Skip to content

Commit e4d9aec

Browse files
committed
build_usd.py now installs Vulkan dependencies
1 parent efe40e2 commit e4d9aec

File tree

13 files changed

+257
-61
lines changed

13 files changed

+257
-61
lines changed

build_scripts/build_usd.py

Lines changed: 116 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,6 +1661,86 @@ def InstallAnimX(context, force, buildArgs):
16611661

16621662
ANIMX = Dependency("AnimX", InstallAnimX, "include/animx.h")
16631663

1664+
############################################################
1665+
# Vulkan SDK components
1666+
VULKAN_SDK_VERSION = "1.3.296.0"
1667+
1668+
VULKAN_HEADERS_URL = f"https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/vulkan-sdk-{VULKAN_SDK_VERSION}.zip"
1669+
def InstallVulkanHeaders(context, force, buildArgs):
1670+
with CurrentWorkingDirectory(DownloadURL(VULKAN_HEADERS_URL, context, force, destFileName=f'Vulkan-Headers-{VULKAN_SDK_VERSION}.zip')):
1671+
extraArgs = buildArgs + [
1672+
'-DVULKAN_HEADERS_ENABLE_INSTALL=ON',
1673+
'-DVULKAN_HEADERS_ENABLE_MODULE=OFF',
1674+
'-DVULKAN_HEADERS_ENABLE_TESTS=OFF',
1675+
]
1676+
RunCMake(context, force, extraArgs)
1677+
1678+
VULKAN_HEADERS = Dependency("Vulkan-Headers", InstallVulkanHeaders, "include/vulkan/vulkan.h")
1679+
1680+
VULKAN_UTILITY_LIBRARIES_URL = f"https://github.com/KhronosGroup/Vulkan-Utility-Libraries/archive/refs/tags/vulkan-sdk-{VULKAN_SDK_VERSION}.zip"
1681+
def InstallVulkanUtilityLibraries(context, force, buildArgs):
1682+
with CurrentWorkingDirectory(DownloadURL(VULKAN_UTILITY_LIBRARIES_URL, context, force, destFileName=f'Vulkan-Utility-Libraries-{VULKAN_SDK_VERSION}.zip')):
1683+
extraArgs = buildArgs + [
1684+
'-DBUILD_TESTS=OFF',
1685+
]
1686+
RunCMake(context, force, extraArgs)
1687+
1688+
VULKAN_UTILITY_LIBRARIES = Dependency("Vulkan-Utility-Libraries", InstallVulkanUtilityLibraries, "include/vulkan/vk_enum_string_helper.h")
1689+
1690+
VULKAN_LOADER_URL = f"https://github.com/KhronosGroup/Vulkan-Loader/archive/refs/tags/vulkan-sdk-{VULKAN_SDK_VERSION}.zip"
1691+
def InstallLoaderVulkan(context, force, buildArgs):
1692+
with CurrentWorkingDirectory(DownloadURL(VULKAN_LOADER_URL, context, force, destFileName=f'Vulkan-Loader-{VULKAN_SDK_VERSION}.zip')):
1693+
extraArgs = buildArgs + [
1694+
f'-DVULKAN_HEADERS_INSTALL_DIR={context.instDir}',
1695+
'-DBUILD_TESTS=OFF',
1696+
'-UPDATE_DEPS=ON',
1697+
]
1698+
RunCMake(context, force, extraArgs)
1699+
1700+
VULKAN_LOADER = Dependency("Vulkan-Loader", InstallLoaderVulkan, "lib/cmake/VulkanLoader/VulkanLoaderConfig.cmake")
1701+
1702+
# The VulkanMemoryAllocator version should match the one used by VULKAN_SDK_VERSION
1703+
VULKAN_MEMORY_ALLOCATOR_VERSION = "3.2.1"
1704+
VULKAN_MEMORY_ALLOCATOR_URL = f"https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/refs/tags/v{VULKAN_MEMORY_ALLOCATOR_VERSION}.zip"
1705+
def InstallVulkanMemoryAllocator(context, force, buildArgs):
1706+
with CurrentWorkingDirectory(DownloadURL(VULKAN_MEMORY_ALLOCATOR_URL, context, force, destFileName=f'VulkanMemoryAllocator-{VULKAN_MEMORY_ALLOCATOR_VERSION}.zip')):
1707+
extraArgs = buildArgs + [
1708+
'-DVMA_ENABLE_INSTALL=ON',
1709+
'-DVMA_BUILD_SAMPLES=OFF',
1710+
'-DVMA_BUILD_DOCUMENTATION=OFF',
1711+
]
1712+
RunCMake(context, force, extraArgs)
1713+
1714+
VULKAN_MEMORY_ALLOCATOR = Dependency("VulkanMemoryAllocator", InstallVulkanMemoryAllocator, "include/vk_mem_alloc.h")
1715+
1716+
# The shaderc version should match the one used by VULKAN_SDK_VERSION
1717+
SHADERC_VERSION = "2024.3"
1718+
SHADERC_URL = f"https://github.com/google/shaderc/archive/refs/tags/v{SHADERC_VERSION}.zip"
1719+
def InstallShaderC(context, force, buildArgs):
1720+
with CurrentWorkingDirectory(DownloadURL(SHADERC_URL, context, force, destFileName=f'shaderc-{SHADERC_VERSION}.zip')):
1721+
Run(f'"{sys.executable}" utils/git-sync-deps')
1722+
PatchFile("third_party/CMakeLists.txt", [
1723+
('set( SKIP_GLSLANG_INSTALL ${SHADERC_SKIP_INSTALL} )\n',
1724+
'set( SKIP_GLSLANG_INSTALL ON )\n'),
1725+
('set( SKIP_SPIRV_TOOLS_INSTALL ${SHADERC_SKIP_INSTALL} )\n',
1726+
'set( SKIP_SPIRV_TOOLS_INSTALL ON )\n'),
1727+
('set( SKIP_GOOGLETEST_INSTALL ${SHADERC_SKIP_INSTALL} )\n',
1728+
'set( SKIP_GOOGLETEST_INSTALL ON} )\n'),
1729+
(' set(GLSLANG_ENABLE_INSTALL $<NOT:${SKIP_GLSLANG_INSTALL}>)\n',
1730+
' set(GLSLANG_ENABLE_INSTALL OFF)\n'),
1731+
])
1732+
extraArgs = buildArgs + [
1733+
'-DSHADERC_SKIP_INSTALL=OFF',
1734+
'-DSHADERC_SKIP_TESTS=ON',
1735+
'-DSHADERC_SKIP_EXAMPLES=ON',
1736+
'-DSHADERC_SKIP_COPYRIGHT_CHECK=ON',
1737+
'-DSHADERC_ENABLE_SHARED_CRT=ON',
1738+
'-DSHADERC_ENABLE_WGSL_OUTPUT=OFF',
1739+
]
1740+
RunCMake(context, force, extraArgs)
1741+
1742+
SHADERC = Dependency("shaderc", InstallShaderC, "include/shaderc/shaderc.h")
1743+
16641744

16651745
############################################################
16661746
# USD
@@ -2177,6 +2257,14 @@ def InstallUSD(context, force, buildArgs):
21772257
default=False, help="Enable Vulkan support")
21782258
subgroup.add_argument("--no-vulkan", dest="enable_vulkan", action="store_false",
21792259
help="Disable Vulkan support (default)")
2260+
group.add_argument("--use-vulkan-sdk", dest="use_vulkan_sdk", type=str,
2261+
nargs='?', default=None, const='',
2262+
help="Use the Vulkan SDK to build HgiVulkan, "
2263+
"otherwise the necessary components will be "
2264+
"installed automactically be the script. "
2265+
"The argument optionally takes a path to the "
2266+
"SDK root, otherwise the VULKAN_SDK environment "
2267+
"variable is required to be set.")
21802268

21812269
group = parser.add_argument_group(title="Imaging Plugin Options")
21822270
subgroup = group.add_mutually_exclusive_group()
@@ -2404,6 +2492,7 @@ def __init__(self, args):
24042492
self.enableVulkan = (self.buildImaging
24052493
and args.enable_vulkan
24062494
and not embedded)
2495+
self.useVuklanSDK = args.use_vulkan_sdk
24072496

24082497
# - USD Imaging
24092498
self.buildUsdImaging = (args.build_imaging == USD_IMAGING and
@@ -2520,6 +2609,24 @@ def ForceBuildDependency(self, dep):
25202609
if context.buildUsdview:
25212610
requiredDependencies += [PYOPENGL, PYSIDE]
25222611

2612+
if context.enableVulkan:
2613+
if context.useVuklanSDK is None:
2614+
# We don't want to use the Vulkan SDK, we build our own components.
2615+
os.environ.pop('VULKAN_SDK', None)
2616+
requiredDependencies += [VULKAN_HEADERS, VULKAN_UTILITY_LIBRARIES,
2617+
VULKAN_LOADER, VULKAN_MEMORY_ALLOCATOR,
2618+
SHADERC]
2619+
elif context.useVuklanSDK == '':
2620+
# We use the Vulkan SDK from the environment
2621+
if not 'VULKAN_SDK' in os.environ:
2622+
PrintError("Vulkan support cannot be enabled when VULKAN_SDK "
2623+
"environment variable is not set")
2624+
sys.exit(1)
2625+
context.useVuklanSDK = os.environ['VULKAN_SDK']
2626+
else:
2627+
# We use the Vulkan SDK from the command line
2628+
os.environ['VULKAN_SDK'] = context.useVuklanSDK
2629+
25232630
if context.buildAnimXTests:
25242631
requiredDependencies += [ANIMX]
25252632

@@ -2546,12 +2653,6 @@ def ForceBuildDependency(self, dep):
25462653
PrintError("Windows ARM64 builds require oneTBB. Enable via the --onetbb argument")
25472654
sys.exit(1)
25482655

2549-
# Error out if user enables Vulkan support but env var VULKAN_SDK is not set.
2550-
if context.enableVulkan and not 'VULKAN_SDK' in os.environ:
2551-
PrintError("Vulkan support cannot be enabled when VULKAN_SDK environment "
2552-
"variable is not set")
2553-
sys.exit(1)
2554-
25552656
if context.targetWasm:
25562657
if "--no-onetbb" in sys.argv:
25572658
PrintError("Wasm target requires oneTBB")
@@ -2776,6 +2877,14 @@ def _JoinVersion(v):
27762877
Embree support: {buildEmbree}
27772878
PRMan support: {buildPrman}
27782879
Vulkan support: {enableVulkan}
2880+
"""
2881+
2882+
if context.enableVulkan and context.useVuklanSDK:
2883+
summaryMsg += """\
2884+
Vulkan SDK: {useVuklanSDK}
2885+
"""
2886+
2887+
summaryMsg += """\
27792888
UsdImaging {buildUsdImaging}
27802889
usdview: {buildUsdview}
27812890
MaterialX support {buildMaterialX}
@@ -2866,6 +2975,7 @@ def FormatBuildArguments(buildArgs):
28662975
buildExamples=("On" if context.buildExamples else "Off"),
28672976
buildTutorials=("On" if context.buildTutorials else "Off"),
28682977
enableVulkan=("On" if context.enableVulkan else "Off"),
2978+
useVuklanSDK = context.useVuklanSDK,
28692979
buildTools=("On" if context.buildTools else "Off"),
28702980
buildUsdValidation=("On" if context.buildUsdValidation else "Off"),
28712981
buildAlembic=("On" if context.buildAlembic else "Off"),

cmake/defaults/Packages.cmake

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -199,22 +199,56 @@ if (PXR_BUILD_IMAGING)
199199
endif()
200200
if (PXR_ENABLE_VULKAN_SUPPORT)
201201
message(STATUS "Enabling experimental feature Vulkan support")
202-
if (EXISTS $ENV{VULKAN_SDK})
203-
find_package(Vulkan REQUIRED COMPONENTS shaderc_combined)
204-
list(APPEND VULKAN_LIBS Vulkan::Vulkan Vulkan::shaderc_combined)
205-
206-
# Find the OS specific libs we need
207-
if (UNIX AND NOT APPLE)
208-
find_package(X11 REQUIRED)
209-
list(APPEND VULKAN_LIBS ${X11_LIBRARIES})
210-
elseif (WIN32)
211-
# No extra libs required
212-
endif()
213202

214-
add_definitions(-DPXR_VULKAN_SUPPORT_ENABLED)
203+
# We use BUILD_LOCAL_INTERFACE so that the Vulkan dependencies remain
204+
# internal only. Except for the headers, which are publicly accessible
205+
# from hgiVulkan.
206+
if (DEFINED ENV{VULKAN_SDK})
207+
message(STATUS "Using Vulkan components from: \"$ENV{VULKAN_SDK}\"")
208+
set(PXR_USING_VULKAN_SDK ON) # for pxrConfig.cmake
209+
210+
# Not using usd_build.py: find from the Vulkan SDK
211+
find_package(Vulkan MODULE REQUIRED COMPONENTS shaderc_combined)
212+
213+
list(APPEND VULKAN_LIBS Vulkan::Headers)
214+
# The SDK uniquely places the "vk_mem_alloc.h" header inside a "vma"
215+
# subdirectory. This means we would need to use "#include <vma/vk_mem_alloc.h>"
216+
# only for the SDK build. Instead of forcing non-SDK users to create
217+
# this path, we'll add a another include directory for the SDK build.
218+
# That way "#include <vk_mem_alloc.h>" should work for everyone.
219+
target_include_directories(Vulkan::Headers INTERFACE
220+
"${Vulkan_INCLUDE_DIR}/vma")
221+
222+
list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:Vulkan::Vulkan>)
223+
list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:Vulkan::shaderc_combined>)
215224
else()
216-
message(FATAL_ERROR "VULKAN_SDK not valid")
225+
message(STATUS "Using locally built Vulkan components")
226+
set(PXR_USING_VULKAN_SDK OFF) # for pxrConfig.cmake
227+
228+
# Using usd_build.py: find individual components
229+
find_package(VulkanHeaders CONFIG REQUIRED)
230+
list(APPEND VULKAN_LIBS Vulkan::Headers)
231+
232+
find_package(VulkanUtilityLibraries CONFIG REQUIRED)
233+
list(APPEND VULKAN_LIBS Vulkan::UtilityHeaders)
234+
235+
find_package(VulkanLoader CONFIG REQUIRED)
236+
list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:Vulkan::Loader>)
237+
238+
find_package(VulkanMemoryAllocator CONFIG REQUIRED)
239+
list(APPEND VULKAN_LIBS GPUOpen::VulkanMemoryAllocator)
240+
241+
find_package(ShaderC MODULE REQUIRED)
242+
list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:shaderc_combined>)
243+
endif()
244+
245+
# Find the OS specific libs we need
246+
if (UNIX AND NOT APPLE)
247+
find_package(X11 REQUIRED)
248+
list(APPEND VULKAN_LIBS $<BUILD_LOCAL_INTERFACE:X11::X11>)
217249
endif()
250+
251+
add_definitions(-DPXR_VULKAN_SUPPORT_ENABLED)
218252
endif()
219253
# --Opensubdiv
220254
set(OPENSUBDIV_USE_GPU ${PXR_BUILD_GPU_SUPPORT})

cmake/modules/FindShaderC.cmake

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
include(FindPackageHandleStandardArgs)
2+
3+
find_path(shaderc_INCLUDE_DIR "shaderc/shaderc.h")
4+
find_library(shaderc_combined_LIBRARY "shaderc_combined")
5+
find_library(shaderc_combined_DEBUG_LIBRARY "shaderc_combinedd")
6+
7+
set(shaderc_combined_release_or_debug "${shaderc_combined_LIBRARY}")
8+
if (NOT shaderc_combined_release_or_debug)
9+
set(shaderc_combined_release_or_debug "${shaderc_combined_DEBUG_LIBRARY}")
10+
endif()
11+
12+
find_package_handle_standard_args(ShaderC DEFAULT_MSG
13+
shaderc_combined_release_or_debug
14+
shaderc_INCLUDE_DIR)
15+
16+
if (ShaderC_FOUND)
17+
add_library(shaderc_combined STATIC IMPORTED)
18+
target_include_directories(shaderc_combined INTERFACE "${shaderc_INCLUDE_DIR}")
19+
20+
if (shaderc_combined_LIBRARY AND NOT shaderc_combined_DEBUG_LIBRARY)
21+
# Only one un-suffixed lib found: ambiguous configuration,
22+
# so import using the generic IMPORTED_LOCATION.
23+
set_target_properties(shaderc_combined PROPERTIES
24+
IMPORTED_LOCATION ${shaderc_combined_LIBRARY})
25+
else()
26+
# We found a lib with a debug suffix so we can disambiguate.
27+
set(found_configurations)
28+
if (shaderc_combined_LIBRARY)
29+
set_target_properties(shaderc_combined PROPERTIES
30+
IMPORTED_LOCATION_RELEASE "${shaderc_combined_LIBRARY}")
31+
list(APPEND found_configurations Release)
32+
endif()
33+
if (shaderc_combined_DEBUG_LIBRARY)
34+
set_target_properties(shaderc_combined PROPERTIES
35+
IMPORTED_LOCATION_DEBUG "${shaderc_combined_DEBUG_LIBRARY}")
36+
list(APPEND found_configurations Debug)
37+
endif()
38+
set_target_properties(shaderc_combined PROPERTIES
39+
IMPORTED_CONFIGURATIONS "${found_configurations}")
40+
endif()
41+
endif()

pxr/imaging/hdSt/codeGen.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5324,8 +5324,8 @@ HdSt_CodeGen::_GenerateElementPrimvar()
53245324
// Don't need to codegen element primvars for frustum culling as they're
53255325
// unneeded. Including them can cause errors in Hgi backends like Vulkan,
53265326
// which needs the resource layout made in HgiVulkanResourceBindings to
5327-
// match the one generated by SPIRV-Reflect in HgiVulkanGraphicsPipeline
5328-
// when creating the VkPipelineLayout.
5327+
// match the one generated in HgiVulkanGraphicsPipeline when creating the
5328+
// VkPipelineLayout.
53295329
if (_geometricShader->IsFrustumCullingPass()) {
53305330
return;
53315331
}
@@ -6981,4 +6981,3 @@ HdSt_CodeGen::_GetFallbackScalarSwizzleString(TfToken const &returnType,
69816981
}
69826982

69836983
PXR_NAMESPACE_CLOSE_SCOPE
6984-

pxr/imaging/hgiVulkan/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ pxr_library(hgiVulkan
4141
shaderProgram
4242
shaderSection
4343
texture
44-
vk_mem_alloc
4544

4645
PUBLIC_HEADERS
4746
api.h

pxr/imaging/hgiVulkan/device.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
#include "pxr/imaging/hgiVulkan/hgi.h"
1212
#include "pxr/imaging/hgiVulkan/instance.h"
1313
#include "pxr/imaging/hgiVulkan/pipelineCache.h"
14-
#include "pxr/imaging/hgiVulkan/vk_mem_alloc.h"
1514

1615
#include "pxr/base/tf/diagnostic.h"
1716

17+
#define VMA_IMPLEMENTATION
18+
#include <vk_mem_alloc.h>
19+
1820

1921
PXR_NAMESPACE_OPEN_SCOPE
2022

@@ -179,11 +181,9 @@ HgiVulkanDevice::HgiVulkanDevice(HgiVulkanInstance* instance)
179181

180182
// Allow certain buffers/images to have dedicated memory allocations to
181183
// improve performance on some GPUs.
182-
bool dedicatedAllocations = false;
183184
if (IsSupportedExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME)
184185
&& IsSupportedExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME))
185186
{
186-
dedicatedAllocations = true;
187187
extensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
188188
extensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);
189189
}
@@ -400,9 +400,16 @@ HgiVulkanDevice::HgiVulkanDevice(HgiVulkanInstance* instance)
400400
allocatorInfo.instance = instance->GetVulkanInstance();
401401
allocatorInfo.physicalDevice = _vkPhysicalDevice;
402402
allocatorInfo.device = _vkDevice;
403-
if (dedicatedAllocations) {
404-
allocatorInfo.flags |=VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT;
405-
}
403+
404+
// Enable to use Vulkan 1.3 at runtime
405+
// With Vulkan 1.3, VMA would be able to apply more optimizations.
406+
allocatorInfo.vulkanApiVersion = VK_API_VERSION_1_3;
407+
408+
// VMA will fill the other pointers itself.
409+
VmaVulkanFunctions vmaVulkanFunctions{};
410+
vmaVulkanFunctions.vkGetInstanceProcAddr = &vkGetInstanceProcAddr;
411+
vmaVulkanFunctions.vkGetDeviceProcAddr = &vkGetDeviceProcAddr;
412+
allocatorInfo.pVulkanFunctions = &vmaVulkanFunctions;
406413

407414
if (supportsMemExtension) {
408415
allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT;

pxr/imaging/hgiVulkan/diagnostic.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,4 +300,4 @@ HgiVulkanResultString(VkResult result)
300300
return string_VkResult(result);
301301
}
302302

303-
PXR_NAMESPACE_CLOSE_SCOPE
303+
PXR_NAMESPACE_CLOSE_SCOPE

pxr/imaging/hgiVulkan/resourceBindings.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ HgiVulkanResourceBindings::HgiVulkanResourceBindings(
9898
uint32_t textureBindIndexStart = 0;
9999

100100
// XXX We need to overspecify the stage usage here so we can match the
101-
// VkDescriptorSetLayout that is created with spirv-reflect for the
102-
// graphics and compute pipelines.
101+
// VkDescriptorSetLayout that is created for the graphics and compute
102+
// pipelines.
103103
VkShaderStageFlags const bufferShaderStageFlags =
104104
HgiVulkanConversions::GetShaderStages(
105105
HgiShaderStageVertex | HgiShaderStageTessellationControl |
@@ -406,4 +406,4 @@ HgiVulkanResourceBindings::GetInflightBits()
406406
return _inflightBits;
407407
}
408408

409-
PXR_NAMESPACE_CLOSE_SCOPE
409+
PXR_NAMESPACE_CLOSE_SCOPE

pxr/imaging/hgiVulkan/sampler.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
#include "pxr/imaging/hgiVulkan/sampler.h"
1313
#include "pxr/imaging/hgiVulkan/diagnostic.h"
1414

15-
#include <float.h>
15+
#include <algorithm>
16+
#include <cfloat>
1617

1718
PXR_NAMESPACE_OPEN_SCOPE
1819

@@ -104,4 +105,4 @@ HgiVulkanSampler::GetInflightBits()
104105
return _inflightBits;
105106
}
106107

107-
PXR_NAMESPACE_CLOSE_SCOPE
108+
PXR_NAMESPACE_CLOSE_SCOPE

0 commit comments

Comments
 (0)