Guest User

Untitled

a guest
Dec 18th, 2023
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. SharedTextureHolder createSharedTextures(int width,
  2.                                          int height,
  3.                                          ID3D11Device1 *firstDevice,
  4.                                          ID3D11Device1 *secondDevice,
  5.                                          int bufferSize) {
  6.     SharedTextureHolder holder{};
  7.  
  8.     for (size_t i = 0; i < bufferSize + 1; i++) {
  9.         ID3D11Texture2D *tex = nullptr;
  10.  
  11.         D3D11_TEXTURE2D_DESC desc = {};
  12.         desc.Width = width;
  13.         desc.Height = height;
  14.         desc.MipLevels = 1;
  15.         desc.ArraySize = 1;
  16.         desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  17.         desc.SampleDesc.Count = 1;
  18.         desc.SampleDesc.Quality = 0;
  19.         desc.Usage = D3D11_USAGE_DEFAULT;
  20.         desc.CPUAccessFlags = 0;
  21.         desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_NTHANDLE | D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;
  22.         desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
  23.  
  24.         HRESULT hr = firstDevice->CreateTexture2D(&desc, nullptr, &tex);
  25.  
  26.         std::cout << "Pointer value tex: " << tex << std::endl;
  27.  
  28.  
  29.         if (FAILED(hr)) {
  30.             std::cerr << "Failed to create shared texture. HRESULT: 0x" << std::hex << hr << std::dec << std::endl;
  31.         }
  32.  
  33.         IDXGIResource1 *shareableResource;
  34.         HRESULT setShareableResource = tex->QueryInterface(__uuidof(IDXGIResource1), (void **) &shareableResource);
  35.  
  36.         if (FAILED(setShareableResource)) {
  37.             std::cerr << "Failed to set shared resource. HRESULT: 0x" << std::hex << setShareableResource << std::dec << std::endl;
  38.         }
  39.  
  40.         HANDLE sharedHandle;
  41.         HRESULT createSharedRes = shareableResource->CreateSharedHandle(NULL,
  42.                                                                         DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE,
  43.                                                                         nullptr,
  44.                                                                         &sharedHandle);
  45.  
  46.         shareableResource->Release();
  47.         if (FAILED(createSharedRes)) {
  48.             std::cerr << "Failed to set shared resource. HRESULT: 0x" << std::hex << createSharedRes << std::dec << std::endl;
  49.         }
  50.  
  51.         IDXGIKeyedMutex *keyedMutex = nullptr;
  52.  
  53.         HRESULT getMutexForTex = tex->QueryInterface(__uuidof(IDXGIKeyedMutex), (void **) &keyedMutex);
  54.  
  55.         if (FAILED(getMutexForTex)) {
  56.             std::cerr << "Failed to obtain IDXGIKeyedMutex for tex. HRESULT: 0x" << std::hex << getMutexForTex << std::dec << std::endl;
  57.         }
  58.  
  59.         // Shared part for device 2
  60.         ID3D11Texture2D *texDevice2 = nullptr;
  61.         HRESULT openResource = secondDevice->OpenSharedResource1(sharedHandle, __uuidof(ID3D11Texture2D ), (void **) &texDevice2);
  62.  
  63.         if (FAILED(openResource)) {
  64.             std::cerr << "Failed to open shared resource. HRESULT: 0x" << std::hex << openResource << std::dec << std::endl;
  65.         }
  66.  
  67.         IDXGIKeyedMutex* keyedMutexTexDevice2 = nullptr;
  68.         HRESULT getMutexForTexDevice2 = texDevice2->QueryInterface(__uuidof(IDXGIKeyedMutex), (void**)&keyedMutexTexDevice2);
  69.  
  70.         if (FAILED(getMutexForTexDevice2)) {
  71.             std::cerr << "Failed to obtain IDXGIKeyedMutex for texDevice2. HRESULT: 0x" << std::hex << getMutexForTexDevice2 << std::dec << std::endl;
  72.         }
  73.  
  74.         SharedTexture sharedTexture{};
  75.         sharedTexture.pUnityTex = tex;
  76.         sharedTexture.pUnityMutex = keyedMutex;
  77.         sharedTexture.pFFmpegTex = texDevice2;
  78.         sharedTexture.pFFmpegMutex = keyedMutexTexDevice2;
  79.  
  80.         if (i == 0) {
  81.             holder.renderingTex = sharedTexture;
  82.         } else {
  83.             holder.bufferTextures.push_back(sharedTexture);
  84.         }
  85.     }
  86.  
  87.     return holder;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment