X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Funiforms.c;h=ba87d3900aff45ef4c30f3d1137ffc4a4776c76c;hb=70847eb0a95f1e1b0fbd435aa0ef4091ae5bef88;hp=6706f794d7e758252f5d480844d2867d85bbd99b;hpb=bf60db5a4ba3893d57e59c8a69516b6519ac0972;p=mesa.git diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 6706f794d7e..ba87d3900af 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -38,7 +38,6 @@ #include "main/glheader.h" #include "main/context.h" -#include "main/dispatch.h" #include "main/shaderapi.h" #include "main/shaderobj.h" #include "main/uniforms.h" @@ -102,21 +101,35 @@ _mesa_update_shader_textures_used(struct gl_shader_program *shProg, struct gl_program *prog) { GLbitfield mask = prog->SamplersUsed; - gl_shader_stage prog_stage = + ASSERTED gl_shader_stage prog_stage = _mesa_program_enum_to_shader_stage(prog->Target); - struct gl_linked_shader *shader = shProg->_LinkedShaders[prog_stage]; + GLuint s; - assert(shader); + assert(shProg->_LinkedShaders[prog_stage]); memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed)); while (mask) { - const int s = u_bit_scan(&mask); + s = u_bit_scan(&mask); update_single_shader_texture_used(shProg, prog, prog->SamplerUnits[s], prog->sh.SamplerTargets[s]); } + + if (unlikely(prog->sh.HasBoundBindlessSampler)) { + /* Loop over bindless samplers bound to texture units. + */ + for (s = 0; s < prog->sh.NumBindlessSamplers; s++) { + struct gl_bindless_sampler *sampler = &prog->sh.BindlessSamplers[s]; + + if (!sampler->bound) + continue; + + update_single_shader_texture_used(shProg, prog, sampler->unit, + sampler->target); + } + } } /** @@ -992,7 +1005,7 @@ _mesa_GetUniformLocation(GLuint programObj, const GLcharARB *name) shProg = _mesa_lookup_shader_program_err(ctx, programObj, "glGetUniformLocation"); - if (!shProg) + if (!shProg || !name) return -1; /* Page 80 (page 94 of the PDF) of the OpenGL 2.1 spec says: @@ -1000,7 +1013,7 @@ _mesa_GetUniformLocation(GLuint programObj, const GLcharARB *name) * "If program has not been successfully linked, the error * INVALID_OPERATION is generated." */ - if (shProg->data->LinkStatus == linking_failure) { + if (shProg->data->LinkStatus == LINKING_FAILURE) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformLocation(program not linked)"); return -1; @@ -1009,6 +1022,17 @@ _mesa_GetUniformLocation(GLuint programObj, const GLcharARB *name) return _mesa_program_resource_location(shProg, GL_UNIFORM, name); } +GLint GLAPIENTRY +_mesa_GetUniformLocation_no_error(GLuint programObj, const GLcharARB *name) +{ + GET_CURRENT_CONTEXT(ctx); + + struct gl_shader_program *shProg = + _mesa_lookup_shader_program(ctx, programObj); + + return _mesa_program_resource_location(shProg, GL_UNIFORM, name); +} + GLuint GLAPIENTRY _mesa_GetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName) @@ -1069,6 +1093,31 @@ _mesa_GetUniformIndices(GLuint program, } } +static void +uniform_block_binding(struct gl_context *ctx, struct gl_shader_program *shProg, + GLuint uniformBlockIndex, GLuint uniformBlockBinding) +{ + if (shProg->data->UniformBlocks[uniformBlockIndex].Binding != + uniformBlockBinding) { + + FLUSH_VERTICES(ctx, 0); + ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer; + + shProg->data->UniformBlocks[uniformBlockIndex].Binding = + uniformBlockBinding; + } +} + +void GLAPIENTRY +_mesa_UniformBlockBinding_no_error(GLuint program, GLuint uniformBlockIndex, + GLuint uniformBlockBinding) +{ + GET_CURRENT_CONTEXT(ctx); + + struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program); + uniform_block_binding(ctx, shProg, uniformBlockIndex, uniformBlockBinding); +} + void GLAPIENTRY _mesa_UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, @@ -1101,17 +1150,38 @@ _mesa_UniformBlockBinding(GLuint program, return; } - if (shProg->data->UniformBlocks[uniformBlockIndex].Binding != - uniformBlockBinding) { + uniform_block_binding(ctx, shProg, uniformBlockIndex, uniformBlockBinding); +} + +static void +shader_storage_block_binding(struct gl_context *ctx, + struct gl_shader_program *shProg, + GLuint shaderStorageBlockIndex, + GLuint shaderStorageBlockBinding) +{ + if (shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding != + shaderStorageBlockBinding) { FLUSH_VERTICES(ctx, 0); - ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer; + ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer; - shProg->data->UniformBlocks[uniformBlockIndex].Binding = - uniformBlockBinding; + shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding = + shaderStorageBlockBinding; } } +void GLAPIENTRY +_mesa_ShaderStorageBlockBinding_no_error(GLuint program, + GLuint shaderStorageBlockIndex, + GLuint shaderStorageBlockBinding) +{ + GET_CURRENT_CONTEXT(ctx); + + struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program); + shader_storage_block_binding(ctx, shProg, shaderStorageBlockIndex, + shaderStorageBlockBinding); +} + void GLAPIENTRY _mesa_ShaderStorageBlockBinding(GLuint program, GLuint shaderStorageBlockIndex, @@ -1146,15 +1216,8 @@ _mesa_ShaderStorageBlockBinding(GLuint program, return; } - if (shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding != - shaderStorageBlockBinding) { - - FLUSH_VERTICES(ctx, 0); - ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer; - - shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding = - shaderStorageBlockBinding; - } + shader_storage_block_binding(ctx, shProg, shaderStorageBlockIndex, + shaderStorageBlockBinding); } /**