From 6d2b5c8052c0d6f37a040e2dc5022ef5db75a38f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 17 May 2018 17:17:08 +0200 Subject: [PATCH] Move read_viewport function back to d3d9.c --- gfx/common/d3d9_common.h | 1 - gfx/drivers/d3d9.c | 57 ++++++++++++++++-- gfx/drivers_renderchain/d3d9_cg_renderchain.c | 58 ------------------- .../d3d9_hlsl_renderchain.c | 1 - 4 files changed, 51 insertions(+), 66 deletions(-) diff --git a/gfx/common/d3d9_common.h b/gfx/common/d3d9_common.h index 6a03e66d29..9d0d7a4c43 100644 --- a/gfx/common/d3d9_common.h +++ b/gfx/common/d3d9_common.h @@ -56,7 +56,6 @@ typedef struct d3d9_renderchain_driver state_tracker_t *tracker, const void *frame, unsigned width, unsigned height, unsigned pitch, unsigned rotation); - bool (*read_viewport)(d3d9_video_t *d3d, uint8_t *buffer, bool is_idle); const char *ident; } d3d9_renderchain_driver_t; diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index ce2ed639cd..43298d3615 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -1740,14 +1740,59 @@ static bool d3d9_frame(void *data, const void *frame, static bool d3d9_read_viewport(void *data, uint8_t *buffer, bool is_idle) { - d3d9_video_t *d3d = (d3d9_video_t*)data; + unsigned width, height; + D3DLOCKED_RECT rect; + LPDIRECT3DSURFACE9 target = NULL; + LPDIRECT3DSURFACE9 dest = NULL; + bool ret = true; + d3d9_video_t *d3d = (d3d9_video_t*)data; + LPDIRECT3DDEVICE9 d3dr = d3d->dev; - if ( !d3d || - !d3d->renderchain_driver || - !d3d->renderchain_driver->read_viewport) - return false; + video_driver_get_size(&width, &height); - return d3d->renderchain_driver->read_viewport(d3d, buffer, false); + if ( + !d3d9_device_get_render_target(d3dr, 0, (void**)&target) || + !d3d9_device_create_offscreen_plain_surface(d3dr, width, height, + d3d9_get_xrgb8888_format(), + D3DPOOL_SYSTEMMEM, (void**)&dest, NULL) || + !d3d9_device_get_render_target_data(d3dr, (void*)target, (void*)dest) + ) + { + ret = false; + goto end; + } + + if (d3d9_surface_lock_rect(dest, (void*)&rect)) + { + unsigned x, y; + unsigned pitchpix = rect.Pitch / 4; + const uint32_t *pixels = (const uint32_t*)rect.pBits; + + pixels += d3d->final_viewport.X; + pixels += (d3d->final_viewport.Height - 1) * pitchpix; + pixels -= d3d->final_viewport.Y * pitchpix; + + for (y = 0; y < d3d->final_viewport.Height; y++, pixels -= pitchpix) + { + for (x = 0; x < d3d->final_viewport.Width; x++) + { + *buffer++ = (pixels[x] >> 0) & 0xff; + *buffer++ = (pixels[x] >> 8) & 0xff; + *buffer++ = (pixels[x] >> 16) & 0xff; + } + } + + d3d9_surface_unlock_rect((void*)dest); + } + else + ret = false; + +end: + if (target) + d3d9_surface_free(target); + if (dest) + d3d9_surface_free(dest); + return ret; } static bool d3d9_set_shader(void *data, diff --git a/gfx/drivers_renderchain/d3d9_cg_renderchain.c b/gfx/drivers_renderchain/d3d9_cg_renderchain.c index b0b2ccc9e5..9938588f0d 100644 --- a/gfx/drivers_renderchain/d3d9_cg_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_cg_renderchain.c @@ -1404,63 +1404,6 @@ static bool d3d9_cg_renderchain_render( return true; } -static bool d3d9_cg_renderchain_read_viewport( - d3d9_video_t *d3d, uint8_t *buffer, bool is_idle) -{ - unsigned width, height; - D3DLOCKED_RECT rect; - LPDIRECT3DSURFACE9 target = NULL; - LPDIRECT3DSURFACE9 dest = NULL; - bool ret = true; - LPDIRECT3DDEVICE9 d3dr = d3d->dev; - - video_driver_get_size(&width, &height); - - if ( - !d3d9_device_get_render_target(d3dr, 0, (void**)&target) || - !d3d9_device_create_offscreen_plain_surface(d3dr, width, height, - d3d9_get_xrgb8888_format(), - D3DPOOL_SYSTEMMEM, (void**)&dest, NULL) || - !d3d9_device_get_render_target_data(d3dr, (void*)target, (void*)dest) - ) - { - ret = false; - goto end; - } - - if (d3d9_surface_lock_rect(dest, (void*)&rect)) - { - unsigned x, y; - unsigned pitchpix = rect.Pitch / 4; - const uint32_t *pixels = (const uint32_t*)rect.pBits; - - pixels += d3d->final_viewport.X; - pixels += (d3d->final_viewport.Height - 1) * pitchpix; - pixels -= d3d->final_viewport.Y * pitchpix; - - for (y = 0; y < d3d->final_viewport.Height; y++, pixels -= pitchpix) - { - for (x = 0; x < d3d->final_viewport.Width; x++) - { - *buffer++ = (pixels[x] >> 0) & 0xff; - *buffer++ = (pixels[x] >> 8) & 0xff; - *buffer++ = (pixels[x] >> 16) & 0xff; - } - } - - d3d9_surface_unlock_rect((void*)dest); - } - else - ret = false; - -end: - if (target) - d3d9_surface_free(target); - if (dest) - d3d9_surface_free(dest); - return ret; -} - d3d9_renderchain_driver_t cg_d3d9_renderchain = { d3d9_cg_renderchain_free, d3d9_cg_renderchain_new, @@ -1469,6 +1412,5 @@ d3d9_renderchain_driver_t cg_d3d9_renderchain = { d3d9_cg_renderchain_add_pass, d3d9_cg_renderchain_add_lut, d3d9_cg_renderchain_render, - d3d9_cg_renderchain_read_viewport, "cg_d3d9", }; diff --git a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c index f94b10be85..a79f32518d 100644 --- a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c @@ -1224,6 +1224,5 @@ d3d9_renderchain_driver_t hlsl_d3d9_renderchain = { hlsl_d3d9_renderchain_add_pass, NULL, /* add_lut */ hlsl_d3d9_renderchain_render, - NULL, /* read_viewport */ "hlsl_d3d9", };