i965/fs: add emit_shader_float_controls_execution_mode() and aux functions
We need this function to emit code that setups the control register later with the defined execution mode for the shader. Therefore, we emit it as the first instruction. v2: - Fix bug in setting the default mode mask in brw_rnd_mode_from_nir(). - Fix support for rounding modes in brw_rnd_mode_from_nir(). v3: - Updated to renamed shader info member and enum values (Andres). v4: - Add actual emission as first instruction of emit_nir_code (Caio). Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Signed-off-by: Andres Gomez <agomez@igalia.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:

committed by
Andres Gomez

parent
8a6507b6fe
commit
9da56ffc52
@@ -200,6 +200,64 @@ fs_visitor::emit_interpolation_setup_gen4()
|
||||
abld.emit(SHADER_OPCODE_RCP, this->pixel_w, wpos_w);
|
||||
}
|
||||
|
||||
static unsigned
|
||||
brw_rnd_mode_from_nir(unsigned mode, unsigned *mask)
|
||||
{
|
||||
unsigned brw_mode = 0;
|
||||
*mask = 0;
|
||||
|
||||
if ((FLOAT_CONTROLS_ROUNDING_MODE_RTZ_FP16 |
|
||||
FLOAT_CONTROLS_ROUNDING_MODE_RTZ_FP32 |
|
||||
FLOAT_CONTROLS_ROUNDING_MODE_RTZ_FP64) &
|
||||
mode) {
|
||||
brw_mode |= BRW_RND_MODE_RTZ << BRW_CR0_RND_MODE_SHIFT;
|
||||
*mask |= BRW_CR0_RND_MODE_MASK;
|
||||
}
|
||||
if ((FLOAT_CONTROLS_ROUNDING_MODE_RTE_FP16 |
|
||||
FLOAT_CONTROLS_ROUNDING_MODE_RTE_FP32 |
|
||||
FLOAT_CONTROLS_ROUNDING_MODE_RTE_FP64) &
|
||||
mode) {
|
||||
brw_mode |= BRW_RND_MODE_RTNE << BRW_CR0_RND_MODE_SHIFT;
|
||||
*mask |= BRW_CR0_RND_MODE_MASK;
|
||||
}
|
||||
if (mode & FLOAT_CONTROLS_DENORM_PRESERVE_FP16) {
|
||||
brw_mode |= BRW_CR0_FP16_DENORM_PRESERVE;
|
||||
*mask |= BRW_CR0_FP16_DENORM_PRESERVE;
|
||||
}
|
||||
if (mode & FLOAT_CONTROLS_DENORM_PRESERVE_FP32) {
|
||||
brw_mode |= BRW_CR0_FP32_DENORM_PRESERVE;
|
||||
*mask |= BRW_CR0_FP32_DENORM_PRESERVE;
|
||||
}
|
||||
if (mode & FLOAT_CONTROLS_DENORM_PRESERVE_FP64) {
|
||||
brw_mode |= BRW_CR0_FP64_DENORM_PRESERVE;
|
||||
*mask |= BRW_CR0_FP64_DENORM_PRESERVE;
|
||||
}
|
||||
if (mode & FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO_FP16)
|
||||
*mask |= BRW_CR0_FP16_DENORM_PRESERVE;
|
||||
if (mode & FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO_FP32)
|
||||
*mask |= BRW_CR0_FP32_DENORM_PRESERVE;
|
||||
if (mode & FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO_FP64)
|
||||
*mask |= BRW_CR0_FP64_DENORM_PRESERVE;
|
||||
if (mode == FLOAT_CONTROLS_DEFAULT_FLOAT_CONTROL_MODE)
|
||||
*mask |= BRW_CR0_FP_MODE_MASK;
|
||||
|
||||
return brw_mode;
|
||||
}
|
||||
|
||||
void
|
||||
fs_visitor::emit_shader_float_controls_execution_mode()
|
||||
{
|
||||
unsigned execution_mode = this->nir->info.float_controls_execution_mode;
|
||||
if (execution_mode == FLOAT_CONTROLS_DEFAULT_FLOAT_CONTROL_MODE)
|
||||
return;
|
||||
|
||||
fs_builder abld = bld.annotate("shader floats control execution mode");
|
||||
unsigned mask = 0;
|
||||
unsigned mode = brw_rnd_mode_from_nir(execution_mode, &mask);
|
||||
abld.emit(SHADER_OPCODE_FLOAT_CONTROL_MODE, bld.null_reg_ud(),
|
||||
brw_imm_d(mode), brw_imm_d(mask));
|
||||
}
|
||||
|
||||
/** Emits the interpolation for the varying inputs. */
|
||||
void
|
||||
fs_visitor::emit_interpolation_setup_gen6()
|
||||
|
Reference in New Issue
Block a user