Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ jobs:
python-version: '3.11'
- name: Install jsonschema
run: python3 -m pip install jsonschema
- name: Install pyparsing
run: python3 -m pip install pyparsing
- name: Install pyinstaller
run: python3 -m pip install pyinstaller
- name: Install Dependencies
Expand Down Expand Up @@ -79,8 +81,12 @@ jobs:
- uses: actions/setup-python@v7
with:
python-version: '3.11'
- name: pip update
run: python3 -m pip install --upgrade pip
- name: Install jsonschema
run: python3 -m pip install jsonschema
- name: Install pyparsing
run: python3 -m pip install pyparsing
- name: Install pyinstaller
run: python3 -m pip install pyinstaller
- name: Setup ccache
Expand Down Expand Up @@ -120,6 +126,8 @@ jobs:
python-version: '3.11'
- name: Install jsonschema
run: python3 -m pip install jsonschema
- name: Install pyparsing
run: python3 -m pip install pyparsing
- name: Install pyinstaller
run: python3 -m pip install pyinstaller
- uses: lukka/get-cmake@latest
Expand Down
6 changes: 3 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,6 @@ scripts/source/vulkan_object.py
scripts/source/base_generator.py
scripts/source/vk.xml
scripts/profiles.spec
profiles.spec
scripts/profiles
scripts/profiles.exe
vkprofiles.spec
scripts/vkprofiles
scripts/vkprofiles.exe
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,19 @@

### Features:
- Implement `VK_NO_PROTOTYPES` support #734
- Add `vkprofiles` executable which bundles the python scripts in a standalone executable
- Validate profiles JSON file with `validate` command
- Generate profiles schema file with `schema` command

### Improvements:
- Improve profiles schema to support capabilities dynamic structures
- Optimize profiles schema to avoid duplicated values

### Deprecation:
- `gen_profiles*.py` file are all deprecated and replaced by `vkprofiles`
- Require Vulkan 1.1

## [Vulkan Profiles Tools 1.4.356](https://github.com/KhronosGroup/Vulkan-Profiles/tree/sdk-1.4.356.0) - July 2026
## [Vulkan Profiles Tools 1.4.357](https://github.com/KhronosGroup/Vulkan-Profiles/tree/sdk-1.4.357.0) - July 2026

### Features:
- Add `profiles.py` python script, to pull dependent extensions into a source profiles file (ALPHA)
Expand Down
120 changes: 100 additions & 20 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,38 @@ set(MERGE_SCRIPT ${PROJECT_SOURCE_DIR}/scripts/gen_profiles_file.py)
set(SOLUTION_SCRIPT ${PROJECT_SOURCE_DIR}/scripts/gen_profiles_solution.py)
set(PROFILES_SCRIPT ${PROJECT_SOURCE_DIR}/scripts/profiles.py)

find_package(Python3 REQUIRED COMPONENTS Interpreter)
# We need Python 3.10 or better to use pyinstaller 6.
find_package(Python3 3.10 REQUIRED COMPONENTS Interpreter)

# Some Python-based build operations (e.g. turning a Python script into a standalone
# executable) require custom Python modules. Here we'll create a custom
# Python virtual environment with the modules we need.
set(VENV_DIR "${CMAKE_CURRENT_BINARY_DIR}/python-venv")
if(WIN32)
set(VENV_PYTHON_EXECUTABLE "${VENV_DIR}/Scripts/python.exe")
else()
set(VENV_PYTHON_EXECUTABLE "${VENV_DIR}/bin/python3")
endif()

# VENV_STAMP is used as a dependency for any target using the venv, to ensure
# that if the venv's dependencies are changed, the venv will be updated.
set(VENV_STAMP "${VENV_DIR}/venv.stamp")

add_custom_command(
OUTPUT "${VENV_STAMP}"
COMMAND ${Python3_EXECUTABLE} -m venv "${VENV_DIR}"
COMMAND "${VENV_PYTHON_EXECUTABLE}" -m pip install --no-cache-dir -r "${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
COMMAND ${CMAKE_COMMAND} -E touch "${VENV_STAMP}"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/requirements.txt"
COMMENT "Creating Python virtual environment and installing dependencies..."
VERBATIM
)

# This target works in subdirectories as a dependency.
add_custom_target(python_venv DEPENDS "${VENV_STAMP}")

# ==============================================================================

find_package(VulkanHeaders REQUIRED CONFIG QUIET)
find_package(VulkanUtilityLibraries REQUIRED CONFIG QUIET)
find_package(valijson REQUIRED CONFIG)
Expand All @@ -69,7 +100,59 @@ endif()
set(PROFILES_SCHEMA_FILENAME "profiles-0.8-latest.json")

# Generate profiles executable
set(OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/scripts")
function(add_pyinstaller_target TARGET_NAME)
# Define the arguments the function accepts
set(options)
set(oneValueArgs SCRIPT OUTPUT_DIR FOLDER OUTPUT_NAME)
set(multiValueArgs DEPENDS PATHS)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

if(NOT ARG_SCRIPT)
message(FATAL_ERROR "add_pyinstaller_target: SCRIPT argument is required for target ${TARGET_NAME}")
endif()

if(NOT ARG_OUTPUT_DIR)
set(ARG_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}")
endif()

if(NOT ARG_OUTPUT_NAME)
set(ARG_OUTPUT_NAME "${TARGET_NAME}")
endif()

# Handle OS-specific executable extension
if(WIN32)
set(EXE_NAME "${ARG_OUTPUT_NAME}.exe")
else()
set(EXE_NAME "${ARG_OUTPUT_NAME}")
endif()
set(FINAL_EXECUTABLE "${ARG_OUTPUT_DIR}/${EXE_NAME}")

set(PYINSTALLER_PATH_FLAGS)
foreach(p ${ARG_PATHS})
list(APPEND PYINSTALLER_PATH_FLAGS "--paths" "${p}")
endforeach()

# Generate the executable via PyInstaller using the VENV python executable
add_custom_command(
OUTPUT "${FINAL_EXECUTABLE}"
COMMAND "${VENV_PYTHON_EXECUTABLE}" -m PyInstaller --onefile --clean ${PYINSTALLER_PATH_FLAGS} --name "${ARG_OUTPUT_NAME}" --distpath "${ARG_OUTPUT_DIR}" "${ARG_SCRIPT}"
DEPENDS ${ARG_DEPENDS} python_venv
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Packaging ${TARGET_NAME} into a standalone executable..."
VERBATIM
)

# Create the custom target to hook into the build system
add_custom_target(
${TARGET_NAME}
DEPENDS "${FINAL_EXECUTABLE}"
)

# Set IDE folder property if provided
if(ARG_FOLDER)
set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "${ARG_FOLDER}")
endif()
endfunction()

set(PYTHON_DEPENDENCIES
"${PROFILES_SCRIPT}"
Expand All @@ -83,30 +166,27 @@ set(PYTHON_DEPENDENCIES
"${CMAKE_CURRENT_SOURCE_DIR}/scripts/source/vulkan_object_version.py"
)

if(WIN32)
set(EXE_NAME "profiles.exe")
else()
set(EXE_NAME "profiles")
if(VULKAN_HEADERS_INSTALL_DIR)
set(VULKAN_REGISTRY_DIR "${VULKAN_HEADERS_INSTALL_DIR}/registry")
set(VULKAN_REGISTRY_SHARE_DIR "${VULKAN_HEADERS_INSTALL_DIR}/share/vulkan/registry")
elseif(TARGET Vulkan::Registry)
get_target_property(VULKAN_REGISTRY_DIR Vulkan::Registry INTERFACE_INCLUDE_DIRECTORIES)
set(VULKAN_REGISTRY_SHARE_DIR "${VULKAN_REGISTRY_DIR}")
endif()
set(FINAL_EXECUTABLE "${OUTPUT_DIR}/${EXE_NAME}")

add_custom_command(
OUTPUT "${FINAL_EXECUTABLE}"
COMMAND ${Python3_EXECUTABLE} -m PyInstaller --onefile --distpath "${OUTPUT_DIR}" "${PROFILES_SCRIPT}"
add_pyinstaller_target(VpProfilesProcessor
OUTPUT_NAME "vkprofiles"
SCRIPT "${PROFILES_SCRIPT}"
OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/scripts"
PATHS
"${VULKAN_REGISTRY_DIR}"
"${VULKAN_REGISTRY_SHARE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/scripts/source"
DEPENDS ${PYTHON_DEPENDENCIES}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Packaging profiles.py into a standalone executable..."
VERBATIM
FOLDER "Profiles generator"
)

add_custom_target(
profiles
DEPENDS "${FINAL_EXECUTABLE}"
)
set_target_properties(profiles PROPERTIES FOLDER "Profiles generator")

# The profiles directory regenerates the Profiles source and headers.
add_subdirectory(profiles)
add_subdirectory(library)
add_subdirectory(layer)

10 changes: 7 additions & 3 deletions layer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -168,21 +168,24 @@ if(ANDROID)
endif()

add_custom_target(VpLayer_generate ALL
COMMAND Python3::Interpreter ${LAYER_PYTHON_SCRIPT}
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry"
${VENV_PYTHON_EXECUTABLE} ${LAYER_PYTHON_SCRIPT}
--api ${API_TYPE}
--registry ${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/vk.xml
--out-layer ${CMAKE_SOURCE_DIR}/layer/profiles_generated.cpp
VERBATIM
SOURCES ${LAYER_PYTHON_SCRIPT}
DEPENDS ${LAYER_PYTHON_SCRIPT}
${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/vk.xml
${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/video.xml)
${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/video.xml
python_venv)
set_target_properties(VpLayer_generate PROPERTIES FOLDER "Profiles layer")
add_dependencies(ProfilesLayer VpLayer_generate)

source_group("Python Files" FILES ${TESTS_PYTHON_SCRIPT})
add_custom_target(VpLayer_generate_tests ALL
COMMAND Python3::Interpreter ${TESTS_PYTHON_SCRIPT}
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry"
${VENV_PYTHON_EXECUTABLE} ${TESTS_PYTHON_SCRIPT}
--api ${API_TYPE}
--registry ${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/vk.xml
--out-profile ${CMAKE_SOURCE_DIR}/profiles/test/data/VP_LUNARG_test_api_generated.json
Expand All @@ -192,6 +195,7 @@ add_custom_target(VpLayer_generate_tests ALL
DEPENDS ${TESTS_PYTHON_SCRIPT}
ProfilesLayer
VpLayer_generate
python_venv
)
set_target_properties(VpLayer_generate_tests PROPERTIES FOLDER "Profiles layer")

Expand Down
2 changes: 1 addition & 1 deletion layer/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ function(LayerTestAndroid NAME)
vktestframework.cpp)

add_test(NAME ${ANDROID_APK_NAME} COMMAND profiles_${NAME})
add_dependencies(${ANDROID_APK_NAME} ProfilesLayer VpCreateDesktopBaseline)
add_dependencies(${ANDROID_APK_NAME} ProfilesLayer VpGenerate-Libraries)

if (NOT ANDROID_SDK_HOME)
set(ANDROID_SDK_HOME $ENV{ANDROID_SDK_HOME})
Expand Down
28 changes: 14 additions & 14 deletions library/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ else()
endif()

add_custom_target(VpLibrary_test_generated_library
COMMAND Python3::Interpreter ${SOLUTION_SCRIPT}
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry"
${VENV_PYTHON_EXECUTABLE} ${SOLUTION_SCRIPT}
--api ${API_TYPE}
--registry ${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/vk.xml
--input ${PROJECT_SOURCE_DIR}/library/test/profiles
Expand All @@ -35,11 +36,10 @@ add_custom_target(VpLibrary_test_generated_library
VERBATIM
SOURCES ${SOLUTION_SCRIPT} ${CMAKE_CURRENT_LIST_DIR}/profiles
DEPENDS ${SOLUTION_SCRIPT} ${CMAKE_CURRENT_LIST_DIR}/profiles
${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/vk.xml)

${VULKAN_HEADERS_INSTALL_DIR}/${CMAKE_INSTALL_DATADIR}/vulkan/registry/vk.xml
python_venv)
set_target_properties(VpLibrary_test_generated_library PROPERTIES FOLDER "Profiles API library")

add_dependencies(VpLibrary_test_generated_library VpGenerated)
add_dependencies(VpLibrary_test_generated_library VpGenerate-Libraries)

# The release source is in ../source/vulkan_profiles.cpp, but the debug source (with
# verbose messages during profile validation) is in ../source/debug/vulkan_profiles.cpp.
Expand All @@ -57,7 +57,7 @@ function(add_unit_test NAME)
target_compile_definitions(${TEST_NAME_HO} PUBLIC "VK_ENABLE_BETA_EXTENSIONS=1")
target_include_directories(${TEST_NAME_HO} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME_HO} PRIVATE ${test_libraries})
add_dependencies(${TEST_NAME_HO} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME_HO} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME_HO} COMMAND ${TEST_NAME_HO} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME_HO} PROPERTIES FOLDER "Profiles API library")

Expand All @@ -69,7 +69,7 @@ function(add_unit_test NAME)
target_compile_definitions(${TEST_NAME_WS} PUBLIC "VK_ENABLE_BETA_EXTENSIONS=1")
target_include_directories(${TEST_NAME_WS} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME_WS} PRIVATE ${test_libraries})
add_dependencies(${TEST_NAME_WS} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME_WS} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME_WS} COMMAND ${TEST_NAME_WS} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME_WS} PROPERTIES FOLDER "Profiles API library")
endfunction(add_unit_test)
Expand All @@ -87,7 +87,7 @@ function(add_unit_test_object NAME)
target_compile_definitions(${TEST_NAME_HO} PUBLIC "VP_USE_OBJECT=1")
target_include_directories(${TEST_NAME_HO} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME_HO} PRIVATE ${test_libraries})
add_dependencies(${TEST_NAME_HO} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME_HO} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME_HO} COMMAND ${TEST_NAME_HO} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME_HO} PROPERTIES FOLDER "Profiles API library")

Expand All @@ -100,7 +100,7 @@ function(add_unit_test_object NAME)
target_compile_definitions(${TEST_NAME_WS} PUBLIC "VP_USE_OBJECT=1")
target_include_directories(${TEST_NAME_WS} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME_WS} PRIVATE ${test_libraries})
add_dependencies(${TEST_NAME_WS} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME_WS} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME_WS} COMMAND ${TEST_NAME_WS} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME_WS} PROPERTIES FOLDER "Profiles API library")
endfunction(add_unit_test_object)
Expand Down Expand Up @@ -174,7 +174,7 @@ function (add_unit_test_simple_android_apk NAME)
create_android_package(${TEST_NAME_HO})

target_include_directories(${TEST_NAME_HO} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
add_dependencies(${TEST_NAME_HO} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME_HO} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME_HO} COMMAND ${TEST_NAME_HO} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME_HO} PROPERTIES FOLDER "Profiles API library")
endfunction(add_unit_test_simple_android_apk)
Expand All @@ -193,7 +193,7 @@ function(add_unit_test_simple NAME)
endif()
target_include_directories(${TEST_NAME_HO} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME_HO} PRIVATE ${test_libraries})
add_dependencies(${TEST_NAME_HO} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME_HO} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME_HO} COMMAND ${TEST_NAME_HO} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME_HO} PROPERTIES FOLDER "Profiles API library")
endfunction(add_unit_test_simple)
Expand All @@ -211,7 +211,7 @@ function(add_unit_test_with_debug_messages_variant NAME)
endif()
target_include_directories(${TEST_NAME} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME} PRIVATE ${test_libraries})
add_dependencies(${TEST_NAME} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME} PROPERTIES FOLDER "Profiles API library")

Expand All @@ -222,7 +222,7 @@ function(add_unit_test_with_debug_messages_variant NAME)
target_compile_definitions(${TEST_NAME_DEBUG_MESSAGES} PUBLIC "WITH_DEBUG_MESSAGES=1")
target_include_directories(${TEST_NAME_DEBUG_MESSAGES} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME_DEBUG_MESSAGES} PRIVATE ${test_libraries})
add_dependencies(${TEST_NAME_DEBUG_MESSAGES} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME_DEBUG_MESSAGES} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME_DEBUG_MESSAGES} COMMAND ${TEST_NAME_DEBUG_MESSAGES} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME_DEBUG_MESSAGES} PROPERTIES FOLDER "Profiles API library")
endfunction(add_unit_test_with_debug_messages_variant)
Expand All @@ -248,7 +248,7 @@ function(add_unit_test_no_prototypes NAME)
target_compile_definitions(${TEST_NAME} PUBLIC "VK_ENABLE_BETA_EXTENSIONS=1")
target_include_directories(${TEST_NAME} PUBLIC "${vulkan-headers_SOURCE_DIR}/include")
target_link_libraries(${TEST_NAME} PRIVATE GTest::gtest GTest::gtest_main Vulkan::Headers Vulkan::Profiles Vulkan::CompilerConfiguration Vulkan::CompilerConfigurationExtra)
add_dependencies(${TEST_NAME} VpGenerated VpLibrary_test_generated_library)
add_dependencies(${TEST_NAME} VpGenerate-Libraries VpLibrary_test_generated_library)
add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME} --gtest_catch_exceptions=0)
set_target_properties(${TEST_NAME} PROPERTIES FOLDER "Profiles API library")
endfunction()
Expand Down
Loading
Loading