mesa/glspirv: compute double inputs and remap attributes
authorAlejandro Piñeiro <apinheiro@igalia.com>
Wed, 21 Mar 2018 08:05:51 +0000 (09:05 +0100)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Mon, 13 Aug 2018 14:28:27 +0000 (16:28 +0200)
input locations used by input attributes are not handled in the same
way in OpenGL vs Vulkan. There is a detailed explanation of such
differences on the following commit:

c2acf97fcc9b32eaa9778771282758e5652a8ad4

So with this commit, the same adjustment that is done after
glsl_to_nir, is being done after spirv_to_nir, when it is used on
OpenGL (ARB_gl_spirv).

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/mesa/main/glspirv.c

index 87075a547cd7f0fdde8c86ee10f8a306a3cdb11e..7af73efd5898c8faa51456a11a999855a9da4e59 100644 (file)
@@ -182,6 +182,20 @@ _mesa_spirv_link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
       prog->last_vert_prog = prog->_LinkedShaders[last_vert_stage - 1]->Program;
 }
 
+static void
+nir_compute_double_inputs(nir_shader *shader,
+                          const nir_shader_compiler_options *options)
+{
+   nir_foreach_variable(var, &shader->inputs) {
+      if (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.vs.double_inputs |= bitfield;
+         }
+      }
+   }
+}
+
 nir_shader *
 _mesa_spirv_to_nir(struct gl_context *ctx,
                    const struct gl_shader_program *prog,
@@ -246,6 +260,11 @@ _mesa_spirv_to_nir(struct gl_context *ctx,
    NIR_PASS_V(nir, nir_split_var_copies);
    NIR_PASS_V(nir, nir_split_per_member_structs);
 
+   if (nir->info.stage == MESA_SHADER_VERTEX) {
+      nir_compute_double_inputs(nir, options);
+      nir_remap_attributes(nir, options);
+   }
+
    return nir;
 }