new structure
This commit is contained in:
parent
dfe9b1abe9
commit
1155e67d63
37 changed files with 2399 additions and 751 deletions
|
|
@ -1,110 +0,0 @@
|
|||
/*
|
||||
Crafter®.Graphics
|
||||
Copyright (C) 2025 Catcrafts®
|
||||
Catcrafts.net
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3.0 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
module;
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <fstream>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
#include <array>
|
||||
|
||||
export module Crafter.Graphics:VulkanShader;
|
||||
import :VulkanDevice;
|
||||
|
||||
namespace Crafter {
|
||||
export template<size_t N>
|
||||
struct StringLiteral {
|
||||
constexpr StringLiteral(const char (&str)[N]) {
|
||||
std::copy_n(str, N, value);
|
||||
}
|
||||
|
||||
char value[N];
|
||||
};
|
||||
|
||||
export struct DescriptorBinding {
|
||||
VkDescriptorType type;
|
||||
std::uint32_t slot;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Represents a Vulkan shader module with specified configuration.
|
||||
*
|
||||
* This class template encapsulates a Vulkan shader, parametrized by the shader's
|
||||
* source path, entry point, shader stage, and its descriptor bindings.
|
||||
*
|
||||
* @tparam path A compile-time string literal specifying the file path to the shader source or binary.
|
||||
* @tparam entrypoint A compile-time string literal specifying the entry point function name within the shader.
|
||||
* @tparam stage The Vulkan shader stage flag indicating the shader type (e.g., vertex, fragment).
|
||||
* @tparam DescriptorCount The number of descriptor bindings used by the shader.
|
||||
* @tparam Descriptors An array of descriptor binding configurations used by the shader.
|
||||
*
|
||||
* This class facilitates compile-time specification of shader resources and metadata,
|
||||
* allowing for type-safe shader management and potentially more efficient shader pipeline creation.
|
||||
* CreateShader must be called before using this shader in a pipeline.
|
||||
*/
|
||||
export template <
|
||||
StringLiteral path,
|
||||
StringLiteral entrypoint,
|
||||
VkShaderStageFlagBits stage,
|
||||
std::uint32_t DescriptorCount,
|
||||
const std::array<DescriptorBinding, DescriptorCount> Descriptors
|
||||
>
|
||||
class VulkanShader {
|
||||
public:
|
||||
constexpr static VkShaderStageFlagBits _stage = stage;
|
||||
constexpr static std::array<DescriptorBinding, DescriptorCount> descriptors = Descriptors;
|
||||
constexpr static std::uint32_t descriptorCount = DescriptorCount;
|
||||
constexpr static StringLiteral _entrypoint = entrypoint;
|
||||
inline static VkShaderModule shader;
|
||||
/**
|
||||
* @brief Creates the vulkan shader, this must be called before any use of this shader.
|
||||
*/
|
||||
static void CreateShader() {
|
||||
std::ifstream file(path.value, std::ios::binary);
|
||||
if (!file) {
|
||||
std::cerr << "Error: Could not open file " << path.value << std::endl;
|
||||
}
|
||||
|
||||
// Move to the end of the file to determine its size
|
||||
file.seekg(0, std::ios::end);
|
||||
std::streamsize size = file.tellg();
|
||||
file.seekg(0, std::ios::beg);
|
||||
|
||||
std::vector<std::uint32_t> spirv(size / sizeof(std::uint32_t));
|
||||
|
||||
// Read the data into the vector
|
||||
if (!file.read(reinterpret_cast<char*>(spirv.data()), size)) {
|
||||
std::cerr << "Error: Could not read data from file" << std::endl;
|
||||
}
|
||||
|
||||
file.close();
|
||||
|
||||
VkShaderModuleCreateInfo module_info{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
|
||||
module_info.codeSize = spirv.size() * sizeof(uint32_t);
|
||||
module_info.pCode = spirv.data();
|
||||
|
||||
VkShaderModule shader_module;
|
||||
VulkanDevice::CHECK_VK_RESULT(vkCreateShaderModule(VulkanDevice::device, &module_info, nullptr, &shader));
|
||||
}
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue