Add ktx
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
# Copyright 2015-2020 The Khronos Group Inc.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Code generation scripts that require a Vulkan SDK installation
|
||||
|
||||
# TODO: Rewrite scripts to generate the files from the Vulkan
|
||||
# registry, vk.xml, in the Vulkan-Docs repo.
|
||||
|
||||
# NOTE: Since this must be explicitly included by setting an option,
|
||||
# require sought packages. However, in order to give an informative
|
||||
# error, REQUIRED is not used in the find_* commands.
|
||||
#
|
||||
# CAUTION: Outputs of custom commands are deleted during a clean
|
||||
# operation so these targets result in clean deleting what are normally
|
||||
# considered source files. There appears to be no easy way to avoid
|
||||
# this. Since only project developers need to use these targets, and
|
||||
# only occasionally, this misfeature can be tolerated.
|
||||
|
||||
if (NOT IOS AND NOT ANDROID)
|
||||
# Not needed as local custom vulkan_core.h is used. Keeping
|
||||
# in case we go back to the standard one.
|
||||
# # find_package doesn't find the Vulkan SDK when building for IOS.
|
||||
# # I haven't investigated why.
|
||||
# find_package(Vulkan REQUIRED)
|
||||
|
||||
# This cmake file is included from its parent so has the same scope as
|
||||
# the including file. If we change Vulkan_INCLUDE_DIR, other parts will
|
||||
# be affected.
|
||||
set(mkvk_vulkan_include_dir external/dfdutils)
|
||||
else()
|
||||
# Skip mkvk. There is no need to use iOS or Android to regenerate
|
||||
# the files.
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(vulkan_header "${mkvk_vulkan_include_dir}/vulkan/vulkan_core.h")
|
||||
|
||||
# CAUTION: On Windows use a version of Perl built for Windows, i.e. not
|
||||
# one found in Cygwin or MSYS (Git for Windows). This is needed so the
|
||||
# generated files have the correct the correct CRLF line endings. The ones
|
||||
# mentioned write LF line endings (possibly related to some Cygwin or MSYS
|
||||
# installation setting for handling of text files). The Perl scripts,
|
||||
# unlike the Awk scripts, have not been modified to always write CRLF
|
||||
# on Windows.
|
||||
#
|
||||
# Strawberry Perl via Chocolatey is recommended.
|
||||
# choco install strawberryperl
|
||||
|
||||
#if(CMAKE_HOST_WIN32 AND NOT CYGWIN_INSTALL_PATH)
|
||||
# # Git for Windows comes with Perl
|
||||
# # Trick FindPerl into considering default Git location
|
||||
# set(CYGWIN_INSTALL_PATH "C:\\Program Files\\Git\\usr")
|
||||
#endif()
|
||||
|
||||
string(APPEND not_found_error
|
||||
"not found. "
|
||||
"This is only needed by project maintainers when regenerating source files. "
|
||||
"To silence, set KTX_GENERATE_VK_FILES OFF.")
|
||||
find_package(Perl QUIET)
|
||||
# Painful. Oh for a way to provide custom error messages for failures.
|
||||
if(NOT PERL_EXECUTABLE)
|
||||
message(FATAL_ERROR "Perl executable ${not_found_error}")
|
||||
endif()
|
||||
|
||||
set(Ruby_FIND_VIRTUALENV FIRST)
|
||||
find_package(Ruby 3 QUIET)
|
||||
if(NOT Ruby_EXECUTABLE)
|
||||
message(FATAL_ERROR "Ruby v3 executable ${not_found_error}")
|
||||
endif()
|
||||
|
||||
find_path(KTX_SPECIFICATION
|
||||
NAMES formats.json
|
||||
PATHS ${PROJECT_SOURCE_DIR}/../KTX-Specification
|
||||
NO_DEFAULT_PATH)
|
||||
if(NOT KTX_SPECIFICATION)
|
||||
message(FATAL_ERROR "KTX-Specification repo clone ${not_found_error}")
|
||||
endif()
|
||||
|
||||
list(APPEND mkvkformatfiles_input
|
||||
${vulkan_header}
|
||||
scripts/mkvkformatfiles)
|
||||
list(APPEND mkvkformatfiles_output
|
||||
"${PROJECT_SOURCE_DIR}/interface/java_binding/src/main/java/org/khronos/ktx/VkFormat.java"
|
||||
"${PROJECT_SOURCE_DIR}/interface/js_binding/vk_format.inl"
|
||||
"${PROJECT_SOURCE_DIR}/interface/python_binding/pyktx/vk_format.py"
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkformat_enum.h"
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkformat_typesize.c"
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkformat_check.c"
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkformat_str.c"
|
||||
"${PROJECT_SOURCE_DIR}tests/unittests/vkformat_list.inl")
|
||||
|
||||
# CAUTION: When a COMMAND contains VAR="Value" CMake messes up the escaping
|
||||
# for Bash. With or without VERBATIM, if Value has no spaces CMake changes it
|
||||
# to VAR=\"Value\". If it has spaces CMake changes it to "VAR=\"Value\"".
|
||||
# The first causes the quotes to leak into the command that is reading VAR
|
||||
# breaking, e.g. opening a file that has VAR's value as part of its name.
|
||||
# The second causes Bash to look for the command 'VAR="Value"' causing it
|
||||
# to exit with error.
|
||||
#
|
||||
# The only workaround I've found is to put the command in a string and invoke
|
||||
# it with bash -c. This is what we'd have to do on Windows anyway as COMMAND
|
||||
# defaults to cmd or powershell (not sure which). In this case CMake passes
|
||||
# to bash a string of the form '"VAR=\"Value\" command arg ..."' which bash
|
||||
# parses successfully.
|
||||
|
||||
list(APPEND mvffc_as_list
|
||||
scripts/mkvkformatfiles ./ ${vulkan_header})
|
||||
list(JOIN mvffc_as_list " " mvffc_as_string)
|
||||
set(mkvkformatfiles_command "${BASH_EXECUTABLE}" -c "${mvffc_as_string}")
|
||||
|
||||
add_custom_command(OUTPUT ${mkvkformatfiles_output}
|
||||
COMMAND ${mkvkformatfiles_command}
|
||||
DEPENDS ${mkvkformatfiles_input}
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
COMMENT "Generating VkFormat-related source files"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_custom_target(mkvkformatfiles
|
||||
DEPENDS ${mkvkformatfiles_output}
|
||||
SOURCES ${mkvkformatfiles_input}
|
||||
)
|
||||
|
||||
list(APPEND makevk2dfd_input
|
||||
${vulkan_header}
|
||||
external/dfdutils/makevk2dfd.pl)
|
||||
set(makevk2dfd_output
|
||||
"${PROJECT_SOURCE_DIR}/external/dfdutils/vk2dfd.inl")
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${makevk2dfd_output}
|
||||
COMMAND "${PERL_EXECUTABLE}" external/dfdutils/makevk2dfd.pl ${vulkan_header} external/dfdutils/vk2dfd.inl
|
||||
DEPENDS ${makevk2dfd_input}
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
COMMENT "Generating VkFormat/DFD switch body"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_custom_target(makevk2dfd
|
||||
DEPENDS ${makevk2dfd_output}
|
||||
SOURCES ${makevk2dfd_input}
|
||||
)
|
||||
|
||||
|
||||
list(APPEND makedfd2vk_input
|
||||
${vulkan_header}
|
||||
external/dfdutils/makedfd2vk.pl)
|
||||
list(APPEND makedfd2vk_output
|
||||
"${PROJECT_SOURCE_DIR}/external/dfdutils/dfd2vk.inl")
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${makedfd2vk_output}
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory external/dfdutils
|
||||
COMMAND "${PERL_EXECUTABLE}" external/dfdutils/makedfd2vk.pl ${vulkan_header} external/dfdutils/dfd2vk.inl
|
||||
DEPENDS ${makedfd2vk_input}
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
COMMENT "Generating DFD/VkFormat switch body"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_custom_target(makedfd2vk
|
||||
DEPENDS ${makedfd2vk_output}
|
||||
SOURCES ${makedfd2vk_input}
|
||||
)
|
||||
|
||||
list(APPEND makevk2gl_input
|
||||
${KTX_SPECIFICATION}/generate_format_switches.rb
|
||||
${KTX_SPECIFICATION}/formats.json)
|
||||
list(APPEND makevk2gl_output
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkFormat2glFormat.inl"
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkFormat2glInternalFormat.inl"
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkFormat2glType.inl")
|
||||
# Until we have D3D or Metal loaders these outputs of
|
||||
# generate_format_switches.rb are unneeded.
|
||||
list(APPEND makevk2gl_extraneous_files
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkFormat2dxgiFormat.inl"
|
||||
"${PROJECT_SOURCE_DIR}/lib/vkFormat2mtlFormat.inl"
|
||||
)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${makevk2gl_output}
|
||||
COMMAND "${RUBY_EXECUTABLE}" ${KTX_SPECIFICATION}/generate_format_switches.rb ${PROJECT_SOURCE_DIR}/lib
|
||||
COMMAND ${CMAKE_COMMAND} -E rm -f ${makevk2gl_extraneous_files}
|
||||
DEPENDS ${makevk2gl_input}
|
||||
WORKING_DIRECTORY ${KTX_SPECIFICATION}
|
||||
COMMENT "Generating VkFormat to OpenGL internal format, format and type switches"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_custom_target(makevk2gl
|
||||
DEPENDS ${makevk2gl_output}
|
||||
SOURCES ${makedvk2gl_input}
|
||||
)
|
||||
|
||||
add_custom_target(mkvk SOURCES ${CMAKE_CURRENT_LIST_FILE})
|
||||
|
||||
add_dependencies(mkvk
|
||||
mkvkformatfiles
|
||||
makevk2dfd
|
||||
makedfd2vk
|
||||
makevk2gl
|
||||
)
|
||||
Reference in New Issue
Block a user