# Destination of hgiInterop is always OpenGL, so always include garch
list(APPEND optionalLibraries garch)
-if (PXR_ENABLE_METAL_SUPPORT)
- add_compile_options(-x objective-c++)
- FIND_LIBRARY(COREVIDEO_LIBRARY CoreVideo)
- list(APPEND optionalLibraries ${COREVIDEO_LIBRARY} hgiMetal)
- list(APPEND optionalCppFiles metal.mm)
- list(APPEND optionalPrivateHeaders metal.h)
-else()
- # No OpenGL-to-OpenGL interop when using Metal.
++if (PXR_ENABLE_GL_SUPPORT)
+ list(APPEND optionalCppFiles opengl.cpp)
+ list(APPEND optionalPrivateHeaders opengl.h)
+ endif()
+
+ if (PXR_ENABLE_VULKAN_SUPPORT)
++ list(APPEND optionalLibraries hgiVulkan)
+ list(APPEND optionalCppFiles vulkan.cpp)
+ list(APPEND optionalPrivateHeaders vulkan.h)
- list(APPEND optionalLibraries hgiVulkan)
++endif()
++
+if (PXR_ENABLE_METAL_SUPPORT)
+ add_compile_options(-x objective-c++)
+ list(APPEND optionalLibraries "-framework CoreVideo" hgiMetal)
+ list(APPEND optionalCppFiles metal.mm)
+ list(APPEND optionalPrivateHeaders metal.h)
- elseif(PXR_ENABLE_VULKAN_SUPPORT)
- list(APPEND optionalLibraries hgiVulkan)
- list(APPEND optionalCppFiles vulkan.cpp)
- list(APPEND optionalPrivateHeaders vulkan.h)
- else()
- # No OpenGL-to-OpenGL interop when using Vulkan or Metal.
- list(APPEND optionalCppFiles opengl.cpp)
- list(APPEND optionalPrivateHeaders opengl.h)
endif()
pxr_library(hgiInterop
#include "pxr/imaging/hgi/hgi.h"
#include "pxr/imaging/hgi/tokens.h"
-
-#if defined(PXR_METAL_SUPPORT_ENABLED)
- #include "pxr/imaging/hgiMetal/hgi.h"
- #include "pxr/imaging/hgiInterop/metal.h"
-#else
- #include "pxr/imaging/hgiInterop/opengl.h"
++#if defined(PXR_GL_SUPPORT_ENABLED)
++#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"
++#include "pxr/imaging/hgiInterop/vulkan.h"
++#endif
+
+#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"
++#include "pxr/imaging/hgiMetal/hgi.h"
++#include "pxr/imaging/hgiInterop/metal.h"
#endif
PXR_NAMESPACE_OPEN_SCOPE
--HgiInterop::HgiInterop() = default;
++struct HgiInteropImpl
++{
++#if defined(PXR_GL_SUPPORT_ENABLED)
++ std::unique_ptr<HgiInteropOpenGL> _openGLToOpenGL;
++#endif
++#if defined(PXR_VULKAN_SUPPORT_ENABLED)
++ std::unique_ptr<HgiInteropVulkan> _vulkanToOpenGL;
++#endif
++#if defined(PXR_METAL_SUPPORT_ENABLED)
++ std::unique_ptr<HgiInteropMetal> _metalToOpenGL;
++#endif
++};
++
++HgiInterop::HgiInterop()
++ : _hgiInteropImpl(std::make_unique<HgiInteropImpl>())
++{}
HgiInterop::~HgiInterop() = default;
{
TfToken const& srcApi = srcHgi->GetAPIName();
- #if defined(PXR_METAL_SUPPORT_ENABLED)
- if (srcApi==HgiTokens->Metal && dstApi==HgiTokens->OpenGL) {
- // Transfer Metal textures to OpenGL application
- if (!_metalToOpenGL) {
- _metalToOpenGL = std::make_unique<HgiInteropMetal>(srcHgi);
+ if (dstApi != HgiTokens->OpenGL) {
- TF_CODING_ERROR("Unsupported destination Hgi backend: %s", dstApi.GetText());
++ TF_CODING_ERROR("Unsupported destination Hgi backend: %s",
++ dstApi.GetText());
+ return;
+ }
+
-#if defined(PXR_METAL_SUPPORT_ENABLED)
- if (srcApi==HgiTokens->Metal) {
- // Transfer Metal textures to OpenGL application
- if (!_metalToOpenGL) {
- _metalToOpenGL = std::make_unique<HgiInteropMetal>(srcHgi);
- }
- return _metalToOpenGL->CompositeToInterop(
- srcColor, srcDepth, dstFramebuffer, dstRegion);
- }
-#else
- if (srcApi==HgiTokens->OpenGL) {
++#if defined(PXR_GL_SUPPORT_ENABLED)
++ if (srcApi == HgiTokens->OpenGL) {
+ // Transfer OpenGL textures to OpenGL application
- if (!_openGLToOpenGL) {
- _openGLToOpenGL = std::make_unique<HgiInteropOpenGL>();
++ if (!_hgiInteropImpl->_openGLToOpenGL) {
++ _hgiInteropImpl->_openGLToOpenGL =
++ std::make_unique<HgiInteropOpenGL>();
}
- _metalToOpenGL->CompositeToInterop(
- return _openGLToOpenGL->CompositeToInterop(
++ return _hgiInteropImpl->_openGLToOpenGL->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) {
+ #endif
+
+ #if defined(PXR_VULKAN_SUPPORT_ENABLED)
- if (srcApi==HgiTokens->Vulkan) {
++ if (srcApi == HgiTokens->Vulkan) {
// Transfer Vulkan textures to OpenGL application
-- if (!_vulkanToOpenGL) {
-- _vulkanToOpenGL = std::make_unique<HgiInteropVulkan>(srcHgi);
++ // XXX: It's possible that if we use the same HgiInterop with a
++ // different Hgi instance passed to this function, HgiInteropVulkan
++ // will have the wrong Hgi instance since we wouldn't recreate it here.
++ // We should fix this.
++ if (!_hgiInteropImpl->_vulkanToOpenGL) {
++ _hgiInteropImpl->_vulkanToOpenGL =
++ std::make_unique<HgiInteropVulkan>(srcHgi);
+ }
- _vulkanToOpenGL->CompositeToInterop(
++ return _hgiInteropImpl->_vulkanToOpenGL->CompositeToInterop(
+ srcColor, srcDepth, dstFramebuffer, dstRegion);
- } else {
- TF_CODING_ERROR("Unsupported Hgi backend: %s", srcApi.GetText());
+ }
- #else
- if (srcApi==HgiTokens->OpenGL && dstApi==HgiTokens->OpenGL) {
- // Transfer OpenGL textures to OpenGL application
- if (!_openGLToOpenGL) {
- _openGLToOpenGL = std::make_unique<HgiInteropOpenGL>();
++#endif
++
++#if defined(PXR_METAL_SUPPORT_ENABLED)
++ if (srcApi == HgiTokens->Metal) {
++ // Transfer Metal textures to OpenGL application
++ // XXX: It's possible that if we use the same HgiInterop with a
++ // different Hgi instance passed to this function, HgiInteropMetal
++ // will have the wrong Hgi instance since we wouldn't recreate it here.
++ // We should fix this.
++ if (!_hgiInteropImpl->_metalToOpenGL) {
++ _hgiInteropImpl->_metalToOpenGL =
++ std::make_unique<HgiInteropMetal>(srcHgi);
}
- _openGLToOpenGL->CompositeToInterop(
- return _vulkanToOpenGL->CompositeToInterop(
++ return _hgiInteropImpl->_metalToOpenGL->CompositeToInterop(
srcColor, srcDepth, dstFramebuffer, dstRegion);
- } else {
- TF_CODING_ERROR("Unsupported Hgi backend: %s", srcApi.GetText());
}
#endif
+
+ TF_CODING_ERROR("Unsupported source Hgi backend: %s", srcApi.GetText());
}
PXR_NAMESPACE_CLOSE_SCOPE