无法通过 D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 共享 D3D11_USAGE_STAGING 资源
A D3D11_USAGE_STAGING Resource cannot be shared via D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
我尝试创建新的 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);
DXGI_MAPPED_RECT bitmap2Dmap;
RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));
_pTexIn
是输入ID3D11Texture2D.
我在 CreateTexture2D()
:
时收到以下错误
D3D11 ERROR: ID3D11Device::CreateTexture2D: A D3D11_USAGE_STAGING
Resource cannot be shared via D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX or
D3D11_RESOURCE_MISC_SHARED. [ STATE_CREATION ERROR #103:
CREATETEXTURE2D_INVALIDMISCFLAGS]
这里是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_STAGING (0x00000003) D3D11_USAGE
BindFlags 0x00000008 unsigned int
CPUAccessFlags 0x00020000 unsigned int
MiscFlags 0x00000002 unsigned int
调试层就是这么说的
A D3D11_USAGE_STAGING Resource cannot be shared via D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX or D3D11_RESOURCE_MISC_SHARED. [ STATE_CREATION ERROR #103: CREATETEXTURE2D_INVALIDMISCFLAGS]
意味着如果您需要同时具有共享和暂存功能,则需要在一台设备上创建两个单独的纹理。一个是可共享的,另一个是暂存的,您将按照数据流的逻辑将数据从一个复制到另一个。您不能设计为暂存可共享纹理。
我尝试创建新的 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);
DXGI_MAPPED_RECT bitmap2Dmap;
RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));
_pTexIn
是输入ID3D11Texture2D.
我在 CreateTexture2D()
:
D3D11 ERROR: ID3D11Device::CreateTexture2D: A D3D11_USAGE_STAGING Resource cannot be shared via D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX or D3D11_RESOURCE_MISC_SHARED. [ STATE_CREATION ERROR #103: CREATETEXTURE2D_INVALIDMISCFLAGS]
这里是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_STAGING (0x00000003) D3D11_USAGE
BindFlags 0x00000008 unsigned int
CPUAccessFlags 0x00020000 unsigned int
MiscFlags 0x00000002 unsigned int
调试层就是这么说的
A D3D11_USAGE_STAGING Resource cannot be shared via D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX or D3D11_RESOURCE_MISC_SHARED. [ STATE_CREATION ERROR #103: CREATETEXTURE2D_INVALIDMISCFLAGS]
意味着如果您需要同时具有共享和暂存功能,则需要在一台设备上创建两个单独的纹理。一个是可共享的,另一个是暂存的,您将按照数据流的逻辑将数据从一个复制到另一个。您不能设计为暂存可共享纹理。