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 <kherbst@redhat.com>
This commit is contained in:
@@ -67,6 +67,7 @@ static const struct nir_shader_compiler_options nir_options = {
|
|||||||
.lower_extract_byte = true,
|
.lower_extract_byte = true,
|
||||||
.lower_extract_word = true,
|
.lower_extract_word = true,
|
||||||
.lower_ffma = true,
|
.lower_ffma = true,
|
||||||
|
.vs_inputs_dual_locations = true,
|
||||||
.max_unroll_iterations = 32
|
.max_unroll_iterations = 32
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -130,11 +130,15 @@ private:
|
|||||||
} /* end of anonymous namespace */
|
} /* end of anonymous namespace */
|
||||||
|
|
||||||
static void
|
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) {
|
if (options->vs_inputs_dual_locations) {
|
||||||
var->data.location += _mesa_bitcount_64(shader->info.vs.double_inputs &
|
nir_foreach_variable(var, &shader->inputs) {
|
||||||
BITFIELD64_MASK(var->data.location));
|
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
|
/* 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
|
* 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 */
|
* locations/slots 0 and 1, and attr1 will use location/slot 2 */
|
||||||
if (shader->info.stage == MESA_SHADER_VERTEX)
|
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);
|
shader->info.name = ralloc_asprintf(shader, "GLSL%d", shader_prog->Name);
|
||||||
if (shader_prog->Label)
|
if (shader_prog->Label)
|
||||||
|
@@ -1892,6 +1892,12 @@ typedef struct nir_shader_compiler_options {
|
|||||||
*/
|
*/
|
||||||
bool use_interpolated_input_intrinsics;
|
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;
|
unsigned max_unroll_iterations;
|
||||||
} nir_shader_compiler_options;
|
} 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_snorm_4x8 = true,
|
||||||
.lower_unpack_unorm_2x16 = true,
|
.lower_unpack_unorm_2x16 = true,
|
||||||
.lower_unpack_unorm_4x8 = true,
|
.lower_unpack_unorm_4x8 = true,
|
||||||
|
.vs_inputs_dual_locations = true,
|
||||||
.max_unroll_iterations = 32,
|
.max_unroll_iterations = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -78,6 +79,7 @@ static const struct nir_shader_compiler_options vector_nir_options = {
|
|||||||
.lower_unpack_unorm_2x16 = true,
|
.lower_unpack_unorm_2x16 = true,
|
||||||
.lower_extract_byte = true,
|
.lower_extract_byte = true,
|
||||||
.lower_extract_word = true,
|
.lower_extract_word = true,
|
||||||
|
.vs_inputs_dual_locations = true,
|
||||||
.max_unroll_iterations = 32,
|
.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_unpack_unorm_2x16 = true,
|
||||||
.lower_extract_byte = true,
|
.lower_extract_byte = true,
|
||||||
.lower_extract_word = true,
|
.lower_extract_word = true,
|
||||||
|
.vs_inputs_dual_locations = true,
|
||||||
.max_unroll_iterations = 32,
|
.max_unroll_iterations = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user