r300: extract TGSI->RC translation helpers into nir_to_rc.h

Pull translate_opcode, translate_register_file, translate_saturate
and the texture-target switch out of r300_tgsi_to_rc into
nir_to_rc.h as static inline rc_translate_* helpers. r300_tgsi_to_rc
now uses them and this is preparation for direct RC emission from
nir_to_rc.c

Assisted-by: Codex (GPT-5.5)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41577>
This commit is contained in:
Pavel Ondračka 2026-05-07 11:45:37 +02:00 committed by Marge Bot
parent ebf2ab9d59
commit e5a893c3aa
2 changed files with 105 additions and 104 deletions

View file

@ -7,12 +7,17 @@
#define NIR_TO_RC_H
#include <stdbool.h>
#include <stdio.h>
#include "compiler/nir/nir.h"
#include "pipe/p_defines.h"
#include "r300_fs.h"
#include "r300_shader_semantics.h"
#include "r300_vs.h"
#include "compiler/radeon_program_constants.h"
#include "pipe/p_shader_tokens.h"
#include "util/compiler.h"
struct nir_shader;
struct pipe_screen;
struct r300_fragment_program_external_state;
@ -29,4 +34,98 @@ nir_to_rc(struct nir_shader *s, struct pipe_screen *screen,
void
ntr_fixup_varying_slots(struct nir_shader *s, nir_variable_mode mode);
/* Helpers used for translating between TGSI and RC enums. */
static inline unsigned
rc_translate_opcode(unsigned tgsi_opcode)
{
switch (tgsi_opcode) {
case TGSI_OPCODE_ARL: return RC_OPCODE_ARL;
case TGSI_OPCODE_MOV: return RC_OPCODE_MOV;
case TGSI_OPCODE_RCP: return RC_OPCODE_RCP;
case TGSI_OPCODE_RSQ: return RC_OPCODE_RSQ;
case TGSI_OPCODE_EXP: return RC_OPCODE_EXP;
case TGSI_OPCODE_LOG: return RC_OPCODE_LOG;
case TGSI_OPCODE_MUL: return RC_OPCODE_MUL;
case TGSI_OPCODE_ADD: return RC_OPCODE_ADD;
case TGSI_OPCODE_DP3: return RC_OPCODE_DP3;
case TGSI_OPCODE_DP4: return RC_OPCODE_DP4;
case TGSI_OPCODE_DST: return RC_OPCODE_DST;
case TGSI_OPCODE_MIN: return RC_OPCODE_MIN;
case TGSI_OPCODE_MAX: return RC_OPCODE_MAX;
case TGSI_OPCODE_SLT: return RC_OPCODE_SLT;
case TGSI_OPCODE_SGE: return RC_OPCODE_SGE;
case TGSI_OPCODE_MAD: return RC_OPCODE_MAD;
case TGSI_OPCODE_FRC: return RC_OPCODE_FRC;
case TGSI_OPCODE_ROUND: return RC_OPCODE_ROUND;
case TGSI_OPCODE_EX2: return RC_OPCODE_EX2;
case TGSI_OPCODE_LG2: return RC_OPCODE_LG2;
case TGSI_OPCODE_POW: return RC_OPCODE_POW;
case TGSI_OPCODE_COS: return RC_OPCODE_COS;
case TGSI_OPCODE_DDX: return RC_OPCODE_DDX;
case TGSI_OPCODE_DDY: return RC_OPCODE_DDY;
case TGSI_OPCODE_KILL: return RC_OPCODE_KILP;
case TGSI_OPCODE_SEQ: return RC_OPCODE_SEQ;
case TGSI_OPCODE_SIN: return RC_OPCODE_SIN;
case TGSI_OPCODE_SNE: return RC_OPCODE_SNE;
case TGSI_OPCODE_TEX: return RC_OPCODE_TEX;
case TGSI_OPCODE_TXD: return RC_OPCODE_TXD;
case TGSI_OPCODE_TXP: return RC_OPCODE_TXP;
case TGSI_OPCODE_ARR: return RC_OPCODE_ARR;
case TGSI_OPCODE_CMP: return RC_OPCODE_CMP;
case TGSI_OPCODE_TXB: return RC_OPCODE_TXB;
case TGSI_OPCODE_DP2: return RC_OPCODE_DP2;
case TGSI_OPCODE_TXL: return RC_OPCODE_TXL;
case TGSI_OPCODE_BRK: return RC_OPCODE_BRK;
case TGSI_OPCODE_IF: return RC_OPCODE_IF;
case TGSI_OPCODE_BGNLOOP: return RC_OPCODE_BGNLOOP;
case TGSI_OPCODE_ELSE: return RC_OPCODE_ELSE;
case TGSI_OPCODE_ENDIF: return RC_OPCODE_ENDIF;
case TGSI_OPCODE_ENDLOOP: return RC_OPCODE_ENDLOOP;
case TGSI_OPCODE_CONT: return RC_OPCODE_CONT;
case TGSI_OPCODE_NOP: return RC_OPCODE_NOP;
case TGSI_OPCODE_KILL_IF: return RC_OPCODE_KIL;
}
fprintf(stderr, "r300: Unknown TGSI/RC opcode: %u\n", tgsi_opcode);
return RC_OPCODE_ILLEGAL_OPCODE;
}
static inline unsigned
rc_translate_register_file(unsigned tgsi_file)
{
switch (tgsi_file) {
case TGSI_FILE_CONSTANT: return RC_FILE_CONSTANT;
case TGSI_FILE_IMMEDIATE: return RC_FILE_CONSTANT;
case TGSI_FILE_INPUT: return RC_FILE_INPUT;
case TGSI_FILE_OUTPUT: return RC_FILE_OUTPUT;
case TGSI_FILE_ADDRESS: return RC_FILE_ADDRESS;
default:
fprintf(stderr, "Unhandled register file: %i\n", tgsi_file);
FALLTHROUGH;
case TGSI_FILE_TEMPORARY: return RC_FILE_TEMPORARY;
}
}
static inline unsigned
rc_translate_saturate(bool saturate)
{
return saturate ? RC_SATURATE_ZERO_ONE : RC_SATURATE_NONE;
}
static inline unsigned
rc_translate_tex_target(unsigned tgsi_target)
{
switch (tgsi_target) {
case TGSI_TEXTURE_1D: return RC_TEXTURE_1D;
case TGSI_TEXTURE_2D: return RC_TEXTURE_2D;
case TGSI_TEXTURE_3D: return RC_TEXTURE_3D;
case TGSI_TEXTURE_CUBE: return RC_TEXTURE_CUBE;
case TGSI_TEXTURE_RECT: return RC_TEXTURE_RECT;
case TGSI_TEXTURE_1D_ARRAY: return RC_TEXTURE_1D_ARRAY;
case TGSI_TEXTURE_2D_ARRAY: return RC_TEXTURE_2D_ARRAY;
default:
UNREACHABLE("unsupported tex target");
}
}
#endif /* NIR_TO_RC_H */

View file

@ -6,6 +6,7 @@
#include <stdio.h>
#include "r300_tgsi_to_rc.h"
#include "compiler/nir_to_rc.h"
#include "compiler/radeon_compiler.h"
#include "tgsi/tgsi_info.h"
@ -15,80 +16,6 @@
#include "util/compiler.h"
static unsigned translate_opcode(unsigned opcode)
{
switch(opcode) {
case TGSI_OPCODE_ARL: return RC_OPCODE_ARL;
case TGSI_OPCODE_MOV: return RC_OPCODE_MOV;
case TGSI_OPCODE_RCP: return RC_OPCODE_RCP;
case TGSI_OPCODE_RSQ: return RC_OPCODE_RSQ;
case TGSI_OPCODE_EXP: return RC_OPCODE_EXP;
case TGSI_OPCODE_LOG: return RC_OPCODE_LOG;
case TGSI_OPCODE_MUL: return RC_OPCODE_MUL;
case TGSI_OPCODE_ADD: return RC_OPCODE_ADD;
case TGSI_OPCODE_DP3: return RC_OPCODE_DP3;
case TGSI_OPCODE_DP4: return RC_OPCODE_DP4;
case TGSI_OPCODE_DST: return RC_OPCODE_DST;
case TGSI_OPCODE_MIN: return RC_OPCODE_MIN;
case TGSI_OPCODE_MAX: return RC_OPCODE_MAX;
case TGSI_OPCODE_SLT: return RC_OPCODE_SLT;
case TGSI_OPCODE_SGE: return RC_OPCODE_SGE;
case TGSI_OPCODE_MAD: return RC_OPCODE_MAD;
case TGSI_OPCODE_FRC: return RC_OPCODE_FRC;
case TGSI_OPCODE_ROUND: return RC_OPCODE_ROUND;
case TGSI_OPCODE_EX2: return RC_OPCODE_EX2;
case TGSI_OPCODE_LG2: return RC_OPCODE_LG2;
case TGSI_OPCODE_POW: return RC_OPCODE_POW;
case TGSI_OPCODE_COS: return RC_OPCODE_COS;
case TGSI_OPCODE_DDX: return RC_OPCODE_DDX;
case TGSI_OPCODE_DDY: return RC_OPCODE_DDY;
case TGSI_OPCODE_KILL: return RC_OPCODE_KILP;
case TGSI_OPCODE_SEQ: return RC_OPCODE_SEQ;
case TGSI_OPCODE_SIN: return RC_OPCODE_SIN;
case TGSI_OPCODE_SNE: return RC_OPCODE_SNE;
case TGSI_OPCODE_TEX: return RC_OPCODE_TEX;
case TGSI_OPCODE_TXD: return RC_OPCODE_TXD;
case TGSI_OPCODE_TXP: return RC_OPCODE_TXP;
case TGSI_OPCODE_ARR: return RC_OPCODE_ARR;
case TGSI_OPCODE_CMP: return RC_OPCODE_CMP;
case TGSI_OPCODE_TXB: return RC_OPCODE_TXB;
case TGSI_OPCODE_DP2: return RC_OPCODE_DP2;
case TGSI_OPCODE_TXL: return RC_OPCODE_TXL;
case TGSI_OPCODE_BRK: return RC_OPCODE_BRK;
case TGSI_OPCODE_IF: return RC_OPCODE_IF;
case TGSI_OPCODE_BGNLOOP: return RC_OPCODE_BGNLOOP;
case TGSI_OPCODE_ELSE: return RC_OPCODE_ELSE;
case TGSI_OPCODE_ENDIF: return RC_OPCODE_ENDIF;
case TGSI_OPCODE_ENDLOOP: return RC_OPCODE_ENDLOOP;
case TGSI_OPCODE_CONT: return RC_OPCODE_CONT;
case TGSI_OPCODE_NOP: return RC_OPCODE_NOP;
case TGSI_OPCODE_KILL_IF: return RC_OPCODE_KIL;
}
fprintf(stderr, "r300: Unknown TGSI/RC opcode: %s\n", tgsi_get_opcode_name(opcode));
return RC_OPCODE_ILLEGAL_OPCODE;
}
static unsigned translate_saturate(unsigned saturate)
{
return saturate ? RC_SATURATE_ZERO_ONE : RC_SATURATE_NONE;
}
static unsigned translate_register_file(unsigned file)
{
switch(file) {
case TGSI_FILE_CONSTANT: return RC_FILE_CONSTANT;
case TGSI_FILE_IMMEDIATE: return RC_FILE_CONSTANT;
case TGSI_FILE_INPUT: return RC_FILE_INPUT;
case TGSI_FILE_OUTPUT: return RC_FILE_OUTPUT;
default:
fprintf(stderr, "Unhandled register file: %i\n", file);
FALLTHROUGH;
case TGSI_FILE_TEMPORARY: return RC_FILE_TEMPORARY;
case TGSI_FILE_ADDRESS: return RC_FILE_ADDRESS;
}
}
static int translate_register_index(
struct tgsi_to_rc * ttr,
unsigned file,
@ -105,7 +32,7 @@ static void transform_dstreg(
struct rc_dst_register * dst,
struct tgsi_full_dst_register * src)
{
dst->File = translate_register_file(src->Register.File);
dst->File = rc_translate_register_file(src->Register.File);
dst->Index = translate_register_index(ttr, src->Register.File, src->Register.Index);
dst->WriteMask = src->Register.WriteMask;
@ -121,7 +48,7 @@ static void transform_srcreg(
struct rc_src_register * dst,
struct tgsi_full_src_register * src)
{
dst->File = translate_register_file(src->Register.File);
dst->File = rc_translate_register_file(src->Register.File);
int index = translate_register_index(ttr, src->Register.File, src->Register.Index);
/* Negative offsets to relative addressing should have been lowered in NIR */
assert(index >= 0);
@ -142,32 +69,7 @@ static void transform_srcreg(
static void transform_texture(struct rc_instruction * dst, struct tgsi_instruction_texture src)
{
switch(src.Texture) {
case TGSI_TEXTURE_1D:
dst->U.I.TexSrcTarget = RC_TEXTURE_1D;
break;
case TGSI_TEXTURE_2D:
dst->U.I.TexSrcTarget = RC_TEXTURE_2D;
break;
case TGSI_TEXTURE_3D:
dst->U.I.TexSrcTarget = RC_TEXTURE_3D;
break;
case TGSI_TEXTURE_CUBE:
dst->U.I.TexSrcTarget = RC_TEXTURE_CUBE;
break;
case TGSI_TEXTURE_RECT:
dst->U.I.TexSrcTarget = RC_TEXTURE_RECT;
break;
case TGSI_TEXTURE_1D_ARRAY:
dst->U.I.TexSrcTarget = RC_TEXTURE_1D_ARRAY;
break;
case TGSI_TEXTURE_2D_ARRAY:
dst->U.I.TexSrcTarget = RC_TEXTURE_2D_ARRAY;
break;
default:
UNREACHABLE("");
break;
}
dst->U.I.TexSrcTarget = rc_translate_tex_target(src.Texture);
dst->U.I.TexSwizzle = RC_SWIZZLE_XYZW;
}
@ -177,8 +79,8 @@ static void transform_instruction(struct tgsi_to_rc * ttr, struct tgsi_full_inst
int i;
dst = rc_insert_new_instruction(ttr->compiler, ttr->compiler->Program.Instructions.Prev);
dst->U.I.Opcode = translate_opcode(src->Instruction.Opcode);
dst->U.I.SaturateMode = translate_saturate(src->Instruction.Saturate);
dst->U.I.Opcode = rc_translate_opcode(src->Instruction.Opcode);
dst->U.I.SaturateMode = rc_translate_saturate(src->Instruction.Saturate);
if (src->Instruction.NumDstRegs)
transform_dstreg(ttr, &dst->U.I.DstReg, &src->Dst[0]);