GPU: Rename GPU_shader_get_uniform to GPU_shader_get_uniform_ensure
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.
This commit is contained in:
parent
938b08b336
commit
4c95899098
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue