compiler: tidy up double_inputs_read uses
authorTimothy Arceri <tarceri@itsqueeze.com>
Sat, 16 Dec 2017 03:06:23 +0000 (14:06 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Mon, 29 Jan 2018 22:08:47 +0000 (09:08 +1100)
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 c2acf97fcc9b 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>
src/compiler/glsl/glsl_to_nir.cpp
src/compiler/glsl/ir_set_program_inouts.cpp
src/compiler/nir/nir_gather_info.c
src/compiler/shader_info.h
src/intel/compiler/brw_vec4.cpp
src/mesa/state_tracker/st_glsl_to_nir.cpp
src/mesa/state_tracker/st_glsl_to_tgsi.cpp
src/mesa/state_tracker/st_program.c

index c4ef4f5ce14959f33141a824d55b63ad0bad3767..29e32cde53cb5d79356c1f2fcfbcfd64b586add3 100644 (file)
@@ -133,13 +133,13 @@ static void
 nir_remap_attributes(nir_shader *shader)
 {
    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));
    }
 
    /* Once the remap is done, reset double_inputs_read, so later it will have
     * which location/slots are doubles */
-   shader->info.double_inputs_read = 0;
+   shader->info.vs.double_inputs = 0;
 }
 
 nir_shader *
@@ -363,10 +363,11 @@ nir_visitor::visit(ir_variable *ir)
       }
 
       /* 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++) {
             uint64_t bitfield = BITFIELD64_BIT(var->data.location + i);
-            shader->info.double_inputs_read |= bitfield;
+            shader->info.vs.double_inputs |= bitfield;
          }
       }
       break;
index 90b06b9f41749b174a4e62ea4c2396c4ee3e8ed5..1b6c8d750b91be453c5c41e6e18b6180e49532c8 100644 (file)
@@ -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.double_inputs_read |= bitfield;
+            prog->info.vs.double_inputs_read |= bitfield;
 
          if (stage == MESA_SHADER_FRAGMENT) {
             prog->info.fs.uses_sample_qualifier |= var->data.sample;
index 946939657ec761a06e3f3b082f5db7ebd6df1bf8..e98129b22c8a9f0a44506d6235b18476996bac6b 100644 (file)
@@ -234,7 +234,8 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader)
              glsl_type_is_dual_slot(glsl_without_array(var->type))) {
             for (uint i = 0; i < glsl_count_attribute_slots(var->type, false); 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_read = 0;
    shader->info.patch_outputs_read = 0;
-   shader->info.double_inputs_read = 0;
    shader->info.patch_inputs_read = 0;
    shader->info.patch_outputs_written = 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) {
       shader->info.fs.uses_sample_qualifier = false;
    }
index 4492cad0e8db49e5262ed9af1244d656839476dd..f6dedb8d624c03986597e6953f68f6173c06b458 100644 (file)
@@ -67,8 +67,6 @@ typedef struct shader_info {
 
    /* Which inputs are actually read */
    uint64_t inputs_read;
-   /* Which inputs are actually read and are double */
-   uint64_t double_inputs_read;
    /* Which outputs are actually written */
    uint64_t outputs_written;
    /* Which outputs are actually read */
@@ -109,6 +107,14 @@ typedef struct shader_info {
    bool has_transform_feedback_varyings;
 
    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 {
          /** The number of vertices recieves per input primitive */
          unsigned vertices_in;
index ad6d8f9d6bc10670ac01a00460e278664d1505ba..e95886349d8fd504b4a56236316d0c8bb88f095e 100644 (file)
@@ -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->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_vue_outputs(shader, is_scalar);
index 4cf150ea1ef879d215dba4d7aa54f48010bfed5f..2de767625af4dd99f08a2d1834bcbc77e7615735 100644 (file)
@@ -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) {
          input_to_index[attr] = 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 */
             num_inputs++;
          }
index 094c79ade9ec6aaa7c8a4fbf9760f3e27298adc0..84ed614927b36547af56b8ea2a5b4fa0beabde0b 100644 (file)
@@ -6783,7 +6783,7 @@ get_mesa_program_tgsi(struct gl_context *ctx,
    _mesa_copy_linked_program_data(shader_program, shader);
    shrink_array_declarations(v->inputs, v->num_inputs,
                              &prog->info.inputs_read,
-                             prog->info.double_inputs_read,
+                             prog->info.vs.double_inputs_read,
                              &prog->info.patch_inputs_read);
    shrink_array_declarations(v->outputs, v->num_outputs,
                              &prog->info.outputs_written, 0ULL,
index 883813d6c026a7427635899ddcef95ed7b49d8ae..1116b5afbc8ad2250b3b6ecdeef42807a007fee1 100644 (file)
@@ -406,7 +406,7 @@ st_translate_vertex_program(struct st_context *st,
          input_to_index[attr] = stvp->num_inputs;
          stvp->index_to_input[stvp->num_inputs] = attr;
          stvp->num_inputs++;
-         if ((stvp->Base.info.double_inputs_read &
+         if ((stvp->Base.info.vs.double_inputs_read &
               BITFIELD64_BIT(attr)) != 0) {
             /* add placeholder for second part of a double attribute */
             stvp->index_to_input[stvp->num_inputs] = ST_DOUBLE_ATTRIB_PLACEHOLDER;