[Bf-blender-cvs] [b9af19ec76f] tmp-drw-callbatching: DRW: Use ARB_shader_draw_parameters when available

Clément Foucault noreply at git.blender.org
Sat Aug 17 14:49:17 CEST 2019


Commit: b9af19ec76f2507a12d8f950e7c2b55afb100752
Author: Clément Foucault
Date:   Sat Jun 1 16:43:50 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rBb9af19ec76f2507a12d8f950e7c2b55afb100752

DRW: Use ARB_shader_draw_parameters when available

This is to pass the offset of the object data to the shader
without a uniform call.

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

M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/modes/shaders/common_view_lib.glsl
M	source/blender/gpu/intern/gpu_shader.c

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

diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 779092cfec9..cdd9df82bdf 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -852,7 +852,11 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader)
   int view_ubo_location = GPU_shader_get_uniform_block(shader, "viewBlock");
   int model_ubo_location = GPU_shader_get_uniform_block(shader, "modelBlock");
   int info_ubo_location = GPU_shader_get_uniform_block(shader, "infoBlock");
-  int drawid_location = GPU_shader_get_uniform_ensure(shader, "drawID");
+  int drawid_location = -1;
+
+  if (!GLEW_ARB_shader_draw_parameters) {
+    drawid_location = GPU_shader_get_uniform_ensure(shader, "drawID");
+  }
 
   if (drawid_location != -1) {
     drw_shgroup_uniform_create_ex(shgroup, drawid_location, DRW_UNIFORM_DRAWID, NULL, 0, 1);
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 567dfc5e704..e3fa95610cf 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1000,10 +1000,14 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
       }
 
       if (drawid_loc != -1) {
+        /* Fallback when ARB_shader_draw_parameters is not supported. */
         int id = handle.id;
         GPU_shader_uniform_vector_int(shgroup->shader, drawid_loc, 1, 1, &id);
         base_inst = 0;
       }
+      else {
+        base_inst = handle.id;
+      }
 
       if (obmats_loc == -1 || obinfos_loc == -1) {
         /* TODO This is Legacy. Need to be removed. */
diff --git a/source/blender/draw/modes/shaders/common_view_lib.glsl b/source/blender/draw/modes/shaders/common_view_lib.glsl
index 307ea8931fa..e235262b572 100644
--- a/source/blender/draw/modes/shaders/common_view_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_view_lib.glsl
@@ -23,7 +23,11 @@ layout(std140) uniform viewBlock
     _world_clip_planes_calc_clip_distance(p, clipPlanes)
 #endif
 
+#ifdef GL_ARB_shader_draw_parameters
+#  define drawID gl_BaseInstanceARB
+#else
 uniform int drawID = 0;
+#endif
 
 struct ObjectMatrices {
   mat4 drw_modelMatrix;
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 3e930d19696..98af9714580 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -249,6 +249,9 @@ static void gpu_shader_standard_extensions(char defines[MAX_EXT_DEFINE_LENGTH])
     /* a #version 400 feature, but we use #version 330 maximum so use extension */
     strcat(defines, "#extension GL_ARB_texture_query_lod: enable\n");
   }
+  if (GLEW_ARB_shader_draw_parameters) {
+    strcat(defines, "#extension GL_ARB_shader_draw_parameters : enable\n");
+  }
 }
 
 static void gpu_shader_standard_defines(char defines[MAX_DEFINE_LENGTH])



More information about the Bf-blender-cvs mailing list