mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 08:37:41 +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,
|
state_tracker_t *tracker,
|
||||||
const void *frame,
|
const void *frame,
|
||||||
unsigned width, unsigned height, unsigned pitch, unsigned rotation);
|
unsigned width, unsigned height, unsigned pitch, unsigned rotation);
|
||||||
bool (*read_viewport)(d3d9_video_t *d3d, uint8_t *buffer, bool is_idle);
|
|
||||||
const char *ident;
|
const char *ident;
|
||||||
} d3d9_renderchain_driver_t;
|
} 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)
|
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 ||
|
video_driver_get_size(&width, &height);
|
||||||
!d3d->renderchain_driver ||
|
|
||||||
!d3d->renderchain_driver->read_viewport)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
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,
|
static bool d3d9_set_shader(void *data,
|
||||||
|
@ -1404,63 +1404,6 @@ static bool d3d9_cg_renderchain_render(
|
|||||||
return true;
|
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_renderchain_driver_t cg_d3d9_renderchain = {
|
||||||
d3d9_cg_renderchain_free,
|
d3d9_cg_renderchain_free,
|
||||||
d3d9_cg_renderchain_new,
|
d3d9_cg_renderchain_new,
|
||||||
@ -1469,6 +1412,5 @@ d3d9_renderchain_driver_t cg_d3d9_renderchain = {
|
|||||||
d3d9_cg_renderchain_add_pass,
|
d3d9_cg_renderchain_add_pass,
|
||||||
d3d9_cg_renderchain_add_lut,
|
d3d9_cg_renderchain_add_lut,
|
||||||
d3d9_cg_renderchain_render,
|
d3d9_cg_renderchain_render,
|
||||||
d3d9_cg_renderchain_read_viewport,
|
|
||||||
"cg_d3d9",
|
"cg_d3d9",
|
||||||
};
|
};
|
||||||
|
@ -1224,6 +1224,5 @@ d3d9_renderchain_driver_t hlsl_d3d9_renderchain = {
|
|||||||
hlsl_d3d9_renderchain_add_pass,
|
hlsl_d3d9_renderchain_add_pass,
|
||||||
NULL, /* add_lut */
|
NULL, /* add_lut */
|
||||||
hlsl_d3d9_renderchain_render,
|
hlsl_d3d9_renderchain_render,
|
||||||
NULL, /* read_viewport */
|
|
||||||
"hlsl_d3d9",
|
"hlsl_d3d9",
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user