This commit is contained in:
Martin Slachta
2026-07-18 14:31:15 +02:00
commit a04f0dc262
3343 changed files with 1140208 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
project(loft_reflect)
FetchContent_Declare(
SpirvReflect
GIT_REPOSITORY https://github.com/KhronosGroup/SPIRV-Reflect
GIT_TAG e55086b044225f9b511ae44dbf9b079d3625943f
GIT_SHALLOW 1
)
set(SPIRV_REFLECT_STATIC_LIB ON CACHE BOOL "" FORCE)
set(SPIRV_REFLECT_EXECUTABLE OFF CACHE BOOL "" FORCE)
set(SPIRV_REFLECT_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SPIRV_REFLECT_TESTS OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(SpirvReflect)
file(GLOB FILES
./src/*.cpp
)
file(GLOB HEADERS
./include/*.hpp
)
add_library(loft_reflect OBJECT ${FILES})
add_library(loft::reflect ALIAS loft_reflect)
target_sources(loft_reflect
PUBLIC FILE_SET HEADERS
BASE_DIRS include
FILES ${HEADERS})
set_target_properties(loft_reflect PROPERTIES POSITION_INDEPENDENT_CODE 1)
target_link_libraries(${PROJECT_NAME}
PUBLIC
loft::base
GPUOpen::VulkanMemoryAllocator
volk::volk
spirv-reflect-static
)
target_include_directories(${PROJECT_NAME}
PUBLIC
${PROJECT_SOURCE_DIR}/include/
)
# add_subdirectory(tests)
@@ -0,0 +1,13 @@
#pragma once
#include <vector>
#include <cstdint>
namespace lft::reflect {
class PipelineLayoutBuilder {
public:
PipelineLayoutBuilder(std::vector<uint32_t> code);
};
}
@@ -0,0 +1,10 @@
#pragma once
namespace lft::reflect {
class DescriptorSetLayoutBuilder {
public:
DescriptorSetLayoutBuilder();
};
}
@@ -0,0 +1,63 @@
#include "PipelineLayoutBuilder.hpp"
#include "shaders/PipelineLayoutBuilder.hpp"
#include <print>
#include "spirv_reflect.h"
namespace lft::reflect {
std::string SpvReflectResultToString(SpvReflectResult result) {
switch (result) {
case SPV_REFLECT_RESULT_SUCCESS: return "Success";
case SPV_REFLECT_RESULT_NOT_READY: return "Not ready";
case SPV_REFLECT_RESULT_ERROR_PARSE_FAILED: return "Parse failed";
case SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED: return "Allocation failed";
case SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED: return "Range exceeded";
case SPV_REFLECT_RESULT_ERROR_NULL_POINTER: return "Null pointer";
case SPV_REFLECT_RESULT_ERROR_INTERNAL_ERROR: return "Internal error";
case SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH: return "Count mismatch";
case SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND: return "Element not found";
case SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_CODE_SIZE: return "Invalid SPIR-V code size";
case SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_MAGIC_NUMBER: return "Invalid SPIR-V magic number";
case SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_EOF: return "Unexpected end of SPIR-V code";
case SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE: return "Invalid SPIR-V ID reference";
case SPV_REFLECT_RESULT_ERROR_SPIRV_SET_NUMBER_OVERFLOW: return "SPIR-V set number overflow";
case SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_STORAGE_CLASS: return "Invalid SPIR-V storage class";
default: return "Unknown error";
}
}
PipelineLayoutBuilder::PipelineLayoutBuilder(std::vector<uint32_t> code) {
SpvReflectShaderModule module;
SpvReflectResult result = spvReflectCreateShaderModule(
code.size() * 4, (const char*)code.data(), &module
);
if(result != SPV_REFLECT_RESULT_SUCCESS) {
std::println("{}", SpvReflectResultToString(result));
return;
}
uint32_t count = 0;
result = spvReflectEnumerateDescriptorSets(&module, &count, nullptr);
std::vector<SpvReflectDescriptorSet*> sets(count);
result = spvReflectEnumerateDescriptorSets(&module, &count, sets.data());
for(auto& set : sets) {
std::println("Set: {}", set->set);
for(uint32_t i = 0; i < set->binding_count; i++) {
std::println("Binding: {}", set->bindings[i]->binding);
VkDescriptorSetLayoutBinding binding = {
.binding = set->bindings[i]->binding,
.descriptorType = (VkDescriptorType)set->bindings[i]->descriptor_type,
.descriptorCount = set->bindings[i]->count,
};
}
}
}
}
+23
View File
@@ -0,0 +1,23 @@
project(loft_reflect_tests)
find_package(Vulkan)
find_package(Catch2 REQUIRED)
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
include(CTest)
include(Catch)
add_executable(loft_reflect_tests
./PipelineLayoutReflectTests.cpp
)
target_link_libraries(loft_reflect_tests
PRIVATE
loft::base
loft::reflect
Catch2::Catch2WithMain
)
catch_discover_tests(loft_reflect_tests)
@@ -0,0 +1,106 @@
#include "PipelineLayoutBuilder.hpp"
#include <catch2/catch_test_macros.hpp>
static uint32_t test_shader[] = {
0x07230203,0x00010000,0x0008000b,0x0000005f,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x000e000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x0000001b,
0x00000030,0x00000031,0x00000035,0x00000039,0x0000003b,0x00000041,0x00030003,0x00000002,
0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000009,0x61746962,
0x6e65676e,0x00000074,0x00040005,0x0000000b,0x6d726f6e,0x00000000,0x00040005,0x0000000f,
0x676e6174,0x00746e65,0x00040005,0x0000001b,0x5474756f,0x00004e42,0x00040005,0x00000030,
0x5074756f,0x0000736f,0x00030005,0x00000031,0x00736f70,0x00050005,0x00000035,0x4e74756f,
0x616d726f,0x0000006c,0x00040005,0x00000039,0x5574756f,0x00000056,0x00030005,0x0000003b,
0x00007675,0x00060005,0x0000003f,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,
0x0000003f,0x00000000,0x505f6c67,0x7469736f,0x006e6f69,0x00070006,0x0000003f,0x00000001,
0x505f6c67,0x746e696f,0x657a6953,0x00000000,0x00070006,0x0000003f,0x00000002,0x435f6c67,
0x4470696c,0x61747369,0x0065636e,0x00070006,0x0000003f,0x00000003,0x435f6c67,0x446c6c75,
0x61747369,0x0065636e,0x00030005,0x00000041,0x00000000,0x00040005,0x00000045,0x656d6143,
0x00006172,0x00050006,0x00000045,0x00000000,0x6a6f7270,0x00000000,0x00050006,0x00000045,
0x00000001,0x77656976,0x00000000,0x00030005,0x00000047,0x006d6163,0x00050005,0x00000057,
0x6e656353,0x646f4e65,0x00000065,0x00070006,0x00000057,0x00000000,0x6e617274,0x726f6673,
0x7864496d,0x00000000,0x00050006,0x00000057,0x00000001,0x6873656d,0x00786449,0x00050005,
0x00000059,0x656a624f,0x6e497463,0x00006f66,0x00050006,0x00000059,0x00000000,0x65646f6e,
0x00000073,0x00050005,0x0000005b,0x656a626f,0x6e497463,0x00006f66,0x00050005,0x0000005c,
0x736e6f63,0x746e6174,0x00000073,0x00070006,0x0000005c,0x00000000,0x6e617274,0x726f6673,
0x7864496d,0x00000000,0x00060006,0x0000005c,0x00000001,0x6574616d,0x6c616972,0x00786449,
0x00060005,0x0000005e,0x68737550,0x736e6f43,0x746e6174,0x00000073,0x00040047,0x0000000b,
0x0000001e,0x00000001,0x00040047,0x0000000f,0x0000001e,0x00000003,0x00040047,0x0000001b,
0x0000001e,0x00000003,0x00040047,0x00000030,0x0000001e,0x00000000,0x00040047,0x00000031,
0x0000001e,0x00000000,0x00040047,0x00000035,0x0000001e,0x00000001,0x00040047,0x00000039,
0x0000001e,0x00000002,0x00040047,0x0000003b,0x0000001e,0x00000002,0x00030047,0x0000003f,
0x00000002,0x00050048,0x0000003f,0x00000000,0x0000000b,0x00000000,0x00050048,0x0000003f,
0x00000001,0x0000000b,0x00000001,0x00050048,0x0000003f,0x00000002,0x0000000b,0x00000003,
0x00050048,0x0000003f,0x00000003,0x0000000b,0x00000004,0x00030047,0x00000045,0x00000002,
0x00040048,0x00000045,0x00000000,0x00000005,0x00050048,0x00000045,0x00000000,0x00000007,
0x00000010,0x00050048,0x00000045,0x00000000,0x00000023,0x00000000,0x00040048,0x00000045,
0x00000001,0x00000005,0x00050048,0x00000045,0x00000001,0x00000007,0x00000010,0x00050048,
0x00000045,0x00000001,0x00000023,0x00000040,0x00040047,0x00000047,0x00000021,0x00000000,
0x00040047,0x00000047,0x00000022,0x00000000,0x00050048,0x00000057,0x00000000,0x00000023,
0x00000000,0x00050048,0x00000057,0x00000001,0x00000023,0x00000004,0x00040047,0x00000058,
0x00000006,0x00000010,0x00030047,0x00000059,0x00000002,0x00050048,0x00000059,0x00000000,
0x00000023,0x00000000,0x00040047,0x0000005b,0x00000021,0x00000001,0x00040047,0x0000005b,
0x00000022,0x00000002,0x00030047,0x0000005c,0x00000002,0x00050048,0x0000005c,0x00000000,
0x00000023,0x00000000,0x00050048,0x0000005c,0x00000001,0x00000023,0x00000004,0x00020013,
0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,
0x00000007,0x00000006,0x00000003,0x00040020,0x00000008,0x00000007,0x00000007,0x00040020,
0x0000000a,0x00000001,0x00000007,0x0004003b,0x0000000a,0x0000000b,0x00000001,0x00040017,
0x0000000d,0x00000006,0x00000004,0x00040020,0x0000000e,0x00000001,0x0000000d,0x0004003b,
0x0000000e,0x0000000f,0x00000001,0x00040015,0x00000013,0x00000020,0x00000000,0x0004002b,
0x00000013,0x00000014,0x00000003,0x00040020,0x00000015,0x00000001,0x00000006,0x00040018,
0x00000019,0x00000007,0x00000003,0x00040020,0x0000001a,0x00000003,0x00000019,0x0004003b,
0x0000001a,0x0000001b,0x00000003,0x0004002b,0x00000006,0x00000020,0x3f800000,0x0004002b,
0x00000006,0x00000021,0x00000000,0x00040020,0x0000002f,0x00000003,0x00000007,0x0004003b,
0x0000002f,0x00000030,0x00000003,0x0004003b,0x0000000a,0x00000031,0x00000001,0x0004002b,
0x00000006,0x00000033,0x3d4ccccd,0x0004003b,0x0000002f,0x00000035,0x00000003,0x00040017,
0x00000037,0x00000006,0x00000002,0x00040020,0x00000038,0x00000003,0x00000037,0x0004003b,
0x00000038,0x00000039,0x00000003,0x00040020,0x0000003a,0x00000001,0x00000037,0x0004003b,
0x0000003a,0x0000003b,0x00000001,0x0004002b,0x00000013,0x0000003d,0x00000001,0x0004001c,
0x0000003e,0x00000006,0x0000003d,0x0006001e,0x0000003f,0x0000000d,0x00000006,0x0000003e,
0x0000003e,0x00040020,0x00000040,0x00000003,0x0000003f,0x0004003b,0x00000040,0x00000041,
0x00000003,0x00040015,0x00000042,0x00000020,0x00000001,0x0004002b,0x00000042,0x00000043,
0x00000000,0x00040018,0x00000044,0x0000000d,0x00000004,0x0004001e,0x00000045,0x00000044,
0x00000044,0x00040020,0x00000046,0x00000002,0x00000045,0x0004003b,0x00000046,0x00000047,
0x00000002,0x00040020,0x00000048,0x00000002,0x00000044,0x0004002b,0x00000042,0x0000004b,
0x00000001,0x00040020,0x00000055,0x00000003,0x0000000d,0x0004001e,0x00000057,0x00000013,
0x00000013,0x0004001c,0x00000058,0x00000057,0x0000003d,0x0003001e,0x00000059,0x00000058,
0x00040020,0x0000005a,0x00000002,0x00000059,0x0004003b,0x0000005a,0x0000005b,0x00000002,
0x0004001e,0x0000005c,0x00000013,0x00000013,0x00040020,0x0000005d,0x00000009,0x0000005c,
0x0004003b,0x0000005d,0x0000005e,0x00000009,0x00050036,0x00000002,0x00000004,0x00000000,
0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,0x0004003d,
0x00000007,0x0000000c,0x0000000b,0x0004003d,0x0000000d,0x00000010,0x0000000f,0x0008004f,
0x00000007,0x00000011,0x00000010,0x00000010,0x00000000,0x00000001,0x00000002,0x0007000c,
0x00000007,0x00000012,0x00000001,0x00000044,0x0000000c,0x00000011,0x00050041,0x00000015,
0x00000016,0x0000000f,0x00000014,0x0004003d,0x00000006,0x00000017,0x00000016,0x0005008e,
0x00000007,0x00000018,0x00000012,0x00000017,0x0003003e,0x00000009,0x00000018,0x0004003d,
0x0000000d,0x0000001c,0x0000000f,0x0008004f,0x00000007,0x0000001d,0x0000001c,0x0000001c,
0x00000000,0x00000001,0x00000002,0x0004003d,0x00000007,0x0000001e,0x00000009,0x0004003d,
0x00000007,0x0000001f,0x0000000b,0x00050051,0x00000006,0x00000022,0x0000001d,0x00000000,
0x00050051,0x00000006,0x00000023,0x0000001d,0x00000001,0x00050051,0x00000006,0x00000024,
0x0000001d,0x00000002,0x00050051,0x00000006,0x00000025,0x0000001e,0x00000000,0x00050051,
0x00000006,0x00000026,0x0000001e,0x00000001,0x00050051,0x00000006,0x00000027,0x0000001e,
0x00000002,0x00050051,0x00000006,0x00000028,0x0000001f,0x00000000,0x00050051,0x00000006,
0x00000029,0x0000001f,0x00000001,0x00050051,0x00000006,0x0000002a,0x0000001f,0x00000002,
0x00060050,0x00000007,0x0000002b,0x00000022,0x00000023,0x00000024,0x00060050,0x00000007,
0x0000002c,0x00000025,0x00000026,0x00000027,0x00060050,0x00000007,0x0000002d,0x00000028,
0x00000029,0x0000002a,0x00060050,0x00000019,0x0000002e,0x0000002b,0x0000002c,0x0000002d,
0x0003003e,0x0000001b,0x0000002e,0x0004003d,0x00000007,0x00000032,0x00000031,0x0005008e,
0x00000007,0x00000034,0x00000032,0x00000033,0x0003003e,0x00000030,0x00000034,0x0004003d,
0x00000007,0x00000036,0x0000000b,0x0003003e,0x00000035,0x00000036,0x0004003d,0x00000037,
0x0000003c,0x0000003b,0x0003003e,0x00000039,0x0000003c,0x00050041,0x00000048,0x00000049,
0x00000047,0x00000043,0x0004003d,0x00000044,0x0000004a,0x00000049,0x00050041,0x00000048,
0x0000004c,0x00000047,0x0000004b,0x0004003d,0x00000044,0x0000004d,0x0000004c,0x00050092,
0x00000044,0x0000004e,0x0000004a,0x0000004d,0x0004003d,0x00000007,0x0000004f,0x00000030,
0x00050051,0x00000006,0x00000050,0x0000004f,0x00000000,0x00050051,0x00000006,0x00000051,
0x0000004f,0x00000001,0x00050051,0x00000006,0x00000052,0x0000004f,0x00000002,0x00070050,
0x0000000d,0x00000053,0x00000050,0x00000051,0x00000052,0x00000020,0x00050091,0x0000000d,
0x00000054,0x0000004e,0x00000053,0x00050041,0x00000055,0x00000056,0x00000041,0x00000043,
0x0003003e,0x00000056,0x00000054,0x000100fd,0x00010038
};
TEST_CASE("TestPipelineLayout", "[reflect]") {
std::vector<uint32_t> code(sizeof(test_shader) / sizeof(*test_shader));
memcpy(code.data(), test_shader, sizeof(test_shader));
lft::reflect::PipelineLayoutBuilder builder(code);
}