compiler: tidy up double_inputs_read uses
First we move double_inputs_read into a vs struct in the union,
double_inputs_read is only used for vs inputs so this will
save space and also allows us to add a new double_inputs field.
We add the new field because c2acf97fcc
changed the behaviour
of double_inputs_read, and while it's no longer used to track
actual reads in i965 we do still want to track this for gallium
drivers.
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -133,13 +133,13 @@ static void
|
|||||||
nir_remap_attributes(nir_shader *shader)
|
nir_remap_attributes(nir_shader *shader)
|
||||||
{
|
{
|
||||||
nir_foreach_variable(var, &shader->inputs) {
|
nir_foreach_variable(var, &shader->inputs) {
|
||||||
var->data.location += _mesa_bitcount_64(shader->info.double_inputs_read &
|
var->data.location += _mesa_bitcount_64(shader->info.vs.double_inputs &
|
||||||
BITFIELD64_MASK(var->data.location));
|
BITFIELD64_MASK(var->data.location));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Once the remap is done, reset double_inputs_read, so later it will have
|
/* Once the remap is done, reset double_inputs_read, so later it will have
|
||||||
* which location/slots are doubles */
|
* which location/slots are doubles */
|
||||||
shader->info.double_inputs_read = 0;
|
shader->info.vs.double_inputs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nir_shader *
|
nir_shader *
|
||||||
@@ -363,10 +363,11 @@ nir_visitor::visit(ir_variable *ir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Mark all the locations that require two slots */
|
/* Mark all the locations that require two slots */
|
||||||
if (glsl_type_is_dual_slot(glsl_without_array(var->type))) {
|
if (shader->info.stage == MESA_SHADER_VERTEX &&
|
||||||
|
glsl_type_is_dual_slot(glsl_without_array(var->type))) {
|
||||||
for (uint i = 0; i < glsl_count_attribute_slots(var->type, true); i++) {
|
for (uint i = 0; i < glsl_count_attribute_slots(var->type, true); i++) {
|
||||||
uint64_t bitfield = BITFIELD64_BIT(var->data.location + i);
|
uint64_t bitfield = BITFIELD64_BIT(var->data.location + i);
|
||||||
shader->info.double_inputs_read |= bitfield;
|
shader->info.vs.double_inputs |= bitfield;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -118,7 +118,7 @@ mark(struct gl_program *prog, ir_variable *var, int offset, int len,
|
|||||||
/* double inputs read is only for vertex inputs */
|
/* double inputs read is only for vertex inputs */
|
||||||
if (stage == MESA_SHADER_VERTEX &&
|
if (stage == MESA_SHADER_VERTEX &&
|
||||||
var->type->without_array()->is_dual_slot())
|
var->type->without_array()->is_dual_slot())
|
||||||
prog->info.double_inputs_read |= bitfield;
|
prog->info.vs.double_inputs_read |= bitfield;
|
||||||
|
|
||||||
if (stage == MESA_SHADER_FRAGMENT) {
|
if (stage == MESA_SHADER_FRAGMENT) {
|
||||||
prog->info.fs.uses_sample_qualifier |= var->data.sample;
|
prog->info.fs.uses_sample_qualifier |= var->data.sample;
|
||||||
|
@@ -234,7 +234,8 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader)
|
|||||||
glsl_type_is_dual_slot(glsl_without_array(var->type))) {
|
glsl_type_is_dual_slot(glsl_without_array(var->type))) {
|
||||||
for (uint i = 0; i < glsl_count_attribute_slots(var->type, false); i++) {
|
for (uint i = 0; i < glsl_count_attribute_slots(var->type, false); i++) {
|
||||||
int idx = var->data.location + i;
|
int idx = var->data.location + i;
|
||||||
shader->info.double_inputs_read |= BITFIELD64_BIT(idx);
|
shader->info.vs.double_inputs |= BITFIELD64_BIT(idx);
|
||||||
|
shader->info.vs.double_inputs_read |= BITFIELD64_BIT(idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -356,10 +357,13 @@ nir_shader_gather_info(nir_shader *shader, nir_function_impl *entrypoint)
|
|||||||
shader->info.outputs_written = 0;
|
shader->info.outputs_written = 0;
|
||||||
shader->info.outputs_read = 0;
|
shader->info.outputs_read = 0;
|
||||||
shader->info.patch_outputs_read = 0;
|
shader->info.patch_outputs_read = 0;
|
||||||
shader->info.double_inputs_read = 0;
|
|
||||||
shader->info.patch_inputs_read = 0;
|
shader->info.patch_inputs_read = 0;
|
||||||
shader->info.patch_outputs_written = 0;
|
shader->info.patch_outputs_written = 0;
|
||||||
shader->info.system_values_read = 0;
|
shader->info.system_values_read = 0;
|
||||||
|
if (shader->info.stage == MESA_SHADER_VERTEX) {
|
||||||
|
shader->info.vs.double_inputs = 0;
|
||||||
|
shader->info.vs.double_inputs_read = 0;
|
||||||
|
}
|
||||||
if (shader->info.stage == MESA_SHADER_FRAGMENT) {
|
if (shader->info.stage == MESA_SHADER_FRAGMENT) {
|
||||||
shader->info.fs.uses_sample_qualifier = false;
|
shader->info.fs.uses_sample_qualifier = false;
|
||||||
}
|
}
|
||||||
|
@@ -67,8 +67,6 @@ typedef struct shader_info {
|
|||||||
|
|
||||||
/* Which inputs are actually read */
|
/* Which inputs are actually read */
|
||||||
uint64_t inputs_read;
|
uint64_t inputs_read;
|
||||||
/* Which inputs are actually read and are double */
|
|
||||||
uint64_t double_inputs_read;
|
|
||||||
/* Which outputs are actually written */
|
/* Which outputs are actually written */
|
||||||
uint64_t outputs_written;
|
uint64_t outputs_written;
|
||||||
/* Which outputs are actually read */
|
/* Which outputs are actually read */
|
||||||
@@ -109,6 +107,14 @@ typedef struct shader_info {
|
|||||||
bool has_transform_feedback_varyings;
|
bool has_transform_feedback_varyings;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
|
struct {
|
||||||
|
/* Which inputs are doubles */
|
||||||
|
uint64_t double_inputs;
|
||||||
|
|
||||||
|
/* Which inputs are actually read and are double */
|
||||||
|
uint64_t double_inputs_read;
|
||||||
|
} vs;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
/** The number of vertices recieves per input primitive */
|
/** The number of vertices recieves per input primitive */
|
||||||
unsigned vertices_in;
|
unsigned vertices_in;
|
||||||
|
@@ -2769,7 +2769,7 @@ brw_compile_vs(const struct brw_compiler *compiler, void *log_data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
prog_data->inputs_read = shader->info.inputs_read;
|
prog_data->inputs_read = shader->info.inputs_read;
|
||||||
prog_data->double_inputs_read = shader->info.double_inputs_read;
|
prog_data->double_inputs_read = shader->info.vs.double_inputs;
|
||||||
|
|
||||||
brw_nir_lower_vs_inputs(shader, key->gl_attrib_wa_flags);
|
brw_nir_lower_vs_inputs(shader, key->gl_attrib_wa_flags);
|
||||||
brw_nir_lower_vue_outputs(shader, is_scalar);
|
brw_nir_lower_vue_outputs(shader, is_scalar);
|
||||||
|
@@ -88,7 +88,7 @@ st_nir_assign_vs_in_locations(struct gl_program *prog, nir_shader *nir)
|
|||||||
if ((prog->info.inputs_read & BITFIELD64_BIT(attr)) != 0) {
|
if ((prog->info.inputs_read & BITFIELD64_BIT(attr)) != 0) {
|
||||||
input_to_index[attr] = num_inputs;
|
input_to_index[attr] = num_inputs;
|
||||||
num_inputs++;
|
num_inputs++;
|
||||||
if ((prog->info.double_inputs_read & BITFIELD64_BIT(attr)) != 0) {
|
if ((prog->info.vs.double_inputs_read & BITFIELD64_BIT(attr)) != 0) {
|
||||||
/* add placeholder for second part of a double attribute */
|
/* add placeholder for second part of a double attribute */
|
||||||
num_inputs++;
|
num_inputs++;
|
||||||
}
|
}
|
||||||
|
@@ -6783,7 +6783,7 @@ get_mesa_program_tgsi(struct gl_context *ctx,
|
|||||||
_mesa_copy_linked_program_data(shader_program, shader);
|
_mesa_copy_linked_program_data(shader_program, shader);
|
||||||
shrink_array_declarations(v->inputs, v->num_inputs,
|
shrink_array_declarations(v->inputs, v->num_inputs,
|
||||||
&prog->info.inputs_read,
|
&prog->info.inputs_read,
|
||||||
prog->info.double_inputs_read,
|
prog->info.vs.double_inputs_read,
|
||||||
&prog->info.patch_inputs_read);
|
&prog->info.patch_inputs_read);
|
||||||
shrink_array_declarations(v->outputs, v->num_outputs,
|
shrink_array_declarations(v->outputs, v->num_outputs,
|
||||||
&prog->info.outputs_written, 0ULL,
|
&prog->info.outputs_written, 0ULL,
|
||||||
|
@@ -406,7 +406,7 @@ st_translate_vertex_program(struct st_context *st,
|
|||||||
input_to_index[attr] = stvp->num_inputs;
|
input_to_index[attr] = stvp->num_inputs;
|
||||||
stvp->index_to_input[stvp->num_inputs] = attr;
|
stvp->index_to_input[stvp->num_inputs] = attr;
|
||||||
stvp->num_inputs++;
|
stvp->num_inputs++;
|
||||||
if ((stvp->Base.info.double_inputs_read &
|
if ((stvp->Base.info.vs.double_inputs_read &
|
||||||
BITFIELD64_BIT(attr)) != 0) {
|
BITFIELD64_BIT(attr)) != 0) {
|
||||||
/* add placeholder for second part of a double attribute */
|
/* add placeholder for second part of a double attribute */
|
||||||
stvp->index_to_input[stvp->num_inputs] = ST_DOUBLE_ATTRIB_PLACEHOLDER;
|
stvp->index_to_input[stvp->num_inputs] = ST_DOUBLE_ATTRIB_PLACEHOLDER;
|
||||||
|
Reference in New Issue
Block a user