Возвратите ошибку при попытке скопировать буфер буфера рендеринга - PullRequest
0 голосов
/ 18 августа 2011

У меня есть один драйвер дисплея режима пользователя WDDM для DX9. Теперь я хотел бы сбросить визуализировать задний буфер цели в файл 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);

1 Ответ

0 голосов
/ 22 декабря 2011

Вы на правильном пути, но я думаю, что вы можете использовать функции DirectX для этого.

Чтобы скопировать цель рендеринга из видеопамяти в системную память, вы должны использовать функцию IDirect3DDevice9 :: GetRenderTargetData () .

Эта функция требует, чтобы целевая поверхность представляла собой неэкранную плоскую поверхность, созданную с помощью пула D3DPOOL_SYSTEMMEM. Эта поверхность также должна иметь те же размеры, что и цель рендеринга (растяжение не допускается). Используйте IDirect3DDevice9 :: CreateOffscreenPlain () для создания этой поверхности.

Тогда эта поверхность может быть заблокирована и ЦПУ может получить доступ к данным о цвете.

...