Skip to content

Commit aebb260

Browse files
committed
Initial layer implementation
1 parent 7ae0a24 commit aebb260

19 files changed

+1544
-28
lines changed

CMakeLists.txt

+10-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ project(spirv2clc)
1818

1919
cmake_policy(SET CMP0063 NEW)
2020

21+
option(SPIRV2CLC_BUILD_TESTING "Enable support for SPIRV2CLC testing." OFF)
22+
2123
set(CMAKE_CXX_STANDARD 17)
2224
set(CMAKE_CXX_STANDARD_REQUIRED ON)
25+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
2326

2427
include(GenerateExportHeader)
2528

@@ -39,7 +42,7 @@ endif()
3942

4043
# Enable compiler warnings
4144
if (MSVC)
42-
add_compile_options(/W4 /WX)
45+
add_compile_options(/W4)
4346
else()
4447
add_compile_options(-Wall -Wextra -pedantic)
4548
endif()
@@ -55,4 +58,9 @@ set(OPENCL_HEADERS_DIR ${PROJECT_SOURCE_DIR}/external/OpenCL-Headers)
5558
add_subdirectory(lib)
5659
add_subdirectory(tools)
5760

58-
add_subdirectory(tests)
61+
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR SPIRV2CLC_BUILD_TESTING)
62+
include(CTest)
63+
endif()
64+
if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR SPIRV2CLC_BUILD_TESTING) AND BUILD_TESTING)
65+
add_subdirectory(tests)
66+
endif()

include/layer.hpp

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#pragma once
2+
3+
#include <CL/cl_layer.h>
4+
5+
#include <map>
6+
#include <memory>
7+
#include <string>
8+
9+
namespace spirv2clc {
10+
class layer {
11+
public:
12+
layer() noexcept;
13+
layer(const layer &) = delete;
14+
layer(layer &&) = delete;
15+
~layer() = default;
16+
layer &operator=(const layer &) = delete;
17+
layer &operator=(layer &&) = delete;
18+
19+
cl_icd_dispatch &get_dispatch();
20+
const cl_icd_dispatch *get_target_dispatch();
21+
22+
cl_int clGetPlatformInfo(cl_platform_id platform, cl_platform_info param_name,
23+
size_t param_value_size, void *param_value,
24+
size_t *param_value_size_ret);
25+
26+
cl_int clGetDeviceInfo(cl_device_id device, cl_device_info param_name,
27+
size_t param_value_size, void *param_value,
28+
size_t *param_value_size_ret);
29+
30+
cl_program clCreateProgramWithIL(cl_context context, const void *il,
31+
size_t length, cl_int *errcode_ret);
32+
33+
cl_int clBuildProgram(cl_program program, cl_uint num_devices,
34+
const cl_device_id *device_list, const char *options,
35+
void(CL_CALLBACK *pfn_notify)(cl_program program,
36+
void *user_data),
37+
void *user_data);
38+
39+
cl_int clGetProgramInfo(cl_program program, cl_program_info param_name,
40+
size_t param_value_size, void *param_value,
41+
size_t *param_value_size_ret);
42+
43+
std::map<cl_program, std::pair<std::string, std::string>> program_ils;
44+
45+
bool tracing;
46+
47+
private:
48+
void init_dispatch(void);
49+
50+
cl_int clGetPlatformInfo_CL_PLATFORM_EXTENSIONS(cl_platform_id platform,
51+
cl_platform_info param_name,
52+
size_t param_value_size,
53+
void *param_value,
54+
size_t *param_value_size_ret);
55+
56+
cl_int clGetDeviceInfo_CL_DEVICE_EXTENSIONS(cl_device_id device,
57+
cl_device_info param_name,
58+
size_t param_value_size,
59+
void *param_value,
60+
size_t *param_value_size_ret);
61+
62+
cl_int clGetDeviceInfo_CL_DEVICE_IL_VERSION(cl_device_id device,
63+
cl_device_info param_name,
64+
size_t param_value_size,
65+
void *param_value,
66+
size_t *param_value_size_ret);
67+
68+
cl_int clGetDeviceInfo_CL_DEVICE_ILS_WITH_VERSION(
69+
cl_device_id device, cl_device_info param_name, size_t param_value_size,
70+
void *param_value, size_t *param_value_size_ret);
71+
72+
cl_int clGetProgramInfo_CL_PROGRAM_IL(cl_program program,
73+
cl_program_info param_name,
74+
size_t param_value_size,
75+
void *param_value,
76+
size_t *param_value_size_ret);
77+
};
78+
79+
inline layer instance;
80+
inline const cl_icd_dispatch *tdispatch = nullptr;
81+
inline cl_icd_dispatch dispatch{};
82+
83+
} // namespace spirv2clc
84+
85+
// internal tracing macros
86+
#define SPIRV2CLC_TRACE(...) \
87+
do { \
88+
if (spirv2clc::instance.tracing) { \
89+
fprintf(stderr, "SPIRV2CLC trace at %s:%d: ", __FILE__, __LINE__); \
90+
fprintf(stderr, __VA_ARGS__); \
91+
} \
92+
} while (0)
93+
94+
#ifdef _WIN32
95+
#define SPIRV2CLC_WIDE_TRACE(...) \
96+
do { \
97+
if (spirv2clc::instance.tracing) { \
98+
fwprintf(stderr, L"SPIRV2CLC trace at %hs:%d: ", __FILE__, __LINE__); \
99+
fwprintf(stderr, __VA_ARGS__); \
100+
} \
101+
} while (0)
102+
103+
#else
104+
#define SPIRV2CLC_WIDE_TRACE(...)
105+
#endif

include/layer_surface.hpp

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#pragma once
2+
3+
#include <CL/cl_layer.h>
4+
5+
CL_API_ENTRY cl_int CL_API_CALL clGetLayerInfo(cl_layer_info param_name,
6+
size_t param_value_size,
7+
void *param_value,
8+
size_t *param_value_size_ret);
9+
10+
CL_API_ENTRY cl_int CL_API_CALL clInitLayer(
11+
cl_uint num_entries, const _cl_icd_dispatch *target_dispatch,
12+
cl_uint *num_entries_out, const _cl_icd_dispatch **layer_dispatch_ret);
13+
14+
CL_API_ENTRY cl_int CL_API_CALL clGetPlatformInfo_wrap(
15+
cl_platform_id platform, cl_platform_info param_name,
16+
size_t param_value_size, void *param_value, size_t *param_value_size_ret);
17+
18+
CL_API_ENTRY cl_int CL_API_CALL clGetDeviceInfo_wrap(
19+
cl_device_id device, cl_device_info param_name, size_t param_value_size,
20+
void *param_value, size_t *param_value_size_ret);
21+
22+
CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithIL_wrap(
23+
cl_context context, const void *il, size_t length, cl_int *errcode_ret);
24+
25+
CL_API_ENTRY cl_program CL_API_CALL clCreateProgramWithILKHR_wrap(
26+
cl_context context, const void *il, size_t length, cl_int *errcode_ret);
27+
28+
CL_API_ENTRY cl_int CL_API_CALL clBuildProgram_wrap(
29+
cl_program program, cl_uint num_devices, const cl_device_id *device_list,
30+
const char *options,
31+
void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
32+
void *user_data);
33+
34+
CL_API_ENTRY cl_int CL_API_CALL clGetProgramInfo_wrap(
35+
cl_program program, cl_program_info param_name, size_t param_value_size,
36+
void *param_value, size_t *param_value_size_ret);

include/spirv2clc.h

+7-5
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ struct translator {
7474
} else if (m_imports.count(id)) {
7575
return m_imports.at(id);
7676
} else if (m_names.count(id)) {
77-
return m_names.at(id);
77+
return std::string{m_names.at(id)} + "_f";
7878
} else if (m_builtin_values.count(id)) {
7979
switch (m_builtin_values.at(id)) {
8080
case SpvBuiltInWorkDim:
@@ -230,12 +230,14 @@ struct translator {
230230
", " + var_for(op4) + ", " + var_for(op5) + ")";
231231
}
232232

233-
std::string src_pointer_type(uint32_t storage, uint32_t tyid, bool signedty) const;
233+
std::string src_pointer_type(uint32_t storage, uint32_t tyid,
234+
bool signedty) const;
234235

235-
std::string builtin_vector_extract(uint32_t id, uint32_t idx, bool constant) const;
236+
std::string builtin_vector_extract(uint32_t id, uint32_t idx,
237+
bool constant) const;
236238

237-
bool is_valid_identifier(const std::string& name) const;
238-
std::string make_valid_identifier(const std::string& name) const;
239+
bool is_valid_identifier(const std::string &name) const;
240+
std::string make_valid_identifier(const std::string &name) const;
239241

240242
bool get_null_constant(uint32_t tyid, std::string &src) const;
241243
std::string

lib/CMakeLists.txt

+25-1
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,37 @@ target_include_directories(libspirv2clc
2929
set_target_properties(libspirv2clc PROPERTIES
3030
CXX_VISIBILITY_PRESET hidden
3131
VISIBILITY_INLINES_HIDDEN ON
32+
POSITION_INDEPENDENT_CODE ON
3233
)
3334

3435
target_link_libraries(libspirv2clc SPIRV-Tools-opt)
3536

3637
generate_export_header(libspirv2clc)
3738

38-
install(TARGETS libspirv2clc
39+
add_library(SPIRV2CLC-Layer SHARED
40+
layer.cpp
41+
layer_surface.cpp
42+
$<$<AND:$<PLATFORM_ID:Windows>,$<CXX_COMPILER_ID:MSVC,Clang>>:layer.def>
43+
$<$<CXX_COMPILER_ID:GNU>:layer.map>
44+
)
45+
46+
target_include_directories(SPIRV2CLC-Layer
47+
PRIVATE
48+
${OPENCL_HEADERS_DIR})
49+
50+
target_compile_features(SPIRV2CLC-Layer PUBLIC cxx_std_17)
51+
52+
target_compile_definitions(SPIRV2CLC-Layer
53+
PUBLIC
54+
CL_TARGET_OPENCL_VERSION=300)
55+
56+
set_target_properties(libspirv2clc PROPERTIES
57+
POSITION_INDEPENDENT_CODE ON
58+
)
59+
60+
target_link_libraries(SPIRV2CLC-Layer PUBLIC libspirv2clc)
61+
62+
install(TARGETS libspirv2clc SPIRV2CLC-Layer
3963
RUNTIME DESTINATION lib COMPONENT libraries
4064
LIBRARY DESTINATION lib COMPONENT libraries
4165
ARCHIVE DESTINATION lib COMPONENT libraries

0 commit comments

Comments
 (0)