Build: Enable Vulkan in USD (no Vulkan SDK)

After some discussion with Brecht and Jeroen, it was decided to use an upstream patch from openusd ([from here](https://github.com/PixarAnimationStudios/OpenUSD/pull/3603)) so we could use the usual vulkan libraries and not the Vulkan SDK.

I did not port Ray's Windows changes from the old PR https://projects.blender.org/blender/blender/pulls/137617 as I didn't know if anything else needs to be changed (and I've only tested this on Linux).

Pull Request: https://projects.blender.org/blender/blender/pulls/138139
This commit is contained in:
Sebastian Parborg
2025-05-28 11:26:05 +02:00
committed by Sebastian Parborg
parent be2b8aca91
commit eb96c2dfb3
12 changed files with 808 additions and 27 deletions

View File

@@ -178,6 +178,8 @@ endif()
include(cmake/shaderc_deps.cmake)
include(cmake/shaderc.cmake)
include(cmake/vulkan.cmake)
include(cmake/vulkan-memory-allocator.cmake)
include(cmake/spirv-reflect.cmake)
include(cmake/pybind11.cmake)
include(cmake/nanobind.cmake)
include(cmake/manifold.cmake)

View File

@@ -160,7 +160,7 @@ download_source(VCINTRINSICS)
download_source(OPENCLHEADERS)
download_source(ICDLOADER)
download_source(MP11)
download_source(SPIRV_HEADERS)
download_source(DPCPP_SPIRV_HEADERS)
download_source(UNIFIED_RUNTIME)
download_source(UNIFIED_MEMORY_FRAMEWORK)
download_source(IGC)
@@ -181,6 +181,10 @@ download_source(SHADERC_SPIRV_HEADERS)
download_source(SHADERC_GLSLANG)
download_source(VULKAN_HEADERS)
download_source(VULKAN_LOADER)
download_source(VULKAN_UTILITY_LIBRARIES)
download_source(SPIRV_HEADERS)
download_source(SPIRV_REFLECT)
download_source(VULKAN_MEMORY_ALLOCATOR)
download_source(PYBIND11)
download_source(DEFLATE)
download_source(HIPRT)

View File

@@ -42,7 +42,7 @@ set(DPCPP_EXTRA_ARGS
-DBOOST_MP11_SOURCE_DIR=${BUILD_DIR}/mp11/src/external_mp11/
-DLEVEL_ZERO_LIBRARY=${LIBDIR}/level-zero/lib/${LIBPREFIX}ze_loader${SHAREDLIBEXT}
-DLEVEL_ZERO_INCLUDE_DIR=${LIBDIR}/level-zero/include/level_zero
-DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=${BUILD_DIR}/spirvheaders/src/external_spirvheaders/
-DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=${BUILD_DIR}/dpcpp_spirvheaders/src/external_dpcpp_spirvheaders/
-DSYCL_UR_USE_FETCH_CONTENT=OFF
-DSYCL_UR_SOURCE_DIR=${BUILD_DIR}/unifiedruntime/src/external_unifiedruntime/
-DFETCHCONTENT_SOURCE_DIR_UNIFIED-MEMORY-FRAMEWORK=${BUILD_DIR}/unifiedmemoryframework/src/external_unifiedmemoryframework/
@@ -138,7 +138,7 @@ add_dependencies(
external_icdloader
external_mp11
external_level-zero
external_spirvheaders
external_dpcpp_spirvheaders
external_unifiedruntime
external_unifiedmemoryframework
external_zstd

View File

@@ -52,11 +52,11 @@ ExternalProject_Add(external_mp11
INSTALL_COMMAND echo .
)
ExternalProject_Add(external_spirvheaders
URL file://${PACKAGE_DIR}/${SPIRV_HEADERS_FILE}
URL_HASH ${SPIRV_HEADERS_HASH_TYPE}=${SPIRV_HEADERS_HASH}
ExternalProject_Add(external_dpcpp_spirvheaders
URL file://${PACKAGE_DIR}/${DPCPP_SPIRV_HEADERS_FILE}
URL_HASH ${DPCPP_SPIRV_HEADERS_HASH_TYPE}=${DPCPP_SPIRV_HEADERS_HASH}
DOWNLOAD_DIR ${DOWNLOAD_DIR}
PREFIX ${BUILD_DIR}/spirvheaders
PREFIX ${BUILD_DIR}/dpcpp_spirvheaders
CONFIGURE_COMMAND echo .
BUILD_COMMAND echo .
INSTALL_COMMAND echo .

View File

@@ -0,0 +1,32 @@
# SPDX-FileCopyrightText: 2022-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
set(SPIRV_REFLECT_EXTRA_ARGS
-DSPIRV_REFLECT_EXECUTABLE=OFF
-DSPIRV_REFLECT_STATIC_LIB=ON
)
ExternalProject_Add(external_spirv_reflect
URL file://${PACKAGE_DIR}/${SPIRV_REFLECT_FILE}
DOWNLOAD_DIR ${DOWNLOAD_DIR}
URL_HASH ${SPIRV_REFLECT_HASH_TYPE}=${SPIRV_REFLECT_HASH}
PREFIX ${BUILD_DIR}/spirv_reflect
CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR}
PATCH_COMMAND ${PATCH_CMD} -p 1 -d
${BUILD_DIR}/spirv_reflect/src/external_spirv_reflect <
${PATCH_DIR}/spirv_reflect.diff
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${LIBDIR}/spirv_reflect
${DEFAULT_CMAKE_FLAGS}
${SPIRV_REFLECT_EXTRA_ARGS}
INSTALL_DIR ${LIBDIR}/spirv_reflect
)
add_dependencies(
external_spirv_reflect
external_spirv_headers
)

View File

@@ -26,10 +26,10 @@ if(WIN32)
list(APPEND USD_PLATFORM_FLAGS -DOPENVDB_LIBRARY=${LIBDIR}/openvdb/lib/openvdb_d.lib)
endif()
elseif(UNIX)
# Workaround USD not linking correctly with static Python library, where it would embed
# part of the interpret in the USD library. Allow undefined Python symbols and replace
# Python library with TBB so it doesn't complain about missing library.
set(USD_PLATFORM_FLAGS
# Workaround USD not linking correctly with static Python library, where it would embed
# part of the interpret in the USD library. Allow undefined Python symbols and replace
# Python library with TBB so it doesn't complain about missing library.
# NOTE(@ideasman42): Setting the root is needed, without this an older version of Python
# is detected from the system. Referencing the root-directory may remove the need
# to explicitly set the `PYTHON_INCLUDE_DIR` & `PYTHON_LIBRARY`.
@@ -53,6 +53,10 @@ elseif(UNIX)
endif()
endif()
if(NOT APPLE)
list(APPEND USD_PLATFORM_FLAGS -DPXR_ENABLE_VULKAN_SUPPORT=ON)
endif()
# Custom namespace to prevent conflicts when importing both bpy module
# and usd-core pip packages with the same version but different libs.
string(REPLACE "." "_" USD_NAMESPACE "pxrBlender_v${USD_VERSION}")
@@ -61,7 +65,6 @@ set(USD_EXTRA_ARGS
${USD_PLATFORM_FLAGS}
-DOPENSUBDIV_ROOT_DIR=${LIBDIR}/opensubdiv
-DOpenImageIO_ROOT=${LIBDIR}/openimageio
-DVulkan_ROOT=${LIBDIR}/vulkan_loader
-DMaterialX_ROOT=${LIBDIR}/materialx
-DOPENEXR_LIBRARIES=${LIBDIR}/imath/lib/${LIBPREFIX}Imath${OPENEXR_VERSION_POSTFIX}${SHAREDLIBEXT}
-DOPENEXR_INCLUDE_DIR=${LIBDIR}/imath/include
@@ -96,9 +99,6 @@ set(USD_EXTRA_ARGS
# USD 22.03 does not support OCIO 2.x
# Tracking ticket https://github.com/PixarAnimationStudios/USD/issues/1386
-DPXR_BUILD_OPENCOLORIO_PLUGIN=OFF
# We'd like Vulkan support on, but it has trouble not finding the SDK since we have
# the invididual components in the deps builder.
-DPXR_ENABLE_VULKAN_SUPPORT=OFF
-DPXR_ENABLE_PTEX_SUPPORT=OFF
-DPXR_BUILD_USD_TOOLS=OFF
-DCMAKE_DEBUG_POSTFIX=_d
@@ -107,6 +107,12 @@ set(USD_EXTRA_ARGS
-DTBB_LIBRARIES=${LIBDIR}/tbb/lib/${LIBPREFIX}${TBB_LIBRARY}${SHAREDLIBEXT}
-DTBB_LIBRARIES_DEBUG=${LIBDIR}/tbb/lib/${LIBPREFIX}${TBB_LIBRARY}${SHAREDLIBEXT}
-DTBB_LIBRARIES_RELEASE=${LIBDIR}/tbb/lib/${LIBPREFIX}${TBB_LIBRARY}${SHAREDLIBEXT}
-DVulkanHeaders_ROOT=${LIBDIR}/vulkan_headers
-DVulkanLoader_ROOT=${LIBDIR}/vulkan_loader
-DVulkanUtilityLibraries_ROOT=${LIBDIR}/vulkan_headers
-DVulkanMemoryAllocator_ROOT=${LIBDIR}/vulkan_memory_allocator
-DShaderC_ROOT=${LIBDIR}/shaderc
-DSpirvReflect_ROOT=${LIBDIR}/spirv_reflect
)
# Ray: I'm not sure if the other platforms relied on this or not but this is no longer
@@ -146,7 +152,13 @@ ExternalProject_Add(external_usd
${PATCH_DIR}/usd_forward_compat.diff &&
${PATCH_CMD} -p 1 -d
${BUILD_DIR}/usd/src/external_usd <
${PATCH_DIR}/usd_noboost.diff
${PATCH_DIR}/usd_noboost.diff &&
${PATCH_CMD} -p 1 -d
${BUILD_DIR}/usd/src/external_usd <
${PATCH_DIR}/usd_no_vulkan_sdk.diff &&
${PATCH_CMD} -p 1 -d
${BUILD_DIR}/usd/src/external_usd <
${PATCH_DIR}/usd_storm_vulkan.diff
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${LIBDIR}/usd
-Wno-dev
@@ -163,6 +175,12 @@ add_dependencies(
external_python
external_openimageio
external_materialx
external_vulkan_loader
external_vulkan_headers
external_vulkan_memory_allocator
external_vulkan_utility_libraries
external_shaderc
external_spirv_reflect
openvdb
)

View File

@@ -1117,15 +1117,15 @@ set(MP11_HOMEPAGE https://github.com/boostorg/mp11)
set(MP11_LICENSE SPDX:BSL-1.0)
# Source llvm-spirv/CMakeLists.txt (repo)
# Source llvm-spirv/spirv-headers-tag.conf (commit/version)
set(SPIRV_HEADERS_VERSION efb6b4099ddb8fa60f62956dee592c4b94ec6a49)
set(SPIRV_HEADERS_URI https://github.com/KhronosGroup/SPIRV-Headers/archive/${SPIRV_HEADERS_VERSION}.tar.gz)
set(SPIRV_HEADERS_HASH cb1f5b929f95169493f924f5aacf50ff9ce91e9470c28c5830a5ff4fca47062c)
set(SPIRV_HEADERS_HASH_TYPE SHA256)
set(SPIRV_HEADERS_FILE SPIR-V-Headers-${SPIRV_HEADERS_VERSION}.tar.gz)
set(SPIRV_HEADERS_HOMEPAGE https://github.com/KhronosGroup/SPIRV-Headers)
set(SPIRV_HEADERS_LICENSE SPDX:MIT-Khronos-old)
set(SPIRV_HEADERS_COPYRIGHT "Copyright (c) 2015-2024 The Khronos Group Inc.")
# Source llvm-spirv/spirv-headers-tag.conf (hash)
set(DPCPP_SPIRV_HEADERS_VERSION efb6b4099ddb8fa60f62956dee592c4b94ec6a49)
set(DPCPP_SPIRV_HEADERS_URI https://github.com/KhronosGroup/SPIRV-Headers/archive/${DPCPP_SPIRV_HEADERS_VERSION}.tar.gz)
set(DPCPP_SPIRV_HEADERS_HASH cb1f5b929f95169493f924f5aacf50ff9ce91e9470c28c5830a5ff4fca47062c)
set(DPCPP_SPIRV_HEADERS_HASH_TYPE SHA256)
set(DPCPP_SPIRV_HEADERS_FILE DPCPP-SPIR-V-Headers-${DPCPP-SPIRV_HEADERS_VERSION}.tar.gz)
set(DPCPP_SPIRV_HEADERS_HOMEPAGE https://github.com/KhronosGroup/SPIRV-Headers)
set(DPCPP_SPIRV_HEADERS_LICENSE SPDX:MIT-Khronos-old)
set(DPCPP_SPIRV_HEADERS_COPYRIGHT "Copyright (c) 2015-2024 The Khronos Group Inc.")
# Source sycl/cmake/modules/FetchUnifiedRuntime.cmake (repo)
# Source sycl/cmake/modules/UnifiedRuntimeTag.cmake (commit/version)
@@ -1348,11 +1348,11 @@ Copyright 2020 The Khronos Group Inc.
Copyright (C) 2015-2018 Google, Inc.
]=])
set(VULKAN_VERSION v1.3.296)
set(VULKAN_VERSION 1.3.296)
set(VULKAN_HEADERS_VERSION ${VULKAN_VERSION})
set(VULKAN_HEADERS_NAME Vulkan-Headers)
set(VULKAN_HEADERS_URI https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/${VULKAN_HEADERS_VERSION}.tar.gz)
set(VULKAN_HEADERS_URI https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v${VULKAN_HEADERS_VERSION}.tar.gz)
set(VULKAN_HEADERS_HASH 3f4cd229d8f7c24c9b5a6ead3d674803)
set(VULKAN_HEADERS_HASH_TYPE MD5)
set(VULKAN_HEADERS_FILE Vulkan-Headers-${VULKAN_HEADERS_VERSION}.tar.gz)
@@ -1362,7 +1362,7 @@ set(VULKAN_HEADERS_COPYRIGHT "Copyright 2015-2023 The Khronos Group Inc.")
set(VULKAN_LOADER_VERSION ${VULKAN_VERSION})
set(VULKAN_LOADER_NAME Vulkan-Loader)
set(VULKAN_LOADER_URI https://github.com/KhronosGroup/Vulkan-Loader/archive/refs/tags/${VULKAN_LOADER_VERSION}.tar.gz)
set(VULKAN_LOADER_URI https://github.com/KhronosGroup/Vulkan-Loader/archive/refs/tags/v${VULKAN_LOADER_VERSION}.tar.gz)
set(VULKAN_LOADER_HASH bca05ec4914888990c92fa9c3e2738ff)
set(VULKAN_LOADER_HASH_TYPE MD5)
set(VULKAN_LOADER_FILE Vulkan-Loader-${VULKAN_LOADER_VERSION}.tar.gz)
@@ -1375,6 +1375,45 @@ Copyright (c) 2019 LunarG, Inc.
Copyright (c) 2019 Google Inc.
]=])
set(VULKAN_UTILITY_LIBRARIES_VERSION ${VULKAN_VERSION})
set(VULKAN_UTILITY_LIBRARIES_URI https://github.com/KhronosGroup/Vulkan-Utility-Libraries/archive/refs/tags/v${VULKAN_UTILITY_LIBRARIES_VERSION}.tar.gz)
set(VULKAN_UTILITY_LIBRARIES_HASH 02091bdc2b5862685da83b37a6c48821)
set(VULKAN_UTILITY_LIBRARIES_HASH_TYPE MD5)
set(VULKAN_UTILITY_LIBRARIES_FILE Vulkan-Utility-Libraries-${VULKAN_UTILITY_LIBRARIES_VERSION}.tar.gz)
set(VULKAN_UTILITY_LIBRARIES_HOMEPAGE https://github.com/KhronosGroup/Vulkan-Utility-Libraries)
set(VULKAN_UTILITY_LIBRARIES_LICENSE SPDX:Apache-2.0)
set(VULKAN_UTILITY_LIBRARIES_COPYRIGHT "Copyright 2015-2025 The Khronos Group Inc.")
set(VULKAN_MEMORY_ALLOCATOR_VERSION 3.2.1)
set(VULKAN_MEMORY_ALLOCATOR_NAME Vulkan-Memory-Allocator)
set(VULKAN_MEMORY_ALLOCATOR_URI
https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/refs/tags/v${VULKAN_MEMORY_ALLOCATOR_VERSION}.tar.gz)
set(VULKAN_MEMORY_ALLOCATOR_HASH f32b8374858566854e5f77564ea2e16d)
set(VULKAN_MEMORY_ALLOCATOR_HASH_TYPE MD5)
set(VULKAN_MEMORY_ALLOCATOR_FILE Vulkan-Memory-Allocator-${VULKAN_MEMORY_ALLOCATOR_VERSION}.tar.gz)
set(VULKAN_MEMORY_ALLOCATOR_HOMEPAGE https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
set(VULKAN_MEMORY_ALLOCATOR_LICENSE SPDX:MIT)
set(SPIRV_HEADERS_VERSION ${VULKAN_VERSION})
set(SPIRV_HEADERS_URI https://github.com/KhronosGroup/SPIRV-Headers/archive/refs/tags/vulkan-sdk-${SPIRV_HEADERS_VERSION}.0.tar.gz)
set(SPIRV_HEADERS_HASH adee3d432b63f345c8ee6d625d0c8e6c)
set(SPIRV_HEADERS_HASH_TYPE MD5)
set(SPIRV_HEADERS_FILE SPIRV-Headers-${SPIRV_HEADERS_VERSION}.tar.gz)
set(SPIRV_HEADERS_NAME SPIR-V Headers)
set(SPIRV_HEADERS_HOMEPAGE https://github.com/KhronosGroup/SPIRV-Headers/)
set(SPIRV_HEADERS_LICENSE SPDX:Apache-2.0)
set(SPIRV_HEADERS_COPYRIGHT "Copyright (c) 2015-2014 The Khronos Group Inc.")
set(SPIRV_REFLECT_VERSION 1.4.309.0)
set(SPIRV_REFLECT_NAME SPIRV-Reflect)
set(SPIRV_REFLECT_URI
https://github.com/KhronosGroup/SPIRV-Reflect/archive/refs/tags/vulkan-sdk-${SPIRV_REFLECT_VERSION}.tar.gz)
set(SPIRV_REFLECT_HASH 11234b7d7895f69c3955e458c7b98914)
set(SPIRV_REFLECT_HASH_TYPE MD5)
set(SPIRV_REFLECT_FILE SPIRV-Reflect-${SPIRV_REFLECT_VERSION}.tar.gz)
set(SPIRV_REFLECT_HOMEPAGE https://github.com/KhronosGroup/SPIRV-Reflect)
set(SPIRV_REFLECT_LICENSE SPDX:Apache-2.0)
set(PYBIND11_VERSION 2.10.1)
set(PYBIND11_URI https://github.com/pybind/pybind11/archive/refs/tags/v${PYBIND11_VERSION}.tar.gz)
set(PYBIND11_HASH ce07bfd5089245da7807b3faf6cbc878)

View File

@@ -0,0 +1,24 @@
# SPDX-FileCopyrightText: 2022-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
set(VULKAN_MEMORY_ALLOCATOR_EXTRA_ARGS
-DVMA_BUILD_DOCUMENTATION=OFF
-DVMA_BUILD_SAMPLES=OFF
-DVMA_ENABLE_INSTALL=ON
)
ExternalProject_Add(external_vulkan_memory_allocator
URL file://${PACKAGE_DIR}/${VULKAN_MEMORY_ALLOCATOR_FILE}
DOWNLOAD_DIR ${DOWNLOAD_DIR}
URL_HASH ${VULKAN_MEMORY_ALLOCATOR_HASH_TYPE}=${VULKAN_MEMORY_ALLOCATOR_HASH}
PREFIX ${BUILD_DIR}/vulkan_memory_allocator
CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR}
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${LIBDIR}/vulkan_memory_allocator
${DEFAULT_CMAKE_FLAGS}
${VULKAN_MEMORY_ALLOCATOR_EXTRA_ARGS}
INSTALL_DIR ${LIBDIR}/vulkan_memory_allocator
)

View File

@@ -21,6 +21,42 @@ set(VULKAN_LOADER_EXTRA_ARGS
-DVULKAN_HEADERS_INSTALL_DIR=${LIBDIR}/vulkan_headers
)
set(VULKAN_UTILITY_LIBRARIES_EXTRA_ARGS
-DVulkanHeaders_DIR=${LIBDIR}/vulkan_headers/share/cmake/VulkanHeaders)
ExternalProject_Add(external_vulkan_utility_libraries
URL file://${PACKAGE_DIR}/${VULKAN_UTILITY_LIBRARIES_FILE}
URL_HASH ${VULKAN_UTILITY_LIBRARIES_HASH_TYPE}=${VULKAN_UTILITY_LIBRARIES_HASH}
PREFIX ${BUILD_DIR}/vulkan_utility_libraries
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${LIBDIR}/vulkan_headers
-Wno-dev ${DEFAULT_CMAKE_FLAGS}
${VULKAN_UTILITY_LIBRARIES_EXTRA_ARGS}
INSTALL_DIR ${LIBDIR}/vulkan_headers
)
add_dependencies(
external_vulkan_utility_libraries
external_vulkan_headers
)
set(SPIRV_HEADERS_EXTRA_ARGS)
ExternalProject_Add(external_spirv_headers
URL file://${PACKAGE_DIR}/${SPIRV_HEADERS_FILE}
URL_HASH ${SPIRV_HEADERS_HASH_TYPE}=${SPIRV_HEADERS_HASH}
PREFIX ${BUILD_DIR}/spirv_headers
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${LIBDIR}/vulkan_headers
-Wno-dev ${DEFAULT_CMAKE_FLAGS}
${SPIRV_HEADERS_EXTRA_ARGS}
INSTALL_DIR ${LIBDIR}/vulkan_headers
)
if(UNIX AND NOT APPLE)
# These are used in `cmake/FindWayland.cmake` from `external_vulkan_loader`.
# NOTE: When upgrading to CMAKE 3.22 we it would be cleaner to use: `PKG_CONFIG_ARGN`,

View File

@@ -0,0 +1,29 @@
From 9a0c9d47bbe8460bbb0861098bf4ee743bc51f45 Mon Sep 17 00:00:00 2001
From: HolyBlackCat <holyblckcat@gmail.com>
Date: Tue, 1 Apr 2025 22:48:21 +0500
Subject: [PATCH] Install the header along with the library.
https://github.com/KhronosGroup/SPIRV-Reflect/commit/9a0c9d47bbe8460bbb0861098bf4ee743bc51f45
---
CMakeLists.txt | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 906c208..b4085d1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -113,8 +113,11 @@ if(SPIRV_REFLECT_STATIC_LIB)
target_include_directories(spirv-reflect-static
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+
+ set_target_properties(spirv-reflect-static PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/spirv_reflect.h")
+
install(TARGETS spirv-reflect-static
LIBRARY DESTINATION lib
- ARCHIVE DESTINATION lib)
+ ARCHIVE DESTINATION lib
+ PUBLIC_HEADER DESTINATION include)
endif()
-

View File

@@ -0,0 +1,581 @@
From 9d89d907a0cd100ee04d4c7feb44745b789c9e4f Mon Sep 17 00:00:00 2001
From: Aleksi Sapon <aleksi.sapon@autodesk.com>
Date: Fri, 11 Apr 2025 17:33:55 -0400
Subject: [PATCH 1/2] build_usd.py now installs Vulkan dependencies
https://github.com/PixarAnimationStudios/OpenUSD/pull/3603
---
build_scripts/build_usd.py | 138 ++++++++++++++++++++++-
cmake/defaults/Packages.cmake | 75 +++++++-----
cmake/macros/Private.cmake | 6 +
cmake/modules/FindShaderC.cmake | 41 +++++++
cmake/modules/FindSpirvReflect.cmake | 54 +++++++++
pxr/imaging/hgiVulkan/CMakeLists.txt | 4 -
pxr/imaging/hgiVulkan/device.cpp | 19 +++-
pxr/imaging/hgiVulkan/diagnostic.cpp | 2 +-
pxr/imaging/hgiVulkan/sampler.cpp | 5 +-
pxr/imaging/hgiVulkan/shaderCompiler.cpp | 4 +-
pxr/imaging/hgiVulkan/spirv_reflect.cpp | 9 --
pxr/imaging/hgiVulkan/spirv_reflect.h | 15 ---
pxr/imaging/hgiVulkan/vk_mem_alloc.cpp | 10 --
pxr/imaging/hgiVulkan/vk_mem_alloc.h | 15 ---
pxr/imaging/hgiVulkan/vulkan.h | 6 +-
15 files changed, 305 insertions(+), 98 deletions(-)
create mode 100644 cmake/modules/FindShaderC.cmake
create mode 100644 cmake/modules/FindSpirvReflect.cmake
delete mode 100644 pxr/imaging/hgiVulkan/spirv_reflect.cpp
delete mode 100644 pxr/imaging/hgiVulkan/spirv_reflect.h
delete mode 100644 pxr/imaging/hgiVulkan/vk_mem_alloc.cpp
delete mode 100644 pxr/imaging/hgiVulkan/vk_mem_alloc.h
diff --git a/cmake/defaults/Packages.cmake b/cmake/defaults/Packages.cmake
index 4e9066ca3a..0a929fda3b 100644
--- a/cmake/defaults/Packages.cmake
+++ b/cmake/defaults/Packages.cmake
@@ -187,38 +187,59 @@ if (PXR_BUILD_IMAGING)
endif()
if (PXR_ENABLE_VULKAN_SUPPORT)
message(STATUS "Enabling experimental feature Vulkan support")
- if (EXISTS $ENV{VULKAN_SDK})
- # Prioritize the VULKAN_SDK includes and packages before any system
- # installed headers. This is to prevent linking against older SDKs
- # that may be installed by the OS.
- # XXX This is fixed in cmake 3.18+
- include_directories(BEFORE SYSTEM $ENV{VULKAN_SDK} $ENV{VULKAN_SDK}/include $ENV{VULKAN_SDK}/lib $ENV{VULKAN_SDK}/source)
- set(ENV{PATH} "$ENV{VULKAN_SDK}:$ENV{VULKAN_SDK}/include:$ENV{VULKAN_SDK}/lib:$ENV{VULKAN_SDK}/source:$ENV{PATH}")
- find_package(Vulkan REQUIRED)
+
+ if (DEFINED ENV{VULKAN_SDK})
+ message(STATUS "Using Vulkan components from: \"$ENV{VULKAN_SDK}\"")
+ # Not using usd_build.py: find from the Vulkan SDK
+ find_package(Vulkan MODULE REQUIRED COMPONENTS shaderc_combined)
+
+ # The SDK uniquely places the "vk_mem_alloc.h" header inside a "vma"
+ # subdirectory. This means we would need to use "#include <vma/vk_mem_alloc.h>"
+ # only for the SDK build. Instead of forcing non-SDK users to create
+ # this path, we'll add a another include directory for the SDK build.
+ # That way "#include <vk_mem_alloc.h>" should work for everyone.
+ target_include_directories(Vulkan::Vulkan INTERFACE
+ "${Vulkan_INCLUDE_DIR}/vma")
+
list(APPEND VULKAN_LIBS Vulkan::Vulkan)
+ list(APPEND VULKAN_LIBS Vulkan::shaderc_combined)
+ else()
+ message(STATUS "Using locally built Vulkan components")
+ # Using usd_build.py: find individual components
+ find_package(VulkanHeaders CONFIG REQUIRED)
+ list(APPEND VULKAN_LIBS Vulkan::Headers)
- # Find the extra vulkan libraries we need
- set(EXTRA_VULKAN_LIBS shaderc_combined)
- if (WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug")
- set(EXTRA_VULKAN_LIBS shaderc_combinedd)
- endif()
- foreach(EXTRA_LIBRARY ${EXTRA_VULKAN_LIBS})
- find_library("${EXTRA_LIBRARY}_PATH" NAMES "${EXTRA_LIBRARY}" PATHS $ENV{VULKAN_SDK}/lib)
- list(APPEND VULKAN_LIBS "${${EXTRA_LIBRARY}_PATH}")
- endforeach()
-
- # Find the OS specific libs we need
- if (UNIX AND NOT APPLE)
- find_package(X11 REQUIRED)
- list(APPEND VULKAN_LIBS ${X11_LIBRARIES})
- elseif (WIN32)
- # No extra libs required
- endif()
+ find_package(VulkanUtilityLibraries CONFIG REQUIRED)
+ list(APPEND VULKAN_LIBS Vulkan::UtilityHeaders)
+
+ find_package(VulkanLoader CONFIG REQUIRED)
+ list(APPEND VULKAN_LIBS Vulkan::Loader)
- add_definitions(-DPXR_VULKAN_SUPPORT_ENABLED)
+ find_package(VulkanMemoryAllocator CONFIG REQUIRED)
+ list(APPEND VULKAN_LIBS GPUOpen::VulkanMemoryAllocator)
+
+ find_package(ShaderC MODULE REQUIRED)
+ list(APPEND VULKAN_LIBS shaderc_combined)
+ endif()
+
+ # In either case we have custom logic for SPIRV-Reflect
+ find_package(SpirvReflect MODULE REQUIRED)
+ if(SpirvReflect_IS_SOURCE_DEP)
+ # SPIRV-Reflect should not be installed nor exported
+ list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:spirv-reflect>)
else()
- message(FATAL_ERROR "VULKAN_SDK not valid")
+ list(APPEND VULKAN_LIBS spirv-reflect)
endif()
+
+ # Find the OS specific libs we need
+ if (UNIX AND NOT APPLE)
+ find_package(X11 REQUIRED)
+ list(APPEND VULKAN_LIBS ${X11_LIBRARIES})
+ elseif (WIN32)
+ # No extra libs required
+ endif()
+
+ add_definitions(-DPXR_VULKAN_SUPPORT_ENABLED)
endif()
# --Opensubdiv
set(OPENSUBDIV_USE_GPU ${PXR_BUILD_GPU_SUPPORT})
diff --git a/cmake/macros/Private.cmake b/cmake/macros/Private.cmake
index 6fe1134c14..4629e5a03f 100644
--- a/cmake/macros/Private.cmake
+++ b/cmake/macros/Private.cmake
@@ -823,6 +823,12 @@ function(_pxr_target_link_libraries NAME)
list(APPEND all_libraries ${external})
foreach(lib ${all_libraries})
+ # Remove BUILD and INSTALL generator expressions:
+ # $<BUILD_LOCAL_INTERFACE:tgt> -> tgt
+ string(REGEX REPLACE
+ [[\$\<(BUILD|INSTALL)_[_A-Z]+\:(.+)\>]]
+ [[\2]] lib ${lib})
+
if (NOT TARGET ${lib})
continue()
endif()
diff --git a/cmake/modules/FindShaderC.cmake b/cmake/modules/FindShaderC.cmake
new file mode 100644
index 0000000000..4dffb19bcc
--- /dev/null
+++ b/cmake/modules/FindShaderC.cmake
@@ -0,0 +1,41 @@
+include(FindPackageHandleStandardArgs)
+
+find_path(shaderc_INCLUDE_DIR "shaderc/shaderc.h")
+find_library(shaderc_combined_LIBRARY "shaderc_combined")
+find_library(shaderc_combined_DEBUG_LIBRARY "shaderc_combinedd")
+
+set(shaderc_combined_release_or_debug "${shaderc_combined_LIBRARY}")
+if (NOT shaderc_combined_release_or_debug)
+ set(shaderc_combined_release_or_debug "${shaderc_combined_DEBUG_LIBRARY}")
+endif()
+
+find_package_handle_standard_args(ShaderC DEFAULT_MSG
+ shaderc_combined_release_or_debug
+ shaderc_INCLUDE_DIR)
+
+if (ShaderC_FOUND)
+ add_library(shaderc_combined STATIC IMPORTED)
+ target_include_directories(shaderc_combined INTERFACE "${shaderc_INCLUDE_DIR}")
+
+ if (shaderc_combined_LIBRARY AND NOT shaderc_combined_DEBUG_LIBRARY)
+ # Only one un-suffixed lib found: ambiguous configuration,
+ # so import using the generic IMPORTED_LOCATION.
+ set_target_properties(shaderc_combined PROPERTIES
+ IMPORTED_LOCATION ${shaderc_combined_LIBRARY})
+ else()
+ # We found a lib with a debug suffix so we can disambiguate.
+ set(found_configurations)
+ if (shaderc_combined_LIBRARY)
+ set_target_properties(shaderc_combined PROPERTIES
+ IMPORTED_LOCATION_RELEASE "${shaderc_combined_LIBRARY}")
+ list(APPEND found_configurations Release)
+ endif()
+ if (shaderc_combined_DEBUG_LIBRARY)
+ set_target_properties(shaderc_combined PROPERTIES
+ IMPORTED_LOCATION_DEBUG "${shaderc_combined_DEBUG_LIBRARY}")
+ list(APPEND found_configurations Debug)
+ endif()
+ set_target_properties(shaderc_combined PROPERTIES
+ IMPORTED_CONFIGURATIONS "${found_configurations}")
+ endif()
+endif()
diff --git a/cmake/modules/FindSpirvReflect.cmake b/cmake/modules/FindSpirvReflect.cmake
new file mode 100644
index 0000000000..c563252b88
--- /dev/null
+++ b/cmake/modules/FindSpirvReflect.cmake
@@ -0,0 +1,54 @@
+include(FindPackageHandleStandardArgs)
+
+set(vulkan_sdk_source_path_hints)
+set(vulkan_sdk_lib_path_hints)
+if (DEFINED ENV{VULKAN_SDK})
+ list(APPEND vulkan_sdk_source_path_hints "$ENV{VULKAN_SDK}/source/SPIRV-Reflect")
+ list(APPEND vulkan_sdk_source_path_hints "$ENV{VULKAN_SDK}/include/SPIRV-Reflect")
+ list(APPEND vulkan_sdk_lib_path_hints "$ENV{VULKAN_SDK}/lib")
+endif()
+
+find_path(spirv-reflect_INCLUDE_DIR "spirv_reflect.h"
+ HINTS ${vulkan_sdk_source_path_hints})
+find_library(spirv-reflect_LIBRARY "spirv-reflect-static"
+ HINTS ${vulkan_sdk_lib_path_hints})
+
+# SPIRV-Reflect is distributed as a source and header file pair,
+# but can also be built as a static library.
+if (spirv-reflect_LIBRARY)
+ find_package_handle_standard_args(SpirvReflect DEFAULT_MSG
+ spirv-reflect_LIBRARY
+ spirv-reflect_INCLUDE_DIR)
+
+ if (SpirvReflect_FOUND)
+ add_library(spirv-reflect STATIC IMPORTED)
+ set_target_properties(spirv-reflect PROPERTIES IMPORTED_LOCATION "${spirv-reflect_LIBRARY}")
+ target_include_directories(spirv-reflect INTERFACE "${spirv-reflect_INCLUDE_DIR}")
+ set(SpirvReflect_IS_SOURCE_DEP FALSE)
+ endif()
+else()
+ find_file(spirv-reflect_SOURCE "spirv_reflect.c"
+ HINTS ${vulkan_sdk_source_path_hints})
+ find_package_handle_standard_args(SpirvReflect DEFAULT_MSG
+ spirv-reflect_SOURCE
+ spirv-reflect_INCLUDE_DIR)
+
+ if (SpirvReflect_FOUND)
+ add_library(spirv-reflect STATIC)
+ target_sources(spirv-reflect PRIVATE "${spirv-reflect_SOURCE}")
+ target_include_directories(spirv-reflect PUBLIC "${spirv-reflect_INCLUDE_DIR}")
+ set_target_properties(spirv-reflect PROPERTIES
+ ARCHIVE_OUTPUT_DIRECTORY "third_party")
+ set(SpirvReflect_IS_SOURCE_DEP TRUE)
+ endif()
+endif()
+
+if (SpirvReflect_FOUND AND NOT EXISTS "${spirv-reflect_INCLUDE_DIR}/include/spirv/unified1/spirv.h")
+ # Most probably not from the Vulkan SDK, so use a "system path."
+ # If installed from build_usd.py this will be found in the USD install path.
+ if (SpirvReflect_IS_SOURCE_DEP)
+ target_compile_definitions(spirv-reflect PUBLIC SPIRV_REFLECT_USE_SYSTEM_SPIRV_H)
+ else()
+ target_compile_definitions(spirv-reflect INTERFACE SPIRV_REFLECT_USE_SYSTEM_SPIRV_H)
+ endif()
+endif()
diff --git a/pxr/imaging/hgiVulkan/CMakeLists.txt b/pxr/imaging/hgiVulkan/CMakeLists.txt
index 00ad754480..dff4754366 100644
--- a/pxr/imaging/hgiVulkan/CMakeLists.txt
+++ b/pxr/imaging/hgiVulkan/CMakeLists.txt
@@ -40,15 +40,11 @@ pxr_library(hgiVulkan
shaderProgram
shaderSection
texture
- vk_mem_alloc
PUBLIC_HEADERS
api.h
vulkan.h
- PRIVATE_CLASSES
- spirv_reflect
-
RESOURCE_FILES
plugInfo.json
)
diff --git a/pxr/imaging/hgiVulkan/device.cpp b/pxr/imaging/hgiVulkan/device.cpp
index 4e5a9627ad..5c0b70ddcb 100644
--- a/pxr/imaging/hgiVulkan/device.cpp
+++ b/pxr/imaging/hgiVulkan/device.cpp
@@ -11,10 +11,12 @@
#include "pxr/imaging/hgiVulkan/hgi.h"
#include "pxr/imaging/hgiVulkan/instance.h"
#include "pxr/imaging/hgiVulkan/pipelineCache.h"
-#include "pxr/imaging/hgiVulkan/vk_mem_alloc.h"
#include "pxr/base/tf/diagnostic.h"
+#define VMA_IMPLEMENTATION
+#include <vk_mem_alloc.h>
+
PXR_NAMESPACE_OPEN_SCOPE
@@ -171,11 +173,9 @@ HgiVulkanDevice::HgiVulkanDevice(HgiVulkanInstance* instance)
// Allow certain buffers/images to have dedicated memory allocations to
// improve performance on some GPUs.
- bool dedicatedAllocations = false;
if (IsSupportedExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME)
&& IsSupportedExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME))
{
- dedicatedAllocations = true;
extensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
extensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);
}
@@ -335,9 +335,16 @@ HgiVulkanDevice::HgiVulkanDevice(HgiVulkanInstance* instance)
allocatorInfo.instance = instance->GetVulkanInstance();
allocatorInfo.physicalDevice = _vkPhysicalDevice;
allocatorInfo.device = _vkDevice;
- if (dedicatedAllocations) {
- allocatorInfo.flags |=VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT;
- }
+
+ // Enable to use Vulkan 1.3 at runtime
+ // With Vulkan 1.3, VMA would be able to apply more optimizations.
+ allocatorInfo.vulkanApiVersion = VK_API_VERSION_1_3;
+
+ // VMA will fill the other pointers itself.
+ VmaVulkanFunctions vmaVulkanFunctions{};
+ vmaVulkanFunctions.vkGetInstanceProcAddr = &vkGetInstanceProcAddr;
+ vmaVulkanFunctions.vkGetDeviceProcAddr = &vkGetDeviceProcAddr;
+ allocatorInfo.pVulkanFunctions = &vmaVulkanFunctions;
if (supportsMemExtension) {
allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT;
diff --git a/pxr/imaging/hgiVulkan/diagnostic.cpp b/pxr/imaging/hgiVulkan/diagnostic.cpp
index fb8d756d6d..455780e2c8 100644
--- a/pxr/imaging/hgiVulkan/diagnostic.cpp
+++ b/pxr/imaging/hgiVulkan/diagnostic.cpp
@@ -274,4 +274,4 @@ HgiVulkanResultString(VkResult result)
return string_VkResult(result);
}
-PXR_NAMESPACE_CLOSE_SCOPE
\ No newline at end of file
+PXR_NAMESPACE_CLOSE_SCOPE
diff --git a/pxr/imaging/hgiVulkan/sampler.cpp b/pxr/imaging/hgiVulkan/sampler.cpp
index e89235cd6f..01de3a85d0 100644
--- a/pxr/imaging/hgiVulkan/sampler.cpp
+++ b/pxr/imaging/hgiVulkan/sampler.cpp
@@ -12,7 +12,8 @@
#include "pxr/imaging/hgiVulkan/sampler.h"
#include "pxr/imaging/hgiVulkan/diagnostic.h"
-#include <float.h>
+#include <algorithm>
+#include <cfloat>
PXR_NAMESPACE_OPEN_SCOPE
@@ -104,4 +105,4 @@ HgiVulkanSampler::GetInflightBits()
return _inflightBits;
}
-PXR_NAMESPACE_CLOSE_SCOPE
\ No newline at end of file
+PXR_NAMESPACE_CLOSE_SCOPE
diff --git a/pxr/imaging/hgiVulkan/shaderCompiler.cpp b/pxr/imaging/hgiVulkan/shaderCompiler.cpp
index 333c2bf125..576b898a99 100644
--- a/pxr/imaging/hgiVulkan/shaderCompiler.cpp
+++ b/pxr/imaging/hgiVulkan/shaderCompiler.cpp
@@ -10,9 +10,9 @@
#include "pxr/imaging/hgiVulkan/device.h"
#include "pxr/imaging/hgiVulkan/diagnostic.h"
#include "pxr/imaging/hgiVulkan/shaderCompiler.h"
-#include "pxr/imaging/hgiVulkan/spirv_reflect.h"
#include <shaderc/shaderc.hpp>
+#include <spirv_reflect.h>
#include <unordered_map>
@@ -278,4 +278,4 @@ HgiVulkanMakeDescriptorSetLayouts(
return layouts;
}
-PXR_NAMESPACE_CLOSE_SCOPE
\ No newline at end of file
+PXR_NAMESPACE_CLOSE_SCOPE
diff --git a/pxr/imaging/hgiVulkan/spirv_reflect.cpp b/pxr/imaging/hgiVulkan/spirv_reflect.cpp
deleted file mode 100644
index b2862df17d..0000000000
--- a/pxr/imaging/hgiVulkan/spirv_reflect.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-//
-// Copyright 2023 Pixar
-//
-// Licensed under the terms set forth in the LICENSE.txt file available at
-// https://openusd.org/license.
-//
-#include "pxr/imaging/hgiVulkan/spirv_reflect.h"
-
-#include <SPIRV-Reflect/spirv_reflect.c>
diff --git a/pxr/imaging/hgiVulkan/spirv_reflect.h b/pxr/imaging/hgiVulkan/spirv_reflect.h
deleted file mode 100644
index b2779079a5..0000000000
--- a/pxr/imaging/hgiVulkan/spirv_reflect.h
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// Copyright 2023 Pixar
-//
-// Licensed under the terms set forth in the LICENSE.txt file available at
-// https://openusd.org/license.
-//
-#ifndef PXR_IMAGING_HGIVULKAN_SPIRV_REFLECT_H
-#define PXR_IMAGING_HGIVULKAN_SPIRV_REFLECT_H
-
-// This is an implementation of SPIRV-Reflect included
-// from the Vulkan SDK.
-
-#include <SPIRV-Reflect/spirv_reflect.h>
-
-#endif
diff --git a/pxr/imaging/hgiVulkan/vk_mem_alloc.cpp b/pxr/imaging/hgiVulkan/vk_mem_alloc.cpp
deleted file mode 100644
index 8f47ddc85f..0000000000
--- a/pxr/imaging/hgiVulkan/vk_mem_alloc.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-//
-// Copyright 2023 Pixar
-//
-// Licensed under the terms set forth in the LICENSE.txt file available at
-// https://openusd.org/license.
-//
-#include "pxr/imaging/hgiVulkan/vk_mem_alloc.h"
-
-#define VMA_IMPLEMENTATION
-#include <vma/vk_mem_alloc.h>
diff --git a/pxr/imaging/hgiVulkan/vk_mem_alloc.h b/pxr/imaging/hgiVulkan/vk_mem_alloc.h
deleted file mode 100644
index 48f5fceff2..0000000000
--- a/pxr/imaging/hgiVulkan/vk_mem_alloc.h
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// Copyright 2023 Pixar
-//
-// Licensed under the terms set forth in the LICENSE.txt file available at
-// https://openusd.org/license.
-//
-#ifndef PXR_IMAGING_HGIVULKAN_VK_MEM_ALLOC_H
-#define PXR_IMAGING_HGIVULKAN_VK_MEM_ALLOC_H
-
-// This is an implementation of VMA (Vulkan Memory Allocator) included
-// from the Vulkan SDK.
-
-#include <vma/vk_mem_alloc.h>
-
-#endif
diff --git a/pxr/imaging/hgiVulkan/vulkan.h b/pxr/imaging/hgiVulkan/vulkan.h
index 3ea215679f..7f28679328 100644
--- a/pxr/imaging/hgiVulkan/vulkan.h
+++ b/pxr/imaging/hgiVulkan/vulkan.h
@@ -22,7 +22,11 @@
#include <vulkan/vulkan.h>
-#include "pxr/imaging/hgiVulkan/vk_mem_alloc.h"
+#define VMA_STATIC_VULKAN_FUNCTIONS 1
+// Allow dynamic fetching too. This is a fallback for anything that doesn't
+// have a prototype.
+#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1
+#include <vk_mem_alloc.h>
// Use the default allocator (nullptr)
inline VkAllocationCallbacks*
From b8db3a3ed8dea771fdfa3103562f4f33976efd16 Mon Sep 17 00:00:00 2001
From: Aleksi Sapon <aleksi.sapon@autodesk.com>
Date: Tue, 22 Apr 2025 14:43:10 -0400
Subject: [PATCH 2/2] Add Vulkan dependencies to pxrConfig.cmake
---
cmake/defaults/Packages.cmake | 29 +++++++++++++++--------------
pxr/pxrConfig.cmake.in | 26 ++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 14 deletions(-)
diff --git a/cmake/defaults/Packages.cmake b/cmake/defaults/Packages.cmake
index 0a929fda3b..4d2658441e 100644
--- a/cmake/defaults/Packages.cmake
+++ b/cmake/defaults/Packages.cmake
@@ -188,23 +188,31 @@ if (PXR_BUILD_IMAGING)
if (PXR_ENABLE_VULKAN_SUPPORT)
message(STATUS "Enabling experimental feature Vulkan support")
+ # We use BUILD_LOCAL_INTERFACE so that the Vulkan dependencies remain
+ # internal only. Except for the headers, which are publicly accessible
+ # from hgiVulkan.
if (DEFINED ENV{VULKAN_SDK})
message(STATUS "Using Vulkan components from: \"$ENV{VULKAN_SDK}\"")
+ set(PXR_USING_VULKAN_SDK ON) # for pxrConfig.cmake
+
# Not using usd_build.py: find from the Vulkan SDK
find_package(Vulkan MODULE REQUIRED COMPONENTS shaderc_combined)
+ list(APPEND VULKAN_LIBS Vulkan::Headers)
# The SDK uniquely places the "vk_mem_alloc.h" header inside a "vma"
# subdirectory. This means we would need to use "#include <vma/vk_mem_alloc.h>"
# only for the SDK build. Instead of forcing non-SDK users to create
# this path, we'll add a another include directory for the SDK build.
# That way "#include <vk_mem_alloc.h>" should work for everyone.
- target_include_directories(Vulkan::Vulkan INTERFACE
+ target_include_directories(Vulkan::Headers INTERFACE
"${Vulkan_INCLUDE_DIR}/vma")
- list(APPEND VULKAN_LIBS Vulkan::Vulkan)
- list(APPEND VULKAN_LIBS Vulkan::shaderc_combined)
+ list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:Vulkan::Vulkan>)
+ list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:Vulkan::shaderc_combined>)
else()
message(STATUS "Using locally built Vulkan components")
+ set(PXR_USING_VULKAN_SDK OFF) # for pxrConfig.cmake
+
# Using usd_build.py: find individual components
find_package(VulkanHeaders CONFIG REQUIRED)
list(APPEND VULKAN_LIBS Vulkan::Headers)
@@ -213,30 +221,23 @@ if (PXR_BUILD_IMAGING)
list(APPEND VULKAN_LIBS Vulkan::UtilityHeaders)
find_package(VulkanLoader CONFIG REQUIRED)
- list(APPEND VULKAN_LIBS Vulkan::Loader)
+ list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:Vulkan::Loader>)
find_package(VulkanMemoryAllocator CONFIG REQUIRED)
list(APPEND VULKAN_LIBS GPUOpen::VulkanMemoryAllocator)
find_package(ShaderC MODULE REQUIRED)
- list(APPEND VULKAN_LIBS shaderc_combined)
+ list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:shaderc_combined>)
endif()
# In either case we have custom logic for SPIRV-Reflect
find_package(SpirvReflect MODULE REQUIRED)
- if(SpirvReflect_IS_SOURCE_DEP)
- # SPIRV-Reflect should not be installed nor exported
- list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:spirv-reflect>)
- else()
- list(APPEND VULKAN_LIBS spirv-reflect)
- endif()
+ list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:spirv-reflect>)
# Find the OS specific libs we need
if (UNIX AND NOT APPLE)
find_package(X11 REQUIRED)
- list(APPEND VULKAN_LIBS ${X11_LIBRARIES})
- elseif (WIN32)
- # No extra libs required
+ list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:X11::X11>)
endif()
add_definitions(-DPXR_VULKAN_SUPPORT_ENABLED)
diff --git a/pxr/pxrConfig.cmake.in b/pxr/pxrConfig.cmake.in
index a7e566bac2..07bd1ad412 100644
--- a/pxr/pxrConfig.cmake.in
+++ b/pxr/pxrConfig.cmake.in
@@ -90,6 +90,32 @@ if(@Imath_FOUND@)
find_dependency(Imath)
endif()
+if(@PXR_ENABLE_VULKAN_SUPPORT@)
+ if(@PXR_USING_VULKAN_SDK@)
+ if(NOT DEFINED Vulkan_DIR AND NOT [[@Vulkan_DIR@]] STREQUAL "")
+ set(Vulkan_DIR [[@Vulkan_DIR@]])
+ endif()
+ find_dependency(Vulkan)
+ if(Vulkan_FOUND)
+ target_include_directories(Vulkan::Headers INTERFACE
+ "${Vulkan_INCLUDE_DIR}/vma")
+ endif()
+ else()
+ if (NOT DEFINED VulkanHeaders_DIR AND NOT [[@VulkanHeaders_DIR@]] STREQUAL "")
+ set(VulkanHeaders_DIR [[@VulkanHeaders_DIR@]])
+ endif()
+ if (NOT DEFINED VulkanUtilityLibraries_DIR AND NOT [[@VulkanUtilityLibraries_DIR@]] STREQUAL "")
+ set(VulkanUtilityLibraries_DIR [[@VulkanUtilityLibraries_DIR@]])
+ endif()
+ if (NOT DEFINED VulkanMemoryAllocator_DIR AND NOT [[@VulkanMemoryAllocator_DIR@]] STREQUAL "")
+ set(VulkanMemoryAllocator_DIR [[@VulkanMemoryAllocator_DIR@]])
+ endif()
+ find_dependency(VulkanHeaders)
+ find_dependency(VulkanUtilityLibraries)
+ find_dependency(VulkanMemoryAllocator)
+ endif()
+endif()
+
include("${PXR_CMAKE_DIR}/cmake/pxrTargets.cmake")
if (TARGET usd_ms)
set(libs "usd_ms")

View File

@@ -0,0 +1,16 @@
diff --git a/pxr/imaging/hdSt/renderDelegate.cpp b/pxr/imaging/hdSt/renderDelegate.cpp
index 2e34715d2..329933383 100644
--- a/pxr/imaging/hdSt/renderDelegate.cpp
+++ b/pxr/imaging/hdSt/renderDelegate.cpp
@@ -541,7 +541,10 @@ HdStRenderDelegate::CommitResources(HdChangeTracker *tracker)
bool
HdStRenderDelegate::IsSupported()
{
- return Hgi::IsSupported();
+ // BLENDER: This doesn't take into account the backend, and fails for Vulkan
+ // because it defaults to OpenGL. Instead assume Blender already succeeded
+ // creating a relevant GPU device before using Storm.
+ return true;
}
TfTokenVector