static bool d3d_read_viewport(void *data, uint8_t *buffer) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = d3d->dev; RARCH_PERFORMANCE_INIT(d3d_read_viewport); RARCH_PERFORMANCE_START(d3d_read_viewport); bool ret = true; LPDIRECT3DSURFACE target = NULL; LPDIRECT3DSURFACE dest = NULL; if (FAILED(d3d->d3d_err = d3dr->GetRenderTarget(0, &target))) { ret = false; goto end; } if (FAILED(d3d->d3d_err = d3dr->CreateOffscreenPlainSurface(d3d->screen_width, d3d->screen_height, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &dest, NULL))) { ret = false; goto end; } if (FAILED(d3d->d3d_err = d3dr->GetRenderTargetData(target, dest))) { ret = false; goto end; } D3DLOCKED_RECT rect; if (SUCCEEDED(dest->LockRect(&rect, NULL, D3DLOCK_READONLY))) { 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 (unsigned y = 0; y < d3d->final_viewport.Height; y++, pixels -= pitchpix) { for (unsigned x = 0; x < d3d->final_viewport.Width; x++) { *buffer++ = (pixels[x] >> 0) & 0xff; *buffer++ = (pixels[x] >> 8) & 0xff; *buffer++ = (pixels[x] >> 16) & 0xff; } } dest->UnlockRect(); }
static bool cg_d3d9_renderchain_read_viewport(void *data, uint8_t *buffer) { unsigned width, height; D3DLOCKED_RECT rect; LPDIRECT3DSURFACE target = NULL; LPDIRECT3DSURFACE dest = NULL; bool ret = true; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; static struct retro_perf_counter d3d_read_viewport = {0}; video_driver_get_size(&width, &height); performance_counter_init(&d3d_read_viewport, "d3d_read_viewport"); performance_counter_start(&d3d_read_viewport); (void)data; (void)buffer; if (FAILED(d3d->d3d_err = d3dr->GetRenderTarget(0, &target))) { ret = false; goto end; } if (FAILED(d3d->d3d_err = d3dr->CreateOffscreenPlainSurface( width, height, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &dest, NULL))) { ret = false; goto end; } if (FAILED(d3d->d3d_err = d3dr->GetRenderTargetData(target, dest))) { ret = false; goto end; } if (SUCCEEDED(dest->LockRect(&rect, NULL, D3DLOCK_READONLY))) { 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; } } dest->UnlockRect(); }