Commit: 216d78687d2b9468b05fb598d1cef0b8424a40d2
Author: Clément Foucault
Date: Fri Aug 14 15:20:35 2020 +0200
Branches: master
https://developer.blender.org/rB216d78687d2b9468b05fb598d1cef0b8424a40d2
GPUShader: GL backend isolation
===================================================================
M source/blender/draw/intern/draw_manager_exec.c
M source/blender/gpu/CMakeLists.txt
M source/blender/gpu/GPU_matrix.h
M source/blender/gpu/GPU_shader.h
M source/blender/gpu/intern/gpu_backend.hh
M source/blender/gpu/intern/gpu_batch.cc
M source/blender/gpu/intern/gpu_batch_presets.c
M source/blender/gpu/intern/gpu_batch_utils.c
M source/blender/gpu/intern/gpu_immediate.cc
M source/blender/gpu/intern/gpu_matrix.cc
M source/blender/gpu/intern/gpu_shader.cc
M source/blender/gpu/intern/gpu_shader_builtin.c
D source/blender/gpu/intern/gpu_shader_private.h
A source/blender/gpu/intern/gpu_shader_private.hh
M source/blender/gpu/intern/gpu_vertex_format.cc
M source/blender/gpu/opengl/gl_backend.hh
M source/blender/gpu/opengl/gl_batch.cc
A source/blender/gpu/opengl/gl_shader.cc
A source/blender/gpu/opengl/gl_shader.hh
M source/blender/python/gpu/gpu_py_shader.c
===================================================================
diff --git a/source/blender/draw/intern/draw_manager_exec.c
b/source/blender/draw/intern/draw_manager_exec.c
index b931bdd0cbe..b23bcd97f41 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -31,8 +31,7 @@
#include "GPU_extensions.h"
#include "GPU_platform.h"
-#include "intern/gpu_primitive_private.h"
-#include "intern/gpu_shader_private.h"
+#include "GPU_shader.h"
#ifdef USE_GPU_SELECT
# include "GPU_select.h"
@@ -821,8 +820,8 @@ static void draw_update_uniforms(DRWShadingGroup *shgroup,
break;
case DRW_UNIFORM_TFEEDBACK_TARGET:
BLI_assert(uni->pvalue && (*use_tfeedback == false));
- *use_tfeedback = GPU_shader_transform_feedback_enable(
- shgroup->shader, ((GPUVertBuf *)uni->pvalue)->vbo_id);
+ *use_tfeedback =
GPU_shader_transform_feedback_enable(shgroup->shader,
+ ((GPUVertBuf
*)uni->pvalue));
break;
/* Legacy/Fallback support. */
case DRW_UNIFORM_BASE_INSTANCE:
diff --git a/source/blender/gpu/CMakeLists.txt
b/source/blender/gpu/CMakeLists.txt
index 906ae31fbc7..bcf2bc42402 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -92,6 +92,7 @@ set(SRC
opengl/gl_batch.cc
opengl/gl_context.cc
opengl/gl_drawlist.cc
+ opengl/gl_shader.cc
opengl/gl_vertex_array.cc
GPU_attr_binding.h
@@ -137,13 +138,14 @@ set(SRC
intern/gpu_primitive_private.h
intern/gpu_private.h
intern/gpu_select_private.h
- intern/gpu_shader_private.h
+ intern/gpu_shader_private.hh
intern/gpu_vertex_format_private.h
opengl/gl_backend.hh
opengl/gl_batch.hh
opengl/gl_context.hh
opengl/gl_drawlist.hh
+ opengl/gl_shader.hh
opengl/gl_vertex_array.hh
)
diff --git a/source/blender/gpu/GPU_matrix.h b/source/blender/gpu/GPU_matrix.h
index 7b94a535a30..aad6ae9e2ba 100644
--- a/source/blender/gpu/GPU_matrix.h
+++ b/source/blender/gpu/GPU_matrix.h
@@ -29,7 +29,7 @@
extern "C" {
#endif
-struct GPUShaderInterface;
+struct GPUShader;
void GPU_matrix_reset(void); /* to Identity transform & empty stack */
@@ -147,7 +147,7 @@ const float (*GPU_matrix_normal_get(float m[3][3]))[3];
const float (*GPU_matrix_normal_inverse_get(float m[3][3]))[3];
/* set uniform values for currently bound shader */
-void GPU_matrix_bind(const struct GPUShaderInterface *);
+void GPU_matrix_bind(struct GPUShader *shader);
bool GPU_matrix_dirty_get(void); /* since last bind */
/* own working polygon offset */
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 0b9109fbd4b..603b6957860 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -27,14 +27,19 @@
extern "C" {
#endif
-typedef struct GPUShader GPUShader;
struct GPUShaderInterface;
struct GPUTexture;
struct GPUUniformBuffer;
+struct GPUVertBuf;
-/* GPU Shader
- * - only for fragment shaders now
- * - must call texture bind before setting a texture as uniform! */
+/* TODO(fclem) These members should be private and the
+ * whole struct should just be an opaque pointer. */
+typedef struct GPUShader {
+ /** Uniform & attribute locations for shader. */
+ struct GPUShaderInterface *interface;
+ /** For debugging purpose. */
+ char name[64];
+} GPUShader;
typedef enum eGPUShaderTFBType {
GPU_SHADER_TFB_NONE = 0, /* Transform feedback unsupported. */
@@ -63,10 +68,7 @@ GPUShader *GPU_shader_create_ex(const char *vertexcode,
const char **tf_names,
const int tf_count,
const char *shader_name);
-GPUShader *GPU_shader_load_from_binary(const char *binary,
- const int binary_format,
- const int binary_len,
- const char *shname);
+
struct GPU_ShaderCreateFromArray_Params {
const char **vert, **geom, **frag, **defs;
};
@@ -81,12 +83,12 @@ void GPU_shader_bind(GPUShader *shader);
void GPU_shader_unbind(void);
/* Returns true if transform feedback was successfully enabled. */
-bool GPU_shader_transform_feedback_enable(GPUShader *shader, unsigned int
vbo_id);
+bool GPU_shader_transform_feedback_enable(GPUShader *shader, struct GPUVertBuf
*vertbuf);
void GPU_shader_transform_feedback_disable(GPUShader *shader);
int GPU_shader_get_program(GPUShader *shader);
-void GPU_shader_set_srgb_uniform(const struct GPUShaderInterface *interface);
+void GPU_shader_set_srgb_uniform(GPUShader *shader);
int GPU_shader_get_uniform(GPUShader *shader, const char *name);
int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin);
diff --git a/source/blender/gpu/intern/gpu_backend.hh
b/source/blender/gpu/intern/gpu_backend.hh
index 25d165098a7..6ab0e32a754 100644
--- a/source/blender/gpu/intern/gpu_backend.hh
+++ b/source/blender/gpu/intern/gpu_backend.hh
@@ -28,6 +28,7 @@
#include "gpu_batch_private.hh"
#include "gpu_context_private.hh"
#include "gpu_drawlist_private.hh"
+#include "gpu_shader_private.hh"
namespace blender {
namespace gpu {
@@ -43,7 +44,7 @@ class GPUBackend {
virtual Batch *batch_alloc(void) = 0;
virtual DrawList *drawlist_alloc(int list_length) = 0;
// virtual FrameBuffer *framebuffer_alloc(void) = 0;
- // virtual Shader *shader_alloc(void) = 0;
+ virtual Shader *shader_alloc(const char *name) = 0;
// virtual Texture *texture_alloc(void) = 0;
};
diff --git a/source/blender/gpu/intern/gpu_batch.cc
b/source/blender/gpu/intern/gpu_batch.cc
index b0a0c142036..6ea82cbc4f1 100644
--- a/source/blender/gpu/intern/gpu_batch.cc
+++ b/source/blender/gpu/intern/gpu_batch.cc
@@ -39,7 +39,7 @@
#include "gpu_batch_private.hh"
#include "gpu_context_private.hh"
#include "gpu_primitive_private.h"
-#include "gpu_shader_private.h"
+#include "gpu_shader_private.hh"
#include "gpu_vertex_format_private.h"
#include <limits.h>
diff --git a/source/blender/gpu/intern/gpu_batch_presets.c
b/source/blender/gpu/intern/gpu_batch_presets.c
index 71c971d8656..8adb1ba1ed3 100644
--- a/source/blender/gpu/intern/gpu_batch_presets.c
+++ b/source/blender/gpu/intern/gpu_batch_presets.c
@@ -35,7 +35,6 @@
#include "GPU_batch.h"
#include "GPU_batch_presets.h" /* own include */
#include "GPU_batch_utils.h"
-#include "gpu_shader_private.h"
/* -------------------------------------------------------------------- */
/** \name Local Structures
diff --git a/source/blender/gpu/intern/gpu_batch_utils.c
b/source/blender/gpu/intern/gpu_batch_utils.c
index 0660d4a1724..e2d03d27035 100644
--- a/source/blender/gpu/intern/gpu_batch_utils.c
+++ b/source/blender/gpu/intern/gpu_batch_utils.c
@@ -28,7 +28,6 @@
#include "GPU_batch.h"
#include "GPU_batch_utils.h" /* own include */
-#include "gpu_shader_private.h"
/* -------------------------------------------------------------------- */
/** \name Polygon Creation (2D)
diff --git a/source/blender/gpu/intern/gpu_immediate.cc
b/source/blender/gpu/intern/gpu_immediate.cc
index 2d137c2f21c..ed2950d8ee9 100644
--- a/source/blender/gpu/intern/gpu_immediate.cc
+++ b/source/blender/gpu/intern/gpu_immediate.cc
@@ -35,7 +35,7 @@
#include "gpu_attr_binding_private.h"
#include "gpu_context_private.hh"
#include "gpu_primitive_private.h"
-#include "gpu_shader_private.h"
+#include "gpu_shader_private.hh"
#include "gpu_vertex_format_private.h"
#include <stdlib.h>
@@ -145,10 +145,7 @@ GPUVertFormat *immVertexFormat(void)
void immBindShader(GPUShader *shader)
{
-#if TRUST_NO_ONE
- assert(imm.bound_program == NULL);
- assert(glIsProgram(shader->program));
-#endif
+ BLI_assert(imm.bound_program == NULL);
imm.bound_program = shader;
imm.shader_interface = shader->interface;
@@ -159,8 +156,8 @@ void immBindShader(GPUShader *shader)
GPU_shader_bind(shader);
get_attr_locations(&imm.vertex_format, &imm.attr_binding,
imm.shader_interface);
- GPU_matrix_bind(imm.shader_interface);
- GPU_shader_set_srgb_uniform(imm.shader_interface);
+ GPU_matrix_bind(shader);
+ GPU_shader_set_srgb_uniform(shader);
}
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
@@ -375,7 +372,7 @@ static void immDrawSetup(void)
}
if (GPU_matrix_dirty_get()) {
- GPU_matrix_bind(imm.shader_interface);
+ GPU_matrix_bind(imm.bound_program);
}
}
diff --git a/source/blender/gpu/intern/gpu_matrix.cc
b/source/blender/gpu/intern/gpu_matrix.cc
index 5d8d77bbf1c..c9bb7e9dad9 100644
--- a/source/blender/gpu/intern/gpu_matrix.cc
+++ b/source/blender/gpu/intern/gpu_matrix.cc
@@ -643,13 +643,13 @@ const float (*GPU_matrix_normal_inverse_get(float
m[3][3]))[3]
return m;
}
-void GPU_matrix_bind(const GPUShaderInterface *shaderface)
+void GPU_matrix_bind(GPUShader *shader)
{
/* set uniform values to matrix stack values
* call this before a draw call if desired matrices are dirty
* call glUseProgram before this, as glUniform expects program to be bound
*/
-
+ const GPUShaderInterface *shaderface = shader->interface;
int32_t MV = GPU_shaderinterface_uniform_builtin(shaderface,
GPU_UNIFORM_MODELVIEW);
int32_t P = GPU_shaderinterface_uniform_builtin(shaderface,
GPU_UNIFORM_PROJECTION);
int32_t MVP = GPU_shaderinterface_uniform_builtin(shaderface,
GPU_UNIFORM_MVP);
@@ -658,32 +658,30 @@ void GPU_matrix_bind(const GPUShaderInterface *shaderface)
int32_t MV_inv = GPU_shaderinterface_uniform_builtin(shaderface,
GPU_UNIFORM_MODELVIEW_INV);
int32_t P_inv = GPU_shaderinterface_uniform_builtin(shaderface,
GPU_UNIFORM_PROJECTION_INV);
- /* XXX(fclem) this works but this assumes shader is unused inside
GPU_shader_uniform_vector. */
- GPUShader *sh = NULL;
if (MV != -1) {
- GPU_shader_uniform_vector(sh, MV, 16, 1, (const float
*)GPU_matrix_model_view_get(NULL));
+ GPU_shader_uniform_vector(shader, MV, 16, 1, (const float
*)GPU_matrix_model_view_get(NULL));
}
if (P != -1) {
- GPU_shader_uniform_vector(sh, P, 16, 1, (const float
*)GPU_matrix_projection_get(NULL));
+ GPU_shader_uniform_vector(shader, P, 16, 1, (const float
*)GPU_matrix_projection_get(NULL));
}
if (MVP
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs