瀏覽代碼

glsl: Add plumbing for handling uniform binding qualifiers.

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>
tags/mesa-9.2-rc1
Kenneth Graunke 12 年之前
父節點
當前提交
67038c6ba2
共有 1 個檔案被更改,包括 23 行新增3 行删除
  1. 23
    3
      src/glsl/link_uniform_initializers.cpp

+ 23
- 3
src/glsl/link_uniform_initializers.cpp 查看文件

@@ -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);
}
}
}


Loading…
取消
儲存