From 5b8de4bdffa1f0caed55a7a3f615dae9f625c53e Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 8 Jan 2018 10:37:27 +1100 Subject: [PATCH] nir: add vs_inputs_dual_locations compiler option Allows nir drivers to either use a single or dual locations for vs double inputs. i965 uses dual locations for both OpenGL and Vulkan drivers, for now gallium OpenGL drivers only use a single location. The following patch will also make use of this option when calling nir_shader_gather_info(). Reviewed-by: Karol Herbst --- src/amd/vulkan/radv_shader.c | 1 + src/compiler/glsl/glsl_to_nir.cpp | 14 +++++++++----- src/compiler/nir/nir.h | 6 ++++++ src/intel/compiler/brw_compiler.c | 3 +++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 620effe50e6..af094e6220f 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -67,6 +67,7 @@ static const struct nir_shader_compiler_options nir_options = { .lower_extract_byte = true, .lower_extract_word = true, .lower_ffma = true, + .vs_inputs_dual_locations = true, .max_unroll_iterations = 32 }; diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 29e32cde53c..1a579f41cd3 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -130,11 +130,15 @@ private: } /* end of anonymous namespace */ static void -nir_remap_attributes(nir_shader *shader) +nir_remap_attributes(nir_shader *shader, + const nir_shader_compiler_options *options) { - nir_foreach_variable(var, &shader->inputs) { - var->data.location += _mesa_bitcount_64(shader->info.vs.double_inputs & - BITFIELD64_MASK(var->data.location)); + if (options->vs_inputs_dual_locations) { + nir_foreach_variable(var, &shader->inputs) { + 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 @@ -164,7 +168,7 @@ glsl_to_nir(const struct gl_shader_program *shader_prog, * 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); + nir_remap_attributes(shader, options); shader->info.name = ralloc_asprintf(shader, "GLSL%d", shader_prog->Name); if (shader_prog->Label) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 41a07b0b48c..4bb96c3c952 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1892,6 +1892,12 @@ typedef struct nir_shader_compiler_options { */ bool use_interpolated_input_intrinsics; + /** + * Do vertex shader double inputs use two locations? The Vulkan spec + * requires two locations to be used, OpenGL allows a single location. + */ + bool vs_inputs_dual_locations; + unsigned max_unroll_iterations; } nir_shader_compiler_options; diff --git a/src/intel/compiler/brw_compiler.c b/src/intel/compiler/brw_compiler.c index e89aeacc7d2..e515559acb6 100644 --- a/src/intel/compiler/brw_compiler.c +++ b/src/intel/compiler/brw_compiler.c @@ -57,6 +57,7 @@ static const struct nir_shader_compiler_options scalar_nir_options = { .lower_unpack_snorm_4x8 = true, .lower_unpack_unorm_2x16 = true, .lower_unpack_unorm_4x8 = true, + .vs_inputs_dual_locations = true, .max_unroll_iterations = 32, }; @@ -78,6 +79,7 @@ static const struct nir_shader_compiler_options vector_nir_options = { .lower_unpack_unorm_2x16 = true, .lower_extract_byte = true, .lower_extract_word = true, + .vs_inputs_dual_locations = true, .max_unroll_iterations = 32, }; @@ -96,6 +98,7 @@ static const struct nir_shader_compiler_options vector_nir_options_gen6 = { .lower_unpack_unorm_2x16 = true, .lower_extract_byte = true, .lower_extract_word = true, + .vs_inputs_dual_locations = true, .max_unroll_iterations = 32, }; -- 2.30.2