2011-08-18 61 views
0

我有一个用于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

你走的是正确的轨道,但我认为你可以使用DirectX的功能。

为了将渲染目标从视频内存复制到系统内存,您应该使用IDirect3DDevice9::GetRenderTargetData()函数。

该函数要求目标曲面是使用池D3DPOOL_SYSTEMMEM创建的离屏平面曲面。该表面也必须与渲染目标尺寸相同(不允许拉伸)。使用IDirect3DDevice9::CreateOffscreenPlain()来创建这个表面。

然后可以锁定该表面,并可以通过CPU访问颜色数据。

相关问题