diff --git a/src/gallium/drivers/r300/compiler/r300_nir_algebraic.py b/src/gallium/drivers/r300/compiler/r300_nir_algebraic.py index b05f994750e..ec6f85adfd5 100644 --- a/src/gallium/drivers/r300/compiler/r300_nir_algebraic.py +++ b/src/gallium/drivers/r300/compiler/r300_nir_algebraic.py @@ -34,6 +34,15 @@ transform_trig_input_vs_r500 = [ (('fcos', 'a'), ('fcos', ('fadd', ('fmul', ('ffract', ('fadd', ('fmul', 'a', 1 / (2 * pi)) , 0.5)), 2 * pi), -pi))), ] +# Transform input to range [-PI, PI]: +# +# y = frac(x / 2PI) +# +transform_trig_input_fs_r500 = [ + (('fsin', 'a'), ('fsin', ('ffract', ('fmul', 'a', 1 / (2 * pi))))), + (('fcos', 'a'), ('fcos', ('ffract', ('fmul', 'a', 1 / (2 * pi))))), +] + def main(): parser = argparse.ArgumentParser() parser.add_argument('-p', '--import-path', required=True) @@ -49,6 +58,9 @@ def main(): f.write(nir_algebraic.AlgebraicPass("r300_transform_vs_trig_input", transform_trig_input_vs_r500).render()) + f.write(nir_algebraic.AlgebraicPass("r300_transform_fs_trig_input", + transform_trig_input_fs_r500).render()) + if __name__ == '__main__': main() diff --git a/src/gallium/drivers/r300/compiler/radeon_program_alu.c b/src/gallium/drivers/r300/compiler/radeon_program_alu.c index c58cf72bdf7..47fdd7885c9 100644 --- a/src/gallium/drivers/r300/compiler/radeon_program_alu.c +++ b/src/gallium/drivers/r300/compiler/radeon_program_alu.c @@ -1026,6 +1026,9 @@ int radeonTransformTrigScale(struct radeon_compiler* c, inst->U.I.Opcode != RC_OPCODE_SIN) return 0; + if (!c->needs_trig_input_transform) + return 1; + temp = rc_find_free_temporary(c); constant = rc_constants_add_immediate_scalar(&c->Program.Constants, RCP_2PI, &constant_swizzle); diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index 241e5c141c9..f585e811dbf 100644 --- a/src/gallium/drivers/r300/r300_fs.c +++ b/src/gallium/drivers/r300/r300_fs.c @@ -440,6 +440,7 @@ static void r300_translate_fragment_shader( compiler.Base.has_half_swizzles = TRUE; compiler.Base.has_presub = TRUE; compiler.Base.has_omod = TRUE; + compiler.Base.needs_trig_input_transform = DBG_ON(r300, DBG_USE_TGSI); compiler.Base.max_temp_regs = compiler.Base.is_r500 ? 128 : (compiler.Base.is_r400 ? 64 : 32); compiler.Base.max_constants = compiler.Base.is_r500 ? 256 : 32; diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 64d7a4e8f68..89af36c9c6c 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -1045,6 +1045,8 @@ static void* r300_create_fs_state(struct pipe_context* pipe, fs->state = *shader; if (fs->state.type == PIPE_SHADER_IR_NIR) { + if (r300->screen->caps.is_r500) + NIR_PASS_V(shader->ir.nir, r300_transform_fs_trig_input); fs->state.tokens = nir_to_tgsi(shader->ir.nir, pipe->screen); } else { assert(fs->state.type == PIPE_SHADER_IR_TGSI); diff --git a/src/gallium/drivers/r300/r300_vs.h b/src/gallium/drivers/r300/r300_vs.h index 4ca5fba255f..3bd0fd66775 100644 --- a/src/gallium/drivers/r300/r300_vs.h +++ b/src/gallium/drivers/r300/r300_vs.h @@ -67,6 +67,8 @@ void r300_translate_vertex_shader(struct r300_context *r300, void r300_draw_init_vertex_shader(struct r300_context *r300, struct r300_vertex_shader *vs); -extern bool r300_transform_trig_input(struct nir_shader *shader); +extern bool r300_transform_vs_trig_input(struct nir_shader *shader); + +extern bool r300_transform_fs_trig_input(struct nir_shader *shader); #endif /* R300_VS_H */