首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Direct3D11:在设备之间共享纹理:黑色纹理

Direct3D11:在设备之间共享纹理:黑色纹理
EN

Stack Overflow用户
提问于 2017-01-13 00:06:27
回答 1查看 2.7K关注 0票数 1

我有两个D3D11设备,每个设备都有自己的上下文,但在同一个适配器上。

我试着在两者之间分享一个纹理,但我在另一边得到的纹理总是黑色的。

代码语言:javascript
运行
复制
HRESULT hr;

// Make a shared texture on device_A / context_A
D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = 1024;
desc.Height = 1024;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.CPUAccessFlags = 0;
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
ID3D11Texture2D* copy_tex;
hr = device_A->CreateTexture2D(&desc, NULL, &copy_tex);

// Test the texture by filling it with some color
D3D11_RENDER_TARGET_VIEW_DESC rtvd = {};
rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvd.Texture2D.MipSlice = 0;
ID3D11RenderTargetView* copy_tex_view = 0;
hr = device_A->CreateRenderTargetView(copy_tex, &rtvd, &copy_tex_view);
FLOAT clear_color[4] = {1, 0, 0, 1};
context_A->ClearRenderTargetView(copy_tex_view, clear_color);

// Now try to share it to device_B:
IDXGIResource* copy_tex_resource = 0;
hr = copy_tex->QueryInterface( __uuidof(IDXGIResource), (void**)&copy_tex_resource );
HANDLE copy_tex_shared_handle = 0;
hr = copy_tex_resource->GetSharedHandle(&copy_tex_shared_handle);
IDXGIResource* copy_tex_resource_mirror = 0;
hr = device_B->OpenSharedResource(copy_tex_shared_handle, __uuidof(ID3D11Texture2D), (void**)&copy_tex_resource_mirror);
ID3D11Texture2D* copy_tex_mirror = 0;
hr = copy_tex_resource_mirror->QueryInterface(__uuidof(ID3D11Texture2D), (void**)(&copy_tex_mirror));

然而:copy_tex_mirror纹理总是黑色的。

我没有得到任何的HRESULT错误代码,甚至可以在device_B / context_B上使用device_B/context_B,但是我无法获得在device_A上输入的像素数据。

我是不是遗漏了什么?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2017-04-11 13:23:22

你怎么知道纹理总是黑色的?:-)

GPU操作由Direct3D排队,所以当您在device_B上打开共享资源时,device_A上的ClearRenderTargetView()可能还没有执行。根据ID3D11设备::OpenSharedResource方法上的MSDN库文档

如果在一个设备上更新了共享纹理,则必须在该设备上调用ID3D11DeviceContext::Flush

当我们在工作中实现设备间的共享纹理时,我们遇到了很多类似的问题。如果将D3D9或OpenGL加到混合物中,陷阱就会成倍增加。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41625272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档