nir: add shader_info::bit_sizes_used
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4791>
This commit is contained in:
@@ -712,11 +712,18 @@ gather_alu_info(nir_alu_instr *instr, nir_shader *shader)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
shader->info.uses_64bit |= instr->dest.dest.ssa.bit_size == 64;
|
const nir_op_info *info = &nir_op_infos[instr->op];
|
||||||
unsigned num_srcs = nir_op_infos[instr->op].num_inputs;
|
|
||||||
for (unsigned i = 0; i < num_srcs; i++) {
|
for (unsigned i = 0; i < info->num_inputs; i++) {
|
||||||
shader->info.uses_64bit |= nir_src_bit_size(instr->src[i].src) == 64;
|
if (nir_alu_type_get_base_type(info->input_types[i]) == nir_type_float)
|
||||||
|
shader->info.bit_sizes_float |= nir_src_bit_size(instr->src[i].src);
|
||||||
|
else
|
||||||
|
shader->info.bit_sizes_int |= nir_src_bit_size(instr->src[i].src);
|
||||||
}
|
}
|
||||||
|
if (nir_alu_type_get_base_type(info->output_type) == nir_type_float)
|
||||||
|
shader->info.bit_sizes_float |= nir_dest_bit_size(instr->dest.dest);
|
||||||
|
else
|
||||||
|
shader->info.bit_sizes_int |= nir_dest_bit_size(instr->dest.dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -749,6 +756,8 @@ nir_shader_gather_info(nir_shader *shader, nir_function_impl *entrypoint)
|
|||||||
shader->info.num_images = 0;
|
shader->info.num_images = 0;
|
||||||
shader->info.image_buffers = 0;
|
shader->info.image_buffers = 0;
|
||||||
shader->info.msaa_images = 0;
|
shader->info.msaa_images = 0;
|
||||||
|
shader->info.bit_sizes_float = 0;
|
||||||
|
shader->info.bit_sizes_int = 0;
|
||||||
|
|
||||||
nir_foreach_uniform_variable(var, shader) {
|
nir_foreach_uniform_variable(var, shader) {
|
||||||
/* Bindless textures and images don't use non-bindless slots.
|
/* Bindless textures and images don't use non-bindless slots.
|
||||||
|
@@ -187,10 +187,9 @@ typedef struct shader_info {
|
|||||||
*/
|
*/
|
||||||
bool uses_fddx_fddy:1;
|
bool uses_fddx_fddy:1;
|
||||||
|
|
||||||
/**
|
/* Bitmask of bit-sizes used with ALU instructions. */
|
||||||
* True if this shader uses 64-bit ALU operations
|
uint8_t bit_sizes_float;
|
||||||
*/
|
uint8_t bit_sizes_int;
|
||||||
bool uses_64bit:1;
|
|
||||||
|
|
||||||
/* Whether the first UBO is the default uniform buffer, i.e. uniforms. */
|
/* Whether the first UBO is the default uniform buffer, i.e. uniforms. */
|
||||||
bool first_ubo_is_default_ubo:1;
|
bool first_ubo_is_default_ubo:1;
|
||||||
|
@@ -119,7 +119,7 @@ brw_create_nir(struct brw_context *brw,
|
|||||||
|
|
||||||
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
|
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
|
||||||
|
|
||||||
if (!ctx->SoftFP64 && nir->info.uses_64bit &&
|
if (!ctx->SoftFP64 && ((nir->info.bit_sizes_int | nir->info.bit_sizes_float) & 64) &&
|
||||||
(options->lower_doubles_options & nir_lower_fp64_full_software)) {
|
(options->lower_doubles_options & nir_lower_fp64_full_software)) {
|
||||||
ctx->SoftFP64 = glsl_float64_funcs_to_nir(ctx, options);
|
ctx->SoftFP64 = glsl_float64_funcs_to_nir(ctx, options);
|
||||||
}
|
}
|
||||||
|
@@ -370,7 +370,7 @@ st_nir_preprocess(struct st_context *st, struct gl_program *prog,
|
|||||||
}
|
}
|
||||||
|
|
||||||
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
|
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
|
||||||
if (!st->ctx->SoftFP64 && nir->info.uses_64bit &&
|
if (!st->ctx->SoftFP64 && ((nir->info.bit_sizes_int | nir->info.bit_sizes_float) & 64) &&
|
||||||
(options->lower_doubles_options & nir_lower_fp64_full_software) != 0) {
|
(options->lower_doubles_options & nir_lower_fp64_full_software) != 0) {
|
||||||
st->ctx->SoftFP64 = glsl_float64_funcs_to_nir(st->ctx, options);
|
st->ctx->SoftFP64 = glsl_float64_funcs_to_nir(st->ctx, options);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user