新增编译shader目标

This commit is contained in:
daiqingshuang 2024-02-19 18:31:59 +08:00
parent c93ed0fd77
commit 307da1f74f
3 changed files with 66 additions and 2 deletions

View File

@ -15,3 +15,59 @@ target_link_libraries(${PROJECT_NAME} PUBLIC imgui spdlog glfw glad)
target_precompile_headers(${PROJECT_NAME} PUBLIC extern.h)
add_definitions(-Dcore_EXPORTS -DSTB_IMAGE_IMPLEMENTATION -DSTBI_WINDOWS_UTF8)
function(compile_shader TARGET_NAME OUTPUT SHADER_INCLUDE_DIR)
set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
set(GLSLANG_BIN $ENV{VULKAN_SDK}/Bin/glslangValidator.exe) # glslangValidator
set(ALL_SHADER_FILE "")
# get files in SHADER_INCLUDE_DIR
file(GLOB_RECURSE ALL_SHADER_FILE "${SHADER_INCLUDE_DIR}/*.vert" "${SHADER_INCLUDE_DIR}/*.frag" "${SHADER_INCLUDE_DIR}/*.comp" "${SHADER_INCLUDE_DIR}/*.tesc" "${SHADER_INCLUDE_DIR}/*.tese" "${SHADER_INCLUDE_DIR}/*.geom")
foreach(SHADER ${ALL_SHADER_FILE}) # shader
get_filename_component(SHADER_NAME ${SHADER} NAME) # shader
string(REPLACE "." "_" HEADER_NAME ${SHADER_NAME}) # .h'.''_'
string(TOUPPER ${HEADER_NAME} GLOBAL_SHADER_VAR) # vector
set(SPV_FILE "${OUTPUT}/spv/${SHADER_NAME}.spv") # .spv
set(CPP_FILE "${OUTPUT}/cpp/${HEADER_NAME}.h") # .h
add_custom_command(
OUTPUT ${SPV_FILE}
COMMAND ${GLSLANG_BIN} -I${SHADER_INCLUDE_DIR} -V100 -o ${SPV_FILE} ${SHADER}
DEPENDS ${SHADER}
WORKING_DIRECTORY "${working_dir}") #
list(APPEND ALL_GENERATED_SPV_FILES ${SPV_FILE})
add_custom_command(
OUTPUT ${CPP_FILE}
COMMAND ${CMAKE_COMMAND} -DPATH=${SPV_FILE} -DHEADER="${CPP_FILE}"
-DGLOBAL="${GLOBAL_SHADER_VAR}" -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateShaderCPPFile.cmake"
DEPENDS ${SPV_FILE}
WORKING_DIRECTORY "${working_dir}") # spvhcmake
list(APPEND ALL_GENERATED_CPP_FILES ${CPP_FILE})
endforeach()
add_custom_target(${TARGET_NAME} # 将上述过程添加到一个生成目标中
DEPENDS ${ALL_GENERATED_SPV_FILES} ${ALL_GENERATED_CPP_FILES} SOURCES ${SHADERS})
endfunction()
# GenerateShaderCPPFile.cmake
function(embed_resource resource_file_name source_file_name variable_name)
if(EXISTS "${source_file_name}")
if("${source_file_name}" IS_NEWER_THAN "${resource_file_name}")
return()
endif()
endif()
if(EXISTS "${resource_file_name}")
file(READ "${resource_file_name}" hex_content HEX)
string(REPEAT "[0-9a-f]" 32 pattern)
string(REGEX REPLACE "(${pattern})" "\\1\n" content "${hex_content}")
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " content "${content}")
string(REGEX REPLACE ", $" "" content "${content}")
set(array_definition "static const std::vector<unsigned char> ${variable_name} =\n{\n${content}\n};")
get_filename_component(file_name ${source_file_name} NAME)
set(source "/**\n * @file ${file_name}\n * @brief Auto generated file.\n */\n#include <vector>\n${array_definition}\n")
file(WRITE "${source_file_name}" "${source}")
else()
message("ERROR: ${resource_file_name} doesn't exist")
return()
endif()
endfunction()
if(EXISTS "${PATH}")
embed_resource("${PATH}" "${HEADER}" "${GLOBAL}")
endif()

View File

@ -16,7 +16,12 @@ void pipeline::create_pipeline_layout() {
pipeline_layout_ = device.createPipelineLayout(pipeline_layout_create_info);
}
void pipeline::create_pipeline_command() const {
void pipeline::execute_pipeline() const {
#ifdef _DEBUG
if (pipeline_ == vk::Pipeline()) {
throw std::runtime_error("Pipeline not created");
}
#endif
const auto renderer = application::get()->get_renderer();
const auto device = renderer->device;
const auto command_pool = renderer->command_pool;

View File

@ -1,6 +1,9 @@
#pragma once
#include <vulkan/vulkan.hpp>
/// 1. add_binding
/// 2. create();
/// 3. execute_pipeline();
class pipeline {
public:
virtual ~pipeline() = default;
@ -34,7 +37,7 @@ public:
virtual void create() = 0;
virtual void destroy() = 0;
virtual void bind(vk::CommandBuffer command_buffer) const = 0;
void create_pipeline_command() const;
void execute_pipeline() const;
vk::Pipeline pipeline_;
vk::PipelineCache pipeline_cache_;