Skip to content
Open
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
47 changes: 36 additions & 11 deletions .github/workflows/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,47 @@ jobs:
with:
variant: sccache
key: ${{ matrix.os }}-${{ matrix.config }}
- name: Configure
- name: Configure (Linux & MacOS)
if: ${{ ! contains(matrix.os, 'windows') }}
shell: bash
run: |
set -ex
mkdir build
cd build
mkdir install
cmake .. -G Ninja \
-DSPIRV_WERROR=OFF \
-DCMAKE_BUILD_TYPE=${{ matrix.config }} \
-DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \
-DCMAKE_INSTALL_PREFIX='${{ github.workspace }}/build/install'
cmake \
-G Ninja \
-D SPIRV_WERROR=OFF \
-D SPIRV_SKIP_EXECUTABLES=ON \
-D SPIRV_SKIP_TESTS=ON \
-D CMAKE_BUILD_TYPE=${{ matrix.config }} \
-D CMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \
-D CMAKE_INSTALL_PREFIX='${{ github.workspace }}/build/install' \
-S . \
-B ./build
- name: Configure (Windows)
if: ${{ contains(matrix.os, 'windows') }}
shell: pwsh
run: |
$ICD_REG_PATH = 'HKLM:\SOFTWARE\Khronos\OpenCL\Vendors'
$LAYER_REG_PATH = 'HKLM:\SOFTWARE\Khronos\OpenCL\Layers'
New-Item -Type Directory ${ICD_REG_PATH} -Force | Out-Null
New-Item -Type Directory ${LAYER_REG_PATH} -Force | Out-Null
Set-ItemProperty -Path ${ICD_REG_PATH} -Type DWord -Value 0 -Name "${env:GITHUB_WORKSPACE}\build\bin\${{ matrix.config }}\layerloadicd.dll"
Set-ItemProperty -Path ${LAYER_REG_PATH} -Type DWord -Value 0 -Name "${env:GITHUB_WORKSPACE}\build\bin\${{ matrix.config }}\SPIRV2CLC-Layer.dll"
cmake `
-G "Visual Studio 17 2022" `
-A x64 `
-T v143 `
-D SPIRV_WERROR=OFF `
-D SPIRV_SKIP_EXECUTABLES=ON `
-D SPIRV_SKIP_TESTS=ON `
-D CMAKE_BUILD_TYPE=${{ matrix.config }} `
-D CMAKE_INSTALL_PREFIX='${{ github.workspace }}/build/install' `
-S . `
-B ./build
- name: Build
run: cmake --build ./build --config ${{ matrix.config }} -j3
- name: Test
run: ctest --test-dir ./build --build-config ${{ matrix.config }} --output-on-failure -j3
- name: Install
run: cmake --install ./build
run: cmake --install ./build --config ${{ matrix.config }}
- uses: actions/upload-artifact@v3
with:
name: spirv2clc-${{ matrix.os }}-${{ matrix.config }}
Expand Down
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,7 @@
[submodule "spirv-tools"]
path = external/SPIRV-Tools
url = https://github.com/KhronosGroup/SPIRV-Tools.git
[submodule "opencl-icd-loader"]
path = external/OpenCL-ICD-Loader
url = https://github.com/Kerilk/OpenCL-ICD-Loader.git
branch = system-layers
25 changes: 18 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@ project(spirv2clc)

cmake_policy(SET CMP0063 NEW)

option(SPIRV2CLC_BUILD_TESTING "Enable support for SPIRV2CLC testing." OFF)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

include(GenerateExportHeader)

Expand All @@ -39,20 +42,28 @@ endif()

# Enable compiler warnings
if (MSVC)
add_compile_options(/W4 /WX)
add_compile_options(/W4)
else()
add_compile_options(-Wall -Wextra -pedantic)
endif()

# Add SPIRV-Tools
set(SPIRV-Headers_SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/SPIRV-Headers)
set(SPIRV_TOOLS_DIR ${PROJECT_SOURCE_DIR}/external/SPIRV-Tools)
set(SPIRV_TOOLS_BINARY_DIR ${CMAKE_BINARY_DIR}/external/SPIRV-Tools)
add_subdirectory(${SPIRV_TOOLS_DIR} EXCLUDE_FROM_ALL)
set(SPIRV-Headers_SOURCE_DIR "${PROJECT_SOURCE_DIR}/external/SPIRV-Headers")
set(SPIRV_TOOLS_DIR "${PROJECT_SOURCE_DIR}/external/SPIRV-Tools")
set(SPIRV_TOOLS_BINARY_DIR "${CMAKE_BINARY_DIR}/external/SPIRV-Tools")
add_subdirectory("${SPIRV_TOOLS_DIR}" EXCLUDE_FROM_ALL)

set(OPENCL_HEADERS_DIR ${PROJECT_SOURCE_DIR}/external/OpenCL-Headers)
set(OPENCL_HEADERS_DIR "${PROJECT_SOURCE_DIR}/external/OpenCL-Headers")
set(OPENCL_ICD_LOADER_DIR "${PROJECT_SOURCE_DIR}/external/OpenCL-ICD-Loader")
set(OPENCL_ICD_LOADER_HEADERS_DIR "${OPENCL_HEADERS_DIR}" CACHE PATH "Path to OpenCL headers include dir")
add_subdirectory(${OPENCL_ICD_LOADER_DIR})

add_subdirectory(lib)
add_subdirectory(tools)

add_subdirectory(tests)
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR SPIRV2CLC_BUILD_TESTING)
include(CTest)
endif()
if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR SPIRV2CLC_BUILD_TESTING) AND BUILD_TESTING)
add_subdirectory(tests)
endif()
1 change: 1 addition & 0 deletions external/OpenCL-ICD-Loader
Submodule OpenCL-ICD-Loader added at bba750
105 changes: 105 additions & 0 deletions include/layer.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#pragma once

#include <CL/cl_layer.h>

#include <map>
#include <memory>
#include <string>

namespace spirv2clc {
class layer {
public:
layer() noexcept;
layer(const layer &) = delete;
layer(layer &&) = delete;
~layer() = default;
layer &operator=(const layer &) = delete;
layer &operator=(layer &&) = delete;

cl_icd_dispatch &get_dispatch();
const cl_icd_dispatch *get_target_dispatch();

cl_int clGetPlatformInfo(cl_platform_id platform, cl_platform_info param_name,
size_t param_value_size, void *param_value,
size_t *param_value_size_ret);

cl_int clGetDeviceInfo(cl_device_id device, cl_device_info param_name,
size_t param_value_size, void *param_value,
size_t *param_value_size_ret);

cl_program clCreateProgramWithIL(cl_context context, const void *il,
size_t length, cl_int *errcode_ret);

cl_int clBuildProgram(cl_program program, cl_uint num_devices,
const cl_device_id *device_list, const char *options,
void(CL_CALLBACK *pfn_notify)(cl_program program,
void *user_data),
void *user_data);

cl_int clGetProgramInfo(cl_program program, cl_program_info param_name,
size_t param_value_size, void *param_value,
size_t *param_value_size_ret);

std::map<cl_program, std::pair<std::string, std::string>> program_ils;

bool tracing;

private:
void init_dispatch(void);

cl_int clGetPlatformInfo_CL_PLATFORM_EXTENSIONS(cl_platform_id platform,
cl_platform_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret);

cl_int clGetDeviceInfo_CL_DEVICE_EXTENSIONS(cl_device_id device,
cl_device_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret);

cl_int clGetDeviceInfo_CL_DEVICE_IL_VERSION(cl_device_id device,
cl_device_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret);

cl_int clGetDeviceInfo_CL_DEVICE_ILS_WITH_VERSION(
cl_device_id device, cl_device_info param_name, size_t param_value_size,
void *param_value, size_t *param_value_size_ret);

cl_int clGetProgramInfo_CL_PROGRAM_IL(cl_program program,
cl_program_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret);
};

inline layer instance;
inline const cl_icd_dispatch *tdispatch = nullptr;
inline cl_icd_dispatch dispatch{};

} // namespace spirv2clc

// internal tracing macros
#define SPIRV2CLC_TRACE(...) \
do { \
if (spirv2clc::instance.tracing) { \
fprintf(stderr, "SPIRV2CLC trace at %s:%d: ", __FILE__, __LINE__); \
fprintf(stderr, __VA_ARGS__); \
} \
} while (0)

#ifdef _WIN32
#define SPIRV2CLC_WIDE_TRACE(...) \
do { \
if (spirv2clc::instance.tracing) { \
fwprintf(stderr, L"SPIRV2CLC trace at %hs:%d: ", __FILE__, __LINE__); \
fwprintf(stderr, __VA_ARGS__); \
} \
} while (0)

#else
#define SPIRV2CLC_WIDE_TRACE(...)
#endif
36 changes: 36 additions & 0 deletions include/layer_surface.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#pragma once

#include <CL/cl_layer.h>

CL_API_ENTRY cl_int CL_API_CALL clGetLayerInfo(cl_layer_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret);

CL_API_ENTRY cl_int CL_API_CALL clInitLayer(
cl_uint num_entries, const _cl_icd_dispatch *target_dispatch,
cl_uint *num_entries_out, const _cl_icd_dispatch **layer_dispatch_ret);

CL_API_ENTRY cl_int CL_API_CALL clGetPlatformInfo_wrap(
cl_platform_id platform, cl_platform_info param_name,
size_t param_value_size, void *param_value, size_t *param_value_size_ret);

CL_API_ENTRY cl_int CL_API_CALL clGetDeviceInfo_wrap(
cl_device_id device, cl_device_info param_name, size_t param_value_size,
void *param_value, size_t *param_value_size_ret);

CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithIL_wrap(
cl_context context, const void *il, size_t length, cl_int *errcode_ret);

CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithILKHR_wrap(
cl_context context, const void *il, size_t length, cl_int *errcode_ret);

CL_API_ENTRY cl_int CL_API_CALL clBuildProgram_wrap(
cl_program program, cl_uint num_devices, const cl_device_id *device_list,
const char *options,
void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
void *user_data);

CL_API_ENTRY cl_int CL_API_CALL clGetProgramInfo_wrap(
cl_program program, cl_program_info param_name, size_t param_value_size,
void *param_value, size_t *param_value_size_ret);
12 changes: 7 additions & 5 deletions include/spirv2clc.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ struct translator {
} else if (m_imports.count(id)) {
return m_imports.at(id);
} else if (m_names.count(id)) {
return m_names.at(id);
return std::string{m_names.at(id)} + "_f";
} else if (m_builtin_values.count(id)) {
switch (m_builtin_values.at(id)) {
case SpvBuiltInWorkDim:
Expand Down Expand Up @@ -230,12 +230,14 @@ struct translator {
", " + var_for(op4) + ", " + var_for(op5) + ")";
}

std::string src_pointer_type(uint32_t storage, uint32_t tyid, bool signedty) const;
std::string src_pointer_type(uint32_t storage, uint32_t tyid,
bool signedty) const;

std::string builtin_vector_extract(uint32_t id, uint32_t idx, bool constant) const;
std::string builtin_vector_extract(uint32_t id, uint32_t idx,
bool constant) const;

bool is_valid_identifier(const std::string& name) const;
std::string make_valid_identifier(const std::string& name) const;
bool is_valid_identifier(const std::string &name) const;
std::string make_valid_identifier(const std::string &name) const;

bool get_null_constant(uint32_t tyid, std::string &src) const;
std::string
Expand Down
26 changes: 25 additions & 1 deletion lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,37 @@ target_include_directories(libspirv2clc
set_target_properties(libspirv2clc PROPERTIES
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
POSITION_INDEPENDENT_CODE ON
)

target_link_libraries(libspirv2clc SPIRV-Tools-opt)

generate_export_header(libspirv2clc)

install(TARGETS libspirv2clc
add_library(SPIRV2CLC-Layer SHARED
layer.cpp
layer_surface.cpp
$<$<AND:$<PLATFORM_ID:Windows>,$<CXX_COMPILER_ID:MSVC,Clang>>:layer.def>
$<$<CXX_COMPILER_ID:GNU>:layer.map>
)

target_include_directories(SPIRV2CLC-Layer
PRIVATE
${OPENCL_HEADERS_DIR})

target_compile_features(SPIRV2CLC-Layer PUBLIC cxx_std_17)
Comment thread
kpet marked this conversation as resolved.

target_compile_definitions(SPIRV2CLC-Layer
PUBLIC
CL_TARGET_OPENCL_VERSION=300)

set_target_properties(libspirv2clc PROPERTIES
POSITION_INDEPENDENT_CODE ON
)

target_link_libraries(SPIRV2CLC-Layer PUBLIC libspirv2clc)

install(TARGETS libspirv2clc SPIRV2CLC-Layer
RUNTIME DESTINATION lib COMPONENT libraries
LIBRARY DESTINATION lib COMPONENT libraries
ARCHIVE DESTINATION lib COMPONENT libraries
Expand Down
Loading