glsl: Handle the binding qualifier for UBO variables.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 01:11:55 +0000 (18:11 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 23:57:24 +0000 (16:57 -0700)
layout(binding = N) is equivalent to calling glUniformBlockBinding(_,N).

This currently only handles the GLSL 1.40 case - no interface names, no
arrays of uniform blocks.  This is okay since we don't yet support GLSL
1.50, and don't expose ARB_shading_language_420pack in ES 3.0.

v2: Move into the other function; use binding, not constant_value.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Acked-by: Paul Berry <stereotype441@gmail.com>
src/glsl/link_uniform_initializers.cpp

index 1b7609a4725b3a22433e1b98e812e13ce60b0631..3f667104759a41ed34d9e46006ee18a77c1d37c3 100644 (file)
@@ -116,6 +116,16 @@ set_uniform_binding(void *mem_ctx, gl_shader_program *prog,
             }
          }
       }
+   } else if (storage->block_index != -1) {
+      /* This is a field of a UBO.  val is the binding index. */
+      for (int i = 0; i < MESA_SHADER_TYPES; i++) {
+         int stage_index = prog->UniformBlockStageIndex[i][storage->block_index];
+
+         if (stage_index != -1) {
+            struct gl_shader *sh = prog->_LinkedShaders[i];
+            sh->UniformBlocks[stage_index].Binding = binding;
+         }
+      }
    }
 
    storage->initialized = true;