mirror of
https://github.com/libretro/RetroArch
synced 2025-03-23 10:20:57 +00:00
Move read_viewport function back to d3d9.c
This commit is contained in:
parent
ad3cedfff1
commit
6d2b5c8052
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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",
|
||||
};
|
||||
|
@ -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",
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user