glsl: Add plumbing for handling uniform binding qualifiers.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 21:28:05 +0000 (14:28 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 23:57:24 +0000 (16:57 -0700)
Sampler uniforms and uniform blocks do not have a var->constant_value.
Instead, they have an integer var->binding value.

This makes extending set_uniform_initializer() somewhat problematic: it
assumes that there is an ir_constant * which represents the initializer,
and that it's safe to dereference that without any NULL checks.

Instead, this patch creates an analogous function for binding
qualifiers, and calls one or the other as appropriate.

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

index f46f6e2db1529bb96152a60113bf2e1385ad6ba7..4efa1b44ae9e2871a434975bfdb7d0c1b5eea584 100644 (file)
@@ -81,6 +81,21 @@ copy_constant_to_storage(union gl_constant_value *storage,
    }
 }
 
+void
+set_uniform_binding(void *mem_ctx, gl_shader_program *prog,
+                    const char *name, const glsl_type *type, int binding)
+{
+   struct gl_uniform_storage *const storage =
+      get_storage(prog->UniformStorage, prog->NumUserUniformStorage, name);
+
+   if (storage == NULL) {
+      assert(storage != NULL);
+      return;
+   }
+
+   storage->initialized = true;
+}
+
 void
 set_uniform_initializer(void *mem_ctx, gl_shader_program *prog,
                        const char *name, const glsl_type *type,
@@ -173,14 +188,19 @@ link_set_uniform_initializers(struct gl_shader_program *prog)
       foreach_list(node, shader->ir) {
         ir_variable *const var = ((ir_instruction *) node)->as_variable();
 
-        if (!var || var->mode != ir_var_uniform || !var->constant_value)
+        if (!var || var->mode != ir_var_uniform)
            continue;
 
         if (!mem_ctx)
            mem_ctx = ralloc_context(NULL);
 
-        linker::set_uniform_initializer(mem_ctx, prog, var->name,
-                                        var->type, var->constant_value);
+         if (var->explicit_binding) {
+            linker::set_uniform_binding(mem_ctx, prog, var->name,
+                                        var->type, var->binding);
+         } else if (var->constant_value) {
+            linker::set_uniform_initializer(mem_ctx, prog, var->name,
+                                            var->type, var->constant_value);
+         }
       }
    }