I have IDirect3DSurface9, default pool, YUV format. How can I efficiently get bitmap bits from it? At the moment I:
- create render target:
device->CreateRenderTarget(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL)
- convert YUV to RGB32:
device->StretchRect(videomem_surf, NULL, render_target_, NULL, D3DTEXF_NONE)
(complete rectangle, no stretching)
- create plain offscreen surface in system memory
device->CreateOffscreenPlainSurface(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL)
- copy data from video mem to sysmem:
device->GetRenderTargetData(render_target, sysmem_offscreen_surface)
- GetDC from offscreen surface, create compatible DC and compatible bitmap, BitBlt from offscreen sufrace DC to compatible DC and copy bitmap bits to my buffer by GetDIBits()
this looks a bit of overhead, because of so many copying: from original surface to render target, then to offscreen surface, then to compatible bitmap, and then finally to my buffer. How can this be improved?
thanks