Directx 尝试复制渲染目标时返回错误';s backbuffer

Directx 尝试复制渲染目标时返回错误';s backbuffer,directx,driver,Directx,Driver,我有一个用于DX9的WDDM用户模式显示驱动程序。现在,我想把它扔掉 将目标的后缓冲区渲染为bmp文件。因为渲染目标资源是 不可锁定,我必须从系统缓冲区创建资源,并从 将目标渲染到系统缓冲区,然后将系统缓冲区保存到bmp 文件但是,调用bitblt总是返回错误代码E_FAIL。我也 尝试调用PFNCaptureTosymem,该函数也返回了相同的错误代码。 这里有什么问题吗 D3DDDI_SURFACEINFO nfo; nfo.Depth = 0; nfo.Width

我有一个用于DX9的WDDM用户模式显示驱动程序。现在,我想把它扔掉 将目标的后缓冲区渲染为bmp文件。因为渲染目标资源是 不可锁定,我必须从系统缓冲区创建资源,并从 将目标渲染到系统缓冲区,然后将系统缓冲区保存到bmp 文件但是,调用bitblt总是返回错误代码E_FAIL。我也 尝试调用PFNCaptureTosymem,该函数也返回了相同的错误代码。 这里有什么问题吗

    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);

您的思路是正确的,但我认为您可以使用DirectX函数来实现这一点

要将渲染目标从视频内存复制到系统内存,应使用函数

此功能要求目标曲面是使用池D3DPOOL_SYSTEMMEM创建的屏幕外普通曲面。此曲面还必须具有与渲染目标相同的尺寸(不允许拉伸)。用于创建此曲面

然后,这个表面可以被锁定,颜色数据可以被CPU访问