我有一个用于DX9的WDDM用户模式显示驱动程序。现在我想抛弃 将目标的后台缓冲区渲染为bmp文件。由于渲染目标资源是 不可锁定,我必须从系统缓冲区和bitblt创建一个资源 将目标渲染到系统缓冲区,然后将系统缓冲区保存到bmp 文件。但是,调用bitblt始终返回错误代码E_FAIL。我也 试图调用pfnCaptureToSysMem,它也返回相同的错误代码。 这里有什么不对吗?
D3DDDI_SURFACEINFO nfo;
nfo.Depth = 0;
nfo.Width = GetRenderSize().cx;
nfo.Height = GetRenderSize().cy;
nfo.pSysMem = NULL;
nfo.SysMemPitch = 0;
nfo.SysMemSlicePitch = 0;
D3DDDIARG_CREATERESOURCE resource;
resource.Format = D3DDDIFMT_A8R8G8B8;
resource.Pool = D3DDDIPOOL_SYSTEMMEM;
resource.MultisampleType = D3DDDIMULTISAMPLE_NONE;
resource.MultisampleQuality = 0;
resource.pSurfList = &nfo;
resource.SurfCount = 1;
resource.MipLevels = 1;
resource.Fvf = 0;
resource.VidPnSourceId = 0;
resource.RefreshRate.Numerator = 0;
resource.RefreshRate.Denominator = 0;
resource.hResource = NULL;
resource.Flags.Value = 0;
resource.Flags.Texture = 1;
resource.Flags.Dynamic = 1;
resource.Rotation = D3DDDI_ROTATION_IDENTITY;
HRESULT hr = m_pDevice->m_deviceFuncs.pfnCreateResource(m_pDevice->GetDrv(), &resource);
HANDLE hSysSpace = resource.hResource;
D3DDDIARG_BLT blt;
blt.hSrcResource = m_pDevice->m_hRenderTarget;
blt.hDstResource = hSysSpace;
blt.SrcRect.left = 0;
blt.SrcRect.top = 0;
blt.SrcRect.right = GetRenderSize().cx;
blt.SrcRect.bottom = GetRenderSize().cy;
blt.DstRect = blt.SrcRect;
blt.DstSubResourceIndex = 0;
blt.SrcSubResourceIndex = 0;
blt.Flags.Value = 0;
blt.ColorKey = 0;
hr = m_pDevice->m_deviceFuncs.pfnBlt(m_pDevice, &blt);
答案 0 :(得分:0)
您走在正确的轨道上,但我认为您可以使用DirectX功能。
为了将渲染目标从视频内存复制到系统内存,您应该使用IDirect3DDevice9::GetRenderTargetData()函数。
此功能要求目标曲面是使用池D3DPOOL_SYSTEMMEM创建的屏外平面。此曲面也必须与渲染目标具有相同的尺寸(不允许拉伸)。使用IDirect3DDevice9::CreateOffscreenPlain()创建此曲面。
然后可以锁定此表面,并且CPU可以访问颜色数据。