compiler: Allow texture unit bindings to also set sampler index
diff --git a/icd/intel/compiler/shader/link_uniforms.cpp b/icd/intel/compiler/shader/link_uniforms.cpp
index 9371347..3a78f3d 100644
--- a/icd/intel/compiler/shader/link_uniforms.cpp
+++ b/icd/intel/compiler/shader/link_uniforms.cpp
@@ -368,8 +368,9 @@
public:
parcel_out_uniform_storage(struct string_to_uint_map *map,
struct gl_uniform_storage *uniforms,
- union gl_constant_value *values)
- : map(map), uniforms(uniforms), values(values)
+ union gl_constant_value *values,
+ bool xgl)
+ : map(map), uniforms(uniforms), values(values), isXGL(xgl)
{
}
@@ -440,14 +441,27 @@
var->get_interface_type()->name);
else
process(var);
- } else
+ } else {
+
+ // Allow uniform binding to set sampler index for XGL
+ // This means both the texture unit and sampler unit will
+ // be bound based on the binding. For instance:
+ // layout (binding = 2) uniform sampler2D surface;
+ // will read from:
+ // XGL_SLOT_SHADER_SAMPLER 2
+ // XGL_SLOT_SHADER_RESOURCE 2
+ if (isXGL && var->type->is_sampler())
+ this->next_sampler = var->data.binding;
+
process(var);
+ }
}
int ubo_block_index;
int ubo_byte_offset;
bool ubo_row_major;
gl_shader_stage shader_type;
+ bool isXGL;
private:
void handle_samplers(const glsl_type *base_type,
@@ -794,7 +808,7 @@
}
void
-link_assign_uniform_locations(struct gl_shader_program *prog)
+link_assign_uniform_locations(struct gl_shader_program *prog, bool isXGL)
{
ralloc_free(prog->UniformStorage);
prog->UniformStorage = NULL;
@@ -886,7 +900,7 @@
union gl_constant_value *data_end = &data[num_data_slots];
#endif
- parcel_out_uniform_storage parcel(prog->UniformHash, uniforms, data);
+ parcel_out_uniform_storage parcel(prog->UniformHash, uniforms, data, isXGL);
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
if (prog->_LinkedShaders[i] == NULL)
diff --git a/icd/intel/compiler/shader/linker.cpp b/icd/intel/compiler/shader/linker.cpp
index a55c7c6..fd23997 100644
--- a/icd/intel/compiler/shader/linker.cpp
+++ b/icd/intel/compiler/shader/linker.cpp
@@ -2590,7 +2590,7 @@
goto done;
update_array_sizes(prog);
- link_assign_uniform_locations(prog);
+ link_assign_uniform_locations(prog, ctx->API == API_XGL);
link_assign_atomic_counter_resources(ctx, prog);
store_fragdepth_layout(prog);
diff --git a/icd/intel/compiler/shader/linker.h b/icd/intel/compiler/shader/linker.h
index f0a947b..28b0ba9 100644
--- a/icd/intel/compiler/shader/linker.h
+++ b/icd/intel/compiler/shader/linker.h
@@ -37,7 +37,7 @@
link_invalidate_variable_locations(exec_list *ir);
extern void
-link_assign_uniform_locations(struct gl_shader_program *prog);
+link_assign_uniform_locations(struct gl_shader_program *prog, bool isXGL);
extern void
link_set_uniform_initializers(struct gl_shader_program *prog);