GPU: Rename GPU_shader_get_uniform to GPU_shader_get_uniform_ensure
authorClément Foucault <foucault.clem@gmail.com>
Wed, 16 Jan 2019 03:41:27 +0000 (04:41 +0100)
committerClément Foucault <foucault.clem@gmail.com>
Thu, 17 Jan 2019 18:44:01 +0000 (19:44 +0100)
This is in order to make the API more multithread friendly inside the
draw manager.

GPU_shader_get_uniform will only serve to query the shader interface and
not do any GL call, making it threadsafe.

For now it only print a warning if the uniform was not queried before.

16 files changed:
source/blender/editors/interface/interface_icons.c
source/blender/editors/mask/mask_draw.c
source/blender/editors/screen/glutil.c
source/blender/editors/space_image/image_draw.c
source/blender/editors/space_node/drawnode.c
source/blender/gpu/GPU_shader.h
source/blender/gpu/GPU_shader_interface.h
source/blender/gpu/intern/gpu_batch.c
source/blender/gpu/intern/gpu_codegen.c
source/blender/gpu/intern/gpu_immediate.c
source/blender/gpu/intern/gpu_shader.c
source/blender/gpu/intern/gpu_shader_interface.c
source/blender/gpu/intern/gpu_viewport.c
source/blender/python/gpu/gpu_py_shader.c
source/blender/windowmanager/intern/wm_draw.c
source/blender/windowmanager/intern/wm_gesture.c

index f3bb61c..bc265ae 100644 (file)
@@ -1373,8 +1373,8 @@ static void icon_draw_cache_flush_ex(void)
        GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_2D_IMAGE_MULTI_RECT_COLOR);
        GPU_shader_bind(shader);
 
-       int img_loc = GPU_shader_get_uniform(shader, "image");
-       int data_loc = GPU_shader_get_uniform(shader, "calls_data[0]");
+       int img_loc = GPU_shader_get_uniform_ensure(shader, "image");
+       int data_loc = GPU_shader_get_uniform_ensure(shader, "calls_data[0]");
 
        glUniform1i(img_loc, 0);
        glUniform4fv(data_loc, ICON_DRAW_CACHE_SIZE * 3, (float *)g_icon_draw_cache.drawcall_cache);
@@ -1462,9 +1462,9 @@ static void icon_draw_texture(
        if (rgb) glUniform4f(GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_COLOR), rgb[0], rgb[1], rgb[2], alpha);
        else     glUniform4f(GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_COLOR), alpha, alpha, alpha, alpha);
 
-       glUniform1i(GPU_shader_get_uniform(shader, "image"), 0);
-       glUniform4f(GPU_shader_get_uniform(shader, "rect_icon"), x1, y1, x2, y2);
-       glUniform4f(GPU_shader_get_uniform(shader, "rect_geom"), x, y, x + w, y + h);
+       glUniform1i(GPU_shader_get_uniform_ensure(shader, "image"), 0);
+       glUniform4f(GPU_shader_get_uniform_ensure(shader, "rect_icon"), x1, y1, x2, y2);
+       glUniform4f(GPU_shader_get_uniform_ensure(shader, "rect_geom"), x, y, x + w, y + h);
 
        GPU_draw_primitive(GPU_PRIM_TRI_STRIP, 4);
 
index 8c33db1..871ce9b 100644 (file)
@@ -709,7 +709,7 @@ void ED_mask_draw_region(
                        GPU_matrix_mul(stabmat);
                }
                IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR);
-               GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red);
+               GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, red);
                immDrawPixelsTex(&state, 0.0f, 0.0f, width, height, GL_RED, GL_FLOAT, GL_NEAREST, buffer, 1.0f, 1.0f, NULL);
 
                GPU_matrix_pop();
index 728df79..60a16d0 100644 (file)
@@ -147,7 +147,7 @@ static void immDrawPixelsTexSetupAttributes(IMMDrawPixelsTexState *state)
 /* To be used before calling immDrawPixelsTex
  * Default shader is GPU_SHADER_2D_IMAGE_COLOR
  * You can still set uniforms with :
- * GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "name"), 0);
+ * GPU_shader_uniform_int(shader, GPU_shader_get_uniform_ensure(shader, "name"), 0);
  * */
 IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
 {
@@ -241,7 +241,7 @@ void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state,
        /* NOTE: Shader could be null for GLSL OCIO drawing, it is fine, since
         * it does not need color.
         */
-       if (state->shader != NULL && GPU_shader_get_uniform(state->shader, "color") != -1) {
+       if (state->shader != NULL && GPU_shader_get_uniform_ensure(state->shader, "color") != -1) {
                immUniformColor4fv((color) ? color : white);
        }
 
index a467674..21b917b 100644 (file)
@@ -434,7 +434,7 @@ static void sima_draw_zbuf_pixels(float x1, float y1, int rectx, int recty, int
        }
 
        IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR);
-       GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red);
+       GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, red);
 
        immDrawPixelsTex(&state, x1, y1, rectx, recty, GL_RED, GL_INT, GL_NEAREST, recti, zoomx, zoomy, NULL);
 
@@ -472,7 +472,7 @@ static void sima_draw_zbuffloat_pixels(Scene *scene, float x1, float y1, int rec
        }
 
        IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR);
-       GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red);
+       GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, red);
 
        immDrawPixelsTex(&state, x1, y1, rectx, recty, GL_RED, GL_FLOAT, GL_NEAREST, rectf, zoomx, zoomy, NULL);
 
@@ -531,7 +531,7 @@ static void draw_image_buffer(const bContext *C, SpaceImage *sima, ARegion *ar,
                                shuffle[3] = 1.0f;
 
                        IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR);
-                       GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, shuffle);
+                       GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, shuffle);
 
                        IMB_colormanagement_display_settings_from_ctx(C, &view_settings, &display_settings);
                        display_buffer = IMB_display_buffer_acquire(ibuf, view_settings, display_settings, &cache_handle);
index b7b75d3..80cdc9e 100644 (file)
@@ -3255,7 +3255,7 @@ void draw_nodespace_back_pix(const bContext *C, ARegion *ar, SpaceNode *snode, b
                                        shuffle[3] = 1.0f;
 
                                IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR);
-                               GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, shuffle);
+                               GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, shuffle);
 
                                immDrawPixelsTex(&state, x, y, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST,
                                                 display_buffer, snode->zoom, snode->zoom, NULL);
index 4803c6c..62e1101 100644 (file)
@@ -82,6 +82,7 @@ int GPU_shader_get_program(GPUShader *shader);
 void *GPU_shader_get_interface(GPUShader *shader);
 
 int GPU_shader_get_uniform(GPUShader *shader, const char *name);
+int GPU_shader_get_uniform_ensure(GPUShader *shader, const char *name);
 int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin);
 int GPU_shader_get_uniform_block(GPUShader *shader, const char *name);
 void GPU_shader_uniform_vector(
index af89e48..0559a72 100644 (file)
@@ -94,6 +94,7 @@ GPUShaderInterface *GPU_shaderinterface_create(int32_t program_id);
 void GPU_shaderinterface_discard(GPUShaderInterface *);
 
 const GPUShaderInput *GPU_shaderinterface_uniform(const GPUShaderInterface *, const char *name);
+const GPUShaderInput *GPU_shaderinterface_uniform_ensure(const GPUShaderInterface *, const char *name);
 const GPUShaderInput *GPU_shaderinterface_uniform_builtin(const GPUShaderInterface *, GPUUniformBuiltin);
 const GPUShaderInput *GPU_shaderinterface_ubo(const GPUShaderInterface *, const char *name);
 const GPUShaderInput *GPU_shaderinterface_attr(const GPUShaderInterface *, const char *name);
index a2184df..30d38eb 100644 (file)
@@ -428,9 +428,9 @@ void GPU_batch_program_use_end(GPUBatch *batch)
 }
 
 #if TRUST_NO_ONE
-#  define GET_UNIFORM const GPUShaderInput *uniform = GPU_shaderinterface_uniform(batch->interface, name); assert(uniform);
+#  define GET_UNIFORM const GPUShaderInput *uniform = GPU_shaderinterface_uniform_ensure(batch->interface, name); assert(uniform);
 #else
-#  define GET_UNIFORM const GPUShaderInput *uniform = GPU_shaderinterface_uniform(batch->interface, name);
+#  define GET_UNIFORM const GPUShaderInput *uniform = GPU_shaderinterface_uniform_ensure(batch->interface, name);
 #endif
 
 void GPU_batch_uniform_1ui(GPUBatch *batch, const char *name, int value)
index 4360941..7db51da 100644 (file)
@@ -1274,7 +1274,7 @@ void GPU_nodes_extract_dynamic_inputs(GPUShader *shader, ListBase *inputs, ListB
 
                        if (input->source == GPU_SOURCE_TEX) {
                                if (input->bindtex) {
-                                       input->shaderloc = GPU_shader_get_uniform(shader, input->shadername);
+                                       input->shaderloc = GPU_shader_get_uniform_ensure(shader, input->shadername);
                                        /* extract nodes */
                                        BLI_remlink(&node->inputs, input);
                                        BLI_addtail(inputs, input);
@@ -1904,7 +1904,7 @@ static int count_active_texture_sampler(GPUShader *shader, char *source)
                        if (*code != '\0') {
                                char sampler_name[64];
                                code = gpu_str_skip_token(code, sampler_name, sizeof(sampler_name));
-                               int id = GPU_shader_get_uniform(shader, sampler_name);
+                               int id = GPU_shader_get_uniform_ensure(shader, sampler_name);
 
                                if (id == -1) {
                                        continue;
index a71ba68..3e13b52 100644 (file)
@@ -703,16 +703,16 @@ void immVertex2iv(uint attrib_id, const int data[2])
 
 #if 0
 #  if TRUST_NO_ONE
-#    define GET_UNIFORM const GPUShaderInput* uniform = GPU_shaderinterface_uniform(imm.shader_interface, name); assert(uniform);
+#    define GET_UNIFORM const GPUShaderInput* uniform = GPU_shaderinterface_uniform_ensure(imm.shader_interface, name); assert(uniform);
 #  else
-#    define GET_UNIFORM const GPUShaderInput* uniform = GPU_shaderinterface_uniform(imm.shader_interface, name);
+#    define GET_UNIFORM const GPUShaderInput* uniform = GPU_shaderinterface_uniform_ensure(imm.shader_interface, name);
 #  endif
 #else
        /* NOTE: It is possible to have uniform fully optimized out from the shader.
         *       In this case we can't assert failure or allow NULL-pointer dereference.
         * TODO(sergey): How can we detect existing-but-optimized-out uniform but still
         *               catch typos in uniform names passed to immUniform*() functions? */
-#  define GET_UNIFORM const GPUShaderInput* uniform = GPU_shaderinterface_uniform(imm.shader_interface, name); if (uniform == NULL) return;
+#  define GET_UNIFORM const GPUShaderInput* uniform = GPU_shaderinterface_uniform_ensure(imm.shader_interface, name); if (uniform == NULL) return;
 #endif
 
 void immUniform1f(const char *name, float x)
index 8a141ea..31a8580 100644 (file)
@@ -563,6 +563,24 @@ int GPU_shader_get_uniform(GPUShader *shader, const char *name)
 {
        BLI_assert(shader && shader->program);
        const GPUShaderInput *uniform = GPU_shaderinterface_uniform(shader->interface, name);
+#if 1 /* Remove this when we have transitionned all uniforms. */
+       if (uniform == NULL) {
+#  ifndef NDEBUG
+               printf("Uniform \"%s\" needs to be added to shader interface after shader creation.\n", name);
+#  endif
+               /* Fallback to avoid issues. */
+               return GPU_shader_get_uniform_ensure(shader, name);
+       }
+#else
+       BLI_assert(uniform);
+#endif
+       return uniform->location;
+}
+
+int GPU_shader_get_uniform_ensure(GPUShader *shader, const char *name)
+{
+       BLI_assert(shader && shader->program);
+       const GPUShaderInput *uniform = GPU_shaderinterface_uniform_ensure(shader->interface, name);
        return uniform ? uniform->location : -1;
 }
 
@@ -576,7 +594,6 @@ int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin)
 int GPU_shader_get_uniform_block(GPUShader *shader, const char *name)
 {
        BLI_assert(shader && shader->program);
-
        const GPUShaderInput *ubo = GPU_shaderinterface_ubo(shader->interface, name);
        return ubo ? ubo->location : -1;
 }
index d46fc97..7522c92 100644 (file)
@@ -310,9 +310,14 @@ void GPU_shaderinterface_discard(GPUShaderInterface *shaderface)
 }
 
 const GPUShaderInput *GPU_shaderinterface_uniform(const GPUShaderInterface *shaderface, const char *name)
+{
+       return buckets_lookup(shaderface->uniform_buckets, shaderface->name_buffer, name);
+}
+
+const GPUShaderInput *GPU_shaderinterface_uniform_ensure(const GPUShaderInterface *shaderface, const char *name)
 {
        /* TODO: Warn if we find a matching builtin, since these can be looked up much quicker. */
-       const GPUShaderInput *input = buckets_lookup(shaderface->uniform_buckets, shaderface->name_buffer, name);
+       const GPUShaderInput *input = GPU_shaderinterface_uniform(shaderface, name);
        /* If input is not found add it so it's found next time. */
        if (input == NULL) {
                input = add_uniform((GPUShaderInterface *)shaderface, name);
index 1dd3faa..7a3d020 100644 (file)
@@ -536,9 +536,9 @@ void GPU_viewport_draw_to_screen(GPUViewport *viewport, const rcti *rect)
        GPU_shader_bind(shader);
 
        GPU_texture_bind(color, 0);
-       glUniform1i(GPU_shader_get_uniform(shader, "image"), 0);
-       glUniform4f(GPU_shader_get_uniform(shader, "rect_icon"), halfx, halfy, 1.0f + halfx, 1.0f + halfy);
-       glUniform4f(GPU_shader_get_uniform(shader, "rect_geom"), x1, y1, x2, y2);
+       glUniform1i(GPU_shader_get_uniform_ensure(shader, "image"), 0);
+       glUniform4f(GPU_shader_get_uniform_ensure(shader, "rect_icon"), halfx, halfy, 1.0f + halfx, 1.0f + halfy);
+       glUniform4f(GPU_shader_get_uniform_ensure(shader, "rect_geom"), x1, y1, x2, y2);
        glUniform4f(GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_COLOR), 1.0f, 1.0f, 1.0f, 1.0f);
 
        GPU_draw_primitive(GPU_PRIM_TRI_STRIP, 4);
index 52fe6f2..31e1ccf 100644 (file)
@@ -86,7 +86,7 @@ success:
 
 static int bpygpu_uniform_location_get(GPUShader *shader, const char *name, const char *error_prefix)
 {
-       int uniform = GPU_shader_get_uniform(shader, name);
+       int uniform = GPU_shader_get_uniform_ensure(shader, name);
 
        if (uniform == -1) {
                PyErr_Format(PyExc_ValueError, "%s: uniform %.32s %.32s not found", error_prefix, name);
index c811a52..073b431 100644 (file)
@@ -488,9 +488,9 @@ void wm_draw_region_blend(ARegion *ar, int view, bool blend)
                alpha = 1.0f;
        }
 
-       glUniform1i(GPU_shader_get_uniform(shader, "image"), 0);
-       glUniform4f(GPU_shader_get_uniform(shader, "rect_icon"), rect_tex.xmin, rect_tex.ymin, rect_tex.xmax, rect_tex.ymax);
-       glUniform4f(GPU_shader_get_uniform(shader, "rect_geom"), rect_geo.xmin, rect_geo.ymin, rect_geo.xmax, rect_geo.ymax);
+       glUniform1i(GPU_shader_get_uniform_ensure(shader, "image"), 0);
+       glUniform4f(GPU_shader_get_uniform_ensure(shader, "rect_icon"), rect_tex.xmin, rect_tex.ymin, rect_tex.xmax, rect_tex.ymax);
+       glUniform4f(GPU_shader_get_uniform_ensure(shader, "rect_geom"), rect_geo.xmin, rect_geo.ymin, rect_geo.xmax, rect_geo.ymax);
        glUniform4f(GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_COLOR), alpha, alpha, alpha, alpha);
 
        GPU_draw_primitive(GPU_PRIM_TRI_STRIP, 4);
index 77734a3..57b2d38 100644 (file)
@@ -314,7 +314,7 @@ static void draw_filled_lasso(wmGesture *gt)
 
                IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR);
                GPU_shader_bind(state.shader);
-               GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform(state.shader, "shuffle"), 4, 1, red);
+               GPU_shader_uniform_vector(state.shader, GPU_shader_get_uniform_ensure(state.shader, "shuffle"), 4, 1, red);
 
                immDrawPixelsTex(&state, rect.xmin, rect.ymin, w, h, GL_RED, GL_UNSIGNED_BYTE, GL_NEAREST, pixel_buf, 1.0f, 1.0f, NULL);