Blender V5.0
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
66 bool finalize(const shader::ShaderCreateInfo *info = nullptr) override;
67 bool finalize_post();
68
76 bool is_ready() const;
77 void warm_cache(int limit) override;
78
79 void bind(const shader::SpecializationConstants *constants_state) override;
80 void unbind() override;
81
82 void uniform_float(int location, int comp_len, int array_size, const float *data) override;
83 void uniform_int(int location, int comp_len, int array_size, const int *data) override;
84
85 std::string resources_declare(const shader::ShaderCreateInfo &info) const override;
86 std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const override;
87 std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override;
88 std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override;
89 std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const override;
90 std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override;
91
93 const shader::SpecializationConstants &constants_state);
96 VKStateManager &state_manager,
97 VKFrameBuffer &framebuffer,
98 shader::SpecializationConstants &constants_state);
99
100 const VKShaderInterface &interface_get() const;
101
108 {
109 return vk_descriptor_set_layout_ != VK_NULL_HANDLE;
110 }
111
112 VkDescriptorSetLayout vk_descriptor_set_layout_get() const
113 {
114 return vk_descriptor_set_layout_;
115 }
116
117 private:
118 void build_shader_module(MutableSpan<StringRefNull> sources,
119 shaderc_shader_kind stage,
120 VKShaderModule &r_shader_module);
121 bool finalize_shader_module(VKShaderModule &shader_module, const char *stage_name);
122 bool finalize_descriptor_set_layouts(VKDevice &vk_device,
123 const VKShaderInterface &shader_interface);
124 bool finalize_pipeline_layout(VKDevice &device, const VKShaderInterface &shader_interface);
125
130 std::string workaround_geometry_shader_source_create(const shader::ShaderCreateInfo &info);
131 bool do_geometry_shader_injection(const shader::ShaderCreateInfo *info) const;
132};
133
134static inline VKShader &unwrap(Shader &shader)
135{
136 return static_cast<VKShader &>(shader);
137}
138
139static inline VKShader *unwrap(Shader *shader)
140{
141 return static_cast<VKShader *>(shader);
142}
143
144} // namespace blender::gpu
GPUPrimType
BMesh const char void * data
void init()
Shader(const char *name)
Definition gpu_shader.cc:57
void unbind() override
Definition vk_shader.cc:733
VKShaderModule compute_module
Definition vk_shader.hh:50
std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override
Definition vk_shader.cc:945
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:559
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:554
std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override
void warm_cache(int limit) override
Definition vk_shader.cc:574
VKPushConstants push_constants
Definition vk_shader.hh:55
void compute_shader_from_glsl(MutableSpan< StringRefNull > sources) override
Definition vk_shader.cc:569
std::string resources_declare(const shader::ShaderCreateInfo &info) const override
Definition vk_shader.cc:745
bool is_ready() const
Definition vk_shader.cc:666
std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override
bool has_descriptor_set() const
Definition vk_shader.hh:107
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:740
void fragment_shader_from_glsl(MutableSpan< StringRefNull > sources) override
Definition vk_shader.cc:564
VKShader(const char *name)
Definition vk_shader.cc:491
VKShaderModule vertex_module
Definition vk_shader.hh:47
void bind(const shader::SpecializationConstants *constants_state) override
Definition vk_shader.cc:723
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:735
const VKShaderInterface & interface_get() const
VkDescriptorSetLayout vk_descriptor_set_layout_get() const
Definition vk_shader.hh:112
bool finalize(const shader::ShaderCreateInfo *info=nullptr) override
Definition vk_shader.cc:579
std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const override
Definition vk_shader.cc:846
static Context * unwrap(GPUContext *ctx)
Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correc...