Blender V4.5
vk_shader.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_string_ref.hh"
12
13#include "gpu_shader_private.hh"
14
15#include "vk_backend.hh"
16#include "vk_context.hh"
17#include "vk_push_constants.hh"
18#include "vk_shader_module.hh"
19
20#include "shaderc/shaderc.hpp"
21
22namespace blender::gpu {
24
25class VKShader : public Shader {
26 private:
27 VKContext *context_ = nullptr;
28
33 VkDescriptorSetLayout vk_descriptor_set_layout_ = VK_NULL_HANDLE;
34
40 VkPipeline vk_pipeline_base_ = VK_NULL_HANDLE;
41
42 bool is_compute_shader_ = false;
43 bool is_static_shader_ = false;
44 bool use_batch_compilation_ = false;
45
46 public:
52 bool compilation_failed = false;
53
54 VkPipelineLayout vk_pipeline_layout = VK_NULL_HANDLE;
56
57 VKShader(const char *name);
58 virtual ~VKShader();
59
60 void init(const shader::ShaderCreateInfo &info, bool is_batch_compilation) override;
61 void init() override {}
62
67 bool finalize(const shader::ShaderCreateInfo *info = nullptr) override;
68 bool finalize_post();
69
77 bool is_ready() const;
78 void warm_cache(int limit) override;
79
80 void bind(const shader::SpecializationConstants *constants_state) override;
81 void unbind() override;
82
83 void uniform_float(int location, int comp_len, int array_size, const float *data) override;
84 void uniform_int(int location, int comp_len, int array_size, const int *data) override;
85
86 std::string resources_declare(const shader::ShaderCreateInfo &info) const override;
87 std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const override;
88 std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override;
89 std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override;
90 std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const override;
91 std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override;
92
94 const shader::SpecializationConstants &constants_state);
97 VKStateManager &state_manager,
98 VKFrameBuffer &framebuffer,
99 shader::SpecializationConstants &constants_state);
100
101 const VKShaderInterface &interface_get() const;
102
109 {
110 return vk_descriptor_set_layout_ != VK_NULL_HANDLE;
111 }
112
113 VkDescriptorSetLayout vk_descriptor_set_layout_get() const
114 {
115 return vk_descriptor_set_layout_;
116 }
117
118 private:
119 void build_shader_module(MutableSpan<StringRefNull> sources,
120 shaderc_shader_kind stage,
121 VKShaderModule &r_shader_module);
122 bool finalize_shader_module(VKShaderModule &shader_module, const char *stage_name);
123 bool finalize_descriptor_set_layouts(VKDevice &vk_device,
124 const VKShaderInterface &shader_interface);
125 bool finalize_pipeline_layout(VKDevice &device, const VKShaderInterface &shader_interface);
126
131 std::string workaround_geometry_shader_source_create(const shader::ShaderCreateInfo &info);
132 bool do_geometry_shader_injection(const shader::ShaderCreateInfo *info) const;
133};
134
135static inline VKShader &unwrap(Shader &shader)
136{
137 return static_cast<VKShader &>(shader);
138}
139
140static inline VKShader *unwrap(Shader *shader)
141{
142 return static_cast<VKShader *>(shader);
143}
144
145} // namespace blender::gpu
GPUPrimType
BMesh const char void * data
Shader(const char *name)
Definition gpu_shader.cc:56
void unbind() override
Definition vk_shader.cc:747
VKShaderModule compute_module
Definition vk_shader.hh:50
std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override
Definition vk_shader.cc:954
void init() override
Definition vk_shader.hh:61
VkPipeline ensure_and_get_graphics_pipeline(GPUPrimType primitive, VKVertexAttributeObject &vao, VKStateManager &state_manager, VKFrameBuffer &framebuffer, shader::SpecializationConstants &constants_state)
void geometry_shader_from_glsl(MutableSpan< StringRefNull > sources) override
Definition vk_shader.cc:573
VkPipeline ensure_and_get_compute_pipeline(const shader::SpecializationConstants &constants_state)
VKShaderModule fragment_module
Definition vk_shader.hh:49
void vertex_shader_from_glsl(MutableSpan< StringRefNull > sources) override
Definition vk_shader.cc:568
std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override
void warm_cache(int limit) override
Definition vk_shader.cc:588
VKPushConstants push_constants
Definition vk_shader.hh:55
void compute_shader_from_glsl(MutableSpan< StringRefNull > sources) override
Definition vk_shader.cc:583
std::string resources_declare(const shader::ShaderCreateInfo &info) const override
Definition vk_shader.cc:759
bool is_ready() const
Definition vk_shader.cc:680
std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override
bool has_descriptor_set() const
Definition vk_shader.hh:108
VkPipelineLayout vk_pipeline_layout
Definition vk_shader.hh:54
void uniform_int(int location, int comp_len, int array_size, const int *data) override
Definition vk_shader.cc:754
void fragment_shader_from_glsl(MutableSpan< StringRefNull > sources) override
Definition vk_shader.cc:578
VKShader(const char *name)
Definition vk_shader.cc:505
VKShaderModule vertex_module
Definition vk_shader.hh:47
void bind(const shader::SpecializationConstants *constants_state) override
Definition vk_shader.cc:737
VKShaderModule geometry_module
Definition vk_shader.hh:48
std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const override
void uniform_float(int location, int comp_len, int array_size, const float *data) override
Definition vk_shader.cc:749
const VKShaderInterface & interface_get() const
VkDescriptorSetLayout vk_descriptor_set_layout_get() const
Definition vk_shader.hh:113
bool finalize(const shader::ShaderCreateInfo *info=nullptr) override
Definition vk_shader.cc:593
std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const override
Definition vk_shader.cc:855
static Context * unwrap(GPUContext *ctx)
Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correc...