Skip to content

Commit

Permalink
Use upstream interface for SPIRV-Headers
Browse files Browse the repository at this point in the history
  • Loading branch information
alexreinking committed Jun 5, 2024
1 parent c3cfcb3 commit 0412407
Show file tree
Hide file tree
Showing 13 changed files with 256 additions and 50 deletions.
4 changes: 0 additions & 4 deletions dependencies/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,5 @@

add_subdirectory(llvm)

if (TARGET_SPIRV)
add_subdirectory(spirv)
endif()

# Needs cache vars set by llvm, do not reorder.
add_subdirectory(wasm)
20 changes: 20 additions & 0 deletions dependencies/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Dependencies

# LLVM / WASM

These are our build wrappers for LLVM and WASM code.

# SPIR-V

This folder contains a copy of the officially released v1.6 ANSI-C header
file for [SPIR-V], obtained from the `sdk-1.3.231` branch
of https://github.com/KhronosGroup/SPIRV-Headers.

The directory structure within this folder matches that of the official
version's install tree, plus the upstream LICENSE notice.

The `update-spirv.sh` script will automatically acquire the upstream repo,
build it, and extract the necessary headers and CMake configuration files.
It takes a single argument, the name of the branch to clone.

[SPIR-V]: https://www.khronos.org/registry/spir-v/
3 changes: 0 additions & 3 deletions dependencies/spirv/CMakeLists.txt

This file was deleted.

File renamed without changes.
38 changes: 0 additions & 38 deletions dependencies/spirv/README.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2574,3 +2574,4 @@ inline void SpvHasResultAndType(SpvOp opcode, bool *hasResult, bool *hasResultTy
#endif /* SPV_ENABLE_UTILITY_CODE */

#endif

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@

####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was Config.cmake.in ########

get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)

macro(set_and_check _var _file)
set(${_var} "${_file}")
if(NOT EXISTS "${_file}")
message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
endif()
endmacro()

macro(check_required_components _NAME)
foreach(comp ${${_NAME}_FIND_COMPONENTS})
if(NOT ${_NAME}_${comp}_FOUND)
if(${_NAME}_FIND_REQUIRED_${comp})
set(${_NAME}_FOUND FALSE)
endif()
endif()
endforeach()
endmacro()

####################################################################################

include("${CMAKE_CURRENT_LIST_DIR}/SPIRV-HeadersTargets.cmake")
check_required_components("SPIRV-Headers")
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# This is a basic version file for the Config-mode of find_package().
# It is used by write_basic_package_version_file() as input file for configure_file()
# to create a version-file which can be installed along a config.cmake file.
#
# The created file sets PACKAGE_VERSION_EXACT if the current version string and
# the requested version string are exactly the same and it sets
# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,
# but only if the requested major version is the same as the current one.
# The variable CVF_VERSION must be set before calling configure_file().


set(PACKAGE_VERSION "1.5.5")

if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()

if("1.5.5" MATCHES "^([0-9]+)\\.")
set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
endif()
else()
set(CVF_VERSION_MAJOR "1.5.5")
endif()

if(PACKAGE_FIND_VERSION_RANGE)
# both endpoints of the range must have the expected major version
math (EXPR CVF_VERSION_MAJOR_NEXT "${CVF_VERSION_MAJOR} + 1")
if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR)
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT)))
set(PACKAGE_VERSION_COMPATIBLE FALSE)
elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX)
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX)))
set(PACKAGE_VERSION_COMPATIBLE TRUE)
else()
set(PACKAGE_VERSION_COMPATIBLE FALSE)
endif()
else()
if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR)
set(PACKAGE_VERSION_COMPATIBLE TRUE)
else()
set(PACKAGE_VERSION_COMPATIBLE FALSE)
endif()

if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()
endif()


Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Generated by CMake

if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8)
message(FATAL_ERROR "CMake >= 2.8.0 required")
endif()
if(CMAKE_VERSION VERSION_LESS "3.0.0")
message(FATAL_ERROR "CMake >= 3.0.0 required")
endif()
cmake_policy(PUSH)
cmake_policy(VERSION 3.0.0...3.27)
#----------------------------------------------------------------
# Generated CMake target import file.
#----------------------------------------------------------------

# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)

# Protect against multiple inclusion, which would fail when already imported targets are added once more.
set(_cmake_targets_defined "")
set(_cmake_targets_not_defined "")
set(_cmake_expected_targets "")
foreach(_cmake_expected_target IN ITEMS SPIRV-Headers::SPIRV-Headers)
list(APPEND _cmake_expected_targets "${_cmake_expected_target}")
if(TARGET "${_cmake_expected_target}")
list(APPEND _cmake_targets_defined "${_cmake_expected_target}")
else()
list(APPEND _cmake_targets_not_defined "${_cmake_expected_target}")
endif()
endforeach()
unset(_cmake_expected_target)
if(_cmake_targets_defined STREQUAL _cmake_expected_targets)
unset(_cmake_targets_defined)
unset(_cmake_targets_not_defined)
unset(_cmake_expected_targets)
unset(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)
return()
endif()
if(NOT _cmake_targets_defined STREQUAL "")
string(REPLACE ";" ", " _cmake_targets_defined_text "${_cmake_targets_defined}")
string(REPLACE ";" ", " _cmake_targets_not_defined_text "${_cmake_targets_not_defined}")
message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_cmake_targets_defined_text}\nTargets not yet defined: ${_cmake_targets_not_defined_text}\n")
endif()
unset(_cmake_targets_defined)
unset(_cmake_targets_not_defined)
unset(_cmake_expected_targets)


# Compute the installation prefix relative to this file.
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
if(_IMPORT_PREFIX STREQUAL "/")
set(_IMPORT_PREFIX "")
endif()

# Create imported target SPIRV-Headers::SPIRV-Headers
add_library(SPIRV-Headers::SPIRV-Headers INTERFACE IMPORTED)

set_target_properties(SPIRV-Headers::SPIRV-Headers PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
)

# Load information for each installed configuration.
file(GLOB _cmake_config_files "${CMAKE_CURRENT_LIST_DIR}/SPIRV-HeadersTargets-*.cmake")
foreach(_cmake_config_file IN LISTS _cmake_config_files)
include("${_cmake_config_file}")
endforeach()
unset(_cmake_config_file)
unset(_cmake_config_files)

# Cleanup temporary variables.
set(_IMPORT_PREFIX)

# Loop over all imported files and verify that they actually exist
foreach(_cmake_target IN LISTS _cmake_import_check_targets)
if(CMAKE_VERSION VERSION_LESS "3.28"
OR NOT DEFINED _cmake_import_check_xcframework_for_${_cmake_target}
OR NOT IS_DIRECTORY "${_cmake_import_check_xcframework_for_${_cmake_target}}")
foreach(_cmake_file IN LISTS "_cmake_import_check_files_for_${_cmake_target}")
if(NOT EXISTS "${_cmake_file}")
message(FATAL_ERROR "The imported target \"${_cmake_target}\" references the file
\"${_cmake_file}\"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
\"${CMAKE_CURRENT_LIST_FILE}\"
but not all the files it references.
")
endif()
endforeach()
endif()
unset(_cmake_file)
unset("_cmake_import_check_files_for_${_cmake_target}")
endforeach()
unset(_cmake_target)
unset(_cmake_import_check_targets)

# This file does not depend on other imported targets which have
# been exported from the same project but in a separate export set.

# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)
40 changes: 40 additions & 0 deletions dependencies/update-spirv.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/bin/bash

set -eo pipefail

cd -- "$(dirname -- "$0")" || exit 1

GIT_BRANCH="$1"
if [ -z "$GIT_BRANCH" ]; then
echo "error: usage: $0 <git-branch>"
echo "remark: the current <git-branch> is sdk-1.3.231"
exit 1
fi

mkdir -p spirv

cleanup () {
rm -rf SPIRV-Headers
}

trap cleanup SIGINT SIGTERM EXIT

git clone https://github.com/KhronosGroup/SPIRV-Headers.git --branch "$GIT_BRANCH"
cmake -S SPIRV-Headers -B SPIRV-Headers/build -DCMAKE_BUILD_TYPE=Release "-DCMAKE_INSTALL_PREFIX=$PWD/SPIRV-Headers/_local"
cmake --build SPIRV-Headers/build --target install

# Copy license information
cp SPIRV-Headers/LICENSE spirv/

# Copy headers we care about
mkdir -p spirv/include/spirv/unified1/
cp SPIRV-Headers/_local/include/spirv/unified1/GLSL.std.450.h spirv/include/spirv/unified1/
cp SPIRV-Headers/_local/include/spirv/unified1/spirv.h spirv/include/spirv/unified1/

# Copy CMake config
mkdir -p spirv/share/
cp -R SPIRV-Headers/_local/share/cmake spirv/share/

git add -f spirv/

echo "Updated SPIRV-Headers to branch $GIT_BRANCH!"
8 changes: 5 additions & 3 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -624,10 +624,12 @@ if (TARGET_VULKAN)
endif()

if (TARGET_SPIRV)
# Our vendored SPIRV headers are only used internally; users do not need
# them installed.
find_package(
SPIRV-Headers 1.5.5 REQUIRED
HINTS "${Halide_SOURCE_DIR}/dependencies/spirv"
)
target_compile_definitions(Halide PRIVATE WITH_SPIRV)
target_link_libraries(Halide PRIVATE "$<BUILD_INTERFACE:Halide::SPIRV>")
target_link_libraries(Halide PRIVATE "$<BUILD_INTERFACE:SPIRV-Headers::SPIRV-Headers>")
endif ()

option(TARGET_WEBGPU "Include WebGPU target" ON)
Expand Down
4 changes: 2 additions & 2 deletions src/SpirvIR.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
#include "IntrusivePtr.h"
#include "Type.h"

#include <spirv/1.6/GLSL.std.450.h> // GLSL extended instructions for common intrinsics
#include <spirv/1.6/spirv.h> // Use v1.6 headers but only use the minimal viable format version (for maximum compatiblity)
#include <spirv/unified1/GLSL.std.450.h> // GLSL extended instructions for common intrinsics
#include <spirv/unified1/spirv.h> // Use v1.6 headers but only use the minimal viable format version (for maximum compatiblity)

namespace Halide {
namespace Internal {
Expand Down

0 comments on commit 0412407

Please sign in to comment.