On Thu, 2015-12-31 at 11:20 -0800, Jordan Justen wrote:
> Previously we were treating the binding index for Uniform Buffer
> Objects and Shader Storage Buffer Objects as being part of the
> combined BufferInterfaceBlocks array.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93322
> Cc: Samuel Iglesias Gonsálvez <[email protected]>
> Cc: Iago Toral <[email protected]>
> Cc: Tapani Pälli <[email protected]>
> Signed-off-by: Jordan Justen <[email protected]>
> Reviewed-by: Juha-Pekka Heikkila <[email protected]>

Reviewed-by: Iago Toral Quiroga <[email protected]>

> ---
> 
> Notes:
>     Maybe the GL_ARB_program_interface_query support code should be able
>     to help out with this, since GetProgramResourceIndex will have the
>     same concept of UBO/SSBO indices. Unfortunately, I don't think the
>     internals of the GL_ARB_program_interface_query implementation
>     currently have the info we need.
> 
>  src/mesa/main/uniforms.c | 30 ++++++++++++++++++++----------
>  1 file changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
> index 758ca24..47f80ce 100644
> --- a/src/mesa/main/uniforms.c
> +++ b/src/mesa/main/uniforms.c
> @@ -1002,10 +1002,10 @@ _mesa_UniformBlockBinding(GLuint program,
>     if (!shProg)
>        return;
>  
> -   if (uniformBlockIndex >= shProg->NumBufferInterfaceBlocks) {
> +   if (uniformBlockIndex >= shProg->NumUniformBlocks) {
>        _mesa_error(ctx, GL_INVALID_VALUE,
>                 "glUniformBlockBinding(block index %u >= %u)",
> -               uniformBlockIndex, shProg->NumBufferInterfaceBlocks);
> +               uniformBlockIndex, shProg->NumUniformBlocks);
>        return;
>     }
>  
> @@ -1016,17 +1016,22 @@ _mesa_UniformBlockBinding(GLuint program,
>        return;
>     }
>  
> -   if (shProg->BufferInterfaceBlocks[uniformBlockIndex].Binding !=
> +   if (shProg->UniformBlocks[uniformBlockIndex]->Binding !=
>         uniformBlockBinding) {
>        int i;
>  
>        FLUSH_VERTICES(ctx, 0);
>        ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer;
>  
> -      shProg->BufferInterfaceBlocks[uniformBlockIndex].Binding = 
> uniformBlockBinding;
> +      const int interface_block_index =
> +         shProg->UboInterfaceBlockIndex[uniformBlockIndex];
> +
> +      shProg->BufferInterfaceBlocks[interface_block_index].Binding =
> +         uniformBlockBinding;
>  
>        for (i = 0; i < MESA_SHADER_STAGES; i++) {
> -      int stage_index = 
> shProg->InterfaceBlockStageIndex[i][uniformBlockIndex];
> +      int stage_index =
> +            shProg->InterfaceBlockStageIndex[i][interface_block_index];
>  
>        if (stage_index != -1) {
>           struct gl_shader *sh = shProg->_LinkedShaders[i];
> @@ -1054,10 +1059,10 @@ _mesa_ShaderStorageBlockBinding(GLuint program,
>     if (!shProg)
>        return;
>  
> -   if (shaderStorageBlockIndex >= shProg->NumBufferInterfaceBlocks) {
> +   if (shaderStorageBlockIndex >= shProg->NumShaderStorageBlocks) {
>        _mesa_error(ctx, GL_INVALID_VALUE,
>                 "glShaderStorageBlockBinding(block index %u >= %u)",
> -               shaderStorageBlockIndex, shProg->NumBufferInterfaceBlocks);
> +               shaderStorageBlockIndex, shProg->NumShaderStorageBlocks);
>        return;
>     }
>  
> @@ -1069,17 +1074,22 @@ _mesa_ShaderStorageBlockBinding(GLuint program,
>        return;
>     }
>  
> -   if (shProg->BufferInterfaceBlocks[shaderStorageBlockIndex].Binding !=
> +   if (shProg->ShaderStorageBlocks[shaderStorageBlockIndex]->Binding !=
>         shaderStorageBlockBinding) {
>        int i;
>  
>        FLUSH_VERTICES(ctx, 0);
>        ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer;
>  
> -      shProg->BufferInterfaceBlocks[shaderStorageBlockIndex].Binding = 
> shaderStorageBlockBinding;
> +      const int interface_block_index =
> +         shProg->SsboInterfaceBlockIndex[shaderStorageBlockIndex];
> +
> +      shProg->BufferInterfaceBlocks[interface_block_index].Binding =
> +         shaderStorageBlockBinding;
>  
>        for (i = 0; i < MESA_SHADER_STAGES; i++) {
> -      int stage_index = 
> shProg->InterfaceBlockStageIndex[i][shaderStorageBlockIndex];
> +      int stage_index =
> +            shProg->InterfaceBlockStageIndex[i][interface_block_index];
>  
>        if (stage_index != -1) {
>           struct gl_shader *sh = shProg->_LinkedShaders[i];


_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to