Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jbakker>2022-01-25 16:46:25 +0300
committerJeroen Bakker <jeroen@blender.org>2022-01-25 16:46:45 +0300
commit3f42417cd4c8c01142937ba03c8fa6ef6e895494 (patch)
tree1a3190641fbba649efe651b3a6c7ffdbee501ebc /source/blender/gpu
parent196da819ba4cf553c76468a091966f33081efb08 (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.txt1
-rw-r--r--source/blender/gpu/intern/gpu_shader.cc2
-rw-r--r--source/blender/gpu/intern/gpu_shader_create_info.cc10
-rw-r--r--source/blender/gpu/intern/gpu_shader_create_info.hh32
-rw-r--r--source/blender/gpu/intern/gpu_shader_private.hh1
-rw-r--r--source/blender/gpu/opengl/gl_shader.cc32
-rw-r--r--source/blender/gpu/opengl/gl_shader.hh1
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,