wren
Vulkan-based game engine
Loading...
Searching...
No Matches
shader.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <shaderc/shaderc.h>
4#include <shaderc/status.h>
6
7#include <memory>
8#include <string>
9#include <tl/expected.hpp>
10#include <vulkan/vulkan.hpp>
11#include <vulkan/vulkan_enums.hpp>
12#include <vulkan/vulkan_handles.hpp>
13#include <vulkan/vulkan_structs.hpp>
14#include <wren/utils/errors.hpp>
15#include <wren/math/vector.hpp>
17
18DEFINE_ERROR_IMPL("shaderc", shaderc_compilation_status)
19BOOST_DESCRIBE_ENUM(shaderc_compilation_status,
20 shaderc_compilation_status_invalid_stage,
21 shaderc_compilation_status_compilation_error,
22 shaderc_compilation_status_internal_error,
23 shaderc_compilation_status_null_result_object,
24 shaderc_compilation_status_validation_error,
25 shaderc_compilation_status_transformation_error,
26 shaderc_compilation_status_configuration_error)
27
28namespace wren::vk {
29
30struct ShaderModule {
31 reflect::spirv_t spirv;
32 ::vk::ShaderModule module;
33 std::shared_ptr<spv_reflect::ShaderModule> reflection;
34
35 ShaderModule() = default;
36 ShaderModule(reflect::spirv_t spirv, const ::vk::ShaderModule &module);
37
38 [[nodiscard]] auto get_vertex_input_bindings() const
39 -> std::vector<::vk::VertexInputBindingDescription>;
40
41 [[nodiscard]] auto get_vertex_input_attributes() const
42 -> std::vector<::vk::VertexInputAttributeDescription>;
43
44 [[nodiscard]] auto get_descriptor_set_layout_bindings() const
45 -> std::vector<::vk::DescriptorSetLayoutBinding>;
46};
47
48class Shader {
49 public:
50 static auto create(const ::vk::Device &device,
51 const std::string &vertex_shader,
52 const std::string &fragment_shader)
53 -> expected<std::shared_ptr<Shader>>;
54
55 static auto compile_shader(const ::vk::Device &device,
56 const shaderc_shader_kind &shader_kind,
57 const std::string &filename,
58 const std::string &shader_source)
60
61 [[nodiscard]] auto get_pipeline() const { return pipeline_; }
62 [[nodiscard]] auto pipeline_layout() const { return pipeline_layout_; }
63 [[nodiscard]] auto descriptor_layout() const { return descriptor_layout_; }
64
65 void fragment_shader(const ShaderModule &fragment) {
66 fragment_shader_module_ = fragment;
67 }
68
69 void vertex_shader(const ShaderModule &vertex) {
70 vertex_shader_module_ = vertex;
71 }
72
73 auto create_graphics_pipeline(const ::vk::Device &device,
74 const ::vk::RenderPass &render_pass,
75 const math::vec2i &size) -> expected<void>;
76
77 private:
78 ::vk::DescriptorSetLayout descriptor_layout_;
79 ::vk::PipelineLayout pipeline_layout_;
80 ::vk::Pipeline pipeline_;
81
82 ShaderModule vertex_shader_module_;
83 ShaderModule fragment_shader_module_;
84};
85
86} // namespace wren::vk
Definition ui.hpp:5
BOOST_DESCRIBE_ENUM(Result, eSuccess, eNotReady, eTimeout, eEventSet, eEventReset, eIncomplete, eErrorOutOfHostMemory, eErrorOutOfDeviceMemory, eErrorInitializationFailed, eErrorDeviceLost, eErrorMemoryMapFailed, eErrorLayerNotPresent, eErrorExtensionNotPresent, eErrorFeatureNotPresent, eErrorIncompatibleDriver, eErrorTooManyObjects, eErrorFormatNotSupported, eErrorFragmentedPool, eErrorUnknown, eErrorOutOfPoolMemory, eErrorOutOfPoolMemoryKHR, eErrorInvalidExternalHandle, eErrorInvalidExternalHandleKHR, eErrorFragmentation, eErrorFragmentationEXT, eErrorInvalidOpaqueCaptureAddress, eErrorInvalidDeviceAddressEXT, eErrorInvalidOpaqueCaptureAddressKHR, ePipelineCompileRequired, eErrorPipelineCompileRequiredEXT, ePipelineCompileRequiredEXT, eErrorSurfaceLostKHR, eErrorNativeWindowInUseKHR, eSuboptimalKHR, eErrorOutOfDateKHR, eErrorIncompatibleDisplayKHR, eErrorValidationFailedEXT, eErrorInvalidShaderNV, eErrorImageUsageNotSupportedKHR, eErrorVideoPictureLayoutNotSupportedKHR, eErrorVideoProfileOperationNotSupportedKHR, eErrorVideoProfileFormatNotSupportedKHR, eErrorVideoProfileCodecNotSupportedKHR, eErrorVideoStdVersionNotSupportedKHR, eErrorInvalidDrmFormatModifierPlaneLayoutEXT, eErrorNotPermittedKHR, eErrorNotPermittedEXT, eThreadIdleKHR, eThreadDoneKHR, eOperationDeferredKHR, eOperationNotDeferredKHR, eErrorCompressionExhaustedEXT)
Definition render_pass.hpp:19
tl::expected< T, Err > expected
Definition errors.hpp:49
#define DEFINE_ERROR_IMPL(CAT_NAME, ERROR_ENUM)
This macro creates the hooks into std::error_code for a given error enum.
Definition errors.hpp:61