Support both OpenGL and Vulkan Hgi from single build.
authorRoman Zulak <rzulak@nvidia.com>
Tue, 1 Aug 2023 20:29:33 +0000 (16:29 -0400)
committerRoman Zulak <rzulak@nvidia.com>
Tue, 1 Aug 2023 20:29:33 +0000 (16:29 -0400)
pxr/imaging/hgiInterop/CMakeLists.txt
pxr/imaging/hgiInterop/hgiInterop.cpp
pxr/imaging/hgiInterop/hgiInterop.h

index a2031af9fb977403e0b59c62ffc73c2f6b1b0747..3ede7084e6ce656932640ffa91034509d475acb0 100644 (file)
@@ -26,6 +26,12 @@ else()
     list(APPEND optionalPrivateHeaders opengl.h)
 endif()
 
+if (PXR_ENABLE_VULKAN_SUPPORT)
+    list(APPEND optionalCppFiles vulkan.cpp)
+    list(APPEND optionalPrivateHeaders vulkan.h)
+    list(APPEND optionalLibraries hgiVulkan)
+endif()
+
 pxr_library(hgiInterop
     LIBRARIES
         gf
index 63748bc77f11df0130c1fd8dcad4abfc38a2c3e9..3d44c50c8d1ac7391deafe4174f2753bf9d87010 100644 (file)
 #if defined(PXR_METAL_SUPPORT_ENABLED)
     #include "pxr/imaging/hgiMetal/hgi.h"
     #include "pxr/imaging/hgiInterop/metal.h"
-#elif defined(PXR_VULKAN_SUPPORT_ENABLED)
-    #include "pxr/imaging/hgiVulkan/hgi.h"
-    #include "pxr/imaging/hgiInterop/vulkan.h"
 #else
     #include "pxr/imaging/hgiInterop/opengl.h"
 #endif
+#if defined(PXR_VULKAN_SUPPORT_ENABLED)
+    #include "pxr/imaging/hgiVulkan/hgi.h"
+    #include "pxr/imaging/hgiInterop/vulkan.h"
+#endif
 
 PXR_NAMESPACE_OPEN_SCOPE
 
@@ -52,40 +53,43 @@ void HgiInterop::TransferToApp(
 {
     TfToken const& srcApi = srcHgi->GetAPIName();
 
+    if (dstApi != HgiTokens->OpenGL) {
+        TF_CODING_ERROR("Unsupported destination Hgi backend: %s", dstApi.GetText());
+        return;
+    }
+
 #if defined(PXR_METAL_SUPPORT_ENABLED)
-    if (srcApi==HgiTokens->Metal && dstApi==HgiTokens->OpenGL) {
+    if (srcApi==HgiTokens->Metal) {
         // Transfer Metal textures to OpenGL application
         if (!_metalToOpenGL) {
             _metalToOpenGL = std::make_unique<HgiInteropMetal>(srcHgi);
         }
-        _metalToOpenGL->CompositeToInterop(
-            srcColor, srcDepth, dstFramebuffer, dstRegion);
-    } else {
-        TF_CODING_ERROR("Unsupported Hgi backend: %s", srcApi.GetText());
-    }
-#elif defined(PXR_VULKAN_SUPPORT_ENABLED)
-    if (srcApi==HgiTokens->Vulkan && dstApi==HgiTokens->OpenGL) {
-        // Transfer Vulkan textures to OpenGL application
-        if (!_vulkanToOpenGL) {
-            _vulkanToOpenGL = std::make_unique<HgiInteropVulkan>(srcHgi);
-        }
-        _vulkanToOpenGL->CompositeToInterop(
+        return _metalToOpenGL->CompositeToInterop(
             srcColor, srcDepth, dstFramebuffer, dstRegion);
-    } else {
-        TF_CODING_ERROR("Unsupported Hgi backend: %s", srcApi.GetText());
     }
 #else
-    if (srcApi==HgiTokens->OpenGL && dstApi==HgiTokens->OpenGL) {
+    if (srcApi==HgiTokens->OpenGL) {
         // Transfer OpenGL textures to OpenGL application
         if (!_openGLToOpenGL) {
             _openGLToOpenGL = std::make_unique<HgiInteropOpenGL>();
         }
-        _openGLToOpenGL->CompositeToInterop(
+        return _openGLToOpenGL->CompositeToInterop(
             srcColor, srcDepth, dstFramebuffer, dstRegion);
-    } else {
-        TF_CODING_ERROR("Unsupported Hgi backend: %s", srcApi.GetText());
     }
 #endif
+
+#if defined(PXR_VULKAN_SUPPORT_ENABLED)
+    if (srcApi==HgiTokens->Vulkan) {
+        // Transfer Vulkan textures to OpenGL application
+        if (!_vulkanToOpenGL) {
+            _vulkanToOpenGL = std::make_unique<HgiInteropVulkan>(srcHgi);
+        }
+        return _vulkanToOpenGL->CompositeToInterop(
+            srcColor, srcDepth, dstFramebuffer, dstRegion);
+    }
+#endif
+
+    TF_CODING_ERROR("Unsupported source Hgi backend: %s", srcApi.GetText());
 }
 
 PXR_NAMESPACE_CLOSE_SCOPE
index eb7ddfdf379ee9696bf559798d3e51a40041c849..c8c617efd9008a1870f6e5640ec6851471f6b624 100644 (file)
@@ -102,11 +102,12 @@ private:
 
 #if defined(PXR_METAL_SUPPORT_ENABLED)
     std::unique_ptr<HgiInteropMetal> _metalToOpenGL;
-#elif defined(PXR_VULKAN_SUPPORT_ENABLED)
-    std::unique_ptr<HgiInteropVulkan> _vulkanToOpenGL;
 #else
     std::unique_ptr<HgiInteropOpenGL> _openGLToOpenGL;
 #endif
+#if defined(PXR_VULKAN_SUPPORT_ENABLED)
+    std::unique_ptr<HgiInteropVulkan> _vulkanToOpenGL;
+#endif
 };