diff --git a/gfx/common/d3d_common.cpp b/gfx/common/d3d_common.cpp index dd598862c0..642224e950 100644 --- a/gfx/common/d3d_common.cpp +++ b/gfx/common/d3d_common.cpp @@ -391,6 +391,24 @@ void d3d_clear(LPDIRECT3DDEVICE dev, #endif } +bool d3d_device_get_render_target(LPDIRECT3DDEVICE dev, + unsigned idx, void **data) +{ +#if defined(HAVE_D3D9) && !defined(__cplusplus) + if (FAILED(IDirect3DDevice9_GetRenderTarget(dev, idx, + (LPDIRECT3DSURFACE*)data))) +#elif defined(HAVE_D3D8) && !defined(__cplusplus) + if (FAILED(IDirect3DDevice8_GetRenderTarget(dev, + (LPDIRECT3DSURFACE*)data))) +#else + if (FAILED(dev->GetRenderTarget(idx, + (LPDIRECT3DSURFACE*)data))) +#endif + return false; + return true; +} + + bool d3d_lock_rectangle(LPDIRECT3DTEXTURE tex, unsigned level, D3DLOCKED_RECT *lock_rect, RECT *rect, unsigned rectangle_height, unsigned flags) diff --git a/gfx/common/d3d_common.h b/gfx/common/d3d_common.h index 4622874122..18abb577e8 100644 --- a/gfx/common/d3d_common.h +++ b/gfx/common/d3d_common.h @@ -110,6 +110,9 @@ void d3d_frame_postprocess(void *data); void d3d_surface_free(void *data); +bool d3d_device_get_render_target(LPDIRECT3DDEVICE dev, + unsigned idx, void **data); + void d3d_set_render_state(void *data, D3DRENDERSTATETYPE state, DWORD value); bool d3d_reset(LPDIRECT3DDEVICE dev, D3DPRESENT_PARAMETERS *d3dpp); diff --git a/gfx/drivers_renderchain/d3d9_cg_renderchain.cpp b/gfx/drivers_renderchain/d3d9_cg_renderchain.cpp index 047844fdbb..60c7098147 100644 --- a/gfx/drivers_renderchain/d3d9_cg_renderchain.cpp +++ b/gfx/drivers_renderchain/d3d9_cg_renderchain.cpp @@ -1414,7 +1414,7 @@ static bool d3d9_cg_renderchain_render( frame_data, width, height, pitch); /* Grab back buffer. */ - d3dr->GetRenderTarget(0, &back_buffer); + d3d_device_get_render_target(d3dr, 0, (void**)&back_buffer); /* In-between render target passes. */ for (i = 0; i < chain->passes.size() - 1; i++) @@ -1549,7 +1549,7 @@ static bool d3d9_cg_renderchain_read_viewport( (void)data; (void)buffer; - if (FAILED(d3d->d3d_err = d3dr->GetRenderTarget(0, &target))) + if (!d3d_device_get_render_target(d3dr, 0, (void**)&target)) { ret = false; goto end;