IDXGISurface :: Map:此对象不是使用允许CPU访问的CPUAccess标志创建的

问题描述 投票:0回答:1

我尝试创建新的ID3D11Texture2D以将其进一步映射到DXGI_MAPPED_RECT。我收到一些ID3D11Texture2D我没有开机(无法更改其创建方式)。

这里是代码的一部分:

CComPtr<IDXGIResource> cpDXGIResource;
RET_HR_NULL(_pTexIn->QueryInterface(__uuidof(IDXGIResource), (void**)&cpDXGIResource), cpDXGIResource);

HANDLE sharedHandle;
cpDXGIResource->GetSharedHandle(&sharedHandle);

CComPtr<ID3D11Texture2D> cpTexIn;
cpD3D11Device->OpenSharedResource(sharedHandle, __uuidof(ID3D11Resource), (void**)(&cpTexIn));

D3D11_TEXTURE2D_DESC td;
cpTexIn->GetDesc(&td);
td.Usage = D3D11_USAGE_STAGING;
td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ;

CComPtr<ID3D11Texture2D> cpNewTexture;
RET_HR_NULL(cpD3D11Device->CreateTexture2D(&td, NULL, &cpNewTexture), cpNewTexture);

cpD3D11DeviceContext->CopyResource(cpNewTexture, cpTexIn);

CComPtr<IDXGISurface> cpDXGISurface;
RET_HR_NULL(cpNewTexture->QueryInterface(&cpDXGISurface), cpDXGISurface);

D3D11_TEXTURE2D_DESC ntd;
cpNewTexture->GetDesc(&ntd);

DXGI_SURFACE_DESC sd;
cpDXGISurface->GetDesc(&sd);

DXGI_MAPPED_RECT bitmap2Dmap;
RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));

_pTexIn是输入ID3D11Texture2D。我在Map()时收到以下错误:

RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));

DXGI错误:IDXGISurface :: Map:未使用允许CPU访问的CPUAccess标志。 [其他错误#42:]在testhost.x86.exe中的0x76734192处引发异常:Microsoft C ++例外:_com_error在内存位置0x0716E134。线程0x26bc已退出,代码为0(0x0)。

BUT!,实际上我在D3D11_CPU_ACCESS_READ上设置了cpNewTexture。请参阅下面的ntd和sd输出:

这里是ntdsd的内容:

ntd {Width=0x00000354 Height=0x000001e0 MipLevels=0x00000001 ...}   D3D11_TEXTURE2D_DESC
    Width   0x00000354  unsigned int
    Height  0x000001e0  unsigned int
    MipLevels   0x00000001  unsigned int
    ArraySize   0x00000001  unsigned int
    Format  DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) DXGI_FORMAT
    SampleDesc  {Count=0x00000001 Quality=0x00000000 }  DXGI_SAMPLE_DESC
    Usage   D3D11_USAGE_DEFAULT (0x00000000)    D3D11_USAGE
    BindFlags   0x00000008  unsigned int
    CPUAccessFlags  0x00020000  unsigned int
    MiscFlags   0x00000002  unsigned int


sd  {Width=0x00000354 Height=0x000001e0 Format=DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) ...} DXGI_SURFACE_DESC
    Width   0x00000354  unsigned int
    Height  0x000001e0  unsigned int
    Format  DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) DXGI_FORMAT
    SampleDesc  {Count=0x00000001 Quality=0x00000000 }  DXGI_SAMPLE_DESC
c++ directx direct2
1个回答
0
投票

确定,在主question Roma中给出了以下说明:

好,我现在似乎已经明白了...我以为您正在映射输出纹理(供阅读!),但您正在映射输入纹理。为什么?在我的防御很难从代码片段中读取执行流程。我是也很困惑为什么要使用IDXGISurface::Map()?你不似乎需要它。也许你应该解释一下自己是什么试图实现。您已经具有用作输入的纹理。是吗与D2D兼容?如果是,请先使用它。不是,创建兼容并在那里复制输入纹理。您不需要地图对于两者之一。

即使您确实想要Map,为什么选择IDXGISurface::Map()?您有适合访问的ID3D11DeviceContext::Map()具有假定的纹理的纹理数据。我会说你不是应该完全做到IDXGISurface::Map()。然后如果Map()用于读取输出用于结束绘图,然后映射纹理或将其复制到mappable并映射第二个。

毕竟

您仍然不需要Map()。即使有可能,这条路Map()CreateBitmap()显然是对性能的打击。 You could and should use other API instead. By using CreateSharedBitmap to create an ID2D1Bitmap from an IDXGISurface, you can write a Direct3D scene to a bitmap and render it with Direct2D

© www.soinside.com 2019 - 2024. All rights reserved.