mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-04 06:38:19 +02:00
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:
parent
ebf2ab9d59
commit
e5a893c3aa
2 changed files with 105 additions and 104 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue