diff options
author | Jeroen Bakker <jbakker> | 2022-01-25 16:46:25 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2022-01-25 16:46:45 +0300 |
commit | 3f42417cd4c8c01142937ba03c8fa6ef6e895494 (patch) | |
tree | 1a3190641fbba649efe651b3a6c7ffdbee501ebc /source/blender/gpu | |
parent | 196da819ba4cf553c76468a091966f33081efb08 (diff) |
Draw: Migrate hair refine compute shader to use create info.
This patch migrates the draw manager hair refine compute shader to use
GPUShaderCreateInfo.
Reviewed By: fclem
Differential Revision: https://developer.blender.org/D13915
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.cc | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader_create_info.cc | 10 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader_create_info.hh | 32 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader_private.hh | 1 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_shader.cc | 32 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_shader.hh | 1 |
7 files changed, 50 insertions, 29 deletions
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 4bb66b78dd0..3e811caa14b 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -406,6 +406,7 @@ set(SHADER_CREATE_INFOS ../draw/intern/shaders/draw_fullscreen_info.hh ../draw/intern/shaders/draw_object_infos_info.hh ../draw/intern/shaders/draw_view_info.hh +../draw/intern/shaders/draw_hair_refine_info.hh shaders/infos/gpu_clip_planes_info.hh shaders/infos/gpu_shader_2D_area_borders_info.hh diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 8c97f423800..ef800abc3c9 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -394,6 +394,7 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info) uint32_t builtins = 0; char *code = gpu_shader_dependency_get_resolved_source(info.compute_source_.c_str(), &builtins); + std::string layout = shader->compute_layout_declare(info); Vector<const char *> sources; standard_defines(sources); @@ -406,6 +407,7 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info) sources.append(types); } sources.append(resources.c_str()); + sources.append(layout.c_str()); sources.append(code); shader->compute_shader_from_glsl(sources); diff --git a/source/blender/gpu/intern/gpu_shader_create_info.cc b/source/blender/gpu/intern/gpu_shader_create_info.cc index b8ae6bc3868..9a32e1b2406 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info.cc +++ b/source/blender/gpu/intern/gpu_shader_create_info.cc @@ -74,12 +74,12 @@ void ShaderCreateInfo::finalize() validate(info); - if (info.local_group_size_[0] != 0) { - BLI_assert(local_group_size_[0] == 0); - for (int i = 0; i < 3; i++) { - local_group_size_[i] = info.local_group_size_[i]; - } + if (info.compute_layout_.local_size_x != -1) { + compute_layout_.local_size_x = info.compute_layout_.local_size_x; + compute_layout_.local_size_y = info.compute_layout_.local_size_y; + compute_layout_.local_size_z = info.compute_layout_.local_size_z; } + if (!info.vertex_source_.is_empty()) { BLI_assert(vertex_source_.is_empty()); vertex_source_ = info.vertex_source_; diff --git a/source/blender/gpu/intern/gpu_shader_create_info.hh b/source/blender/gpu/intern/gpu_shader_create_info.hh index c7b3ac5ca37..02c303fb8fa 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info.hh +++ b/source/blender/gpu/intern/gpu_shader_create_info.hh @@ -223,8 +223,6 @@ struct ShaderCreateInfo { * Only for names used by gpu::ShaderInterface. */ size_t interface_names_size_ = 0; - /** Only for compute shaders. */ - int local_group_size_[3] = {0, 0, 0}; struct VertIn { int index; @@ -242,6 +240,14 @@ struct ShaderCreateInfo { }; GeometryStageLayout geometry_layout_; + struct ComputeStageLayout { + int local_size_x = -1; + int local_size_y = -1; + int local_size_z = -1; + }; + + ComputeStageLayout compute_layout_; + struct FragOut { int index; Type type; @@ -366,6 +372,14 @@ struct ShaderCreateInfo { return *(Self *)this; } + Self &local_group_size(int local_size_x = -1, int local_size_y = -1, int local_size_z = -1) + { + compute_layout_.local_size_x = local_size_x; + compute_layout_.local_size_y = local_size_y; + compute_layout_.local_size_z = local_size_z; + return *(Self *)this; + } + /* Only needed if geometry shader is enabled. */ Self &geometry_out(StageInterfaceInfo &interface) { @@ -504,20 +518,6 @@ struct ShaderCreateInfo { /** \} */ /* -------------------------------------------------------------------- */ - /** \name Compute shaders Local Group Size - * \{ */ - - Self &local_group_size(int x, int y = 1, int z = 1) - { - local_group_size_[0] = x; - local_group_size_[1] = y; - local_group_size_[2] = z; - return *(Self *)this; - } - - /** \} */ - - /* -------------------------------------------------------------------- */ /** \name Defines * \{ */ diff --git a/source/blender/gpu/intern/gpu_shader_private.hh b/source/blender/gpu/intern/gpu_shader_private.hh index 7837af0dcf2..3bfecdefba7 100644 --- a/source/blender/gpu/intern/gpu_shader_private.hh +++ b/source/blender/gpu/intern/gpu_shader_private.hh @@ -77,6 +77,7 @@ class Shader { virtual std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const = 0; virtual std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const = 0; virtual std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const = 0; + virtual std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const = 0; /* DEPRECATED: Kept only because of BGL API. */ virtual int program_handle_get() const = 0; diff --git a/source/blender/gpu/opengl/gl_shader.cc b/source/blender/gpu/opengl/gl_shader.cc index cec85abae6f..bf18ba09c03 100644 --- a/source/blender/gpu/opengl/gl_shader.cc +++ b/source/blender/gpu/opengl/gl_shader.cc @@ -271,16 +271,16 @@ static void print_image_type(std::ostream &os, static std::ostream &print_qualifier(std::ostream &os, const Qualifier &qualifiers) { - if ((qualifiers & Qualifier::RESTRICT) != Qualifier::RESTRICT) { - os << "restrict"; + if ((qualifiers & Qualifier::RESTRICT) == Qualifier::RESTRICT) { + os << "restrict "; } - if ((qualifiers & Qualifier::READ_ONLY) != Qualifier::READ_ONLY) { - os << "readonly"; + if ((qualifiers & Qualifier::READ_ONLY) == Qualifier::READ_ONLY) { + os << "readonly "; } - if ((qualifiers & Qualifier::WRITE_ONLY) != Qualifier::WRITE_ONLY) { - os << "writeonly"; + if ((qualifiers & Qualifier::WRITE_ONLY) == Qualifier::WRITE_ONLY) { + os << "writeonly "; } - return os << " "; + return os; } static void print_resource(std::ostream &os, const ShaderCreateInfo::Resource &res) @@ -328,8 +328,8 @@ static void print_resource(std::ostream &os, const ShaderCreateInfo::Resource &r array_offset = res.storagebuf.name.find_first_of("["); name_no_array = (array_offset == -1) ? res.storagebuf.name : StringRef(res.storagebuf.name.c_str(), array_offset); - os << "buffer "; print_qualifier(os, res.storagebuf.qualifiers); + os << "buffer "; os << name_no_array << " { " << res.storagebuf.type_name << " _" << res.storagebuf.name << "; };\n"; break; @@ -507,6 +507,22 @@ std::string GLShader::geometry_interface_declare(const ShaderCreateInfo &info) c return ss.str(); } +std::string GLShader::compute_layout_declare(const ShaderCreateInfo &info) const +{ + std::stringstream ss; + ss << "\n/* Compute Layout. */\n"; + ss << "layout(local_size_x = " << info.compute_layout_.local_size_x; + if (info.compute_layout_.local_size_y != -1) { + ss << ", local_size_y = " << info.compute_layout_.local_size_y; + } + if (info.compute_layout_.local_size_z != -1) { + ss << ", local_size_y = " << info.compute_layout_.local_size_z; + } + ss << ") in;\n"; + ss << "\n"; + return ss.str(); +} + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/gpu/opengl/gl_shader.hh b/source/blender/gpu/opengl/gl_shader.hh index af92c77db54..a82ab026c16 100644 --- a/source/blender/gpu/opengl/gl_shader.hh +++ b/source/blender/gpu/opengl/gl_shader.hh @@ -69,6 +69,7 @@ class GLShader : public Shader { std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override; std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override; std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const override; + std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override; /** Should be called before linking. */ void transform_feedback_names_set(Span<const char *> name_list, |