mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-09 20:20:33 +01:00
some basic r500 portage
This commit is contained in:
parent
5da8289e9c
commit
1c71ec4d45
6 changed files with 742 additions and 20 deletions
|
|
@ -281,10 +281,14 @@ void r300InitCmdBuf(r300ContextPtr r300)
|
|||
{
|
||||
int size, mtu;
|
||||
int has_tcl = 1;
|
||||
int is_r500 = 0;
|
||||
|
||||
if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
|
||||
has_tcl = 0;
|
||||
|
||||
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
|
||||
is_r500 = 1;
|
||||
|
||||
r300->hw.max_state_size = 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
|
||||
|
||||
mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
|
||||
|
|
@ -374,10 +378,17 @@ void r300InitCmdBuf(r300ContextPtr r300)
|
|||
r300->hw.su_depth_scale.cmd[0] = cmdpacket0(R300_SU_DEPTH_SCALE, 2);
|
||||
ALLOC_STATE(rc, always, R300_RC_CMDSIZE, 0);
|
||||
r300->hw.rc.cmd[R300_RC_CMD_0] = cmdpacket0(R300_RS_COUNT, 2);
|
||||
ALLOC_STATE(ri, always, R300_RI_CMDSIZE, 0);
|
||||
r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(R300_RS_IP_0, 8);
|
||||
ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
|
||||
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(R300_RS_ROUTE_0, 1);
|
||||
if (is_r500) {
|
||||
ALLOC_STATE(ri, always, R300_RI_CMDSIZE, 0);
|
||||
r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(R500_RS_IP_0, 16);
|
||||
ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
|
||||
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(R500_RS_INST_0, 1);
|
||||
} else {
|
||||
ALLOC_STATE(ri, always, R300_RI_CMDSIZE, 0);
|
||||
r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(R300_RS_IP_0, 8);
|
||||
ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
|
||||
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(R300_RS_ROUTE_0, 1);
|
||||
}
|
||||
ALLOC_STATE(sc_hyperz, always, 3, 0);
|
||||
r300->hw.sc_hyperz.cmd[0] = cmdpacket0(R300_SC_HYPERZ, 2);
|
||||
ALLOC_STATE(sc_screendoor, always, 2, 0);
|
||||
|
|
@ -389,14 +400,25 @@ void r300InitCmdBuf(r300ContextPtr r300)
|
|||
r300->hw.fpt.cmd[R300_FPT_CMD_0] = cmdpacket0(R300_PFS_TEXI_0, 0);
|
||||
ALLOC_STATE(us_out_fmt, always, 6, 0);
|
||||
r300->hw.us_out_fmt.cmd[0] = cmdpacket0(R500_US_OUT_FMT, 5);
|
||||
ALLOC_STATE(fpi[0], variable, R300_FPI_CMDSIZE, 0);
|
||||
r300->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR0_0, 1);
|
||||
ALLOC_STATE(fpi[1], variable, R300_FPI_CMDSIZE, 1);
|
||||
r300->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR1_0, 1);
|
||||
ALLOC_STATE(fpi[2], variable, R300_FPI_CMDSIZE, 2);
|
||||
r300->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR2_0, 1);
|
||||
ALLOC_STATE(fpi[3], variable, R300_FPI_CMDSIZE, 3);
|
||||
r300->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR3_0, 1);
|
||||
|
||||
if (is_r500) {
|
||||
ALLOC_STATE(r500fp, variable, R300_FPI_CMDSIZE, 0);
|
||||
r300->hw.r500fp.cmd[R300_FPI_CMD_0] = cmdr500fp(0, 1);
|
||||
}
|
||||
|
||||
if (0/*is_r500*/) {
|
||||
|
||||
}/* else*/
|
||||
{
|
||||
ALLOC_STATE(fpi[0], variable, R300_FPI_CMDSIZE, 0);
|
||||
r300->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR0_0, 1);
|
||||
ALLOC_STATE(fpi[1], variable, R300_FPI_CMDSIZE, 1);
|
||||
r300->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR1_0, 1);
|
||||
ALLOC_STATE(fpi[2], variable, R300_FPI_CMDSIZE, 2);
|
||||
r300->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR2_0, 1);
|
||||
ALLOC_STATE(fpi[3], variable, R300_FPI_CMDSIZE, 3);
|
||||
r300->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR3_0, 1);
|
||||
}
|
||||
ALLOC_STATE(fogs, always, R300_FOGS_CMDSIZE, 0);
|
||||
r300->hw.fogs.cmd[R300_FOGS_CMD_0] = cmdpacket0(FG_FOG_BLEND, 1);
|
||||
ALLOC_STATE(fogc, always, R300_FOGC_CMDSIZE, 0);
|
||||
|
|
@ -456,10 +478,18 @@ void r300InitCmdBuf(r300ContextPtr r300)
|
|||
r300->hw.vps.cmd[R300_VPS_CMD_0] =
|
||||
cmdvpu(R300_PVS_UPLOAD_POINTSIZE, 1);
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
|
||||
r300->hw.vpucp[i].cmd[R300_VPUCP_CMD_0] =
|
||||
cmdvpu(R300_PVS_UPLOAD_CLIP_PLANE0+i, 1);
|
||||
if (is_r500) {
|
||||
for (i = 0; i < 6; i++) {
|
||||
ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
|
||||
r300->hw.vpucp[i].cmd[R300_VPUCP_CMD_0] =
|
||||
cmdvpu(R500_PVS_UPLOAD_CLIP_PLANE0+i, 1);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < 6; i++) {
|
||||
ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
|
||||
r300->hw.vpucp[i].cmd[R300_VPUCP_CMD_0] =
|
||||
cmdvpu(R300_PVS_UPLOAD_CLIP_PLANE0+i, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -487,6 +487,7 @@ struct r300_hw_state {
|
|||
struct r300_state_atom fp; /* fragment program cntl + nodes (4600) */
|
||||
struct r300_state_atom fpt; /* texi - (4620) */
|
||||
struct r300_state_atom us_out_fmt; /* (46A4) */
|
||||
struct r300_state_atom r500fp; /* r500 fp instructions */
|
||||
struct r300_state_atom fpi[4]; /* fp instructions (46C0/47C0/48C0/49C0) */
|
||||
struct r300_state_atom fogs; /* fog state (4BC0) */
|
||||
struct r300_state_atom fogc; /* fog color (4BC8) */
|
||||
|
|
|
|||
|
|
@ -74,6 +74,18 @@ static inline uint32_t cmdvpu(int addr, int count)
|
|||
return cmd.u;
|
||||
}
|
||||
|
||||
static inline uint32_t cmdr500fp(int addr, int count)
|
||||
{
|
||||
drm_r300_cmd_header_t cmd;
|
||||
|
||||
cmd.vpu.cmd_type = R300_CMD_R500FP;
|
||||
cmd.vpu.count = count;
|
||||
cmd.vpu.adrhi = ((unsigned int)addr & 0xFF00) >> 8;
|
||||
cmd.vpu.adrlo = ((unsigned int)addr & 0x00FF);
|
||||
|
||||
return cmd.u;
|
||||
}
|
||||
|
||||
static inline uint32_t cmdpacket3(int packet)
|
||||
{
|
||||
drm_r300_cmd_header_t cmd;
|
||||
|
|
|
|||
|
|
@ -657,7 +657,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
/* This table specifies the source location and format for up to 16 texture
|
||||
* addresses (i[0]:i[15]) and four colors (c[0]:c[3])
|
||||
*/
|
||||
#define R500_RS_IP_0 0x4074
|
||||
#define R500_RS_IP_0 0x4074
|
||||
#define R500_RS_IP_1 0x4078
|
||||
#define R500_RS_IP_2 0x407C
|
||||
#define R500_RS_IP_3 0x4080
|
||||
|
|
@ -1151,7 +1151,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
|
||||
/* */
|
||||
#define R500_RS_INST_0 0x4320
|
||||
#define R500_RS_INST_0 0x4320
|
||||
#define R500_RS_INST_1 0x4324
|
||||
#define R500_RS_INST_2 0x4328
|
||||
#define R500_RS_INST_3 0x432c
|
||||
|
|
@ -2544,6 +2544,479 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#define R300_PRIM_NUM_VERTICES_SHIFT 16
|
||||
#define R300_PRIM_NUM_VERTICES_MASK 0xffff
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* The R500 unified shader (US) registers come in banks of 512 each, one
|
||||
* for each instruction slot in the shader. You can't touch them directly.
|
||||
* R500_US_VECTOR_INDEX() sets the base instruction to modify; successive
|
||||
* writes to R500_GA_US_VECTOR_DATA autoincrement the index after the
|
||||
* instruction is fully specified.
|
||||
*/
|
||||
#define R500_US_ALU_ALPHA_INST_0 0xa800
|
||||
# define R500_ALPHA_OP_MAD 0
|
||||
# define R500_ALPHA_OP_DP 1
|
||||
# define R500_ALPHA_OP_MIN 2
|
||||
# define R500_ALPHA_OP_MAX 3
|
||||
/* #define R500_ALPHA_OP_RESERVED 4 */
|
||||
# define R500_ALPHA_OP_CND 5
|
||||
# define R500_ALPHA_OP_CMP 6
|
||||
# define R500_ALPHA_OP_FRC 7
|
||||
# define R500_ALPHA_OP_EX2 8
|
||||
# define R500_ALPHA_OP_LN2 9
|
||||
# define R500_ALPHA_OP_RCP 10
|
||||
# define R500_ALPHA_OP_RSQ 11
|
||||
# define R500_ALPHA_OP_SIN 12
|
||||
# define R500_ALPHA_OP_COS 13
|
||||
# define R500_ALPHA_OP_MDH 14
|
||||
# define R500_ALPHA_OP_MDV 15
|
||||
# define R500_ALPHA_ADDRD(x) (x << 4)
|
||||
# define R500_ALPHA_ADDRD_REL (1 << 11)
|
||||
# define R500_ALPHA_SEL_A_SRC0 (0 << 12)
|
||||
# define R500_ALPHA_SEL_A_SRC1 (1 << 12)
|
||||
# define R500_ALPHA_SEL_A_SRC2 (2 << 12)
|
||||
# define R500_ALPHA_SEL_A_SRCP (3 << 12)
|
||||
# define R500_ALPHA_SWIZ_A_R (0 << 14)
|
||||
# define R500_ALPHA_SWIZ_A_G (1 << 14)
|
||||
# define R500_ALPHA_SWIZ_A_B (2 << 14)
|
||||
# define R500_ALPHA_SWIZ_A_A (3 << 14)
|
||||
# define R500_ALPHA_SWIZ_A_0 (4 << 14)
|
||||
# define R500_ALPHA_SWIZ_A_HALF (5 << 14)
|
||||
# define R500_ALPHA_SWIZ_A_1 (6 << 14)
|
||||
/* #define R500_ALPHA_SWIZ_A_UNUSED (7 << 14) */
|
||||
# define R500_ALPHA_MOD_A_NOP (0 << 17)
|
||||
# define R500_ALPHA_MOD_A_NEG (1 << 17)
|
||||
# define R500_ALPHA_MOD_A_ABS (2 << 17)
|
||||
# define R500_ALPHA_MOD_A_NAB (3 << 17)
|
||||
# define R500_ALPHA_SEL_B_SRC0 (0 << 19)
|
||||
# define R500_ALPHA_SEL_B_SRC1 (1 << 19)
|
||||
# define R500_ALPHA_SEL_B_SRC2 (2 << 19)
|
||||
# define R500_ALPHA_SEL_B_SRCP (3 << 19)
|
||||
# define R500_ALPHA_SWIZ_B_R (0 << 21)
|
||||
# define R500_ALPHA_SWIZ_B_G (1 << 21)
|
||||
# define R500_ALPHA_SWIZ_B_B (2 << 21)
|
||||
# define R500_ALPHA_SWIZ_B_A (3 << 21)
|
||||
# define R500_ALPHA_SWIZ_B_0 (4 << 21)
|
||||
# define R500_ALPHA_SWIZ_B_HALF (5 << 21)
|
||||
# define R500_ALPHA_SWIZ_B_1 (6 << 21)
|
||||
/* #define R500_ALPHA_SWIZ_B_UNUSED (7 << 21) */
|
||||
# define R500_ALPHA_MOD_B_NOP (0 << 24)
|
||||
# define R500_ALPHA_MOD_B_NEG (1 << 24)
|
||||
# define R500_ALPHA_MOD_B_ABS (2 << 24)
|
||||
# define R500_ALPHA_MOD_B_NAB (3 << 24)
|
||||
# define R500_ALPHA_OMOD_IDENTITY (0 << 26)
|
||||
# define R500_ALPHA_OMOD_MUL_2 (1 << 26)
|
||||
# define R500_ALPHA_OMOD_MUL_4 (2 << 26)
|
||||
# define R500_ALPHA_OMOD_MUL_8 (3 << 26)
|
||||
# define R500_ALPHA_OMOD_DIV_2 (4 << 26)
|
||||
# define R500_ALPHA_OMOD_DIV_4 (5 << 26)
|
||||
# define R500_ALPHA_OMOD_DIV_8 (6 << 26)
|
||||
# define R500_ALPHA_OMOD_DISABLE (7 << 26)
|
||||
# define R500_ALPHA_TARGET(x) (x << 29)
|
||||
# define R500_ALPHA_W_OMASK (1 << 31)
|
||||
#define R500_US_ALU_ALPHA_ADDR_0 0x9800
|
||||
# define R500_ALPHA_ADDR0(x) (x << 0)
|
||||
# define R500_ALPHA_ADDR0_CONST (1 << 8)
|
||||
# define R500_ALPHA_ADDR0_REL (1 << 9)
|
||||
# define R500_ALPHA_ADDR1(x) (x << 10)
|
||||
# define R500_ALPHA_ADDR1_CONST (1 << 18)
|
||||
# define R500_ALPHA_ADDR1_REL (1 << 19)
|
||||
# define R500_ALPHA_ADDR2(x) (x << 20)
|
||||
# define R500_ALPHA_ADDR2_CONST (1 << 28)
|
||||
# define R500_ALPHA_ADDR2_REL (1 << 29)
|
||||
# define R500_ALPHA_SRCP_OP_1_MINUS_2A0 (0 << 30)
|
||||
# define R500_ALPHA_SRCP_OP_A1_MINUS_A0 (1 << 30)
|
||||
# define R500_ALPHA_SRCP_OP_A1_PLUS_A0 (2 << 30)
|
||||
# define R500_ALPHA_SRCP_OP_1_MINUS_A0 (3 << 30)
|
||||
#define R500_US_ALU_RGBA_INST_0 0xb000
|
||||
# define R500_ALU_RGBA_OP_MAD (0 << 0)
|
||||
# define R500_ALU_RGBA_OP_DP3 (1 << 0)
|
||||
# define R500_ALU_RGBA_OP_DP4 (2 << 0)
|
||||
# define R500_ALU_RGBA_OP_D2A (3 << 0)
|
||||
# define R500_ALU_RGBA_OP_MIN (4 << 0)
|
||||
# define R500_ALU_RGBA_OP_MAX (5 << 0)
|
||||
/* #define R500_ALU_RGBA_OP_RESERVED (6 << 0) */
|
||||
# define R500_ALU_RGBA_OP_CND (7 << 0)
|
||||
# define R500_ALU_RGBA_OP_CMP (8 << 0)
|
||||
# define R500_ALU_RGBA_OP_FRC (9 << 0)
|
||||
# define R500_ALU_RGBA_OP_SOP (10 << 0)
|
||||
# define R500_ALU_RGBA_OP_MDH (11 << 0)
|
||||
# define R500_ALU_RGBA_OP_MDV (12 << 0)
|
||||
# define R500_ALU_RGBA_ADDRD(x) (x << 4)
|
||||
# define R500_ALU_RGBA_ADDRD_REL (1 << 11)
|
||||
# define R500_ALU_RGBA_SEL_C_SRC0 (0 << 12)
|
||||
# define R500_ALU_RGBA_SEL_C_SRC1 (1 << 12)
|
||||
# define R500_ALU_RGBA_SEL_C_SRC2 (2 << 12)
|
||||
# define R500_ALU_RGBA_SEL_C_SRCP (3 << 12)
|
||||
# define R500_ALU_RGBA_R_SWIZ_R (0 << 14)
|
||||
# define R500_ALU_RGBA_R_SWIZ_G (1 << 14)
|
||||
# define R500_ALU_RGBA_R_SWIZ_B (2 << 14)
|
||||
# define R500_ALU_RGBA_R_SWIZ_A (3 << 14)
|
||||
# define R500_ALU_RGBA_R_SWIZ_0 (4 << 14)
|
||||
# define R500_ALU_RGBA_R_SWIZ_HALF (5 << 14)
|
||||
# define R500_ALU_RGBA_R_SWIZ_1 (6 << 14)
|
||||
/* #define R500_ALU_RGBA_R_SWIZ_UNUSED (7 << 14) */
|
||||
# define R500_ALU_RGBA_G_SWIZ_R (0 << 17)
|
||||
# define R500_ALU_RGBA_G_SWIZ_G (1 << 17)
|
||||
# define R500_ALU_RGBA_G_SWIZ_B (2 << 17)
|
||||
# define R500_ALU_RGBA_G_SWIZ_A (3 << 17)
|
||||
# define R500_ALU_RGBA_G_SWIZ_0 (4 << 17)
|
||||
# define R500_ALU_RGBA_G_SWIZ_HALF (5 << 17)
|
||||
# define R500_ALU_RGBA_G_SWIZ_1 (6 << 17)
|
||||
/* #define R500_ALU_RGBA_G_SWIZ_UNUSED (7 << 17) */
|
||||
# define R500_ALU_RGBA_B_SWIZ_R (0 << 20)
|
||||
# define R500_ALU_RGBA_B_SWIZ_G (1 << 20)
|
||||
# define R500_ALU_RGBA_B_SWIZ_B (2 << 20)
|
||||
# define R500_ALU_RGBA_B_SWIZ_A (3 << 20)
|
||||
# define R500_ALU_RGBA_B_SWIZ_0 (4 << 20)
|
||||
# define R500_ALU_RGBA_B_SWIZ_HALF (5 << 20)
|
||||
# define R500_ALU_RGBA_B_SWIZ_1 (6 << 20)
|
||||
/* #define R500_ALU_RGBA_B_SWIZ_UNUSED (7 << 20) */
|
||||
# define R500_ALU_RGBA_MOD_C_NOP (0 << 23)
|
||||
# define R500_ALU_RGBA_MOD_C_NEG (1 << 23)
|
||||
# define R500_ALU_RGBA_MOD_C_ABS (2 << 23)
|
||||
# define R500_ALU_RGBA_MOD_C_NAB (3 << 23)
|
||||
# define R500_ALU_RGBA_ALPHA_SEL_C_SRC0 (0 << 25)
|
||||
# define R500_ALU_RGBA_ALPHA_SEL_C_SRC1 (1 << 25)
|
||||
# define R500_ALU_RGBA_ALPHA_SEL_C_SRC2 (2 << 25)
|
||||
# define R500_ALU_RGBA_ALPHA_SEL_C_SRCP (3 << 25)
|
||||
# define R500_ALU_RGBA_A_SWIZ_R (0 << 27)
|
||||
# define R500_ALU_RGBA_A_SWIZ_G (1 << 27)
|
||||
# define R500_ALU_RGBA_A_SWIZ_B (2 << 27)
|
||||
# define R500_ALU_RGBA_A_SWIZ_A (3 << 27)
|
||||
# define R500_ALU_RGBA_A_SWIZ_0 (4 << 27)
|
||||
# define R500_ALU_RGBA_A_SWIZ_HALF (5 << 27)
|
||||
# define R500_ALU_RGBA_A_SWIZ_1 (6 << 27)
|
||||
/* #define R500_ALU_RGBA_A_SWIZ_UNUSED (7 << 27) */
|
||||
# define R500_ALU_RGBA_ALPHA_MOD_C_NOP (0 << 30)
|
||||
# define R500_ALU_RGBA_ALPHA_MOD_C_NEG (1 << 30)
|
||||
# define R500_ALU_RGBA_ALPHA_MOD_C_ABS (2 << 30)
|
||||
# define R500_ALU_RGBA_ALPHA_MOD_C_NAB (3 << 30)
|
||||
#define R500_US_ALU_RGB_INST_0 0xa000
|
||||
# define R500_ALU_RGB_SEL_A_SRC0 (0 << 0)
|
||||
# define R500_ALU_RGB_SEL_A_SRC1 (1 << 0)
|
||||
# define R500_ALU_RGB_SEL_A_SRC2 (2 << 0)
|
||||
# define R500_ALU_RGB_SEL_A_SRCP (3 << 0)
|
||||
# define R500_ALU_RGB_R_SWIZ_A_R (0 << 2)
|
||||
# define R500_ALU_RGB_R_SWIZ_A_G (1 << 2)
|
||||
# define R500_ALU_RGB_R_SWIZ_A_B (2 << 2)
|
||||
# define R500_ALU_RGB_R_SWIZ_A_A (3 << 2)
|
||||
# define R500_ALU_RGB_R_SWIZ_A_0 (4 << 2)
|
||||
# define R500_ALU_RGB_R_SWIZ_A_HALF (5 << 2)
|
||||
# define R500_ALU_RGB_R_SWIZ_A_1 (6 << 2)
|
||||
/* #define R500_ALU_RGB_R_SWIZ_A_UNUSED (7 << 2) */
|
||||
# define R500_ALU_RGB_G_SWIZ_A_R (0 << 5)
|
||||
# define R500_ALU_RGB_G_SWIZ_A_G (1 << 5)
|
||||
# define R500_ALU_RGB_G_SWIZ_A_B (2 << 5)
|
||||
# define R500_ALU_RGB_G_SWIZ_A_A (3 << 5)
|
||||
# define R500_ALU_RGB_G_SWIZ_A_0 (4 << 5)
|
||||
# define R500_ALU_RGB_G_SWIZ_A_HALF (5 << 5)
|
||||
# define R500_ALU_RGB_G_SWIZ_A_1 (6 << 5)
|
||||
/* #define R500_ALU_RGB_G_SWIZ_A_UNUSED (7 << 5) */
|
||||
# define R500_ALU_RGB_B_SWIZ_A_R (0 << 8)
|
||||
# define R500_ALU_RGB_B_SWIZ_A_G (1 << 8)
|
||||
# define R500_ALU_RGB_B_SWIZ_A_B (2 << 8)
|
||||
# define R500_ALU_RGB_B_SWIZ_A_A (3 << 8)
|
||||
# define R500_ALU_RGB_B_SWIZ_A_0 (4 << 8)
|
||||
# define R500_ALU_RGB_B_SWIZ_A_HALF (5 << 8)
|
||||
# define R500_ALU_RGB_B_SWIZ_A_1 (6 << 8)
|
||||
/* #define R500_ALU_RGB_B_SWIZ_A_UNUSED (7 << 8) */
|
||||
# define R500_ALU_RGB_MOD_A_NOP (0 << 11)
|
||||
# define R500_ALU_RGB_MOD_A_NEG (1 << 11)
|
||||
# define R500_ALU_RGB_MOD_A_ABS (2 << 11)
|
||||
# define R500_ALU_RGB_MOD_A_NAB (3 << 11)
|
||||
# define R500_ALU_RGB_SEL_B_SRC0 (0 << 13)
|
||||
# define R500_ALU_RGB_SEL_B_SRC1 (1 << 13)
|
||||
# define R500_ALU_RGB_SEL_B_SRC2 (2 << 13)
|
||||
# define R500_ALU_RGB_SEL_B_SRCP (3 << 13)
|
||||
# define R500_ALU_RGB_R_SWIZ_B_R (0 << 15)
|
||||
# define R500_ALU_RGB_R_SWIZ_B_G (1 << 15)
|
||||
# define R500_ALU_RGB_R_SWIZ_B_B (2 << 15)
|
||||
# define R500_ALU_RGB_R_SWIZ_B_A (3 << 15)
|
||||
# define R500_ALU_RGB_R_SWIZ_B_0 (4 << 15)
|
||||
# define R500_ALU_RGB_R_SWIZ_B_HALF (5 << 15)
|
||||
# define R500_ALU_RGB_R_SWIZ_B_1 (6 << 15)
|
||||
/* #define R500_ALU_RGB_R_SWIZ_B_UNUSED (7 << 15) */
|
||||
# define R500_ALU_RGB_G_SWIZ_B_R (0 << 18)
|
||||
# define R500_ALU_RGB_G_SWIZ_B_G (1 << 18)
|
||||
# define R500_ALU_RGB_G_SWIZ_B_B (2 << 18)
|
||||
# define R500_ALU_RGB_G_SWIZ_B_A (3 << 18)
|
||||
# define R500_ALU_RGB_G_SWIZ_B_0 (4 << 18)
|
||||
# define R500_ALU_RGB_G_SWIZ_B_HALF (5 << 18)
|
||||
# define R500_ALU_RGB_G_SWIZ_B_1 (6 << 18)
|
||||
/* #define R500_ALU_RGB_G_SWIZ_B_UNUSED (7 << 18) */
|
||||
# define R500_ALU_RGB_B_SWIZ_B_R (0 << 21)
|
||||
# define R500_ALU_RGB_B_SWIZ_B_G (1 << 21)
|
||||
# define R500_ALU_RGB_B_SWIZ_B_B (2 << 21)
|
||||
# define R500_ALU_RGB_B_SWIZ_B_A (3 << 21)
|
||||
# define R500_ALU_RGB_B_SWIZ_B_0 (4 << 21)
|
||||
# define R500_ALU_RGB_B_SWIZ_B_HALF (5 << 21)
|
||||
# define R500_ALU_RGB_B_SWIZ_B_1 (6 << 21)
|
||||
/* #define R500_ALU_RGB_B_SWIZ_B_UNUSED (7 << 21) */
|
||||
# define R500_ALU_RGB_MOD_B_NOP (0 << 24)
|
||||
# define R500_ALU_RGB_MOD_B_NEG (1 << 24)
|
||||
# define R500_ALU_RGB_MOD_B_ABS (2 << 24)
|
||||
# define R500_ALU_RGB_MOD_B_NAB (3 << 24)
|
||||
# define R500_ALU_RGB_OMOD_IDENTITY (0 << 26)
|
||||
# define R500_ALU_RGB_OMOD_MUL_2 (1 << 26)
|
||||
# define R500_ALU_RGB_OMOD_MUL_4 (2 << 26)
|
||||
# define R500_ALU_RGB_OMOD_MUL_8 (3 << 26)
|
||||
# define R500_ALU_RGB_OMOD_DIV_2 (4 << 26)
|
||||
# define R500_ALU_RGB_OMOD_DIV_4 (5 << 26)
|
||||
# define R500_ALU_RGB_OMOD_DIV_8 (6 << 26)
|
||||
# define R500_ALU_RGB_OMOD_DISABLE (7 << 26)
|
||||
# define R500_ALU_RGB_TARGET(x) (x << 29)
|
||||
# define R500_ALU_RGB_WMASK (1 << 31)
|
||||
#define R500_US_ALU_RGB_ADDR_0 0x9000
|
||||
# define R500_RGB_ADDR0(x) (x << 0)
|
||||
# define R500_RGB_ADDR0_CONST (1 << 8)
|
||||
# define R500_RGB_ADDR0_REL (1 << 9)
|
||||
# define R500_RGB_ADDR1(x) (x << 10)
|
||||
# define R500_RGB_ADDR1_CONST (1 << 18)
|
||||
# define R500_RGB_ADDR1_REL (1 << 19)
|
||||
# define R500_RGB_ADDR2(x) (x << 20)
|
||||
# define R500_RGB_ADDR2_CONST (1 << 28)
|
||||
# define R500_RGB_ADDR2_REL (1 << 29)
|
||||
# define R500_RGB_SRCP_OP_1_MINUS_2RGB0 (0 << 30)
|
||||
# define R500_RGB_SRCP_OP_RGB1_MINUS_RGB0 (1 << 30)
|
||||
# define R500_RGB_SRCP_OP_RGB1_PLUS_RGB0 (2 << 30)
|
||||
# define R500_RGB_SRCP_OP_1_MINUS_RGB0 (3 << 30)
|
||||
#define R500_US_CMN_INST_0 0xb800
|
||||
# define R500_INST_TYPE_ALU (0 << 0)
|
||||
# define R500_INST_TYPE_OUT (1 << 0)
|
||||
# define R500_INST_TYPE_FC (2 << 0)
|
||||
# define R500_INST_TYPE_TEX (3 << 0)
|
||||
# define R500_INST_TEX_SEM_WAIT (1 << 2)
|
||||
# define R500_INST_RGB_PRED_SEL_NONE (0 << 3)
|
||||
# define R500_INST_RGB_PRED_SEL_RGBA (1 << 3)
|
||||
# define R500_INST_RGB_PRED_SEL_RRRR (2 << 3)
|
||||
# define R500_INST_RGB_PRED_SEL_GGGG (3 << 3)
|
||||
# define R500_INST_RGB_PRED_SEL_BBBB (4 << 3)
|
||||
# define R500_INST_RGB_PRED_SEL_AAAA (5 << 3)
|
||||
# define R500_INST_RGB_PRED_INV (1 << 6)
|
||||
# define R500_INST_WRITE_INACTIVE (1 << 7)
|
||||
# define R500_INST_LAST (1 << 8)
|
||||
# define R500_INST_NOP (1 << 9)
|
||||
# define R500_INST_ALU_WAIT (1 << 10)
|
||||
# define R500_INST_RGB_WMASK_R (1 << 11)
|
||||
# define R500_INST_RGB_WMASK_G (1 << 12)
|
||||
# define R500_INST_RGB_WMASK_B (1 << 13)
|
||||
# define R500_INST_ALPHA_WMASK (1 << 14)
|
||||
# define R500_INST_RGB_OMASK_R (1 << 15)
|
||||
# define R500_INST_RGB_OMASK_G (1 << 16)
|
||||
# define R500_INST_RGB_OMASK_B (1 << 17)
|
||||
# define R500_INST_ALPHA_OMASK (1 << 18)
|
||||
# define R500_INST_RGB_CLAMP (1 << 19)
|
||||
# define R500_INST_ALPHA_CLAMP (1 << 20)
|
||||
# define R500_INST_ALU_RESULT_SEL (1 << 21)
|
||||
# define R500_INST_ALPHA_PRED_INV (1 << 22)
|
||||
# define R500_INST_ALU_RESULT_OP_EQ (0 << 23)
|
||||
# define R500_INST_ALU_RESULT_OP_LT (1 << 23)
|
||||
# define R500_INST_ALU_RESULT_OP_GE (2 << 23)
|
||||
# define R500_INST_ALU_RESULT_OP_NE (3 << 23)
|
||||
# define R500_INST_ALPHA_PRED_SEL_NONE (0 << 25)
|
||||
# define R500_INST_ALPHA_PRED_SEL_RGBA (1 << 25)
|
||||
# define R500_INST_ALPHA_PRED_SEL_RRRR (2 << 25)
|
||||
# define R500_INST_ALPHA_PRED_SEL_GGGG (3 << 25)
|
||||
# define R500_INST_ALPHA_PRED_SEL_BBBB (4 << 25)
|
||||
# define R500_INST_ALPHA_PRED_SEL_AAAA (5 << 25)
|
||||
/* XXX next four are kind of guessed */
|
||||
# define R500_INST_STAT_WE_R (1 << 28)
|
||||
# define R500_INST_STAT_WE_G (1 << 29)
|
||||
# define R500_INST_STAT_WE_B (1 << 30)
|
||||
# define R500_INST_STAT_WE_A (1 << 31)
|
||||
|
||||
/* note that these are 8 bit lengths, despite the offsets, at least for R500 */
|
||||
#define R500_US_CODE_ADDR 0x4630
|
||||
# define R500_US_CODE_START_ADDR(x) (x << 0)
|
||||
# define R500_US_CODE_END_ADDR(x) (x << 16)
|
||||
#define R500_US_CODE_OFFSET 0x4638
|
||||
# define R500_US_CODE_OFFSET_ADDR(x) (x << 0)
|
||||
#define R500_US_CODE_RANGE 0x4634
|
||||
# define R500_US_CODE_RANGE_ADDR(x) (x << 0)
|
||||
# define R500_US_CODE_RANGE_SIZE(x) (x << 16)
|
||||
#define R500_US_CONFIG 0x4600
|
||||
# define R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO (1 << 1)
|
||||
#define R500_US_FC_ADDR_0 0xa000
|
||||
# define R500_FC_BOOL_ADDR(x) (x << 0)
|
||||
# define R500_FC_INT_ADDR(x) (x << 8)
|
||||
# define R500_FC_JUMP_ADDR(x) (x << 16)
|
||||
# define R500_FC_JUMP_GLOBAL (1 << 31)
|
||||
#define R500_US_FC_BOOL_CONST 0x4620
|
||||
# define R500_FC_KBOOL(x) (x)
|
||||
#define R500_US_FC_CTRL 0x4624
|
||||
# define R500_FC_TEST_EN (1 << 30)
|
||||
# define R500_FC_FULL_FC_EN (1 << 31)
|
||||
#define R500_US_FC_INST_0 0x9800
|
||||
# define R500_FC_OP_JUMP (0 << 0)
|
||||
# define R500_FC_OP_LOOP (1 << 0)
|
||||
# define R500_FC_OP_ENDLOOP (2 << 0)
|
||||
# define R500_FC_OP_REP (3 << 0)
|
||||
# define R500_FC_OP_ENDREP (4 << 0)
|
||||
# define R500_FC_OP_BREAKLOOP (5 << 0)
|
||||
# define R500_FC_OP_BREAKREP (6 << 0)
|
||||
# define R500_FC_OP_CONTINUE (7 << 0)
|
||||
# define R500_FC_B_ELSE (1 << 4)
|
||||
# define R500_FC_JUMP_ANY (1 << 5)
|
||||
# define R500_FC_A_OP_NONE (0 << 6)
|
||||
# define R500_FC_A_OP_POP (1 << 6)
|
||||
# define R500_FC_A_OP_PUSH (2 << 6)
|
||||
# define R500_FC_JUMP_FUNC(x) (x << 8)
|
||||
# define R500_FC_B_POP_CNT(x) (x << 16)
|
||||
# define R500_FC_B_OP0_NONE (0 << 24)
|
||||
# define R500_FC_B_OP0_DECR (1 << 24)
|
||||
# define R500_FC_B_OP0_INCR (2 << 24)
|
||||
# define R500_FC_B_OP1_DECR (0 << 26)
|
||||
# define R500_FC_B_OP1_NONE (1 << 26)
|
||||
# define R500_FC_B_OP1_INCR (2 << 26)
|
||||
# define R500_FC_IGNORE_UNCOVERED (1 << 28)
|
||||
#define R500_US_FC_INT_CONST_0 0x4c00
|
||||
# define R500_FC_INT_CONST_KR(x) (x << 0)
|
||||
# define R500_FC_INT_CONST_KG(x) (x << 8)
|
||||
# define R500_FC_INT_CONST_KB(x) (x << 16)
|
||||
/* _0 through _15 */
|
||||
#define R500_US_FORMAT0_0 0x4640
|
||||
# define R500_FORMAT_TXWIDTH(x) (x << 0)
|
||||
# define R500_FORMAT_TXHEIGHT(x) (x << 11)
|
||||
# define R500_FORMAT_TXDEPTH(x) (x << 22)
|
||||
/* _0 through _3 */
|
||||
#define R500_US_OUT_FMT_0 0x46a4
|
||||
# define R500_OUT_FMT_C4_8 (0 << 0)
|
||||
# define R500_OUT_FMT_C4_10 (1 << 0)
|
||||
# define R500_OUT_FMT_C4_10_GAMMA (2 << 0)
|
||||
# define R500_OUT_FMT_C_16 (3 << 0)
|
||||
# define R500_OUT_FMT_C2_16 (4 << 0)
|
||||
# define R500_OUT_FMT_C4_16 (5 << 0)
|
||||
# define R500_OUT_FMT_C_16_MPEG (6 << 0)
|
||||
# define R500_OUT_FMT_C2_16_MPEG (7 << 0)
|
||||
# define R500_OUT_FMT_C2_4 (8 << 0)
|
||||
# define R500_OUT_FMT_C_3_3_2 (9 << 0)
|
||||
# define R500_OUT_FMT_C_6_5_6 (10 << 0)
|
||||
# define R500_OUT_FMT_C_11_11_10 (11 << 0)
|
||||
# define R500_OUT_FMT_C_10_11_11 (12 << 0)
|
||||
# define R500_OUT_FMT_C_2_10_10_10 (13 << 0)
|
||||
/* #define R500_OUT_FMT_RESERVED (14 << 0) */
|
||||
# define R500_OUT_FMT_UNUSED (15 << 0)
|
||||
# define R500_OUT_FMT_C_16_FP (16 << 0)
|
||||
# define R500_OUT_FMT_C2_16_FP (17 << 0)
|
||||
# define R500_OUT_FMT_C4_16_FP (18 << 0)
|
||||
# define R500_OUT_FMT_C_32_FP (19 << 0)
|
||||
# define R500_OUT_FMT_C2_32_FP (20 << 0)
|
||||
# define R500_OUT_FMT_C4_32_FP (21 << 0)
|
||||
# define R500_C0_SEL_A (0 << 8)
|
||||
# define R500_C0_SEL_R (1 << 8)
|
||||
# define R500_C0_SEL_G (2 << 8)
|
||||
# define R500_C0_SEL_B (3 << 8)
|
||||
# define R500_C1_SEL_A (0 << 10)
|
||||
# define R500_C1_SEL_R (1 << 10)
|
||||
# define R500_C1_SEL_G (2 << 10)
|
||||
# define R500_C1_SEL_B (3 << 10)
|
||||
# define R500_C2_SEL_A (0 << 12)
|
||||
# define R500_C2_SEL_R (1 << 12)
|
||||
# define R500_C2_SEL_G (2 << 12)
|
||||
# define R500_C2_SEL_B (3 << 12)
|
||||
# define R500_C3_SEL_A (0 << 14)
|
||||
# define R500_C3_SEL_R (1 << 14)
|
||||
# define R500_C3_SEL_G (2 << 14)
|
||||
# define R500_C3_SEL_B (3 << 14)
|
||||
# define R500_OUT_SIGN(x) (x << 16)
|
||||
# define R500_ROUND_ADJ (1 << 20)
|
||||
#define R500_US_PIXSIZE 0x4604
|
||||
# define R500_PIX_SIZE(x) (x)
|
||||
#define R500_US_TEX_ADDR_0 0x9800
|
||||
# define R500_TEX_SRC_ADDR(x) (x << 0)
|
||||
# define R500_TEX_SRC_ADDR_REL (1 << 7)
|
||||
# define R500_TEX_SRC_S_SWIZ_R (0 << 8)
|
||||
# define R500_TEX_SRC_S_SWIZ_G (1 << 8)
|
||||
# define R500_TEX_SRC_S_SWIZ_B (2 << 8)
|
||||
# define R500_TEX_SRC_S_SWIZ_A (3 << 8)
|
||||
# define R500_TEX_SRC_T_SWIZ_R (0 << 10)
|
||||
# define R500_TEX_SRC_T_SWIZ_G (1 << 10)
|
||||
# define R500_TEX_SRC_T_SWIZ_B (2 << 10)
|
||||
# define R500_TEX_SRC_T_SWIZ_A (3 << 10)
|
||||
# define R500_TEX_SRC_R_SWIZ_R (0 << 12)
|
||||
# define R500_TEX_SRC_R_SWIZ_G (1 << 12)
|
||||
# define R500_TEX_SRC_R_SWIZ_B (2 << 12)
|
||||
# define R500_TEX_SRC_R_SWIZ_A (3 << 12)
|
||||
# define R500_TEX_SRC_Q_SWIZ_R (0 << 14)
|
||||
# define R500_TEX_SRC_Q_SWIZ_G (1 << 14)
|
||||
# define R500_TEX_SRC_Q_SWIZ_B (2 << 14)
|
||||
# define R500_TEX_SRC_Q_SWIZ_A (3 << 14)
|
||||
# define R500_TEX_DST_ADDR(x) (x << 16)
|
||||
# define R500_TEX_DST_ADDR_REL (1 << 23)
|
||||
# define R500_TEX_DST_R_SWIZ_R (0 << 24)
|
||||
# define R500_TEX_DST_R_SWIZ_G (1 << 24)
|
||||
# define R500_TEX_DST_R_SWIZ_B (2 << 24)
|
||||
# define R500_TEX_DST_R_SWIZ_A (3 << 24)
|
||||
# define R500_TEX_DST_G_SWIZ_R (0 << 26)
|
||||
# define R500_TEX_DST_G_SWIZ_G (1 << 26)
|
||||
# define R500_TEX_DST_G_SWIZ_B (2 << 26)
|
||||
# define R500_TEX_DST_G_SWIZ_A (3 << 26)
|
||||
# define R500_TEX_DST_B_SWIZ_R (0 << 28)
|
||||
# define R500_TEX_DST_B_SWIZ_G (1 << 28)
|
||||
# define R500_TEX_DST_B_SWIZ_B (2 << 28)
|
||||
# define R500_TEX_DST_B_SWIZ_A (3 << 28)
|
||||
# define R500_TEX_DST_A_SWIZ_R (0 << 30)
|
||||
# define R500_TEX_DST_A_SWIZ_G (1 << 30)
|
||||
# define R500_TEX_DST_A_SWIZ_B (2 << 30)
|
||||
# define R500_TEX_DST_A_SWIZ_A (3 << 30)
|
||||
#define R500_US_TEX_ADDR_DXDY_0 0xa000
|
||||
# define R500_DX_ADDR(x) (x << 0)
|
||||
# define R500_DX_ADDR_REL (1 << 7)
|
||||
# define R500_DX_S_SWIZ_R (0 << 8)
|
||||
# define R500_DX_S_SWIZ_G (1 << 8)
|
||||
# define R500_DX_S_SWIZ_B (2 << 8)
|
||||
# define R500_DX_S_SWIZ_A (3 << 8)
|
||||
# define R500_DX_T_SWIZ_R (0 << 10)
|
||||
# define R500_DX_T_SWIZ_G (1 << 10)
|
||||
# define R500_DX_T_SWIZ_B (2 << 10)
|
||||
# define R500_DX_T_SWIZ_A (3 << 10)
|
||||
# define R500_DX_R_SWIZ_R (0 << 12)
|
||||
# define R500_DX_R_SWIZ_G (1 << 12)
|
||||
# define R500_DX_R_SWIZ_B (2 << 12)
|
||||
# define R500_DX_R_SWIZ_A (3 << 12)
|
||||
# define R500_DX_Q_SWIZ_R (0 << 14)
|
||||
# define R500_DX_Q_SWIZ_G (1 << 14)
|
||||
# define R500_DX_Q_SWIZ_B (2 << 14)
|
||||
# define R500_DX_Q_SWIZ_A (3 << 14)
|
||||
# define R500_DY_ADDR(x) (x << 16)
|
||||
# define R500_DY_ADDR_REL (1 << 17)
|
||||
# define R500_DY_S_SWIZ_R (0 << 24)
|
||||
# define R500_DY_S_SWIZ_G (1 << 24)
|
||||
# define R500_DY_S_SWIZ_B (2 << 24)
|
||||
# define R500_DY_S_SWIZ_A (3 << 24)
|
||||
# define R500_DY_T_SWIZ_R (0 << 26)
|
||||
# define R500_DY_T_SWIZ_G (1 << 26)
|
||||
# define R500_DY_T_SWIZ_B (2 << 26)
|
||||
# define R500_DY_T_SWIZ_A (3 << 26)
|
||||
# define R500_DY_R_SWIZ_R (0 << 28)
|
||||
# define R500_DY_R_SWIZ_G (1 << 28)
|
||||
# define R500_DY_R_SWIZ_B (2 << 28)
|
||||
# define R500_DY_R_SWIZ_A (3 << 28)
|
||||
# define R500_DY_Q_SWIZ_R (0 << 30)
|
||||
# define R500_DY_Q_SWIZ_G (1 << 30)
|
||||
# define R500_DY_Q_SWIZ_B (2 << 30)
|
||||
# define R500_DY_Q_SWIZ_A (3 << 30)
|
||||
#define R500_US_TEX_INST_0 0x9000
|
||||
# define R500_TEX_ID(x) (x << 16)
|
||||
# define R500_TEX_INST_NOP (0 << 22)
|
||||
# define R500_TEX_INST_LD (1 << 22)
|
||||
# define R500_TEX_INST_TEXKILL (2 << 22)
|
||||
# define R500_TEX_INST_PROJ (3 << 22)
|
||||
# define R500_TEX_INST_LODBIAS (4 << 22)
|
||||
# define R500_TEX_INST_LOD (5 << 22)
|
||||
# define R500_TEX_INST_DXDY (6 << 22)
|
||||
# define R500_TEX_SEM_ACQUIRE (1 << 25)
|
||||
# define R500_TEX_IGNORE_UNCOVERED (1 << 26)
|
||||
# define R500_TEX_UNSCALED (1 << 27)
|
||||
#define R500_US_W_FMT 0x46b4
|
||||
# define R500_W_FMT_W0 (0 << 0)
|
||||
# define R500_W_FMT_W24 (1 << 0)
|
||||
# define R500_W_FMT_W24FP (2 << 0)
|
||||
# define R500_W_SRC_US (0 << 2)
|
||||
# define R500_W_SRC_RAS (1 << 2)
|
||||
|
||||
|
||||
/* Draw a primitive from vertex data in arrays loaded via 3D_LOAD_VBPNTR.
|
||||
* Two parameter dwords:
|
||||
* 0. VAP_VTX_FMT: The first parameter is not written to hardware
|
||||
|
|
|
|||
|
|
@ -1603,6 +1603,128 @@ static void r300SetupRSUnit(GLcontext * ctx)
|
|||
WARN_ONCE("Don't know how to satisfy InputsRead=0x%08x\n", InputsRead);
|
||||
}
|
||||
|
||||
static void r500SetupRSUnit(GLcontext * ctx)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
/* I'm still unsure if these are needed */
|
||||
GLuint interp_magic[8] = {
|
||||
0x00,
|
||||
R300_RS_COL_PTR(1),
|
||||
R300_RS_COL_PTR(2),
|
||||
R300_RS_COL_PTR(3),
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00
|
||||
};
|
||||
union r300_outputs_written OutputsWritten;
|
||||
GLuint InputsRead;
|
||||
int fp_reg, high_rr;
|
||||
int in_texcoords, col_interp_nr;
|
||||
int i;
|
||||
|
||||
if (hw_tcl_on)
|
||||
OutputsWritten.vp_outputs = CURRENT_VERTEX_SHADER(ctx)->key.OutputsWritten;
|
||||
else
|
||||
RENDERINPUTS_COPY(OutputsWritten.index_bitset, r300->state.render_inputs_bitset);
|
||||
|
||||
if (ctx->FragmentProgram._Current)
|
||||
InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
|
||||
else {
|
||||
fprintf(stderr, "No ctx->FragmentProgram._Current!!\n");
|
||||
return; /* This should only ever happen once.. */
|
||||
}
|
||||
|
||||
R300_STATECHANGE(r300, ri);
|
||||
R300_STATECHANGE(r300, rc);
|
||||
R300_STATECHANGE(r300, rr);
|
||||
|
||||
fp_reg = in_texcoords = col_interp_nr = high_rr = 0;
|
||||
|
||||
r300->hw.rr.cmd[R300_RR_ROUTE_1] = 0;
|
||||
|
||||
if (InputsRead & FRAG_BIT_WPOS) {
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
|
||||
if (!(InputsRead & (FRAG_BIT_TEX0 << i)))
|
||||
break;
|
||||
|
||||
if (i == ctx->Const.MaxTextureUnits) {
|
||||
fprintf(stderr, "\tno free texcoord found...\n");
|
||||
_mesa_exit(-1);
|
||||
}
|
||||
|
||||
InputsRead |= (FRAG_BIT_TEX0 << i);
|
||||
InputsRead &= ~FRAG_BIT_WPOS;
|
||||
}
|
||||
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
r300->hw.ri.cmd[R300_RI_INTERP_0 + i] = 0 | R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3) | (in_texcoords << R300_RS_INTERP_SRC_SHIFT)
|
||||
| interp_magic[i];
|
||||
|
||||
r300->hw.rr.cmd[R300_RR_ROUTE_0 + fp_reg] = 0;
|
||||
if (InputsRead & (FRAG_BIT_TEX0 << i)) {
|
||||
//assert(r300->state.texture.tc_count != 0);
|
||||
r300->hw.rr.cmd[R300_RR_ROUTE_0 + fp_reg] |= R300_RS_ROUTE_ENABLE | i /* source INTERP */
|
||||
| (fp_reg << R300_RS_ROUTE_DEST_SHIFT);
|
||||
high_rr = fp_reg;
|
||||
|
||||
/* Passing invalid data here can lock the GPU. */
|
||||
if (R300_OUTPUTS_WRITTEN_TEST(OutputsWritten, VERT_RESULT_TEX0 + i, _TNL_ATTRIB_TEX(i))) {
|
||||
InputsRead &= ~(FRAG_BIT_TEX0 << i);
|
||||
fp_reg++;
|
||||
} else {
|
||||
WARN_ONCE("fragprog wants coords for tex%d, vp doesn't provide them!\n", i);
|
||||
}
|
||||
}
|
||||
/* Need to count all coords enabled at vof */
|
||||
if (R300_OUTPUTS_WRITTEN_TEST(OutputsWritten, VERT_RESULT_TEX0 + i, _TNL_ATTRIB_TEX(i))) {
|
||||
in_texcoords++;
|
||||
}
|
||||
}
|
||||
|
||||
if (InputsRead & FRAG_BIT_COL0) {
|
||||
if (R300_OUTPUTS_WRITTEN_TEST(OutputsWritten, VERT_RESULT_COL0, _TNL_ATTRIB_COLOR0)) {
|
||||
r300->hw.rr.cmd[R300_RR_ROUTE_0] |= 0 | R300_RS_ROUTE_0_COLOR | (fp_reg++ << R300_RS_ROUTE_0_COLOR_DEST_SHIFT);
|
||||
InputsRead &= ~FRAG_BIT_COL0;
|
||||
col_interp_nr++;
|
||||
} else {
|
||||
WARN_ONCE("fragprog wants col0, vp doesn't provide it\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (InputsRead & FRAG_BIT_COL1) {
|
||||
if (R300_OUTPUTS_WRITTEN_TEST(OutputsWritten, VERT_RESULT_COL1, _TNL_ATTRIB_COLOR1)) {
|
||||
r300->hw.rr.cmd[R300_RR_ROUTE_1] |= R300_RS_ROUTE_1_UNKNOWN11 | R300_RS_ROUTE_1_COLOR1 | (fp_reg++ << R300_RS_ROUTE_1_COLOR1_DEST_SHIFT);
|
||||
InputsRead &= ~FRAG_BIT_COL1;
|
||||
if (high_rr < 1)
|
||||
high_rr = 1;
|
||||
col_interp_nr++;
|
||||
} else {
|
||||
WARN_ONCE("fragprog wants col1, vp doesn't provide it\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Need at least one. This might still lock as the values are undefined... */
|
||||
if (in_texcoords == 0 && col_interp_nr == 0) {
|
||||
r300->hw.rr.cmd[R300_RR_ROUTE_0] |= 0 | R300_RS_ROUTE_0_COLOR | (fp_reg++ << R300_RS_ROUTE_0_COLOR_DEST_SHIFT);
|
||||
col_interp_nr++;
|
||||
}
|
||||
|
||||
r300->hw.rc.cmd[1] = 0 | ((in_texcoords << 2) << R300_IT_COUNT_SHIFT)
|
||||
| (col_interp_nr << R300_IC_COUNT_SHIFT)
|
||||
| R300_HIRES_EN;
|
||||
|
||||
assert(high_rr >= 0);
|
||||
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(R300_RS_ROUTE_0, high_rr + 1);
|
||||
r300->hw.rc.cmd[2] = 0xC0 | high_rr;
|
||||
|
||||
if (InputsRead)
|
||||
WARN_ONCE("Don't know how to satisfy InputsRead=0x%08x\n", InputsRead);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#define bump_vpu_count(ptr, new_count) do{\
|
||||
drm_r300_cmd_header_t* _p=((drm_r300_cmd_header_t*)(ptr));\
|
||||
int _nc=(new_count)/4; \
|
||||
|
|
@ -2163,6 +2285,81 @@ static void r300SetupPixelShader(r300ContextPtr rmesa)
|
|||
}
|
||||
}
|
||||
|
||||
static void r500SetupPixelShader(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx = rmesa->radeon.glCtx;
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *)
|
||||
(char *)ctx->FragmentProgram._Current;
|
||||
int i, k;
|
||||
|
||||
if (!fp) /* should only happenen once, just after context is created */
|
||||
return;
|
||||
|
||||
/* emit the standard zero shader */
|
||||
R300_STATECHANGE(rmesa, r500fp);
|
||||
i = 1;
|
||||
rmesa->hw.r500fp.cmd[i++] = 0x7807;
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_TEX_ID(0) | R500_TEX_INST_LD | R500_TEX_SEM_ACQUIRE | R500_TEX_IGNORE_UNCOVERED;
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_TEX_SRC_ADDR(0) | R500_TEX_SRC_S_SWIZ_R |
|
||||
R500_TEX_SRC_T_SWIZ_G |
|
||||
R500_TEX_DST_ADDR(0) |
|
||||
R500_TEX_DST_R_SWIZ_R |
|
||||
R500_TEX_DST_G_SWIZ_G |
|
||||
R500_TEX_DST_B_SWIZ_B |
|
||||
R500_TEX_DST_A_SWIZ_A;
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_DX_ADDR(0) |
|
||||
R500_DX_S_SWIZ_R |
|
||||
R500_DX_T_SWIZ_R |
|
||||
R500_DX_R_SWIZ_R |
|
||||
R500_DX_Q_SWIZ_R |
|
||||
R500_DY_ADDR(0) |
|
||||
R500_DY_S_SWIZ_R |
|
||||
R500_DY_T_SWIZ_R |
|
||||
R500_DY_R_SWIZ_R |
|
||||
R500_DY_Q_SWIZ_R;
|
||||
rmesa->hw.r500fp.cmd[i++] = 0x0;
|
||||
rmesa->hw.r500fp.cmd[i++] = 0x0;
|
||||
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_INST_TYPE_OUT |
|
||||
R500_INST_TEX_SEM_WAIT |
|
||||
R500_INST_LAST |
|
||||
R500_INST_RGB_OMASK_R |
|
||||
R500_INST_RGB_OMASK_G |
|
||||
R500_INST_RGB_OMASK_B |
|
||||
R500_INST_ALPHA_OMASK;
|
||||
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_RGB_ADDR0(0) |
|
||||
R500_RGB_ADDR1(0) |
|
||||
R500_RGB_ADDR1_CONST |
|
||||
R500_RGB_ADDR2(0) |
|
||||
R500_RGB_ADDR2_CONST |
|
||||
R500_RGB_SRCP_OP_1_MINUS_2RGB0;
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_ALPHA_ADDR0(0) |
|
||||
R500_ALPHA_ADDR1(0) |
|
||||
R500_ALPHA_ADDR1_CONST |
|
||||
R500_ALPHA_ADDR2(0) |
|
||||
R500_ALPHA_ADDR2_CONST |
|
||||
R500_ALPHA_SRCP_OP_1_MINUS_2A0;
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_ALU_RGB_SEL_A_SRC0 |
|
||||
R500_ALU_RGB_R_SWIZ_A_R |
|
||||
R500_ALU_RGB_G_SWIZ_A_G |
|
||||
R500_ALU_RGB_B_SWIZ_A_B |
|
||||
R500_ALU_RGB_SEL_B_SRC0 |
|
||||
R500_ALU_RGB_R_SWIZ_B_1 |
|
||||
R500_ALU_RGB_B_SWIZ_B_1 |
|
||||
R500_ALU_RGB_G_SWIZ_B_1;
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_ALPHA_OP_MAD |
|
||||
R500_ALPHA_SWIZ_A_A |
|
||||
R500_ALPHA_SWIZ_B_1;
|
||||
rmesa->hw.r500fp.cmd[i++] = R500_ALU_RGBA_OP_MAD |
|
||||
R500_ALU_RGBA_R_SWIZ_0 |
|
||||
R500_ALU_RGBA_G_SWIZ_0 |
|
||||
R500_ALU_RGBA_B_SWIZ_0 |
|
||||
R500_ALU_RGBA_A_SWIZ_0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void r300UpdateShaderStates(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx;
|
||||
|
|
@ -2170,12 +2367,19 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)
|
|||
|
||||
r300UpdateTextureState(ctx);
|
||||
|
||||
r300SetupPixelShader(rmesa);
|
||||
if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
|
||||
r500SetupPixelShader(rmesa);
|
||||
else
|
||||
r300SetupPixelShader(rmesa);
|
||||
r300SetupTextures(ctx);
|
||||
|
||||
if ((rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
|
||||
r300SetupVertexProgram(rmesa);
|
||||
r300SetupRSUnit(ctx);
|
||||
|
||||
if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
|
||||
r500SetupRSUnit(ctx);
|
||||
else
|
||||
r300SetupRSUnit(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -168,6 +168,8 @@ enum {
|
|||
CHIP_FAMILY_RV410,
|
||||
CHIP_FAMILY_RS400,
|
||||
CHIP_FAMILY_RS690,
|
||||
CHIP_FAMILY_RV515,
|
||||
CHIP_FAMILY_R520,
|
||||
CHIP_FAMILY_LAST
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue