[Bf-blender-cvs] [19175f4757d] master: GPUBatch & GPUImmediate: Use GPUShader instead of using raw OGL handle

Clément Foucault noreply at git.blender.org
Thu Jul 30 13:40:48 CEST 2020


Commit: 19175f4757df6d90c87ccf83ed5c5199bd1d4aba
Author: Clément Foucault
Date:   Thu Jul 30 01:07:29 2020 +0200
Branches: master
https://developer.blender.org/rB19175f4757df6d90c87ccf83ed5c5199bd1d4aba

GPUBatch & GPUImmediate: Use GPUShader instead of using raw OGL handle

===================================================================

M	intern/opencolorio/ocio_impl_glsl.cc
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/intern/draw_view.c
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/gpu/GPU_batch.h
M	source/blender/gpu/GPU_immediate.h
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_batch.cc
M	source/blender/gpu/intern/gpu_immediate.cc
M	source/blender/gpu/intern/gpu_shader.cc
M	source/blender/gpu/intern/gpu_shader_private.h
M	source/blender/python/gpu/gpu_py_batch.c

===================================================================

diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc
index 43416f734c5..ab81227ff1a 100644
--- a/intern/opencolorio/ocio_impl_glsl.cc
+++ b/intern/opencolorio/ocio_impl_glsl.cc
@@ -47,6 +47,7 @@
 
 extern "C" {
 #include "GPU_immediate.h"
+#include "GPU_shader.h"
 }
 
 using namespace OCIO_NAMESPACE;
@@ -94,18 +95,15 @@ struct OCIO_GLSLCurveMappingParameters {
 struct OCIO_GLSLShader {
   /** Cache IDs */
   std::string cacheId;
-  /** TODO(fclem): Remove. IMM shader interface. */
-  struct GPUShaderInterface *interface;
-  /** OpenGL Shader objects handles. */
-  GLuint frag;
-  GLuint vert;
-  GLuint program;
+
+  struct GPUShader *shader;
   /** Uniform locations. */
   GLint dither_loc;
   GLint overlay_loc;
   GLint overlay_tex_loc;
   GLint predivide_loc;
   GLint curve_mapping_loc;
+  GLint ubo_bind;
   /** Error checking. */
   bool valid;
 };
@@ -152,56 +150,6 @@ static OCIO_GLSLDrawState *allocateOpenGLState(void)
 /** \name Shader
  * \{ */
 
-static GLuint compileShaderText(GLenum shader_type, const char *text)
-{
-  GLuint shader;
-  GLint stat;
-
-  shader = glCreateShader(shader_type);
-  glShaderSource(shader, 1, (const GLchar **)&text, NULL);
-  glCompileShader(shader);
-  glGetShaderiv(shader, GL_COMPILE_STATUS, &stat);
-
-  if (!stat) {
-    GLchar log[1000];
-    GLsizei len;
-    glGetShaderInfoLog(shader, 1000, &len, log);
-    fprintf(stderr, "Shader compile error:\n%s\n", log);
-    return 0;
-  }
-
-  return shader;
-}
-
-static GLuint linkShaders(GLuint frag, GLuint vert)
-{
-  if (!frag || !vert) {
-    return 0;
-  }
-
-  GLuint program = glCreateProgram();
-
-  glAttachShader(program, frag);
-  glAttachShader(program, vert);
-
-  glLinkProgram(program);
-
-  /* check link */
-  {
-    GLint stat;
-    glGetProgramiv(program, GL_LINK_STATUS, &stat);
-    if (!stat) {
-      GLchar log[1000];
-      GLsizei len;
-      glGetProgramInfoLog(program, 1000, &len, log);
-      fprintf(stderr, "Shader link error:\n%s\n", log);
-      return 0;
-    }
-  }
-
-  return program;
-}
-
 static void updateGLSLShader(OCIO_GLSLShader *shader,
                              ConstProcessorRcPtr *processor_scene_to_ui,
                              ConstProcessorRcPtr *processpr_ui_to_display,
@@ -213,28 +161,14 @@ static void updateGLSLShader(OCIO_GLSLShader *shader,
   }
 
   /* Delete any previous shader. */
-  glDeleteProgram(shader->program);
-  glDeleteShader(shader->frag);
-  glDeleteShader(shader->vert);
-
-  if (shader->interface) {
-    GPU_shaderinterface_discard(shader->interface);
+  if (shader->shader) {
+    GPU_shader_free(shader->shader);
   }
 
-  {
-    /* Vertex shader */
-    std::ostringstream osv;
-
-    osv << "#version 330\n";
-    osv << datatoc_gpu_shader_display_transform_vertex_glsl;
-
-    shader->vert = compileShaderText(GL_VERTEX_SHADER, osv.str().c_str());
-  }
+  std::ostringstream os;
   {
     /* Fragment shader */
-    std::ostringstream os;
 
-    os << "#version 330\n";
     /* Work around OpenColorIO not supporting latest GLSL yet. */
     os << "#define texture2D texture\n";
     os << "#define texture3D texture\n";
@@ -246,41 +180,36 @@ static void updateGLSLShader(OCIO_GLSLShader *shader,
     os << (*processpr_ui_to_display)->getGpuShaderText(*shader_desc) << "\n";
 
     os << datatoc_gpu_shader_display_transform_glsl;
-
-    shader->frag = compileShaderText(GL_FRAGMENT_SHADER, os.str().c_str());
   }
 
-  /* shader_Program */
-  if (shader->frag && shader->vert) {
-    shader->program = linkShaders(shader->frag, shader->vert);
-  }
+  shader->shader = GPU_shader_create(datatoc_gpu_shader_display_transform_vertex_glsl,
+                                     os.str().c_str(),
+                                     NULL,
+                                     NULL,
+                                     NULL,
+                                     __func__);
 
-  if (shader->program) {
-    shader->dither_loc = glGetUniformLocation(shader->program, "dither");
-    shader->overlay_tex_loc = glGetUniformLocation(shader->program, "overlay_texture");
-    shader->overlay_loc = glGetUniformLocation(shader->program, "overlay");
-    shader->predivide_loc = glGetUniformLocation(shader->program, "predivide");
-    shader->curve_mapping_loc = glGetUniformLocation(shader->program, "curve_mapping");
+  if (shader->shader) {
+    shader->dither_loc = GPU_shader_get_uniform(shader->shader, "dither");
+    shader->overlay_tex_loc = GPU_shader_get_uniform(shader->shader, "overlay_texture");
+    shader->overlay_loc = GPU_shader_get_uniform(shader->shader, "overlay");
+    shader->predivide_loc = GPU_shader_get_uniform(shader->shader, "predivide");
+    shader->curve_mapping_loc = GPU_shader_get_uniform(shader->shader, "curve_mapping");
+    shader->ubo_bind = GPU_shader_get_uniform_block_binding(shader->shader,
+                                                            "OCIO_GLSLCurveMappingParameters");
 
-    glUseProgram(shader->program);
-
-    /* TODO(fclem) Remove this. Make caller always assume viewport space and
-     * specify texco via vertex attribs. */
-    shader->interface = GPU_shaderinterface_create(shader->program);
-
-    /* Set UBO binding location. */
-    GLuint index = glGetUniformBlockIndex(shader->program, "OCIO_GLSLCurveMappingParameters");
-    glUniformBlockBinding(shader->program, index, UBO_BIND_LOC);
+    GPU_shader_bind(shader->shader);
 
     /* Set texture bind point uniform once. This is saved by the shader. */
-    glUniform1i(glGetUniformLocation(shader->program, "image_texture"), 0);
-    glUniform1i(glGetUniformLocation(shader->program, "lut3d_texture"), 2);
-    glUniform1i(glGetUniformLocation(shader->program, "lut3d_display_texture"), 3);
-    glUniform1i(glGetUniformLocation(shader->program, "curve_mapping_texture"), 4);
+    GPUShader *sh = shader->shader;
+    GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "image_texture"), 0);
+    GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_texture"), 2);
+    GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_display_texture"), 3);
+    GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "curve_mapping_texture"), 4);
   }
 
   shader->cacheId = cache_id;
-  shader->valid = (shader->program != 0);
+  shader->valid = (shader->shader != NULL);
 }
 
 static void ensureGLSLShader(OCIO_GLSLShader **shader_ptr,
@@ -302,12 +231,8 @@ static void ensureGLSLShader(OCIO_GLSLShader **shader_ptr,
 
 static void freeGLSLShader(OCIO_GLSLShader *shader)
 {
-  glDeleteProgram(shader->program);
-  glDeleteShader(shader->frag);
-  glDeleteShader(shader->vert);
-
-  if (shader->interface) {
-    GPU_shaderinterface_discard(shader->interface);
+  if (shader->shader) {
+    GPU_shader_free(shader->shader);
   }
 
   OBJECT_GUARDED_DELETE(shader, OCIO_GLSLShader);
@@ -674,10 +599,10 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r,
     glActiveTexture(GL_TEXTURE0);
 
     /* Bind UBO. */
-    glBindBufferBase(GL_UNIFORM_BUFFER, 0, shader_curvemap->buffer);
+    glBindBufferBase(GL_UNIFORM_BUFFER, shader->ubo_bind, shader_curvemap->buffer);
 
     /* TODO(fclem) remove remains of IMM. */
-    immBindProgram(shader->program, shader->interface);
+    immBindShader(shader->shader);
 
     /* Bind Shader and set uniforms. */
     // glUseProgram(shader->program);
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 805a49cf11e..91cbc03e5a4 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -670,8 +670,7 @@ BLI_INLINE void draw_geometry_bind(DRWShadingGroup *shgroup, GPUBatch *geom)
 
   DST.batch = geom;
 
-  GPU_batch_program_set_no_use(
-      geom, GPU_shader_get_program(shgroup->shader), GPU_shader_get_interface(shgroup->shader));
+  GPU_batch_set_shader_no_bind(geom, shgroup->shader);
 
   geom->program_in_use = true; /* XXX hacking #GPUBatch */
 
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index 3c470f802ec..b42700b2c7e 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -184,8 +184,7 @@ void DRW_draw_cursor(void)
 
       GPUBatch *cursor_batch = DRW_cache_cursor_get(is_aligned);
       GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_2D_FLAT_COLOR);
-      GPU_batch_program_set(
-          cursor_batch, GPU_shader_get_program(shader), GPU_shader_get_interface(shader));
+      GPU_batch_set_shader(cursor_batch, shader);
 
       GPU_batch_draw(cursor_batch);
 
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 995e980aba0..7863d2b724d 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1599,7 +1599,7 @@ static void sequencer_draw_display_buffer(const bContext *C,
         GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
   }
 
-  /* Format needs to be created prior to any immBindProgram call.
+  /* Format needs to be created prior to any immBindShader call.
    * Do it here because OCIO binds it's own shader. */
   eGPUTextureFormat format;
   eGPUDataFormat data;
diff --git a/source/blender/gpu/GPU_batch.h b/source/blender/gpu/GPU_batch.h
index 5f55b512695..85d9c037b38 100644
--- a/source/blender/gpu/GPU_batch.h
+++ b/source/blender/gpu/GPU_batch.h
@@ -127,9 +127,8 @@ int GPU_batch_vertbuf_add_ex(GPUBatch *, GPUVertBuf *, bool own_vbo);
 
 #define GPU_batch_vertbuf_add(batch, verts) GPU_batch_vertbuf_add_ex(batch, verts, false)
 
-void GPU_batch_program_set_no_use(GPUBatch *, uint32_t program, const GPUShaderInterface *);
-void GPU_batch_program_set(GPUBatch *, uint32_t program, const GPUShaderInterface *);
-void GPU_batch_program_set_shader(GPUBatch *, GPUShader *shader);
+void GPU_batch_set_shader(GPUBatch *batch, GPUShader *shader);
+void GPU_batch_set_shader_no_bind(GPUBatch *batch, GPUShader *shader);
 void GPU_batch_program_set_imm_shader(GPUBatch *batch);
 void GPU_batch_program_set_builtin(GPUBatch *batch, eGPUBuiltinShader shader_id);
 void 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list