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

Reply via email to