I need to read back a GPU texture (stored in the GPU as D3D11_USAGE_DEFAULT). I am doing this via creating a staging ID3D11Texture. The whole application is running in a Microsoft Store application.
I am starting from a D3D11ShaderResourceView defined in the cResourceShaderView variable below. Code follows:
ID3D11Texture2D* pTextureInterface = 0;
ID3D11Resource* res;
HRESULT hr = 0;
ID3D11Texture2D* tx = 0;
ID3D11Device* dv;
deviceContext->GetDevice(&dv);
cResourceShaderView->GetResource(&res);
hr = res->QueryInterface<ID3D11Texture2D>(&pTextureInterface);
D3D11_TEXTURE2D_DESC desc;
pTextureInterface->GetDesc(&desc);
desc.Usage = D3D11_USAGE_STAGING;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
desc.BindFlags = 0;
hr = dv->CreateTexture2D(&desc, nullptr, &tx);
deviceContext->CopyResource(tx, pTextureInterface);
D3D11_MAPPED_SUBRESOURCE mapped = { 0 };
hr = deviceContext->Map(tx, 0, D3D11_MAP_READ, 0, &mapped);
The Map() function fails with an E_INVALIDARG.
I have turned on Debug Layers and there are no specific warnings nor errors in the Visual Studio Window for all these code above.
If I try to save this texture using the DirectX::SaveWICTextureToFile function which uses this same method in the sample, inside this function the Map() function call here fails as well with an E_INVALIDARG and without any debug warnings nor errors.
The GetDesc() function gives me a valid D3D11_TEXTURE2D_DESC for that texture.
What could be wrong?
