compiler: Move double_inputs to gl_program::DualSlotInputs
Previously, we had two field in shader_info: double_inputs_read and double_inputs. Presumably, the one was for all double inputs that are read and the other is all that exist. However, because nir_gather_info regenerates these two values, there is a possibility, if a variable gets deleted, that the value of double_inputs could change over time. This is a problem because double_inputs is used to remap the input locations to a two-slot-per-dvec3/4 scheme for i965. If that mapping were to change between glsl_to_nir and back-end state setup, we would fall over when trying to map the NIR outputs back onto the GL location space. This commit changes the way slot re-mapping works. Instead of the double_inputs field in shader_info, it adds a DualSlotInputs bitfield to gl_program. By having it in gl_program, we more easily guarantee that NIR passes won't touch it after it's been set. It also makes more sense to put it in a GL data structure since it's really a mapping from GL slots to back-end and/or NIR slots and not really a NIR shader thing. Tested-by: Alejandro Piñeiro <apinheiro@igalia.com> (ARB_gl_spirv tests) Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
@@ -149,8 +149,11 @@ glsl_to_nir(const struct gl_shader_program *shader_prog,
|
||||
* two locations. For instance, if we have in the IR code a dvec3 attr0 in
|
||||
* location 0 and vec4 attr1 in location 1, in NIR attr0 will use
|
||||
* locations/slots 0 and 1, and attr1 will use location/slot 2 */
|
||||
if (shader->info.stage == MESA_SHADER_VERTEX)
|
||||
nir_remap_attributes(shader, options);
|
||||
if (shader->info.stage == MESA_SHADER_VERTEX) {
|
||||
sh->Program->DualSlotInputs = nir_get_dual_slot_attributes(shader);
|
||||
if (options->vs_inputs_dual_locations)
|
||||
nir_remap_dual_slot_attributes(shader, sh->Program->DualSlotInputs);
|
||||
}
|
||||
|
||||
shader->info.name = ralloc_asprintf(shader, "GLSL%d", shader_prog->Name);
|
||||
if (shader_prog->Label)
|
||||
@@ -344,15 +347,6 @@ nir_visitor::visit(ir_variable *ir)
|
||||
var->data.compact = ir->type->without_array()->is_scalar();
|
||||
}
|
||||
}
|
||||
|
||||
/* Mark all the locations that require two slots */
|
||||
if (shader->info.stage == MESA_SHADER_VERTEX &&
|
||||
glsl_type_is_dual_slot(glsl_without_array(var->type))) {
|
||||
for (unsigned i = 0; i < glsl_count_attribute_slots(var->type, true); i++) {
|
||||
uint64_t bitfield = BITFIELD64_BIT(var->data.location + i);
|
||||
shader->info.vs.double_inputs |= bitfield;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ir_var_shader_out:
|
||||
|
@@ -118,7 +118,7 @@ mark(struct gl_program *prog, ir_variable *var, int offset, int len,
|
||||
/* double inputs read is only for vertex inputs */
|
||||
if (stage == MESA_SHADER_VERTEX &&
|
||||
var->type->without_array()->is_dual_slot())
|
||||
prog->info.vs.double_inputs_read |= bitfield;
|
||||
prog->DualSlotInputs |= bitfield;
|
||||
|
||||
if (stage == MESA_SHADER_FRAGMENT) {
|
||||
prog->info.fs.uses_sample_qualifier |= var->data.sample;
|
||||
|
@@ -1035,6 +1035,7 @@ write_shader_metadata(struct blob *metadata, gl_linked_shader *shader)
|
||||
struct gl_program *glprog = shader->Program;
|
||||
unsigned i;
|
||||
|
||||
blob_write_uint64(metadata, glprog->DualSlotInputs);
|
||||
blob_write_bytes(metadata, glprog->TexturesUsed,
|
||||
sizeof(glprog->TexturesUsed));
|
||||
blob_write_uint64(metadata, glprog->SamplersUsed);
|
||||
@@ -1088,6 +1089,7 @@ read_shader_metadata(struct blob_reader *metadata,
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
glprog->DualSlotInputs = blob_read_uint64(metadata);
|
||||
blob_copy_bytes(metadata, (uint8_t *) glprog->TexturesUsed,
|
||||
sizeof(glprog->TexturesUsed));
|
||||
glprog->SamplersUsed = blob_read_uint64(metadata);
|
||||
|
Reference in New Issue
Block a user