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 <kherbst@redhat.com>tags/18.1-branchpoint
| @@ -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 | |||
| }; | |||
| @@ -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) | |||
| @@ -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; | |||
| @@ -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, | |||
| }; | |||