[Bf-blender-cvs] [bbf6a0c6aa4] tmp-gpu-shader-descriptor-2: gpu_shader_gpencil_stroke.
Jeroen Bakker
noreply at git.blender.org
Tue Jan 11 14:26:49 CET 2022
Commit: bbf6a0c6aa4a1cb0a451be7361d2675764308671
Author: Jeroen Bakker
Date: Tue Jan 11 13:38:31 2022 +0100
Branches: tmp-gpu-shader-descriptor-2
https://developer.blender.org/rBbbf6a0c6aa4a1cb0a451be7361d2675764308671
gpu_shader_gpencil_stroke.
===================================================================
M source/blender/editors/gpencil/drawgpencil.c
M source/blender/gpu/CMakeLists.txt
M source/blender/gpu/GPU_immediate.h
M source/blender/gpu/GPU_shader_shared.h
M source/blender/gpu/intern/gpu_immediate.cc
M source/blender/gpu/intern/gpu_shader.cc
M source/blender/gpu/intern/gpu_shader_builtin.c
M source/blender/gpu/intern/gpu_shader_create_info.hh
M source/blender/gpu/intern/gpu_shader_private.hh
M source/blender/gpu/opengl/gl_shader.cc
M source/blender/gpu/opengl/gl_shader.hh
M source/blender/gpu/shaders/gpu_shader_gpencil_stroke_frag.glsl
M source/blender/gpu/shaders/gpu_shader_gpencil_stroke_geom.glsl
M source/blender/gpu/shaders/gpu_shader_gpencil_stroke_vert.glsl
A source/blender/gpu/shaders/infos/gpu_shader_gpencil_stroke_info.hh
M source/blender/gpu/shaders/infos/gpu_shader_todo_info.hh
===================================================================
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 6f63529298c..23b579b94f1 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -61,9 +61,12 @@
#include "WM_api.h"
+#include "GPU_batch.h"
#include "GPU_immediate.h"
#include "GPU_matrix.h"
+#include "GPU_shader_shared.h"
#include "GPU_state.h"
+#include "GPU_uniform_buffer.h"
#include "ED_gpencil.h"
#include "ED_screen.h"
@@ -189,21 +192,27 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw,
};
immBindBuiltinProgram(GPU_SHADER_GPENCIL_STROKE);
- immUniform2fv("Viewport", viewport);
- immUniform1f("pixsize", tgpw->rv3d->pixsize);
+
float obj_scale = tgpw->ob ?
(tgpw->ob->scale[0] + tgpw->ob->scale[1] + tgpw->ob->scale[2]) / 3.0f :
1.0f;
- immUniform1f("objscale", obj_scale);
+ struct GPencilStrokeData gpencil_stroke_data;
+ copy_v2_v2(gpencil_stroke_data.viewport, viewport);
+ gpencil_stroke_data.pixsize = tgpw->rv3d->pixsize;
+ gpencil_stroke_data.objscale = obj_scale;
int keep_size = (int)((tgpw->gpd) && (tgpw->gpd->flag & GP_DATA_STROKE_KEEPTHICKNESS));
- immUniform1i("keep_size", keep_size);
- immUniform1f("pixfactor", tgpw->gpd->pixfactor);
+ gpencil_stroke_data.keep_size = keep_size;
+ gpencil_stroke_data.pixfactor = tgpw->gpd->pixfactor;
/* xray mode always to 3D space to avoid wrong zdepth calculation (T60051) */
- immUniform1i("xraymode", GP_XRAY_3DSPACE);
- immUniform1i("caps_start", (int)tgpw->gps->caps[0]);
- immUniform1i("caps_end", (int)tgpw->gps->caps[1]);
- immUniform1i("fill_stroke", (int)tgpw->is_fill_stroke);
+ gpencil_stroke_data.xraymode = GP_XRAY_3DSPACE;
+ gpencil_stroke_data.caps_start = tgpw->gps->caps[0];
+ gpencil_stroke_data.caps_end = tgpw->gps->caps[1];
+ gpencil_stroke_data.fill_stroke = tgpw->is_fill_stroke;
+
+ GPUUniformBuf *ubo = GPU_uniformbuf_create_ex(
+ sizeof(struct GPencilStrokeData), &gpencil_stroke_data, __func__);
+ immBindUniformBuf("gpencil_stroke_data", ubo);
/* draw stroke curve */
immBeginAtMost(GPU_PRIM_LINE_STRIP_ADJ, totpoints + cyclic_add + 2);
@@ -255,6 +264,8 @@ static void gpencil_draw_stroke_3d(tGPDdraw *tgpw,
immEnd();
immUnbindProgram();
+
+ GPU_uniformbuf_free(ubo);
}
/* ----- Strokes Drawing ------ */
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index fd30c3311bb..64878989923 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -438,6 +438,7 @@ shaders/infos/gpu_shader_2D_area_borders_info.hh
shaders/infos/gpu_shader_instance_varying_color_varying_size_info.hh
shaders/infos/gpu_shader_3D_point_info.hh
shaders/infos/gpu_shader_2D_nodelink_info.hh
+shaders/infos/gpu_shader_gpencil_stroke_info.hh
#shaders/infos/gpu_shader_todo_info.hh
)
diff --git a/source/blender/gpu/GPU_immediate.h b/source/blender/gpu/GPU_immediate.h
index a175fc65ba4..1b288d19c4a 100644
--- a/source/blender/gpu/GPU_immediate.h
+++ b/source/blender/gpu/GPU_immediate.h
@@ -122,6 +122,7 @@ void immUniformMatrix4fv(const char *name, const float data[4][4]);
void immBindTexture(const char *name, GPUTexture *tex);
void immBindTextureSampler(const char *name, GPUTexture *tex, eGPUSamplerState state);
+void immBindUniformBuf(const char *name, GPUUniformBuf *ubo);
/* Convenience functions for setting "uniform vec4 color". */
/* The RGB functions have implicit alpha = 1.0. */
diff --git a/source/blender/gpu/GPU_shader_shared.h b/source/blender/gpu/GPU_shader_shared.h
index 99a3cfe8557..6e38e016979 100644
--- a/source/blender/gpu/GPU_shader_shared.h
+++ b/source/blender/gpu/GPU_shader_shared.h
@@ -22,3 +22,16 @@ struct NodeLinkInstanceData {
float arrowSize;
float2 pad;
};
+
+struct GPencilStrokeData {
+ float2 viewport;
+ float pixsize;
+ float objscale;
+ float pixfactor;
+ int xraymode;
+ int caps_start;
+ int caps_end;
+ bool1 keep_size;
+ bool1 fill_stroke;
+ float2 pad;
+};
diff --git a/source/blender/gpu/intern/gpu_immediate.cc b/source/blender/gpu/intern/gpu_immediate.cc
index 7ca93252683..e28776c87b3 100644
--- a/source/blender/gpu/intern/gpu_immediate.cc
+++ b/source/blender/gpu/intern/gpu_immediate.cc
@@ -629,6 +629,12 @@ void immBindTextureSampler(const char *name, GPUTexture *tex, eGPUSamplerState s
GPU_texture_bind_ex(tex, state, binding, true);
}
+void immBindUniformBuf(const char *name, GPUUniformBuf *ubo)
+{
+ int binding = GPU_shader_get_uniform_block_binding(imm->shader, name);
+ GPU_uniformbuf_bind(ubo, binding);
+}
+
/* --- convenience functions for setting "uniform vec4 color" --- */
void immUniformColor4f(float r, float g, float b, float a)
diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc
index 387e2f22702..243c2c829ff 100644
--- a/source/blender/gpu/intern/gpu_shader.cc
+++ b/source/blender/gpu/intern/gpu_shader.cc
@@ -354,6 +354,7 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info)
if (!info.geometry_source_.is_empty()) {
uint32_t builtins = 0;
std::string interface = shader->geometry_interface_declare(info);
+ std::string layout = shader->geometry_layout_declare(info);
char *code = gpu_shader_dependency_get_resolved_source(info.geometry_source_.c_str(),
&builtins);
@@ -368,6 +369,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(interface.c_str());
sources.append(code);
diff --git a/source/blender/gpu/intern/gpu_shader_builtin.c b/source/blender/gpu/intern/gpu_shader_builtin.c
index c67afdc1577..b6d272838bd 100644
--- a/source/blender/gpu/intern/gpu_shader_builtin.c
+++ b/source/blender/gpu/intern/gpu_shader_builtin.c
@@ -338,11 +338,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_SHADER_BUILTIN_LEN] = {
.defs = "#define UNIFORM_SCALE\n",
},
- [GPU_SHADER_2D_AREA_BORDERS] =
- {
- .name = "GPU_SHADER_2D_AREA_BORDERS",
- .create_info = "gpu_shader_2D_area_borders"
- },
+ [GPU_SHADER_2D_AREA_BORDERS] = {.name = "GPU_SHADER_2D_AREA_BORDERS",
+ .create_info = "gpu_shader_2D_area_borders"},
[GPU_SHADER_2D_WIDGET_BASE] =
{
.name = "GPU_SHADER_2D_WIDGET_BASE",
@@ -368,13 +365,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_SHADER_BUILTIN_LEN] = {
[GPU_SHADER_2D_NODELINK_INST] = {.name = "GPU_SHADER_2D_NODELINK_INST",
.create_info = "gpu_shader_2D_nodelink_inst"},
- [GPU_SHADER_GPENCIL_STROKE] =
- {
- .name = "GPU_SHADER_GPENCIL_STROKE",
- .vert = datatoc_gpu_shader_gpencil_stroke_vert_glsl,
- .geom = datatoc_gpu_shader_gpencil_stroke_geom_glsl,
- .frag = datatoc_gpu_shader_gpencil_stroke_frag_glsl,
- },
+ [GPU_SHADER_GPENCIL_STROKE] = {.name = "GPU_SHADER_GPENCIL_STROKE",
+ .create_info = "gpu_shader_gpencil_stroke"},
};
GPUShader *GPU_shader_get_builtin_shader_with_config(eGPUBuiltinShader shader,
diff --git a/source/blender/gpu/intern/gpu_shader_create_info.hh b/source/blender/gpu/intern/gpu_shader_create_info.hh
index 179cc468416..da84916714f 100644
--- a/source/blender/gpu/intern/gpu_shader_create_info.hh
+++ b/source/blender/gpu/intern/gpu_shader_create_info.hh
@@ -147,6 +147,22 @@ enum class Interpolation {
NO_PERSPECTIVE,
};
+/** Input layout for geometry shader. */
+enum class InputLayout {
+ POINTS = 0,
+ LINES,
+ LINES_ADJACENCY,
+ TRIANGLES,
+ TRIANGLES_ADJACENCY,
+};
+
+/** Output layout for geometry shader. */
+enum class OutputLayout {
+ POINTS = 0,
+ LINE_STRIP,
+ TRIANGLE_STRIP,
+};
+
struct StageInterfaceInfo {
struct InOut {
Interpolation interp;
@@ -216,6 +232,17 @@ struct ShaderCreateInfo {
};
Vector<VertIn> vertex_inputs_;
+ struct GeomIn {
+ InputLayout layout;
+ };
+ GeomIn geom_in_;
+
+ struct GeomOut {
+ OutputLayout layout;
+ int max_vertices;
+ };
+ GeomOut geom_out_;
+
struct FragOut {
int index;
Type type;
@@ -318,6 +345,14 @@ struct ShaderCreateInfo {
return *(Self *)this;
}
+ Self &geometry_layout(InputLayout layout_in, OutputLayout layout_out, int max_vertices)
+ {
+ geom_in_.layout = layout_in;
+ geom_out_.layout = layout_out;
+ geom_out_.max_vertices = max_vertices;
+ return *(Self *)this;
+ }
+
/* Only needed if geometry shader is enabled. */
Self &geometry_out(StageInterfaceInfo &interface)
{
diff --git a/source/blender/gpu/intern/gpu_shader_private.hh b/source/blender/gpu/intern/gpu_shader_private.hh
index e6cc17215d9..7837af0dcf2 100644
--- a/source/blender/gpu/intern/gpu_shader_private.hh
+++ b/source/blender/gpu/intern/gpu_shader_private.hh
@@ -76,6 +76,7 @@ class Shader {
virtual std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const = 0;
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;
/* 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 f41d3bcc409..f5caf0df3d3 100644
--- a/source/blender/gpu/opengl/gl_shader.cc
+++ b/source/blender/gpu/opengl/gl_shader.cc
@@ -125,6 +125,38 @@ static const char *to_string(const Type &type)
}
}
+static const char *to_string(const InputLayout &layout)
+{
+ switch (layout) {
+ case InputLayout::POINTS:
+ return "points";
+ case InputLayout::LINES:
+ return "lines";
+ case InputLayout::LINES_ADJACENCY:
+ return "lines_adjacency";
+ case InputLayout::TRIANGLES:
+ return "triangle
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list