R6xx/R7xx: r300 -> r600 symbols

This commit is contained in:
Alex Deucher
2009-04-09 10:55:41 -04:00
parent 4138bdb3b1
commit e24e4ae2e8
28 changed files with 3595 additions and 3595 deletions
+247 -247
View File
@@ -55,7 +55,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "r600_state.h"
#include "radeon_reg.h"
#define R300_VAP_PVS_UPLOAD_ADDRESS 0x2200
#define R600_VAP_PVS_UPLOAD_ADDRESS 0x2200
# define RADEON_ONE_REG_WR (1 << 15)
/** # of dwords reserved for additional instructions that may need to be written
@@ -63,9 +63,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#define SPACE_FOR_FLUSHING 4
static unsigned packet0_count(r300ContextPtr r300, uint32_t *pkt)
static unsigned packet0_count(r600ContextPtr r600, uint32_t *pkt)
{
if (r300->radeon.radeonScreen->kernel_mm) {
if (r600->radeon.radeonScreen->kernel_mm) {
return ((((*pkt) >> 16) & 0x3FFF) + 1);
} else {
drm_r300_cmd_header_t *t = (drm_r300_cmd_header_t*)pkt;
@@ -79,12 +79,12 @@ static unsigned packet0_count(r300ContextPtr r300, uint32_t *pkt)
void emit_vpu(GLcontext *ctx, struct radeon_state_atom * atom)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
BATCH_LOCALS(&r300->radeon);
r600ContextPtr r600 = R600_CONTEXT(ctx);
BATCH_LOCALS(&r600->radeon);
drm_r300_cmd_header_t cmd;
uint32_t addr, ndw, i;
if (!r300->radeon.radeonScreen->kernel_mm) {
if (!r600->radeon.radeonScreen->kernel_mm) {
uint32_t dwords;
dwords = (*atom->check) (ctx, atom);
BEGIN_BATCH_NO_AUTOSTATE(dwords);
@@ -98,38 +98,38 @@ void emit_vpu(GLcontext *ctx, struct radeon_state_atom * atom)
ndw = cmd.vpu.count * 4;
if (ndw) {
if (r300->vap_flush_needed) {
if (r600->vap_flush_needed) {
BEGIN_BATCH_NO_AUTOSTATE(15 + ndw);
/* flush processing vertices */
OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0);
OUT_BATCH_REGVAL(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
OUT_BATCH_REGVAL(R600_SC_SCREENDOOR, 0);
OUT_BATCH_REGVAL(R600_RB3D_DSTCACHE_CTLSTAT, R600_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
OUT_BATCH_REGVAL(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0xffffff);
OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0);
r300->vap_flush_needed = GL_FALSE;
OUT_BATCH_REGVAL(R600_SC_SCREENDOOR, 0xffffff);
OUT_BATCH_REGVAL(R600_VAP_PVS_STATE_FLUSH_REG, 0);
r600->vap_flush_needed = GL_FALSE;
} else {
BEGIN_BATCH_NO_AUTOSTATE(5 + ndw);
}
OUT_BATCH_REGVAL(R300_VAP_PVS_UPLOAD_ADDRESS, addr);
OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA, ndw-1) | RADEON_ONE_REG_WR);
OUT_BATCH_REGVAL(R600_VAP_PVS_UPLOAD_ADDRESS, addr);
OUT_BATCH(CP_PACKET0(R600_VAP_PVS_UPLOAD_DATA, ndw-1) | RADEON_ONE_REG_WR);
for (i = 0; i < ndw; i++) {
OUT_BATCH(atom->cmd[i+1]);
}
OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0);
OUT_BATCH_REGVAL(R600_VAP_PVS_STATE_FLUSH_REG, 0);
END_BATCH();
}
}
void emit_r500fp(GLcontext *ctx, struct radeon_state_atom * atom)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
BATCH_LOCALS(&r300->radeon);
r600ContextPtr r600 = R600_CONTEXT(ctx);
BATCH_LOCALS(&r600->radeon);
drm_r300_cmd_header_t cmd;
uint32_t addr, ndw, i, sz;
int type, clamp, stride;
if (!r300->radeon.radeonScreen->kernel_mm) {
if (!r600->radeon.radeonScreen->kernel_mm) {
uint32_t dwords;
dwords = (*atom->check) (ctx, atom);
BEGIN_BATCH_NO_AUTOSTATE(dwords);
@@ -165,42 +165,42 @@ void emit_r500fp(GLcontext *ctx, struct radeon_state_atom * atom)
static void emit_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
BATCH_LOCALS(&r300->radeon);
int numtmus = packet0_count(r300, r300->hw.tex.offset.cmd);
r600ContextPtr r600 = R600_CONTEXT(ctx);
BATCH_LOCALS(&r600->radeon);
int numtmus = packet0_count(r600, r600->hw.tex.offset.cmd);
int notexture = 0;
if (numtmus) {
int i;
for(i = 0; i < numtmus; ++i) {
radeonTexObj *t = r300->hw.textures[i];
radeonTexObj *t = r600->hw.textures[i];
if (!t)
notexture = 1;
}
if (r300->radeon.radeonScreen->kernel_mm && notexture) {
if (r600->radeon.radeonScreen->kernel_mm && notexture) {
return;
}
BEGIN_BATCH_NO_AUTOSTATE(4 * numtmus);
for(i = 0; i < numtmus; ++i) {
radeonTexObj *t = r300->hw.textures[i];
OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
radeonTexObj *t = r600->hw.textures[i];
OUT_BATCH_REGSEQ(R600_TX_OFFSET_0 + (i * 4), 1);
if (t && !t->image_override) {
OUT_BATCH_RELOC(t->tile_bits, t->mt->bo, 0,
RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
} else if (!t) {
OUT_BATCH(r300->radeon.radeonScreen->texOffset[0]);
OUT_BATCH(r600->radeon.radeonScreen->texOffset[0]);
} else { /* override cases */
if (t->bo) {
OUT_BATCH_RELOC(t->tile_bits, t->bo, 0,
RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
} else if (!r300->radeon.radeonScreen->kernel_mm) {
} else if (!r600->radeon.radeonScreen->kernel_mm) {
OUT_BATCH(t->override_offset);
}
else
OUT_BATCH(r300->radeon.radeonScreen->texOffset[0]);
OUT_BATCH(r600->radeon.radeonScreen->texOffset[0]);
}
}
END_BATCH();
@@ -209,13 +209,13 @@ static void emit_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
BATCH_LOCALS(&r300->radeon);
r600ContextPtr r600 = R600_CONTEXT(ctx);
BATCH_LOCALS(&r600->radeon);
struct radeon_renderbuffer *rrb;
uint32_t cbpitch;
uint32_t offset = r300->radeon.state.color.draw_offset;
uint32_t offset = r600->radeon.state.color.draw_offset;
rrb = radeon_get_colorbuffer(&r300->radeon);
rrb = radeon_get_colorbuffer(&r600->radeon);
if (!rrb || !rrb->bo) {
fprintf(stderr, "no rrb\n");
return;
@@ -223,34 +223,34 @@ static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
cbpitch = (rrb->pitch / rrb->cpp);
if (rrb->cpp == 4)
cbpitch |= R300_COLOR_FORMAT_ARGB8888;
cbpitch |= R600_COLOR_FORMAT_ARGB8888;
else
cbpitch |= R300_COLOR_FORMAT_RGB565;
cbpitch |= R600_COLOR_FORMAT_RGB565;
if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
cbpitch |= R300_COLOR_TILE_ENABLE;
cbpitch |= R600_COLOR_TILE_ENABLE;
BEGIN_BATCH_NO_AUTOSTATE(8);
OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0, 1);
OUT_BATCH_REGSEQ(R600_RB3D_COLOROFFSET0, 1);
OUT_BATCH_RELOC(offset, rrb->bo, offset, 0, RADEON_GEM_DOMAIN_VRAM, 0);
OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0, 1);
OUT_BATCH_REGSEQ(R600_RB3D_COLORPITCH0, 1);
OUT_BATCH_RELOC(cbpitch, rrb->bo, cbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
END_BATCH();
if (r300->radeon.radeonScreen->driScreen->dri2.enabled) {
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
if (r600->radeon.radeonScreen->driScreen->dri2.enabled) {
if (r600->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
BEGIN_BATCH_NO_AUTOSTATE(3);
OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL, 2);
OUT_BATCH_REGSEQ(R600_SC_SCISSORS_TL, 2);
OUT_BATCH(0);
OUT_BATCH((rrb->width << R300_SCISSORS_X_SHIFT) |
(rrb->height << R300_SCISSORS_Y_SHIFT));
OUT_BATCH((rrb->width << R600_SCISSORS_X_SHIFT) |
(rrb->height << R600_SCISSORS_Y_SHIFT));
END_BATCH();
} else {
BEGIN_BATCH_NO_AUTOSTATE(3);
OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL, 2);
OUT_BATCH((R300_SCISSORS_OFFSET << R300_SCISSORS_X_SHIFT) |
(R300_SCISSORS_OFFSET << R300_SCISSORS_Y_SHIFT));
OUT_BATCH(((rrb->width + R300_SCISSORS_OFFSET) << R300_SCISSORS_X_SHIFT) |
((rrb->height + R300_SCISSORS_OFFSET) << R300_SCISSORS_Y_SHIFT));
OUT_BATCH_REGSEQ(R600_SC_SCISSORS_TL, 2);
OUT_BATCH((R600_SCISSORS_OFFSET << R600_SCISSORS_X_SHIFT) |
(R600_SCISSORS_OFFSET << R600_SCISSORS_Y_SHIFT));
OUT_BATCH(((rrb->width + R600_SCISSORS_OFFSET) << R600_SCISSORS_X_SHIFT) |
((rrb->height + R600_SCISSORS_OFFSET) << R600_SCISSORS_Y_SHIFT));
END_BATCH();
}
}
@@ -258,45 +258,45 @@ static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
static void emit_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
BATCH_LOCALS(&r300->radeon);
r600ContextPtr r600 = R600_CONTEXT(ctx);
BATCH_LOCALS(&r600->radeon);
struct radeon_renderbuffer *rrb;
uint32_t zbpitch;
rrb = radeon_get_depthbuffer(&r300->radeon);
rrb = radeon_get_depthbuffer(&r600->radeon);
if (!rrb)
return;
zbpitch = (rrb->pitch / rrb->cpp);
if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE) {
zbpitch |= R300_DEPTHMACROTILE_ENABLE;
zbpitch |= R600_DEPTHMACROTILE_ENABLE;
}
if (rrb->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
zbpitch |= R300_DEPTHMICROTILE_TILED;
zbpitch |= R600_DEPTHMICROTILE_TILED;
}
BEGIN_BATCH_NO_AUTOSTATE(6);
OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
OUT_BATCH_REGSEQ(R600_ZB_DEPTHOFFSET, 1);
OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH, zbpitch);
OUT_BATCH_REGVAL(R600_ZB_DEPTHPITCH, zbpitch);
END_BATCH();
}
static void emit_zstencil_format(GLcontext *ctx, struct radeon_state_atom * atom)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
BATCH_LOCALS(&r300->radeon);
r600ContextPtr r600 = R600_CONTEXT(ctx);
BATCH_LOCALS(&r600->radeon);
struct radeon_renderbuffer *rrb;
uint32_t format = 0;
rrb = radeon_get_depthbuffer(&r300->radeon);
rrb = radeon_get_depthbuffer(&r600->radeon);
if (!rrb)
format = 0;
else {
if (rrb->cpp == 2)
format = R300_DEPTHFORMAT_16BIT_INT_Z;
format = R600_DEPTHFORMAT_16BIT_INT_Z;
else if (rrb->cpp == 4)
format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
format = R600_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
}
OUT_BATCH(atom->cmd[0]);
@@ -315,12 +315,12 @@ static int check_always(GLcontext *ctx, struct radeon_state_atom *atom)
static int check_variable(GLcontext *ctx, struct radeon_state_atom *atom)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
r600ContextPtr r600 = R600_CONTEXT(ctx);
int cnt;
if (atom->cmd[0] == CP_PACKET2) {
return 0;
}
cnt = packet0_count(r300, atom->cmd);
cnt = packet0_count(r600, atom->cmd);
return cnt ? cnt + 1 : 0;
}
@@ -350,320 +350,320 @@ int check_r500fp_const(GLcontext *ctx, struct radeon_state_atom *atom)
#define ALLOC_STATE( ATOM, CHK, SZ, IDX ) \
do { \
r300->hw.ATOM.cmd_size = (SZ); \
r300->hw.ATOM.cmd = (uint32_t*)CALLOC((SZ) * sizeof(uint32_t)); \
r300->hw.ATOM.name = #ATOM; \
r300->hw.ATOM.idx = (IDX); \
r300->hw.ATOM.check = check_##CHK; \
r300->hw.ATOM.dirty = GL_FALSE; \
r300->radeon.hw.max_state_size += (SZ); \
insert_at_tail(&r300->radeon.hw.atomlist, &r300->hw.ATOM); \
r600->hw.ATOM.cmd_size = (SZ); \
r600->hw.ATOM.cmd = (uint32_t*)CALLOC((SZ) * sizeof(uint32_t)); \
r600->hw.ATOM.name = #ATOM; \
r600->hw.ATOM.idx = (IDX); \
r600->hw.ATOM.check = check_##CHK; \
r600->hw.ATOM.dirty = GL_FALSE; \
r600->radeon.hw.max_state_size += (SZ); \
insert_at_tail(&r600->radeon.hw.atomlist, &r600->hw.ATOM); \
} while (0)
/**
* Allocate memory for the command buffer and initialize the state atom
* list. Note that the initial hardware state is set by r300InitState().
* list. Note that the initial hardware state is set by r600InitState().
*/
void r300InitCmdBuf(r300ContextPtr r300)
void r600InitCmdBuf(r600ContextPtr r600)
{
int mtu;
int has_tcl = 1;
int is_r500 = 0;
int i;
if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
if (!(r600->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
has_tcl = 0;
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
if (r600->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
is_r500 = 1;
r300->radeon.hw.max_state_size = 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
r600->radeon.hw.max_state_size = 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
mtu = r600->radeon.glCtx->Const.MaxTextureUnits;
if (RADEON_DEBUG & DEBUG_TEXTURE) {
fprintf(stderr, "Using %d maximum texture units..\n", mtu);
}
/* Setup the atom linked list */
make_empty_list(&r300->radeon.hw.atomlist);
r300->radeon.hw.atomlist.name = "atom-list";
make_empty_list(&r600->radeon.hw.atomlist);
r600->radeon.hw.atomlist.name = "atom-list";
/* Initialize state atoms */
ALLOC_STATE(vpt, always, R300_VPT_CMDSIZE, 0);
r300->hw.vpt.cmd[R300_VPT_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_SE_VPORT_XSCALE, 6);
ALLOC_STATE(vap_cntl, always, R300_VAP_CNTL_SIZE, 0);
r300->hw.vap_cntl.cmd[R300_VAP_CNTL_FLUSH] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PVS_STATE_FLUSH_REG, 1);
r300->hw.vap_cntl.cmd[R300_VAP_CNTL_FLUSH_1] = 0;
r300->hw.vap_cntl.cmd[R300_VAP_CNTL_CMD] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_CNTL, 1);
ALLOC_STATE(vpt, always, R600_VPT_CMDSIZE, 0);
r600->hw.vpt.cmd[R600_VPT_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_SE_VPORT_XSCALE, 6);
ALLOC_STATE(vap_cntl, always, R600_VAP_CNTL_SIZE, 0);
r600->hw.vap_cntl.cmd[R600_VAP_CNTL_FLUSH] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_PVS_STATE_FLUSH_REG, 1);
r600->hw.vap_cntl.cmd[R600_VAP_CNTL_FLUSH_1] = 0;
r600->hw.vap_cntl.cmd[R600_VAP_CNTL_CMD] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_CNTL, 1);
if (is_r500) {
ALLOC_STATE(vap_index_offset, always, 2, 0);
r300->hw.vap_index_offset.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_VAP_INDEX_OFFSET, 1);
r300->hw.vap_index_offset.cmd[1] = 0;
r600->hw.vap_index_offset.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R500_VAP_INDEX_OFFSET, 1);
r600->hw.vap_index_offset.cmd[1] = 0;
}
ALLOC_STATE(vte, always, 3, 0);
r300->hw.vte.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SE_VTE_CNTL, 2);
r600->hw.vte.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_SE_VTE_CNTL, 2);
ALLOC_STATE(vap_vf_max_vtx_indx, always, 3, 0);
r300->hw.vap_vf_max_vtx_indx.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_VF_MAX_VTX_INDX, 2);
r600->hw.vap_vf_max_vtx_indx.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_VF_MAX_VTX_INDX, 2);
ALLOC_STATE(vap_cntl_status, always, 2, 0);
r300->hw.vap_cntl_status.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_CNTL_STATUS, 1);
ALLOC_STATE(vir[0], variable, R300_VIR_CMDSIZE, 0);
r300->hw.vir[0].cmd[R300_VIR_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PROG_STREAM_CNTL_0, 1);
ALLOC_STATE(vir[1], variable, R300_VIR_CMDSIZE, 1);
r300->hw.vir[1].cmd[R300_VIR_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PROG_STREAM_CNTL_EXT_0, 1);
ALLOC_STATE(vic, always, R300_VIC_CMDSIZE, 0);
r300->hw.vic.cmd[R300_VIC_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_VTX_STATE_CNTL, 2);
r600->hw.vap_cntl_status.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_CNTL_STATUS, 1);
ALLOC_STATE(vir[0], variable, R600_VIR_CMDSIZE, 0);
r600->hw.vir[0].cmd[R600_VIR_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_VAP_PROG_STREAM_CNTL_0, 1);
ALLOC_STATE(vir[1], variable, R600_VIR_CMDSIZE, 1);
r600->hw.vir[1].cmd[R600_VIR_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_VAP_PROG_STREAM_CNTL_EXT_0, 1);
ALLOC_STATE(vic, always, R600_VIC_CMDSIZE, 0);
r600->hw.vic.cmd[R600_VIC_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_VTX_STATE_CNTL, 2);
ALLOC_STATE(vap_psc_sgn_norm_cntl, always, 2, 0);
r300->hw.vap_psc_sgn_norm_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PSC_SGN_NORM_CNTL, SGN_NORM_ZERO_CLAMP_MINUS_ONE);
r600->hw.vap_psc_sgn_norm_cntl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_PSC_SGN_NORM_CNTL, SGN_NORM_ZERO_CLAMP_MINUS_ONE);
if (has_tcl) {
ALLOC_STATE(vap_clip_cntl, always, 2, 0);
r300->hw.vap_clip_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_CLIP_CNTL, 1);
r600->hw.vap_clip_cntl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_CLIP_CNTL, 1);
ALLOC_STATE(vap_clip, always, 5, 0);
r300->hw.vap_clip.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_GB_VERT_CLIP_ADJ, 4);
r600->hw.vap_clip.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_VAP_GB_VERT_CLIP_ADJ, 4);
ALLOC_STATE(vap_pvs_vtx_timeout_reg, always, 2, 0);
r300->hw.vap_pvs_vtx_timeout_reg.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, VAP_PVS_VTX_TIMEOUT_REG, 1);
r600->hw.vap_pvs_vtx_timeout_reg.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, VAP_PVS_VTX_TIMEOUT_REG, 1);
}
ALLOC_STATE(vof, always, R300_VOF_CMDSIZE, 0);
r300->hw.vof.cmd[R300_VOF_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_VAP_OUTPUT_VTX_FMT_0, 2);
ALLOC_STATE(vof, always, R600_VOF_CMDSIZE, 0);
r600->hw.vof.cmd[R600_VOF_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_VAP_OUTPUT_VTX_FMT_0, 2);
if (has_tcl) {
ALLOC_STATE(pvs, always, R300_PVS_CMDSIZE, 0);
r300->hw.pvs.cmd[R300_PVS_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PVS_CODE_CNTL_0, 3);
ALLOC_STATE(pvs, always, R600_PVS_CMDSIZE, 0);
r600->hw.pvs.cmd[R600_PVS_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_VAP_PVS_CODE_CNTL_0, 3);
}
ALLOC_STATE(gb_enable, always, 2, 0);
r300->hw.gb_enable.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GB_ENABLE, 1);
ALLOC_STATE(gb_misc, always, R300_GB_MISC_CMDSIZE, 0);
r300->hw.gb_misc.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GB_MSPOS0, 5);
ALLOC_STATE(txe, always, R300_TXE_CMDSIZE, 0);
r300->hw.txe.cmd[R300_TXE_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_TX_ENABLE, 1);
r600->hw.gb_enable.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GB_ENABLE, 1);
ALLOC_STATE(gb_misc, always, R600_GB_MISC_CMDSIZE, 0);
r600->hw.gb_misc.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GB_MSPOS0, 5);
ALLOC_STATE(txe, always, R600_TXE_CMDSIZE, 0);
r600->hw.txe.cmd[R600_TXE_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_TX_ENABLE, 1);
ALLOC_STATE(ga_point_s0, always, 5, 0);
r300->hw.ga_point_s0.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POINT_S0, 4);
r600->hw.ga_point_s0.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_POINT_S0, 4);
ALLOC_STATE(ga_triangle_stipple, always, 2, 0);
r300->hw.ga_triangle_stipple.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_TRIANGLE_STIPPLE, 1);
ALLOC_STATE(ps, always, R300_PS_CMDSIZE, 0);
r300->hw.ps.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POINT_SIZE, 1);
r600->hw.ga_triangle_stipple.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_TRIANGLE_STIPPLE, 1);
ALLOC_STATE(ps, always, R600_PS_CMDSIZE, 0);
r600->hw.ps.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_POINT_SIZE, 1);
ALLOC_STATE(ga_point_minmax, always, 4, 0);
r300->hw.ga_point_minmax.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POINT_MINMAX, 3);
r600->hw.ga_point_minmax.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_POINT_MINMAX, 3);
ALLOC_STATE(lcntl, always, 2, 0);
r300->hw.lcntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_LINE_CNTL, 1);
r600->hw.lcntl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_LINE_CNTL, 1);
ALLOC_STATE(ga_line_stipple, always, 4, 0);
r300->hw.ga_line_stipple.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_LINE_STIPPLE_VALUE, 3);
r600->hw.ga_line_stipple.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_LINE_STIPPLE_VALUE, 3);
ALLOC_STATE(shade, always, 5, 0);
r300->hw.shade.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_ENHANCE, 4);
r600->hw.shade.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_ENHANCE, 4);
ALLOC_STATE(polygon_mode, always, 4, 0);
r300->hw.polygon_mode.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POLY_MODE, 3);
r600->hw.polygon_mode.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_POLY_MODE, 3);
ALLOC_STATE(fogp, always, 3, 0);
r300->hw.fogp.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_FOG_SCALE, 2);
r600->hw.fogp.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_GA_FOG_SCALE, 2);
ALLOC_STATE(zbias_cntl, always, 2, 0);
r300->hw.zbias_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_TEX_WRAP, 1);
ALLOC_STATE(zbs, always, R300_ZBS_CMDSIZE, 0);
r300->hw.zbs.cmd[R300_ZBS_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_SU_POLY_OFFSET_FRONT_SCALE, 4);
r600->hw.zbias_cntl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_SU_TEX_WRAP, 1);
ALLOC_STATE(zbs, always, R600_ZBS_CMDSIZE, 0);
r600->hw.zbs.cmd[R600_ZBS_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_SU_POLY_OFFSET_FRONT_SCALE, 4);
ALLOC_STATE(occlusion_cntl, always, 2, 0);
r300->hw.occlusion_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_POLY_OFFSET_ENABLE, 1);
ALLOC_STATE(cul, always, R300_CUL_CMDSIZE, 0);
r300->hw.cul.cmd[R300_CUL_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_CULL_MODE, 1);
r600->hw.occlusion_cntl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_SU_POLY_OFFSET_ENABLE, 1);
ALLOC_STATE(cul, always, R600_CUL_CMDSIZE, 0);
r600->hw.cul.cmd[R600_CUL_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_SU_CULL_MODE, 1);
ALLOC_STATE(su_depth_scale, always, 3, 0);
r300->hw.su_depth_scale.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_DEPTH_SCALE, 2);
ALLOC_STATE(rc, always, R300_RC_CMDSIZE, 0);
r300->hw.rc.cmd[R300_RC_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_COUNT, 2);
r600->hw.su_depth_scale.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_SU_DEPTH_SCALE, 2);
ALLOC_STATE(rc, always, R600_RC_CMDSIZE, 0);
r600->hw.rc.cmd[R600_RC_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_RS_COUNT, 2);
if (is_r500) {
ALLOC_STATE(ri, always, R500_RI_CMDSIZE, 0);
r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R500_RS_IP_0, 16);
r600->hw.ri.cmd[R600_RI_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R500_RS_IP_0, 16);
for (i = 0; i < 8; i++) {
r300->hw.ri.cmd[R300_RI_CMD_0 + i +1] =
r600->hw.ri.cmd[R600_RI_CMD_0 + i +1] =
(R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_S_SHIFT) |
(R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_T_SHIFT) |
(R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT) |
(R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT);
}
ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R500_RS_INST_0, 1);
ALLOC_STATE(rr, variable, R600_RR_CMDSIZE, 0);
r600->hw.rr.cmd[R600_RR_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R500_RS_INST_0, 1);
} else {
ALLOC_STATE(ri, always, R300_RI_CMDSIZE, 0);
r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_IP_0, 8);
ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_INST_0, 1);
ALLOC_STATE(ri, always, R600_RI_CMDSIZE, 0);
r600->hw.ri.cmd[R600_RI_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_RS_IP_0, 8);
ALLOC_STATE(rr, variable, R600_RR_CMDSIZE, 0);
r600->hw.rr.cmd[R600_RR_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_RS_INST_0, 1);
}
ALLOC_STATE(sc_hyperz, always, 3, 0);
r300->hw.sc_hyperz.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SC_HYPERZ, 2);
r600->hw.sc_hyperz.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_SC_HYPERZ, 2);
ALLOC_STATE(sc_screendoor, always, 2, 0);
r300->hw.sc_screendoor.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SC_SCREENDOOR, 1);
r600->hw.sc_screendoor.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_SC_SCREENDOOR, 1);
ALLOC_STATE(us_out_fmt, always, 6, 0);
r300->hw.us_out_fmt.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_OUT_FMT, 5);
r600->hw.us_out_fmt.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_US_OUT_FMT, 5);
if (is_r500) {
ALLOC_STATE(fp, always, R500_FP_CMDSIZE, 0);
r300->hw.fp.cmd[R500_FP_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R500_US_CONFIG, 2);
r300->hw.fp.cmd[R500_FP_CNTL] = R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO;
r300->hw.fp.cmd[R500_FP_CMD_1] = cmdpacket0(r300->radeon.radeonScreen, R500_US_CODE_ADDR, 3);
r300->hw.fp.cmd[R500_FP_CMD_2] = cmdpacket0(r300->radeon.radeonScreen, R500_US_FC_CTRL, 1);
r300->hw.fp.cmd[R500_FP_FC_CNTL] = 0; /* FIXME when we add flow control */
r600->hw.fp.cmd[R500_FP_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R500_US_CONFIG, 2);
r600->hw.fp.cmd[R500_FP_CNTL] = R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO;
r600->hw.fp.cmd[R500_FP_CMD_1] = cmdpacket0(r600->radeon.radeonScreen, R500_US_CODE_ADDR, 3);
r600->hw.fp.cmd[R500_FP_CMD_2] = cmdpacket0(r600->radeon.radeonScreen, R500_US_FC_CTRL, 1);
r600->hw.fp.cmd[R500_FP_FC_CNTL] = 0; /* FIXME when we add flow control */
ALLOC_STATE(r500fp, r500fp, R500_FPI_CMDSIZE, 0);
r300->hw.r500fp.cmd[R300_FPI_CMD_0] =
cmdr500fp(r300->radeon.radeonScreen, 0, 0, 0, 0);
r300->hw.r500fp.emit = emit_r500fp;
r600->hw.r500fp.cmd[R600_FPI_CMD_0] =
cmdr500fp(r600->radeon.radeonScreen, 0, 0, 0, 0);
r600->hw.r500fp.emit = emit_r500fp;
ALLOC_STATE(r500fp_const, r500fp_const, R500_FPP_CMDSIZE, 0);
r300->hw.r500fp_const.cmd[R300_FPI_CMD_0] =
cmdr500fp(r300->radeon.radeonScreen, 0, 0, 1, 0);
r300->hw.r500fp_const.emit = emit_r500fp;
r600->hw.r500fp_const.cmd[R600_FPI_CMD_0] =
cmdr500fp(r600->radeon.radeonScreen, 0, 0, 1, 0);
r600->hw.r500fp_const.emit = emit_r500fp;
} else {
ALLOC_STATE(fp, always, R300_FP_CMDSIZE, 0);
r300->hw.fp.cmd[R300_FP_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_CONFIG, 3);
r300->hw.fp.cmd[R300_FP_CMD_1] = cmdpacket0(r300->radeon.radeonScreen, R300_US_CODE_ADDR_0, 4);
ALLOC_STATE(fp, always, R600_FP_CMDSIZE, 0);
r600->hw.fp.cmd[R600_FP_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_US_CONFIG, 3);
r600->hw.fp.cmd[R600_FP_CMD_1] = cmdpacket0(r600->radeon.radeonScreen, R600_US_CODE_ADDR_0, 4);
ALLOC_STATE(fpt, variable, R300_FPT_CMDSIZE, 0);
r300->hw.fpt.cmd[R300_FPT_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_TEX_INST_0, 0);
ALLOC_STATE(fpt, variable, R600_FPT_CMDSIZE, 0);
r600->hw.fpt.cmd[R600_FPT_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_US_TEX_INST_0, 0);
ALLOC_STATE(fpi[0], variable, R300_FPI_CMDSIZE, 0);
r300->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_RGB_INST_0, 1);
ALLOC_STATE(fpi[1], variable, R300_FPI_CMDSIZE, 1);
r300->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_RGB_ADDR_0, 1);
ALLOC_STATE(fpi[2], variable, R300_FPI_CMDSIZE, 2);
r300->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_ALPHA_INST_0, 1);
ALLOC_STATE(fpi[3], variable, R300_FPI_CMDSIZE, 3);
r300->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_ALPHA_ADDR_0, 1);
ALLOC_STATE(fpp, variable, R300_FPP_CMDSIZE, 0);
r300->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_PFS_PARAM_0_X, 0);
ALLOC_STATE(fpi[0], variable, R600_FPI_CMDSIZE, 0);
r600->hw.fpi[0].cmd[R600_FPI_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_US_ALU_RGB_INST_0, 1);
ALLOC_STATE(fpi[1], variable, R600_FPI_CMDSIZE, 1);
r600->hw.fpi[1].cmd[R600_FPI_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_US_ALU_RGB_ADDR_0, 1);
ALLOC_STATE(fpi[2], variable, R600_FPI_CMDSIZE, 2);
r600->hw.fpi[2].cmd[R600_FPI_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_US_ALU_ALPHA_INST_0, 1);
ALLOC_STATE(fpi[3], variable, R600_FPI_CMDSIZE, 3);
r600->hw.fpi[3].cmd[R600_FPI_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_US_ALU_ALPHA_ADDR_0, 1);
ALLOC_STATE(fpp, variable, R600_FPP_CMDSIZE, 0);
r600->hw.fpp.cmd[R600_FPP_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_PFS_PARAM_0_X, 0);
}
ALLOC_STATE(fogs, always, R300_FOGS_CMDSIZE, 0);
r300->hw.fogs.cmd[R300_FOGS_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_FOG_BLEND, 1);
ALLOC_STATE(fogc, always, R300_FOGC_CMDSIZE, 0);
r300->hw.fogc.cmd[R300_FOGC_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_FOG_COLOR_R, 3);
ALLOC_STATE(at, always, R300_AT_CMDSIZE, 0);
r300->hw.at.cmd[R300_AT_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_ALPHA_FUNC, 2);
ALLOC_STATE(fogs, always, R600_FOGS_CMDSIZE, 0);
r600->hw.fogs.cmd[R600_FOGS_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_FG_FOG_BLEND, 1);
ALLOC_STATE(fogc, always, R600_FOGC_CMDSIZE, 0);
r600->hw.fogc.cmd[R600_FOGC_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_FG_FOG_COLOR_R, 3);
ALLOC_STATE(at, always, R600_AT_CMDSIZE, 0);
r600->hw.at.cmd[R600_AT_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_FG_ALPHA_FUNC, 2);
ALLOC_STATE(fg_depth_src, always, 2, 0);
r300->hw.fg_depth_src.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_DEPTH_SRC, 1);
r600->hw.fg_depth_src.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_FG_DEPTH_SRC, 1);
ALLOC_STATE(rb3d_cctl, always, 2, 0);
r300->hw.rb3d_cctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_CCTL, 1);
ALLOC_STATE(bld, always, R300_BLD_CMDSIZE, 0);
r300->hw.bld.cmd[R300_BLD_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_CBLEND, 2);
ALLOC_STATE(cmk, always, R300_CMK_CMDSIZE, 0);
r300->hw.cmk.cmd[R300_CMK_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, RB3D_COLOR_CHANNEL_MASK, 1);
r600->hw.rb3d_cctl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_RB3D_CCTL, 1);
ALLOC_STATE(bld, always, R600_BLD_CMDSIZE, 0);
r600->hw.bld.cmd[R600_BLD_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_RB3D_CBLEND, 2);
ALLOC_STATE(cmk, always, R600_CMK_CMDSIZE, 0);
r600->hw.cmk.cmd[R600_CMK_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, RB3D_COLOR_CHANNEL_MASK, 1);
if (is_r500) {
ALLOC_STATE(blend_color, always, 3, 0);
r300->hw.blend_color.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_RB3D_CONSTANT_COLOR_AR, 2);
r600->hw.blend_color.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R500_RB3D_CONSTANT_COLOR_AR, 2);
} else {
ALLOC_STATE(blend_color, always, 2, 0);
r300->hw.blend_color.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_BLEND_COLOR, 1);
r600->hw.blend_color.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_RB3D_BLEND_COLOR, 1);
}
ALLOC_STATE(rop, always, 2, 0);
r300->hw.rop.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_ROPCNTL, 1);
ALLOC_STATE(cb, always, R300_CB_CMDSIZE, 0);
r300->hw.cb.emit = &emit_cb_offset;
r600->hw.rop.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_RB3D_ROPCNTL, 1);
ALLOC_STATE(cb, always, R600_CB_CMDSIZE, 0);
r600->hw.cb.emit = &emit_cb_offset;
ALLOC_STATE(rb3d_dither_ctl, always, 10, 0);
r300->hw.rb3d_dither_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_DITHER_CTL, 9);
r600->hw.rb3d_dither_ctl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_RB3D_DITHER_CTL, 9);
ALLOC_STATE(rb3d_aaresolve_ctl, always, 2, 0);
r300->hw.rb3d_aaresolve_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_AARESOLVE_CTL, 1);
r600->hw.rb3d_aaresolve_ctl.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_RB3D_AARESOLVE_CTL, 1);
ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold, always, 3, 0);
r300->hw.rb3d_discard_src_pixel_lte_threshold.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD, 2);
ALLOC_STATE(zs, always, R300_ZS_CMDSIZE, 0);
r300->hw.zs.cmd[R300_ZS_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_ZB_CNTL, 3);
r600->hw.rb3d_discard_src_pixel_lte_threshold.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD, 2);
ALLOC_STATE(zs, always, R600_ZS_CMDSIZE, 0);
r600->hw.zs.cmd[R600_ZS_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_ZB_CNTL, 3);
ALLOC_STATE(zstencil_format, always, 5, 0);
r300->hw.zstencil_format.cmd[0] =
cmdpacket0(r300->radeon.radeonScreen, R300_ZB_FORMAT, 4);
r300->hw.zstencil_format.emit = emit_zstencil_format;
r600->hw.zstencil_format.cmd[0] =
cmdpacket0(r600->radeon.radeonScreen, R600_ZB_FORMAT, 4);
r600->hw.zstencil_format.emit = emit_zstencil_format;
ALLOC_STATE(zb, always, R300_ZB_CMDSIZE, 0);
r300->hw.zb.emit = emit_zb_offset;
ALLOC_STATE(zb, always, R600_ZB_CMDSIZE, 0);
r600->hw.zb.emit = emit_zb_offset;
ALLOC_STATE(zb_depthclearvalue, always, 2, 0);
r300->hw.zb_depthclearvalue.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_DEPTHCLEARVALUE, 1);
r600->hw.zb_depthclearvalue.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_ZB_DEPTHCLEARVALUE, 1);
ALLOC_STATE(unk4F30, always, 3, 0);
r300->hw.unk4F30.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, 0x4F30, 2);
r600->hw.unk4F30.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, 0x4F30, 2);
ALLOC_STATE(zb_hiz_offset, always, 2, 0);
r300->hw.zb_hiz_offset.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_HIZ_OFFSET, 1);
r600->hw.zb_hiz_offset.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_ZB_HIZ_OFFSET, 1);
ALLOC_STATE(zb_hiz_pitch, always, 2, 0);
r300->hw.zb_hiz_pitch.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_HIZ_PITCH, 1);
r600->hw.zb_hiz_pitch.cmd[0] = cmdpacket0(r600->radeon.radeonScreen, R600_ZB_HIZ_PITCH, 1);
/* VPU only on TCL */
if (has_tcl) {
int i;
ALLOC_STATE(vpi, vpu, R300_VPI_CMDSIZE, 0);
r300->hw.vpi.cmd[0] =
cmdvpu(r300->radeon.radeonScreen, R300_PVS_CODE_START, 0);
r300->hw.vpi.emit = emit_vpu;
ALLOC_STATE(vpi, vpu, R600_VPI_CMDSIZE, 0);
r600->hw.vpi.cmd[0] =
cmdvpu(r600->radeon.radeonScreen, R600_PVS_CODE_START, 0);
r600->hw.vpi.emit = emit_vpu;
if (is_r500) {
ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
r300->hw.vpp.cmd[0] =
cmdvpu(r300->radeon.radeonScreen, R500_PVS_CONST_START, 0);
r300->hw.vpp.emit = emit_vpu;
ALLOC_STATE(vpp, vpu, R600_VPP_CMDSIZE, 0);
r600->hw.vpp.cmd[0] =
cmdvpu(r600->radeon.radeonScreen, R500_PVS_CONST_START, 0);
r600->hw.vpp.emit = emit_vpu;
ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
r300->hw.vps.cmd[0] =
cmdvpu(r300->radeon.radeonScreen, R500_POINT_VPORT_SCALE_OFFSET, 1);
r300->hw.vps.emit = emit_vpu;
ALLOC_STATE(vps, vpu, R600_VPS_CMDSIZE, 0);
r600->hw.vps.cmd[0] =
cmdvpu(r600->radeon.radeonScreen, R500_POINT_VPORT_SCALE_OFFSET, 1);
r600->hw.vps.emit = emit_vpu;
for (i = 0; i < 6; i++) {
ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
r300->hw.vpucp[i].cmd[0] =
cmdvpu(r300->radeon.radeonScreen,
ALLOC_STATE(vpucp[i], vpu, R600_VPUCP_CMDSIZE, 0);
r600->hw.vpucp[i].cmd[0] =
cmdvpu(r600->radeon.radeonScreen,
R500_PVS_UCP_START + i, 1);
r300->hw.vpucp[i].emit = emit_vpu;
r600->hw.vpucp[i].emit = emit_vpu;
}
} else {
ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
r300->hw.vpp.cmd[0] =
cmdvpu(r300->radeon.radeonScreen, R300_PVS_CONST_START, 0);
r300->hw.vpp.emit = emit_vpu;
ALLOC_STATE(vpp, vpu, R600_VPP_CMDSIZE, 0);
r600->hw.vpp.cmd[0] =
cmdvpu(r600->radeon.radeonScreen, R600_PVS_CONST_START, 0);
r600->hw.vpp.emit = emit_vpu;
ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
r300->hw.vps.cmd[0] =
cmdvpu(r300->radeon.radeonScreen, R300_POINT_VPORT_SCALE_OFFSET, 1);
r300->hw.vps.emit = emit_vpu;
ALLOC_STATE(vps, vpu, R600_VPS_CMDSIZE, 0);
r600->hw.vps.cmd[0] =
cmdvpu(r600->radeon.radeonScreen, R600_POINT_VPORT_SCALE_OFFSET, 1);
r600->hw.vps.emit = emit_vpu;
for (i = 0; i < 6; i++) {
ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
r300->hw.vpucp[i].cmd[0] =
cmdvpu(r300->radeon.radeonScreen,
R300_PVS_UCP_START + i, 1);
r300->hw.vpucp[i].emit = emit_vpu;
ALLOC_STATE(vpucp[i], vpu, R600_VPUCP_CMDSIZE, 0);
r600->hw.vpucp[i].cmd[0] =
cmdvpu(r600->radeon.radeonScreen,
R600_PVS_UCP_START + i, 1);
r600->hw.vpucp[i].emit = emit_vpu;
}
}
}
/* Textures */
ALLOC_STATE(tex.filter, variable, mtu + 1, 0);
r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER0_0, 0);
r600->hw.tex.filter.cmd[R600_TEX_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_TX_FILTER0_0, 0);
ALLOC_STATE(tex.filter_1, variable, mtu + 1, 0);
r300->hw.tex.filter_1.cmd[R300_TEX_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER1_0, 0);
r600->hw.tex.filter_1.cmd[R600_TEX_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_TX_FILTER1_0, 0);
ALLOC_STATE(tex.size, variable, mtu + 1, 0);
r300->hw.tex.size.cmd[R300_TEX_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_TX_SIZE_0, 0);
r600->hw.tex.size.cmd[R600_TEX_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_TX_SIZE_0, 0);
ALLOC_STATE(tex.format, variable, mtu + 1, 0);
r300->hw.tex.format.cmd[R300_TEX_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_TX_FORMAT_0, 0);
r600->hw.tex.format.cmd[R600_TEX_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_TX_FORMAT_0, 0);
ALLOC_STATE(tex.pitch, variable, mtu + 1, 0);
r300->hw.tex.pitch.cmd[R300_TEX_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_TX_FORMAT2_0, 0);
r600->hw.tex.pitch.cmd[R600_TEX_CMD_0] = cmdpacket0(r600->radeon.radeonScreen, R600_TX_FORMAT2_0, 0);
ALLOC_STATE(tex.offset, variable, 1, 0);
r300->hw.tex.offset.cmd[R300_TEX_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_TX_OFFSET_0, 0);
r300->hw.tex.offset.emit = &emit_tex_offsets;
r600->hw.tex.offset.cmd[R600_TEX_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_TX_OFFSET_0, 0);
r600->hw.tex.offset.emit = &emit_tex_offsets;
ALLOC_STATE(tex.chroma_key, variable, mtu + 1, 0);
r300->hw.tex.chroma_key.cmd[R300_TEX_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_TX_CHROMA_KEY_0, 0);
r600->hw.tex.chroma_key.cmd[R600_TEX_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_TX_CHROMA_KEY_0, 0);
ALLOC_STATE(tex.border_color, variable, mtu + 1, 0);
r300->hw.tex.border_color.cmd[R300_TEX_CMD_0] =
cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, 0);
r600->hw.tex.border_color.cmd[R600_TEX_CMD_0] =
cmdpacket0(r600->radeon.radeonScreen, R600_TX_BORDER_COLOR_0, 0);
r300->radeon.hw.is_dirty = GL_TRUE;
r300->radeon.hw.all_dirty = GL_TRUE;
r600->radeon.hw.is_dirty = GL_TRUE;
r600->radeon.hw.all_dirty = GL_TRUE;
rcommonInitCmdBuf(&r300->radeon);
rcommonInitCmdBuf(&r600->radeon);
}
+1 -1
View File
@@ -38,7 +38,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "r600_context.h"
extern void r300InitCmdBuf(r300ContextPtr r300);
extern void r600InitCmdBuf(r600ContextPtr r600);
void emit_vpu(GLcontext *ctx, struct radeon_state_atom * atom);
int check_vpu(GLcontext *ctx, struct radeon_state_atom *atom);
+76 -76
View File
@@ -155,14 +155,14 @@ const struct dri_extension gl_20_extension[] = {
};
extern struct tnl_pipeline_stage _r300_render_stage;
extern const struct tnl_pipeline_stage _r300_tcl_stage;
extern struct tnl_pipeline_stage _r600_render_stage;
extern const struct tnl_pipeline_stage _r600_tcl_stage;
static const struct tnl_pipeline_stage *r300_pipeline[] = {
static const struct tnl_pipeline_stage *r600_pipeline[] = {
/* Try and go straight to t&l
*/
&_r300_tcl_stage,
&_r600_tcl_stage,
/* Catch any t&l fallbacks
*/
@@ -186,12 +186,12 @@ static const struct tnl_pipeline_stage *r300_pipeline[] = {
/* Else do them here.
*/
&_r300_render_stage,
&_r600_render_stage,
&_tnl_render_stage, /* FALLBACK */
0,
};
static void r300RunPipeline(GLcontext * ctx)
static void r600RunPipeline(GLcontext * ctx)
{
_mesa_lock_context_textures(ctx);
@@ -202,7 +202,7 @@ static void r300RunPipeline(GLcontext * ctx)
_mesa_unlock_context_textures(ctx);
}
static void r300_get_lock(radeonContextPtr rmesa)
static void r600_get_lock(radeonContextPtr rmesa)
{
drm_radeon_sarea_t *sarea = rmesa->sarea;
@@ -213,79 +213,79 @@ static void r300_get_lock(radeonContextPtr rmesa)
}
}
static void r300_vtbl_emit_cs_header(struct radeon_cs *cs, radeonContextPtr rmesa)
static void r600_vtbl_emit_cs_header(struct radeon_cs *cs, radeonContextPtr rmesa)
{
/* please flush pipe do all pending work */
radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
R300_SC_SCREENDOOR, 1));
R600_SC_SCREENDOOR, 1));
radeon_cs_write_dword(cs, 0x0);
radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
R300_SC_SCREENDOOR, 1));
R600_SC_SCREENDOOR, 1));
radeon_cs_write_dword(cs, 0x00FFFFFF);
radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
R300_SC_HYPERZ, 1));
R600_SC_HYPERZ, 1));
radeon_cs_write_dword(cs, 0x0);
radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
R300_US_CONFIG, 1));
R600_US_CONFIG, 1));
radeon_cs_write_dword(cs, 0x0);
radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
R300_ZB_CNTL, 1));
R600_ZB_CNTL, 1));
radeon_cs_write_dword(cs, 0x0);
radeon_cs_write_dword(cs, cmdwait(rmesa->radeonScreen, R300_WAIT_3D));
radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
R300_RB3D_DSTCACHE_CTLSTAT, 1));
radeon_cs_write_dword(cs, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
R600_RB3D_DSTCACHE_CTLSTAT, 1));
radeon_cs_write_dword(cs, R600_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
radeon_cs_write_dword(cs, cmdpacket0(rmesa->radeonScreen,
R300_ZB_ZCACHE_CTLSTAT, 1));
radeon_cs_write_dword(cs, R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE);
R600_ZB_ZCACHE_CTLSTAT, 1));
radeon_cs_write_dword(cs, R600_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE);
radeon_cs_write_dword(cs, cmdwait(rmesa->radeonScreen,
R300_WAIT_3D | R300_WAIT_3D_CLEAN));
}
static void r300_vtbl_pre_emit_atoms(radeonContextPtr radeon)
static void r600_vtbl_pre_emit_atoms(radeonContextPtr radeon)
{
r300ContextPtr r300 = (r300ContextPtr)radeon;
r600ContextPtr r600 = (r600ContextPtr)radeon;
BATCH_LOCALS(radeon);
r300->vap_flush_needed = GL_TRUE;
r600->vap_flush_needed = GL_TRUE;
cp_wait(radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
BEGIN_BATCH_NO_AUTOSTATE(2);
OUT_BATCH_REGVAL(R300_TX_INVALTAGS, R300_TX_FLUSH);
OUT_BATCH_REGVAL(R600_TX_INVALTAGS, R600_TX_FLUSH);
END_BATCH();
end_3d(radeon);
}
static void r300_fallback(GLcontext *ctx, GLuint bit, GLboolean mode)
static void r600_fallback(GLcontext *ctx, GLuint bit, GLboolean mode)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
r600ContextPtr r600 = R600_CONTEXT(ctx);
if (mode)
r300->radeon.Fallback |= bit;
r600->radeon.Fallback |= bit;
else
r300->radeon.Fallback &= ~bit;
r600->radeon.Fallback &= ~bit;
}
static void r300_init_vtbl(radeonContextPtr radeon)
static void r600_init_vtbl(radeonContextPtr radeon)
{
radeon->vtbl.get_lock = r300_get_lock;
radeon->vtbl.update_viewport_offset = r300UpdateViewportOffset;
radeon->vtbl.emit_cs_header = r300_vtbl_emit_cs_header;
radeon->vtbl.swtcl_flush = r300_swtcl_flush;
radeon->vtbl.pre_emit_atoms = r300_vtbl_pre_emit_atoms;
radeon->vtbl.fallback = r300_fallback;
radeon->vtbl.get_lock = r600_get_lock;
radeon->vtbl.update_viewport_offset = r600UpdateViewportOffset;
radeon->vtbl.emit_cs_header = r600_vtbl_emit_cs_header;
radeon->vtbl.swtcl_flush = r600_swtcl_flush;
radeon->vtbl.pre_emit_atoms = r600_vtbl_pre_emit_atoms;
radeon->vtbl.fallback = r600_fallback;
}
/* Create the device specific rendering context.
*/
GLboolean r300CreateContext(const __GLcontextModes * glVisual,
GLboolean r600CreateContext(const __GLcontextModes * glVisual,
__DRIcontextPrivate * driContextPriv,
void *sharedContextPrivate)
{
__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
struct dd_function_table functions;
r300ContextPtr r300;
r600ContextPtr r600;
GLcontext *ctx;
int tcl_mode;
@@ -293,52 +293,52 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
assert(driContextPriv);
assert(screen);
/* Allocate the R300 context */
r300 = (r300ContextPtr) CALLOC(sizeof(*r300));
if (!r300)
/* Allocate the R600 context */
r600 = (r600ContextPtr) CALLOC(sizeof(*r600));
if (!r600)
return GL_FALSE;
if (!(screen->chip_flags & RADEON_CHIPSET_TCL))
hw_tcl_on = future_hw_tcl_on = 0;
r300_init_vtbl(&r300->radeon);
r600_init_vtbl(&r600->radeon);
/* Parse configuration files.
* Do this here so that initialMaxAnisotropy is set before we create
* the default textures.
*/
driParseConfigFiles(&r300->radeon.optionCache, &screen->optionCache,
screen->driScreen->myNum, "r300");
r300->radeon.initialMaxAnisotropy = driQueryOptionf(&r300->radeon.optionCache,
driParseConfigFiles(&r600->radeon.optionCache, &screen->optionCache,
screen->driScreen->myNum, "r600");
r600->radeon.initialMaxAnisotropy = driQueryOptionf(&r600->radeon.optionCache,
"def_max_anisotropy");
/* Init default driver functions then plug in our R300-specific functions
/* Init default driver functions then plug in our R600-specific functions
* (the texture functions are especially important)
*/
_mesa_init_driver_functions(&functions);
r300InitIoctlFuncs(&functions);
r300InitStateFuncs(&functions);
r300InitTextureFuncs(&functions);
r300InitShaderFuncs(&functions);
r600InitIoctlFuncs(&functions);
r600InitStateFuncs(&functions);
r600InitTextureFuncs(&functions);
r600InitShaderFuncs(&functions);
if (!radeonInitContext(&r300->radeon, &functions,
if (!radeonInitContext(&r600->radeon, &functions,
glVisual, driContextPriv,
sharedContextPrivate)) {
FREE(r300);
FREE(r600);
return GL_FALSE;
}
/* Init r300 context data */
/* Init r600 context data */
/* Set the maximum texture size small enough that we can guarentee that
* all texture units can bind a maximal texture and have them both in
* texturable memory at once.
*/
ctx = r300->radeon.glCtx;
ctx = r600->radeon.glCtx;
ctx->Const.MaxTextureImageUnits =
driQueryOptioni(&r300->radeon.optionCache, "texture_image_units");
driQueryOptioni(&r600->radeon.optionCache, "texture_image_units");
ctx->Const.MaxTextureCoordUnits =
driQueryOptioni(&r300->radeon.optionCache, "texture_coord_units");
driQueryOptioni(&r600->radeon.optionCache, "texture_coord_units");
ctx->Const.MaxTextureUnits =
MIN2(ctx->Const.MaxTextureImageUnits,
ctx->Const.MaxTextureCoordUnits);
@@ -352,13 +352,13 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
ctx->Const.MinPointSize = 1.0;
ctx->Const.MinPointSizeAA = 1.0;
ctx->Const.MaxPointSize = R300_POINTSIZE_MAX;
ctx->Const.MaxPointSizeAA = R300_POINTSIZE_MAX;
ctx->Const.MaxPointSize = R600_POINTSIZE_MAX;
ctx->Const.MaxPointSizeAA = R600_POINTSIZE_MAX;
ctx->Const.MinLineWidth = 1.0;
ctx->Const.MinLineWidthAA = 1.0;
ctx->Const.MaxLineWidth = R300_LINESIZE_MAX;
ctx->Const.MaxLineWidthAA = R300_LINESIZE_MAX;
ctx->Const.MaxLineWidth = R600_LINESIZE_MAX;
ctx->Const.MaxLineWidthAA = R600_LINESIZE_MAX;
/* Needs further modifications */
#if 0
@@ -380,7 +380,7 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
/* Install the customized pipeline:
*/
_tnl_destroy_pipeline(ctx);
_tnl_install_pipeline(ctx, r300_pipeline);
_tnl_install_pipeline(ctx, r600_pipeline);
/* Try and keep materials and vertices separate:
*/
@@ -420,50 +420,50 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
driInitExtensions(ctx, card_extensions, GL_TRUE);
if (r300->radeon.radeonScreen->kernel_mm)
if (r600->radeon.radeonScreen->kernel_mm)
driInitExtensions(ctx, mm_extensions, GL_FALSE);
if (driQueryOptionb
(&r300->radeon.optionCache, "disable_stencil_two_side"))
(&r600->radeon.optionCache, "disable_stencil_two_side"))
_mesa_disable_extension(ctx, "GL_EXT_stencil_two_side");
if (r300->radeon.glCtx->Mesa_DXTn
&& !driQueryOptionb(&r300->radeon.optionCache, "disable_s3tc")) {
if (r600->radeon.glCtx->Mesa_DXTn
&& !driQueryOptionb(&r600->radeon.optionCache, "disable_s3tc")) {
_mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
_mesa_enable_extension(ctx, "GL_S3_s3tc");
} else
if (driQueryOptionb(&r300->radeon.optionCache, "force_s3tc_enable"))
if (driQueryOptionb(&r600->radeon.optionCache, "force_s3tc_enable"))
{
_mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
}
r300->disable_lowimpact_fallback =
driQueryOptionb(&r300->radeon.optionCache,
r600->disable_lowimpact_fallback =
driQueryOptionb(&r600->radeon.optionCache,
"disable_lowimpact_fallback");
radeon_fbo_init(&r300->radeon);
radeon_fbo_init(&r600->radeon);
radeonInitSpanFuncs( ctx );
r300InitCmdBuf(r300);
r300InitState(r300);
r600InitCmdBuf(r600);
r600InitState(r600);
if (!(screen->chip_flags & RADEON_CHIPSET_TCL))
r300InitSwtcl(ctx);
r600InitSwtcl(ctx);
TNL_CONTEXT(ctx)->Driver.RunPipeline = r300RunPipeline;
TNL_CONTEXT(ctx)->Driver.RunPipeline = r600RunPipeline;
tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode");
if (driQueryOptionb(&r300->radeon.optionCache, "no_rast")) {
tcl_mode = driQueryOptioni(&r600->radeon.optionCache, "tcl_mode");
if (driQueryOptionb(&r600->radeon.optionCache, "no_rast")) {
fprintf(stderr, "disabling 3D acceleration\n");
#if R200_MERGED
FALLBACK(&r300->radeon, RADEON_FALLBACK_DISABLE, 1);
FALLBACK(&r600->radeon, RADEON_FALLBACK_DISABLE, 1);
#endif
}
if (tcl_mode == DRI_CONF_TCL_SW ||
!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) {
if (r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
r300->radeon.radeonScreen->chip_flags &=
!(r600->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) {
if (r600->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
r600->radeon.radeonScreen->chip_flags &=
~RADEON_CHIPSET_TCL;
fprintf(stderr, "Disabling HW TCL support\n");
}
TCL_FALLBACK(r300->radeon.glCtx,
TCL_FALLBACK(r600->radeon.glCtx,
RADEON_TCL_FALLBACK_TCL_DISABLE, 1);
}
+220 -220
View File
@@ -48,9 +48,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "main/mtypes.h"
#include "main/colormac.h"
struct r300_context;
typedef struct r300_context r300ContextRec;
typedef struct r300_context *r300ContextPtr;
struct r600_context;
typedef struct r600_context r600ContextRec;
typedef struct r600_context *r600ContextPtr;
#include "main/mm.h"
@@ -80,116 +80,116 @@ typedef struct r300_context *r300ContextPtr;
/* The blit width for texture uploads
*/
#define R300_BLIT_WIDTH_BYTES 1024
#define R300_MAX_TEXTURE_UNITS 8
#define R600_BLIT_WIDTH_BYTES 1024
#define R600_MAX_TEXTURE_UNITS 8
struct r300_texture_state {
struct r600_texture_state {
int tc_count; /* number of incoming texture coordinates from VAP */
};
#define R300_VPT_CMD_0 0
#define R300_VPT_XSCALE 1
#define R300_VPT_XOFFSET 2
#define R300_VPT_YSCALE 3
#define R300_VPT_YOFFSET 4
#define R300_VPT_ZSCALE 5
#define R300_VPT_ZOFFSET 6
#define R300_VPT_CMDSIZE 7
#define R600_VPT_CMD_0 0
#define R600_VPT_XSCALE 1
#define R600_VPT_XOFFSET 2
#define R600_VPT_YSCALE 3
#define R600_VPT_YOFFSET 4
#define R600_VPT_ZSCALE 5
#define R600_VPT_ZOFFSET 6
#define R600_VPT_CMDSIZE 7
#define R300_VIR_CMD_0 0 /* vir is variable size (at least 1) */
#define R300_VIR_CNTL_0 1
#define R300_VIR_CNTL_1 2
#define R300_VIR_CNTL_2 3
#define R300_VIR_CNTL_3 4
#define R300_VIR_CNTL_4 5
#define R300_VIR_CNTL_5 6
#define R300_VIR_CNTL_6 7
#define R300_VIR_CNTL_7 8
#define R300_VIR_CMDSIZE 9
#define R600_VIR_CMD_0 0 /* vir is variable size (at least 1) */
#define R600_VIR_CNTL_0 1
#define R600_VIR_CNTL_1 2
#define R600_VIR_CNTL_2 3
#define R600_VIR_CNTL_3 4
#define R600_VIR_CNTL_4 5
#define R600_VIR_CNTL_5 6
#define R600_VIR_CNTL_6 7
#define R600_VIR_CNTL_7 8
#define R600_VIR_CMDSIZE 9
#define R300_VIC_CMD_0 0
#define R300_VIC_CNTL_0 1
#define R300_VIC_CNTL_1 2
#define R300_VIC_CMDSIZE 3
#define R600_VIC_CMD_0 0
#define R600_VIC_CNTL_0 1
#define R600_VIC_CNTL_1 2
#define R600_VIC_CMDSIZE 3
#define R300_VOF_CMD_0 0
#define R300_VOF_CNTL_0 1
#define R300_VOF_CNTL_1 2
#define R300_VOF_CMDSIZE 3
#define R600_VOF_CMD_0 0
#define R600_VOF_CNTL_0 1
#define R600_VOF_CNTL_1 2
#define R600_VOF_CMDSIZE 3
#define R300_PVS_CMD_0 0
#define R300_PVS_CNTL_1 1
#define R300_PVS_CNTL_2 2
#define R300_PVS_CNTL_3 3
#define R300_PVS_CMDSIZE 4
#define R600_PVS_CMD_0 0
#define R600_PVS_CNTL_1 1
#define R600_PVS_CNTL_2 2
#define R600_PVS_CNTL_3 3
#define R600_PVS_CMDSIZE 4
#define R300_GB_MISC_CMD_0 0
#define R300_GB_MISC_MSPOS_0 1
#define R300_GB_MISC_MSPOS_1 2
#define R300_GB_MISC_TILE_CONFIG 3
#define R300_GB_MISC_SELECT 4
#define R300_GB_MISC_AA_CONFIG 5
#define R300_GB_MISC_CMDSIZE 6
#define R600_GB_MISC_CMD_0 0
#define R600_GB_MISC_MSPOS_0 1
#define R600_GB_MISC_MSPOS_1 2
#define R600_GB_MISC_TILE_CONFIG 3
#define R600_GB_MISC_SELECT 4
#define R600_GB_MISC_AA_CONFIG 5
#define R600_GB_MISC_CMDSIZE 6
#define R300_TXE_CMD_0 0
#define R300_TXE_ENABLE 1
#define R300_TXE_CMDSIZE 2
#define R600_TXE_CMD_0 0
#define R600_TXE_ENABLE 1
#define R600_TXE_CMDSIZE 2
#define R300_PS_CMD_0 0
#define R300_PS_POINTSIZE 1
#define R300_PS_CMDSIZE 2
#define R600_PS_CMD_0 0
#define R600_PS_POINTSIZE 1
#define R600_PS_CMDSIZE 2
#define R300_ZBS_CMD_0 0
#define R300_ZBS_T_FACTOR 1
#define R300_ZBS_T_CONSTANT 2
#define R300_ZBS_W_FACTOR 3
#define R300_ZBS_W_CONSTANT 4
#define R300_ZBS_CMDSIZE 5
#define R600_ZBS_CMD_0 0
#define R600_ZBS_T_FACTOR 1
#define R600_ZBS_T_CONSTANT 2
#define R600_ZBS_W_FACTOR 3
#define R600_ZBS_W_CONSTANT 4
#define R600_ZBS_CMDSIZE 5
#define R300_CUL_CMD_0 0
#define R300_CUL_CULL 1
#define R300_CUL_CMDSIZE 2
#define R600_CUL_CMD_0 0
#define R600_CUL_CULL 1
#define R600_CUL_CMDSIZE 2
#define R300_RC_CMD_0 0
#define R300_RC_CNTL_0 1
#define R300_RC_CNTL_1 2
#define R300_RC_CMDSIZE 3
#define R600_RC_CMD_0 0
#define R600_RC_CNTL_0 1
#define R600_RC_CNTL_1 2
#define R600_RC_CMDSIZE 3
#define R300_RI_CMD_0 0
#define R300_RI_INTERP_0 1
#define R300_RI_INTERP_1 2
#define R300_RI_INTERP_2 3
#define R300_RI_INTERP_3 4
#define R300_RI_INTERP_4 5
#define R300_RI_INTERP_5 6
#define R300_RI_INTERP_6 7
#define R300_RI_INTERP_7 8
#define R300_RI_CMDSIZE 9
#define R600_RI_CMD_0 0
#define R600_RI_INTERP_0 1
#define R600_RI_INTERP_1 2
#define R600_RI_INTERP_2 3
#define R600_RI_INTERP_3 4
#define R600_RI_INTERP_4 5
#define R600_RI_INTERP_5 6
#define R600_RI_INTERP_6 7
#define R600_RI_INTERP_7 8
#define R600_RI_CMDSIZE 9
#define R500_RI_CMDSIZE 17
#define R300_RR_CMD_0 0 /* rr is variable size (at least 1) */
#define R300_RR_INST_0 1
#define R300_RR_INST_1 2
#define R300_RR_INST_2 3
#define R300_RR_INST_3 4
#define R300_RR_INST_4 5
#define R300_RR_INST_5 6
#define R300_RR_INST_6 7
#define R300_RR_INST_7 8
#define R300_RR_CMDSIZE 9
#define R600_RR_CMD_0 0 /* rr is variable size (at least 1) */
#define R600_RR_INST_0 1
#define R600_RR_INST_1 2
#define R600_RR_INST_2 3
#define R600_RR_INST_3 4
#define R600_RR_INST_4 5
#define R600_RR_INST_5 6
#define R600_RR_INST_6 7
#define R600_RR_INST_7 8
#define R600_RR_CMDSIZE 9
#define R300_FP_CMD_0 0
#define R300_FP_CNTL0 1
#define R300_FP_CNTL1 2
#define R300_FP_CNTL2 3
#define R300_FP_CMD_1 4
#define R300_FP_NODE0 5
#define R300_FP_NODE1 6
#define R300_FP_NODE2 7
#define R300_FP_NODE3 8
#define R300_FP_CMDSIZE 9
#define R600_FP_CMD_0 0
#define R600_FP_CNTL0 1
#define R600_FP_CNTL1 2
#define R600_FP_CNTL2 3
#define R600_FP_CMD_1 4
#define R600_FP_NODE0 5
#define R600_FP_NODE1 6
#define R600_FP_NODE2 7
#define R600_FP_NODE3 8
#define R600_FP_CMDSIZE 9
#define R500_FP_CMD_0 0
#define R500_FP_CNTL 1
@@ -202,107 +202,107 @@ struct r300_texture_state {
#define R500_FP_FC_CNTL 8
#define R500_FP_CMDSIZE 9
#define R300_FPT_CMD_0 0
#define R300_FPT_INSTR_0 1
#define R300_FPT_CMDSIZE 65
#define R600_FPT_CMD_0 0
#define R600_FPT_INSTR_0 1
#define R600_FPT_CMDSIZE 65
#define R300_FPI_CMD_0 0
#define R300_FPI_INSTR_0 1
#define R300_FPI_CMDSIZE 65
#define R600_FPI_CMD_0 0
#define R600_FPI_INSTR_0 1
#define R600_FPI_CMDSIZE 65
/* R500 has space for 512 instructions - 6 dwords per instruction */
#define R500_FPI_CMDSIZE (512*6+1)
#define R300_FPP_CMD_0 0
#define R300_FPP_PARAM_0 1
#define R300_FPP_CMDSIZE (32*4+1)
#define R600_FPP_CMD_0 0
#define R600_FPP_PARAM_0 1
#define R600_FPP_CMDSIZE (32*4+1)
/* R500 has spcae for 256 constants - 4 dwords per constant */
#define R500_FPP_CMDSIZE (256*4+1)
#define R300_FOGS_CMD_0 0
#define R300_FOGS_STATE 1
#define R300_FOGS_CMDSIZE 2
#define R600_FOGS_CMD_0 0
#define R600_FOGS_STATE 1
#define R600_FOGS_CMDSIZE 2
#define R300_FOGC_CMD_0 0
#define R300_FOGC_R 1
#define R300_FOGC_G 2
#define R300_FOGC_B 3
#define R300_FOGC_CMDSIZE 4
#define R600_FOGC_CMD_0 0
#define R600_FOGC_R 1
#define R600_FOGC_G 2
#define R600_FOGC_B 3
#define R600_FOGC_CMDSIZE 4
#define R300_FOGP_CMD_0 0
#define R300_FOGP_SCALE 1
#define R300_FOGP_START 2
#define R300_FOGP_CMDSIZE 3
#define R600_FOGP_CMD_0 0
#define R600_FOGP_SCALE 1
#define R600_FOGP_START 2
#define R600_FOGP_CMDSIZE 3
#define R300_AT_CMD_0 0
#define R300_AT_ALPHA_TEST 1
#define R300_AT_UNKNOWN 2
#define R300_AT_CMDSIZE 3
#define R600_AT_CMD_0 0
#define R600_AT_ALPHA_TEST 1
#define R600_AT_UNKNOWN 2
#define R600_AT_CMDSIZE 3
#define R300_BLD_CMD_0 0
#define R300_BLD_CBLEND 1
#define R300_BLD_ABLEND 2
#define R300_BLD_CMDSIZE 3
#define R600_BLD_CMD_0 0
#define R600_BLD_CBLEND 1
#define R600_BLD_ABLEND 2
#define R600_BLD_CMDSIZE 3
#define R300_CMK_CMD_0 0
#define R300_CMK_COLORMASK 1
#define R300_CMK_CMDSIZE 2
#define R600_CMK_CMD_0 0
#define R600_CMK_COLORMASK 1
#define R600_CMK_CMDSIZE 2
#define R300_CB_CMD_0 0
#define R300_CB_OFFSET 1
#define R300_CB_CMD_1 2
#define R300_CB_PITCH 3
#define R300_CB_CMDSIZE 4
#define R600_CB_CMD_0 0
#define R600_CB_OFFSET 1
#define R600_CB_CMD_1 2
#define R600_CB_PITCH 3
#define R600_CB_CMDSIZE 4
#define R300_ZS_CMD_0 0
#define R300_ZS_CNTL_0 1
#define R300_ZS_CNTL_1 2
#define R300_ZS_CNTL_2 3
#define R300_ZS_CMDSIZE 4
#define R600_ZS_CMD_0 0
#define R600_ZS_CNTL_0 1
#define R600_ZS_CNTL_1 2
#define R600_ZS_CNTL_2 3
#define R600_ZS_CMDSIZE 4
#define R300_ZB_CMD_0 0
#define R300_ZB_OFFSET 1
#define R300_ZB_PITCH 2
#define R300_ZB_CMDSIZE 3
#define R600_ZB_CMD_0 0
#define R600_ZB_OFFSET 1
#define R600_ZB_PITCH 2
#define R600_ZB_CMDSIZE 3
#define R300_VAP_CNTL_FLUSH 0
#define R300_VAP_CNTL_FLUSH_1 1
#define R300_VAP_CNTL_CMD 2
#define R300_VAP_CNTL_INSTR 3
#define R300_VAP_CNTL_SIZE 4
#define R600_VAP_CNTL_FLUSH 0
#define R600_VAP_CNTL_FLUSH_1 1
#define R600_VAP_CNTL_CMD 2
#define R600_VAP_CNTL_INSTR 3
#define R600_VAP_CNTL_SIZE 4
#define R300_VPI_CMD_0 0
#define R300_VPI_INSTR_0 1
#define R300_VPI_CMDSIZE 1025 /* 256 16 byte instructions */
#define R600_VPI_CMD_0 0
#define R600_VPI_INSTR_0 1
#define R600_VPI_CMDSIZE 1025 /* 256 16 byte instructions */
#define R300_VPP_CMD_0 0
#define R300_VPP_PARAM_0 1
#define R300_VPP_CMDSIZE 1025 /* 256 4-component parameters */
#define R600_VPP_CMD_0 0
#define R600_VPP_PARAM_0 1
#define R600_VPP_CMDSIZE 1025 /* 256 4-component parameters */
#define R300_VPUCP_CMD_0 0
#define R300_VPUCP_X 1
#define R300_VPUCP_Y 2
#define R300_VPUCP_Z 3
#define R300_VPUCP_W 4
#define R300_VPUCP_CMDSIZE 5 /* 256 4-component parameters */
#define R600_VPUCP_CMD_0 0
#define R600_VPUCP_X 1
#define R600_VPUCP_Y 2
#define R600_VPUCP_Z 3
#define R600_VPUCP_W 4
#define R600_VPUCP_CMDSIZE 5 /* 256 4-component parameters */
#define R300_VPS_CMD_0 0
#define R300_VPS_ZERO_0 1
#define R300_VPS_ZERO_1 2
#define R300_VPS_POINTSIZE 3
#define R300_VPS_ZERO_3 4
#define R300_VPS_CMDSIZE 5
#define R600_VPS_CMD_0 0
#define R600_VPS_ZERO_0 1
#define R600_VPS_ZERO_1 2
#define R600_VPS_POINTSIZE 3
#define R600_VPS_ZERO_3 4
#define R600_VPS_CMDSIZE 5
/* the layout is common for all fields inside tex */
#define R300_TEX_CMD_0 0
#define R300_TEX_VALUE_0 1
#define R600_TEX_CMD_0 0
#define R600_TEX_VALUE_0 1
/* We don't really use this, instead specify mtu+1 dynamically
#define R300_TEX_CMDSIZE (MAX_TEXTURE_UNITS+1)
#define R600_TEX_CMDSIZE (MAX_TEXTURE_UNITS+1)
*/
/**
* Cache for hardware register state.
*/
struct r300_hw_state {
struct r600_hw_state {
struct radeon_state_atom vpt; /* viewport (1D98) */
struct radeon_state_atom vap_cntl;
struct radeon_state_atom vap_index_offset; /* 0x208c r5xx only */
@@ -388,7 +388,7 @@ struct r300_hw_state {
} tex;
struct radeon_state_atom txe; /* tex enable (4104) */
radeonTexObj *textures[R300_MAX_TEXTURE_UNITS];
radeonTexObj *textures[R600_MAX_TEXTURE_UNITS];
};
/**
@@ -398,16 +398,16 @@ struct r300_hw_state {
/* Vertex shader state */
/* Perhaps more if we store programs in vmem? */
/* drm_r300_cmd_header_t->vpu->count is unsigned char */
/* drm_r600_cmd_header_t->vpu->count is unsigned char */
#define VSF_MAX_FRAGMENT_LENGTH (255*4)
/* Can be tested with colormat currently. */
#define VSF_MAX_FRAGMENT_TEMPS (14)
#define STATE_R300_WINDOW_DIMENSION (STATE_INTERNAL_DRIVER+0)
#define STATE_R300_TEXRECT_FACTOR (STATE_INTERNAL_DRIVER+1)
#define STATE_R600_WINDOW_DIMENSION (STATE_INTERNAL_DRIVER+0)
#define STATE_R600_TEXRECT_FACTOR (STATE_INTERNAL_DRIVER+1)
struct r300_vertex_shader_fragment {
struct r600_vertex_shader_fragment {
int length;
union {
GLuint d[VSF_MAX_FRAGMENT_LENGTH];
@@ -416,39 +416,39 @@ struct r300_vertex_shader_fragment {
} body;
};
struct r300_vertex_shader_state {
struct r300_vertex_shader_fragment program;
struct r600_vertex_shader_state {
struct r600_vertex_shader_fragment program;
};
extern int hw_tcl_on;
#define COLOR_IS_RGBA
#define TAG(x) r300##x
#define TAG(x) r600##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG
//#define CURRENT_VERTEX_SHADER(ctx) (ctx->VertexProgram._Current)
#define CURRENT_VERTEX_SHADER(ctx) (R300_CONTEXT(ctx)->selected_vp)
#define CURRENT_VERTEX_SHADER(ctx) (R600_CONTEXT(ctx)->selected_vp)
/* Should but doesnt work */
//#define CURRENT_VERTEX_SHADER(ctx) (R300_CONTEXT(ctx)->curr_vp)
//#define CURRENT_VERTEX_SHADER(ctx) (R600_CONTEXT(ctx)->curr_vp)
/* r300_vertex_shader_state and r300_vertex_program should probably be merged together someday.
/* r600_vertex_shader_state and r600_vertex_program should probably be merged together someday.
* Keeping them them seperate for now should ensure fixed pipeline keeps functioning properly.
*/
struct r300_vertex_program_key {
struct r600_vertex_program_key {
GLuint InputsRead;
GLuint OutputsWritten;
GLuint OutputsAdded;
};
struct r300_vertex_program {
struct r300_vertex_program *next;
struct r300_vertex_program_key key;
struct r600_vertex_program {
struct r600_vertex_program *next;
struct r600_vertex_program_key key;
int translated;
struct r300_vertex_shader_fragment program;
struct r600_vertex_shader_fragment program;
int pos_end;
int num_temporaries; /* Number of temp vars used by program */
@@ -460,10 +460,10 @@ struct r300_vertex_program {
int use_ref_count;
};
struct r300_vertex_program_cont {
struct r600_vertex_program_cont {
struct gl_vertex_program mesa_program; /* Must be first */
struct r300_vertex_shader_fragment params;
struct r300_vertex_program *progs;
struct r600_vertex_shader_fragment params;
struct r600_vertex_program *progs;
};
#define PFS_MAX_ALU_INST 64
@@ -472,13 +472,13 @@ struct r300_vertex_program_cont {
#define PFS_NUM_TEMP_REGS 32
#define PFS_NUM_CONST_REGS 16
struct r300_pfs_compile_state;
struct r600_pfs_compile_state;
/**
* Stores state that influences the compilation of a fragment program.
*/
struct r300_fragment_program_external_state {
struct r600_fragment_program_external_state {
struct {
/**
* If the sampler is used as a shadow sampler,
@@ -502,7 +502,7 @@ struct r300_fragment_program_external_state {
};
struct r300_fragment_program_node {
struct r600_fragment_program_node {
int tex_offset; /**< first tex instruction */
int tex_end; /**< last tex instruction, relative to tex_offset */
int alu_offset; /**< first ALU instruction */
@@ -511,9 +511,9 @@ struct r300_fragment_program_node {
};
/**
* Stores an R300 fragment program in its compiled-to-hardware form.
* Stores an R600 fragment program in its compiled-to-hardware form.
*/
struct r300_fragment_program_code {
struct r600_fragment_program_code {
struct {
int length; /**< total # of texture instructions used */
GLuint inst[PFS_MAX_TEX_INST];
@@ -529,7 +529,7 @@ struct r300_fragment_program_code {
} inst[PFS_MAX_ALU_INST];
} alu;
struct r300_fragment_program_node node[4];
struct r600_fragment_program_node node[4];
int cur_node;
int first_node_has_tex;
@@ -547,14 +547,14 @@ struct r300_fragment_program_code {
* Store everything about a fragment program that is needed
* to render with that program.
*/
struct r300_fragment_program {
struct r600_fragment_program {
struct gl_fragment_program mesa_program;
GLboolean translated;
GLboolean error;
struct r300_fragment_program_external_state state;
struct r300_fragment_program_code code;
struct r600_fragment_program_external_state state;
struct r600_fragment_program_code code;
GLboolean WritesDepth;
GLuint optimization;
@@ -623,30 +623,30 @@ struct r500_fragment_program {
GLuint optimization;
};
#define R300_MAX_AOS_ARRAYS 16
#define R600_MAX_AOS_ARRAYS 16
#define REG_COORDS 0
#define REG_COLOR0 1
#define REG_TEX0 2
struct r300_state {
struct r300_texture_state texture;
struct r600_state {
struct r600_texture_state texture;
int sw_tcl_inputs[VERT_ATTRIB_MAX];
struct r300_vertex_shader_state vertex_shader;
struct r600_vertex_shader_state vertex_shader;
DECLARE_RENDERINPUTS(render_inputs_bitset); /* actual render inputs that R300 was configured for.
DECLARE_RENDERINPUTS(render_inputs_bitset); /* actual render inputs that R600 was configured for.
They are the same as tnl->render_inputs for fixed pipeline */
};
#define R300_FALLBACK_NONE 0
#define R300_FALLBACK_TCL 1
#define R300_FALLBACK_RAST 2
#define R600_FALLBACK_NONE 0
#define R600_FALLBACK_TCL 1
#define R600_FALLBACK_RAST 2
/* r300_swtcl.c
/* r600_swtcl.c
*/
struct r300_swtcl_info {
struct r600_swtcl_info {
/*
* Offset of the 4UB color data within a hardware (swtcl) vertex.
*/
@@ -670,16 +670,16 @@ struct r300_swtcl_info {
/**
* \brief R300 context structure.
* \brief R600 context structure.
*/
struct r300_context {
struct r600_context {
struct radeon_context radeon; /* parent class, must be first */
struct r300_hw_state hw;
struct r600_hw_state hw;
struct r300_state state;
struct r600_state state;
struct gl_vertex_program *curr_vp;
struct r300_vertex_program *selected_vp;
struct r600_vertex_program *selected_vp;
/* Vertex buffers
*/
@@ -688,21 +688,21 @@ struct r300_context {
GLboolean disable_lowimpact_fallback;
struct r300_swtcl_info swtcl;
struct r600_swtcl_info swtcl;
GLboolean vap_flush_needed;
};
#define R300_CONTEXT(ctx) ((r300ContextPtr)(ctx->DriverCtx))
#define R600_CONTEXT(ctx) ((r600ContextPtr)(ctx->DriverCtx))
extern void r300DestroyContext(__DRIcontextPrivate * driContextPriv);
extern GLboolean r300CreateContext(const __GLcontextModes * glVisual,
extern void r600DestroyContext(__DRIcontextPrivate * driContextPriv);
extern GLboolean r600CreateContext(const __GLcontextModes * glVisual,
__DRIcontextPrivate * driContextPriv,
void *sharedContextPrivate);
extern void r300SelectVertexShader(r300ContextPtr r300);
extern void r300InitShaderFuncs(struct dd_function_table *functions);
extern int r300VertexProgUpdateParams(GLcontext * ctx,
struct r300_vertex_program_cont *vp,
extern void r600SelectVertexShader(r600ContextPtr r600);
extern void r600InitShaderFuncs(struct dd_function_table *functions);
extern int r600VertexProgUpdateParams(GLcontext * ctx,
struct r600_vertex_program_cont *vp,
float *dst);
#define RADEON_D_CAPTURE 0
@@ -710,7 +710,7 @@ extern int r300VertexProgUpdateParams(GLcontext * ctx,
#define RADEON_D_PLAYBACK_RAW 2
#define RADEON_D_T 3
#define r300PackFloat32 radeonPackFloat32
#define r300PackFloat24 radeonPackFloat24
#define r600PackFloat32 radeonPackFloat32
#define r600PackFloat24 radeonPackFloat24
#endif /* __R300_CONTEXT_H__ */
#endif /* __R600_CONTEXT_H__ */
+73 -73
View File
@@ -51,21 +51,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "r600_ioctl.h"
#if SWIZZLE_X != R300_INPUT_ROUTE_SELECT_X || \
SWIZZLE_Y != R300_INPUT_ROUTE_SELECT_Y || \
SWIZZLE_Z != R300_INPUT_ROUTE_SELECT_Z || \
SWIZZLE_W != R300_INPUT_ROUTE_SELECT_W || \
SWIZZLE_ZERO != R300_INPUT_ROUTE_SELECT_ZERO || \
SWIZZLE_ONE != R300_INPUT_ROUTE_SELECT_ONE
#if SWIZZLE_X != R600_INPUT_ROUTE_SELECT_X || \
SWIZZLE_Y != R600_INPUT_ROUTE_SELECT_Y || \
SWIZZLE_Z != R600_INPUT_ROUTE_SELECT_Z || \
SWIZZLE_W != R600_INPUT_ROUTE_SELECT_W || \
SWIZZLE_ZERO != R600_INPUT_ROUTE_SELECT_ZERO || \
SWIZZLE_ONE != R600_INPUT_ROUTE_SELECT_ONE
#error Cannot change these!
#endif
#define DEBUG_ALL DEBUG_VERTS
#define DW_SIZE(x) ((inputs[tab[(x)]] << R300_DST_VEC_LOC_SHIFT) | \
(attribptr[tab[(x)]]->size - 1) << R300_DATA_TYPE_0_SHIFT)
#define DW_SIZE(x) ((inputs[tab[(x)]] << R600_DST_VEC_LOC_SHIFT) | \
(attribptr[tab[(x)]]->size - 1) << R600_DATA_TYPE_0_SHIFT)
GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
GLuint r600VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
int *inputs, GLint * tab, GLuint nr)
{
GLuint i, dw;
@@ -74,15 +74,15 @@ GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
for (i = 0; i < nr; i += 2) {
/* make sure input is valid, would lockup the gpu */
assert(inputs[tab[i]] != -1);
dw = (R300_SIGNED | DW_SIZE(i));
dw = (R600_SIGNED | DW_SIZE(i));
if (i + 1 == nr) {
dw |= R300_LAST_VEC << R300_DATA_TYPE_0_SHIFT;
dw |= R600_LAST_VEC << R600_DATA_TYPE_0_SHIFT;
} else {
assert(inputs[tab[i + 1]] != -1);
dw |= (R300_SIGNED |
DW_SIZE(i + 1)) << R300_DATA_TYPE_1_SHIFT;
dw |= (R600_SIGNED |
DW_SIZE(i + 1)) << R600_DATA_TYPE_1_SHIFT;
if (i + 2 == nr) {
dw |= R300_LAST_VEC << R300_DATA_TYPE_1_SHIFT;
dw |= R600_LAST_VEC << R600_DATA_TYPE_1_SHIFT;
}
}
dst[i >> 1] = dw;
@@ -91,26 +91,26 @@ GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
return (nr + 1) >> 1;
}
static GLuint r300VAPInputRoute1Swizzle(int swizzle[4])
static GLuint r600VAPInputRoute1Swizzle(int swizzle[4])
{
return (swizzle[0] << R300_SWIZZLE_SELECT_X_SHIFT) |
(swizzle[1] << R300_SWIZZLE_SELECT_Y_SHIFT) |
(swizzle[2] << R300_SWIZZLE_SELECT_Z_SHIFT) |
(swizzle[3] << R300_SWIZZLE_SELECT_W_SHIFT);
return (swizzle[0] << R600_SWIZZLE_SELECT_X_SHIFT) |
(swizzle[1] << R600_SWIZZLE_SELECT_Y_SHIFT) |
(swizzle[2] << R600_SWIZZLE_SELECT_Z_SHIFT) |
(swizzle[3] << R600_SWIZZLE_SELECT_W_SHIFT);
}
GLuint r300VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr)
GLuint r600VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr)
{
GLuint i, dw;
for (i = 0; i < nr; i += 2) {
dw = (r300VAPInputRoute1Swizzle(swizzle[i]) |
((R300_WRITE_ENA_X | R300_WRITE_ENA_Y |
R300_WRITE_ENA_Z | R300_WRITE_ENA_W) << R300_WRITE_ENA_SHIFT)) << R300_SWIZZLE0_SHIFT;
dw = (r600VAPInputRoute1Swizzle(swizzle[i]) |
((R600_WRITE_ENA_X | R600_WRITE_ENA_Y |
R600_WRITE_ENA_Z | R600_WRITE_ENA_W) << R600_WRITE_ENA_SHIFT)) << R600_SWIZZLE0_SHIFT;
if (i + 1 < nr) {
dw |= (r300VAPInputRoute1Swizzle(swizzle[i + 1]) |
((R300_WRITE_ENA_X | R300_WRITE_ENA_Y |
R300_WRITE_ENA_Z | R300_WRITE_ENA_W) << R300_WRITE_ENA_SHIFT)) << R300_SWIZZLE1_SHIFT;
dw |= (r600VAPInputRoute1Swizzle(swizzle[i + 1]) |
((R600_WRITE_ENA_X | R600_WRITE_ENA_Y |
R600_WRITE_ENA_Z | R600_WRITE_ENA_W) << R600_WRITE_ENA_SHIFT)) << R600_SWIZZLE1_SHIFT;
}
dst[i >> 1] = dw;
}
@@ -118,64 +118,64 @@ GLuint r300VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr)
return (nr + 1) >> 1;
}
GLuint r300VAPInputCntl0(GLcontext * ctx, GLuint InputsRead)
GLuint r600VAPInputCntl0(GLcontext * ctx, GLuint InputsRead)
{
/* No idea what this value means. I have seen other values written to
* this register... */
return 0x5555;
}
GLuint r300VAPInputCntl1(GLcontext * ctx, GLuint InputsRead)
GLuint r600VAPInputCntl1(GLcontext * ctx, GLuint InputsRead)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
GLuint i, vic_1 = 0;
if (InputsRead & (1 << VERT_ATTRIB_POS))
vic_1 |= R300_INPUT_CNTL_POS;
vic_1 |= R600_INPUT_CNTL_POS;
if (InputsRead & (1 << VERT_ATTRIB_NORMAL))
vic_1 |= R300_INPUT_CNTL_NORMAL;
vic_1 |= R600_INPUT_CNTL_NORMAL;
if (InputsRead & (1 << VERT_ATTRIB_COLOR0))
vic_1 |= R300_INPUT_CNTL_COLOR;
vic_1 |= R600_INPUT_CNTL_COLOR;
rmesa->state.texture.tc_count = 0;
for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
if (InputsRead & (1 << (VERT_ATTRIB_TEX0 + i))) {
rmesa->state.texture.tc_count++;
vic_1 |= R300_INPUT_CNTL_TC0 << i;
vic_1 |= R600_INPUT_CNTL_TC0 << i;
}
return vic_1;
}
GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten)
GLuint r600VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten)
{
GLuint ret = 0;
if (OutputsWritten & (1 << VERT_RESULT_HPOS))
ret |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT;
ret |= R600_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT;
if (OutputsWritten & (1 << VERT_RESULT_COL0))
ret |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT;
ret |= R600_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT;
if (OutputsWritten & (1 << VERT_RESULT_COL1))
ret |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT;
ret |= R600_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT;
if (OutputsWritten & (1 << VERT_RESULT_BFC0)
|| OutputsWritten & (1 << VERT_RESULT_BFC1))
ret |=
R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT |
R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT |
R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT;
R600_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT |
R600_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT |
R600_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT;
if (OutputsWritten & (1 << VERT_RESULT_PSIZ))
ret |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT;
ret |= R600_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT;
return ret;
}
GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten)
GLuint r600VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten)
{
GLuint i, ret = 0, first_free_texcoord = 0;
@@ -199,11 +199,11 @@ GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten)
/* Emit vertex data to GART memory
* Route inputs to the vertex processor
* This function should never return R300_FALLBACK_TCL when using software tcl.
* This function should never return R600_FALLBACK_TCL when using software tcl.
*/
int r300EmitArrays(GLcontext * ctx)
int r600EmitArrays(GLcontext * ctx)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *vb = &tnl->vb;
GLuint nr;
@@ -214,8 +214,8 @@ int r300EmitArrays(GLcontext * ctx)
int vir_inputs[VERT_ATTRIB_MAX];
GLint tab[VERT_ATTRIB_MAX];
int swizzle[VERT_ATTRIB_MAX][4];
struct r300_vertex_program *prog =
(struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
struct r600_vertex_program *prog =
(struct r600_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
if (hw_tcl_on) {
inputs = prog->inputs;
@@ -287,8 +287,8 @@ int r300EmitArrays(GLcontext * ctx)
}
}
if (nr > R300_MAX_AOS_ARRAYS) {
return R300_FALLBACK_TCL;
if (nr > R600_MAX_AOS_ARRAYS) {
return R600_FALLBACK_TCL;
}
for (i = 0; i < nr; i++) {
@@ -310,55 +310,55 @@ int r300EmitArrays(GLcontext * ctx)
/* Setup INPUT_ROUTE. */
if (rmesa->radeon.radeonScreen->kernel_mm) {
R300_STATECHANGE(rmesa, vir[0]);
R600_STATECHANGE(rmesa, vir[0]);
rmesa->hw.vir[0].cmd[0] &= 0xC000FFFF;
rmesa->hw.vir[1].cmd[0] &= 0xC000FFFF;
rmesa->hw.vir[0].cmd[0] |=
(r300VAPInputRoute0(&rmesa->hw.vir[0].cmd[R300_VIR_CNTL_0],
(r600VAPInputRoute0(&rmesa->hw.vir[0].cmd[R600_VIR_CNTL_0],
vb->AttribPtr, inputs, tab, nr) & 0x3FFF) << 16;
R300_STATECHANGE(rmesa, vir[1]);
R600_STATECHANGE(rmesa, vir[1]);
rmesa->hw.vir[1].cmd[0] |=
(r300VAPInputRoute1(&rmesa->hw.vir[1].cmd[R300_VIR_CNTL_0], swizzle,
(r600VAPInputRoute1(&rmesa->hw.vir[1].cmd[R600_VIR_CNTL_0], swizzle,
nr) & 0x3FFF) << 16;
} else {
R300_STATECHANGE(rmesa, vir[0]);
R600_STATECHANGE(rmesa, vir[0]);
((drm_r300_cmd_header_t *) rmesa->hw.vir[0].cmd)->packet0.count =
r300VAPInputRoute0(&rmesa->hw.vir[0].cmd[R300_VIR_CNTL_0],
r600VAPInputRoute0(&rmesa->hw.vir[0].cmd[R600_VIR_CNTL_0],
vb->AttribPtr, inputs, tab, nr);
R300_STATECHANGE(rmesa, vir[1]);
R600_STATECHANGE(rmesa, vir[1]);
((drm_r300_cmd_header_t *) rmesa->hw.vir[1].cmd)->packet0.count =
r300VAPInputRoute1(&rmesa->hw.vir[1].cmd[R300_VIR_CNTL_0], swizzle,
r600VAPInputRoute1(&rmesa->hw.vir[1].cmd[R600_VIR_CNTL_0], swizzle,
nr);
}
/* Setup INPUT_CNTL. */
R300_STATECHANGE(rmesa, vic);
rmesa->hw.vic.cmd[R300_VIC_CNTL_0] = r300VAPInputCntl0(ctx, InputsRead);
rmesa->hw.vic.cmd[R300_VIC_CNTL_1] = r300VAPInputCntl1(ctx, InputsRead);
R600_STATECHANGE(rmesa, vic);
rmesa->hw.vic.cmd[R600_VIC_CNTL_0] = r600VAPInputCntl0(ctx, InputsRead);
rmesa->hw.vic.cmd[R600_VIC_CNTL_1] = r600VAPInputCntl1(ctx, InputsRead);
/* Setup OUTPUT_VTX_FMT. */
R300_STATECHANGE(rmesa, vof);
rmesa->hw.vof.cmd[R300_VOF_CNTL_0] =
r300VAPOutputCntl0(ctx, OutputsWritten);
rmesa->hw.vof.cmd[R300_VOF_CNTL_1] =
r300VAPOutputCntl1(ctx, OutputsWritten);
R600_STATECHANGE(rmesa, vof);
rmesa->hw.vof.cmd[R600_VOF_CNTL_0] =
r600VAPOutputCntl0(ctx, OutputsWritten);
rmesa->hw.vof.cmd[R600_VOF_CNTL_1] =
r600VAPOutputCntl1(ctx, OutputsWritten);
rmesa->radeon.tcl.aos_count = nr;
return R300_FALLBACK_NONE;
return R600_FALLBACK_NONE;
}
void r300EmitCacheFlush(r300ContextPtr rmesa)
void r600EmitCacheFlush(r600ContextPtr rmesa)
{
BATCH_LOCALS(&rmesa->radeon);
BEGIN_BATCH_NO_AUTOSTATE(4);
OUT_BATCH_REGVAL(R300_RB3D_DSTCACHE_CTLSTAT,
R300_RB3D_DSTCACHE_CTLSTAT_DC_FREE_FREE_3D_TAGS |
R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
OUT_BATCH_REGVAL(R300_ZB_ZCACHE_CTLSTAT,
R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE |
R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE);
OUT_BATCH_REGVAL(R600_RB3D_DSTCACHE_CTLSTAT,
R600_RB3D_DSTCACHE_CTLSTAT_DC_FREE_FREE_3D_TAGS |
R600_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
OUT_BATCH_REGVAL(R600_ZB_ZCACHE_CTLSTAT,
R600_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE |
R600_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE);
END_BATCH();
COMMIT_BATCH();
}
+12 -12
View File
@@ -34,7 +34,7 @@
* Jerome Glisse <j.glisse@gmail.com>
*/
/* This files defines functions for accessing R300 hardware.
/* This files defines functions for accessing R600 hardware.
*/
#ifndef __R600_EMIT_H__
#define __R600_EMIT_H__
@@ -165,7 +165,7 @@ void static INLINE end_3d(radeonContextPtr radeon)
}
}
void static INLINE cp_delay(r300ContextPtr rmesa, unsigned short count)
void static INLINE cp_delay(r600ContextPtr rmesa, unsigned short count)
{
BATCH_LOCALS(&rmesa->radeon);
@@ -216,19 +216,19 @@ void static INLINE cp_wait(radeonContextPtr radeon, unsigned char flags)
}
}
extern int r300EmitArrays(GLcontext * ctx);
extern int r600EmitArrays(GLcontext * ctx);
extern int r300PrimitiveType(r300ContextPtr rmesa, int prim);
extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim);
extern int r600PrimitiveType(r600ContextPtr rmesa, int prim);
extern int r600NumVerts(r600ContextPtr rmesa, int num_verts, int prim);
extern void r300EmitCacheFlush(r300ContextPtr rmesa);
extern void r600EmitCacheFlush(r600ContextPtr rmesa);
extern GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
extern GLuint r600VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
int *inputs, GLint * tab, GLuint nr);
extern GLuint r300VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr);
extern GLuint r300VAPInputCntl0(GLcontext * ctx, GLuint InputsRead);
extern GLuint r300VAPInputCntl1(GLcontext * ctx, GLuint InputsRead);
extern GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten);
extern GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten);
extern GLuint r600VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr);
extern GLuint r600VAPInputCntl0(GLcontext * ctx, GLuint InputsRead);
extern GLuint r600VAPInputCntl1(GLcontext * ctx, GLuint InputsRead);
extern GLuint r600VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten);
extern GLuint r600VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten);
#endif
+56 -56
View File
@@ -85,8 +85,8 @@ static GLboolean transform_TEX(
struct radeon_transform_context *t,
struct prog_instruction* orig_inst, void* data)
{
struct r300_fragment_program_compiler *compiler =
(struct r300_fragment_program_compiler*)data;
struct r600_fragment_program_compiler *compiler =
(struct r600_fragment_program_compiler*)data;
struct prog_instruction inst = *orig_inst;
struct prog_instruction* tgt;
GLboolean destredirect = GL_FALSE;
@@ -127,7 +127,7 @@ static GLboolean transform_TEX(
*/
if (inst.Opcode != OPCODE_KIL && inst.TexSrcTarget == TEXTURE_RECT_INDEX) {
gl_state_index tokens[STATE_LENGTH] = {
STATE_INTERNAL, STATE_R300_TEXRECT_FACTOR, 0, 0,
STATE_INTERNAL, STATE_R600_TEXRECT_FACTOR, 0, 0,
0
};
@@ -247,13 +247,13 @@ static GLboolean transform_TEX(
}
static void update_params(r300ContextPtr r300, struct r300_fragment_program *fp)
static void update_params(r600ContextPtr r600, struct r600_fragment_program *fp)
{
struct gl_fragment_program *mp = &fp->mesa_program;
/* Ask Mesa nicely to fill in ParameterValues for us */
if (mp->Base.Parameters)
_mesa_load_state_parameters(r300->radeon.glCtx, mp->Base.Parameters);
_mesa_load_state_parameters(r600->radeon.glCtx, mp->Base.Parameters);
}
@@ -268,7 +268,7 @@ static void update_params(r300ContextPtr r300, struct r300_fragment_program *fp)
* \todo if/when r5xx supports the radeon_program architecture, this is a
* likely candidate for code sharing.
*/
static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler)
static void insert_WPOS_trailer(struct r600_fragment_program_compiler *compiler)
{
GLuint InputsRead = compiler->fp->mesa_program.Base.InputsRead;
@@ -276,7 +276,7 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler)
return;
static gl_state_index tokens[STATE_LENGTH] = {
STATE_INTERNAL, STATE_R300_WINDOW_DIMENSION, 0, 0, 0
STATE_INTERNAL, STATE_R600_WINDOW_DIMENSION, 0, 0, 0
};
struct prog_instruction *fpi;
GLuint window_index;
@@ -382,9 +382,9 @@ static GLuint build_func(GLuint comparefunc)
* fragment program.
*/
static void build_state(
r300ContextPtr r300,
struct r300_fragment_program *fp,
struct r300_fragment_program_external_state *state)
r600ContextPtr r600,
struct r600_fragment_program *fp,
struct r600_fragment_program_external_state *state)
{
int unit;
@@ -392,7 +392,7 @@ static void build_state(
for(unit = 0; unit < 16; ++unit) {
if (fp->mesa_program.Base.ShadowSamplers & (1 << unit)) {
struct gl_texture_object* tex = r300->radeon.glCtx->Texture.Unit[unit]._Current;
struct gl_texture_object* tex = r600->radeon.glCtx->Texture.Unit[unit]._Current;
state->unit[unit].depth_texture_mode = build_dtm(tex->DepthMode);
state->unit[unit].texture_compare_func = build_func(tex->CompareFunc);
@@ -401,12 +401,12 @@ static void build_state(
}
void r300TranslateFragmentShader(r300ContextPtr r300,
struct r300_fragment_program *fp)
void r600TranslateFragmentShader(r600ContextPtr r600,
struct r600_fragment_program *fp)
{
struct r300_fragment_program_external_state state;
struct r600_fragment_program_external_state state;
build_state(r300, fp, &state);
build_state(r600, fp, &state);
if (_mesa_memcmp(&fp->state, &state, sizeof(state))) {
/* TODO: cache compiled programs */
fp->translated = GL_FALSE;
@@ -414,12 +414,12 @@ void r300TranslateFragmentShader(r300ContextPtr r300,
}
if (!fp->translated) {
struct r300_fragment_program_compiler compiler;
struct r600_fragment_program_compiler compiler;
compiler.r300 = r300;
compiler.r600 = r600;
compiler.fp = fp;
compiler.code = &fp->code;
compiler.program = _mesa_clone_program(r300->radeon.glCtx, &fp->mesa_program.Base);
compiler.program = _mesa_clone_program(r600->radeon.glCtx, &fp->mesa_program.Base);
if (RADEON_DEBUG & DEBUG_PIXEL) {
_mesa_printf("Fragment Program: Initial program:\n");
@@ -434,7 +434,7 @@ void r300TranslateFragmentShader(r300ContextPtr r300,
{ &radeonTransformTrigSimple, 0 }
};
radeonLocalTransform(
r300->radeon.glCtx,
r600->radeon.glCtx,
compiler.program,
3, transformations);
@@ -445,18 +445,18 @@ void r300TranslateFragmentShader(r300ContextPtr r300,
struct radeon_nqssadce_descr nqssadce = {
.Init = &nqssadce_init,
.IsNativeSwizzle = &r300FPIsNativeSwizzle,
.BuildSwizzle = &r300FPBuildSwizzle,
.IsNativeSwizzle = &r600FPIsNativeSwizzle,
.BuildSwizzle = &r600FPBuildSwizzle,
.RewriteDepthOut = GL_TRUE
};
radeonNqssaDce(r300->radeon.glCtx, compiler.program, &nqssadce);
radeonNqssaDce(r600->radeon.glCtx, compiler.program, &nqssadce);
if (RADEON_DEBUG & DEBUG_PIXEL) {
_mesa_printf("Compiler: after NqSSA-DCE:\n");
_mesa_print_program(compiler.program);
}
if (!r300FragmentProgramEmit(&compiler))
if (!r600FragmentProgramEmit(&compiler))
fp->error = GL_TRUE;
/* Subtle: Rescue any parameters that have been added during transformations */
@@ -464,22 +464,22 @@ void r300TranslateFragmentShader(r300ContextPtr r300,
fp->mesa_program.Base.Parameters = compiler.program->Parameters;
compiler.program->Parameters = 0;
_mesa_reference_program(r300->radeon.glCtx, &compiler.program, NULL);
_mesa_reference_program(r600->radeon.glCtx, &compiler.program, NULL);
if (!fp->error)
fp->translated = GL_TRUE;
if (fp->error || (RADEON_DEBUG & DEBUG_PIXEL))
r300FragmentProgramDump(fp, &fp->code);
r300UpdateStateParameters(r300->radeon.glCtx, _NEW_PROGRAM);
r600FragmentProgramDump(fp, &fp->code);
r600UpdateStateParameters(r600->radeon.glCtx, _NEW_PROGRAM);
}
update_params(r300, fp);
update_params(r600, fp);
}
/* just some random things... */
void r300FragmentProgramDump(
struct r300_fragment_program *fp,
struct r300_fragment_program_code *code)
void r600FragmentProgramDump(
struct r600_fragment_program *fp,
struct r600_fragment_program_code *code)
{
int n, i, j;
static int pc = 0;
@@ -505,18 +505,18 @@ void r300FragmentProgramDump(
const char *instr;
switch ((code->tex.
inst[i] >> R300_TEX_INST_SHIFT) &
inst[i] >> R600_TEX_INST_SHIFT) &
15) {
case R300_TEX_OP_LD:
case R600_TEX_OP_LD:
instr = "TEX";
break;
case R300_TEX_OP_KIL:
case R600_TEX_OP_KIL:
instr = "KIL";
break;
case R300_TEX_OP_TXP:
case R600_TEX_OP_TXP:
instr = "TXP";
break;
case R300_TEX_OP_TXB:
case R600_TEX_OP_TXB:
instr = "TXB";
break;
default:
@@ -527,13 +527,13 @@ void r300FragmentProgramDump(
" %s t%i, %c%i, texture[%i] (%08x)\n",
instr,
(code->tex.
inst[i] >> R300_DST_ADDR_SHIFT) & 31,
inst[i] >> R600_DST_ADDR_SHIFT) & 31,
't',
(code->tex.
inst[i] >> R300_SRC_ADDR_SHIFT) & 31,
inst[i] >> R600_SRC_ADDR_SHIFT) & 31,
(code->tex.
inst[i] & R300_TEX_ID_MASK) >>
R300_TEX_ID_SHIFT,
inst[i] & R600_TEX_ID_MASK) >>
R600_TEX_ID_SHIFT,
code->tex.inst[i]);
}
}
@@ -559,45 +559,45 @@ void r300FragmentProgramDump(
dstc[0] = 0;
sprintf(flags, "%s%s%s",
(code->alu.inst[i].
inst1 & R300_ALU_DSTC_REG_X) ? "x" : "",
inst1 & R600_ALU_DSTC_REG_X) ? "x" : "",
(code->alu.inst[i].
inst1 & R300_ALU_DSTC_REG_Y) ? "y" : "",
inst1 & R600_ALU_DSTC_REG_Y) ? "y" : "",
(code->alu.inst[i].
inst1 & R300_ALU_DSTC_REG_Z) ? "z" : "");
inst1 & R600_ALU_DSTC_REG_Z) ? "z" : "");
if (flags[0] != 0) {
sprintf(dstc, "t%i.%s ",
(code->alu.inst[i].
inst1 >> R300_ALU_DSTC_SHIFT) & 31,
inst1 >> R600_ALU_DSTC_SHIFT) & 31,
flags);
}
sprintf(flags, "%s%s%s",
(code->alu.inst[i].
inst1 & R300_ALU_DSTC_OUTPUT_X) ? "x" : "",
inst1 & R600_ALU_DSTC_OUTPUT_X) ? "x" : "",
(code->alu.inst[i].
inst1 & R300_ALU_DSTC_OUTPUT_Y) ? "y" : "",
inst1 & R600_ALU_DSTC_OUTPUT_Y) ? "y" : "",
(code->alu.inst[i].
inst1 & R300_ALU_DSTC_OUTPUT_Z) ? "z" : "");
inst1 & R600_ALU_DSTC_OUTPUT_Z) ? "z" : "");
if (flags[0] != 0) {
sprintf(tmp, "o%i.%s",
(code->alu.inst[i].
inst1 >> R300_ALU_DSTC_SHIFT) & 31,
inst1 >> R600_ALU_DSTC_SHIFT) & 31,
flags);
strcat(dstc, tmp);
}
dsta[0] = 0;
if (code->alu.inst[i].inst3 & R300_ALU_DSTA_REG) {
if (code->alu.inst[i].inst3 & R600_ALU_DSTA_REG) {
sprintf(dsta, "t%i.w ",
(code->alu.inst[i].
inst3 >> R300_ALU_DSTA_SHIFT) & 31);
inst3 >> R600_ALU_DSTA_SHIFT) & 31);
}
if (code->alu.inst[i].inst3 & R300_ALU_DSTA_OUTPUT) {
if (code->alu.inst[i].inst3 & R600_ALU_DSTA_OUTPUT) {
sprintf(tmp, "o%i.w ",
(code->alu.inst[i].
inst3 >> R300_ALU_DSTA_SHIFT) & 31);
inst3 >> R600_ALU_DSTA_SHIFT) & 31);
strcat(dsta, tmp);
}
if (code->alu.inst[i].inst3 & R300_ALU_DSTA_DEPTH) {
if (code->alu.inst[i].inst3 & R600_ALU_DSTA_DEPTH) {
strcat(dsta, "Z");
}
@@ -617,19 +617,19 @@ void r300FragmentProgramDump(
d = regc & 31;
if (d < 12) {
switch (d % 4) {
case R300_ALU_ARGC_SRC0C_XYZ:
case R600_ALU_ARGC_SRC0C_XYZ:
sprintf(buf, "%s.xyz",
srcc[d / 4]);
break;
case R300_ALU_ARGC_SRC0C_XXX:
case R600_ALU_ARGC_SRC0C_XXX:
sprintf(buf, "%s.xxx",
srcc[d / 4]);
break;
case R300_ALU_ARGC_SRC0C_YYY:
case R600_ALU_ARGC_SRC0C_YYY:
sprintf(buf, "%s.yyy",
srcc[d / 4]);
break;
case R300_ALU_ARGC_SRC0C_ZZZ:
case R600_ALU_ARGC_SRC0C_ZZZ:
sprintf(buf, "%s.zzz",
srcc[d / 4]);
break;
+30 -30
View File
@@ -66,67 +66,67 @@
#define FP_SELC_MASK_XYZ 7
#define FP_SELC(destidx,regmask,outmask,src0,src1,src2) \
(((destidx) << R300_ALU_DSTC_SHIFT) | \
(((destidx) << R600_ALU_DSTC_SHIFT) | \
(FP_SELC_MASK_##regmask << 23) | \
(FP_SELC_MASK_##outmask << 26) | \
((src0) << R300_ALU_SRC0C_SHIFT) | \
((src1) << R300_ALU_SRC1C_SHIFT) | \
((src2) << R300_ALU_SRC2C_SHIFT))
((src0) << R600_ALU_SRC0C_SHIFT) | \
((src1) << R600_ALU_SRC1C_SHIFT) | \
((src2) << R600_ALU_SRC2C_SHIFT))
#define FP_SELA_MASK_NO 0
#define FP_SELA_MASK_W 1
#define FP_SELA(destidx,regmask,outmask,src0,src1,src2) \
(((destidx) << R300_ALU_DSTA_SHIFT) | \
(((destidx) << R600_ALU_DSTA_SHIFT) | \
(FP_SELA_MASK_##regmask << 23) | \
(FP_SELA_MASK_##outmask << 24) | \
((src0) << R300_ALU_SRC0A_SHIFT) | \
((src1) << R300_ALU_SRC1A_SHIFT) | \
((src2) << R300_ALU_SRC2A_SHIFT))
((src0) << R600_ALU_SRC0A_SHIFT) | \
((src1) << R600_ALU_SRC1A_SHIFT) | \
((src2) << R600_ALU_SRC2A_SHIFT))
/* Produce unshifted argument selectors */
#define FP_ARGC(source) R300_ALU_ARGC_##source
#define FP_ARGA(source) R300_ALU_ARGA_##source
#define FP_ARGC(source) R600_ALU_ARGC_##source
#define FP_ARGA(source) R600_ALU_ARGA_##source
#define FP_ABS(arg) ((arg) | (1 << 6))
#define FP_NEG(arg) ((arg) ^ (1 << 5))
/* Produce instruction dword */
#define FP_INSTRC(opcode,arg0,arg1,arg2) \
(R300_ALU_OUTC_##opcode | \
((arg0) << R300_ALU_ARG0C_SHIFT) | \
((arg1) << R300_ALU_ARG1C_SHIFT) | \
((arg2) << R300_ALU_ARG2C_SHIFT))
(R600_ALU_OUTC_##opcode | \
((arg0) << R600_ALU_ARG0C_SHIFT) | \
((arg1) << R600_ALU_ARG1C_SHIFT) | \
((arg2) << R600_ALU_ARG2C_SHIFT))
#define FP_INSTRA(opcode,arg0,arg1,arg2) \
(R300_ALU_OUTA_##opcode | \
((arg0) << R300_ALU_ARG0A_SHIFT) | \
((arg1) << R300_ALU_ARG1A_SHIFT) | \
((arg2) << R300_ALU_ARG2A_SHIFT))
(R600_ALU_OUTA_##opcode | \
((arg0) << R600_ALU_ARG0A_SHIFT) | \
((arg1) << R600_ALU_ARG1A_SHIFT) | \
((arg2) << R600_ALU_ARG2A_SHIFT))
#endif
struct r300_fragment_program;
struct r600_fragment_program;
extern void r300TranslateFragmentShader(r300ContextPtr r300,
struct r300_fragment_program *fp);
extern void r600TranslateFragmentShader(r600ContextPtr r600,
struct r600_fragment_program *fp);
/**
* Used internally by the r300 fragment program code to store compile-time
* Used internally by the r600 fragment program code to store compile-time
* only data.
*/
struct r300_fragment_program_compiler {
r300ContextPtr r300;
struct r300_fragment_program *fp;
struct r300_fragment_program_code *code;
struct r600_fragment_program_compiler {
r600ContextPtr r600;
struct r600_fragment_program *fp;
struct r600_fragment_program_code *code;
struct gl_program *program;
};
extern GLboolean r300FragmentProgramEmit(struct r300_fragment_program_compiler *compiler);
extern GLboolean r600FragmentProgramEmit(struct r600_fragment_program_compiler *compiler);
extern void r300FragmentProgramDump(
struct r300_fragment_program *fp,
struct r300_fragment_program_code *code);
extern void r600FragmentProgramDump(
struct r600_fragment_program *fp,
struct r600_fragment_program_code *code);
#endif
+53 -53
View File
@@ -28,7 +28,7 @@
/**
* \file
*
* Emit the r300_fragment_program_code that can be understood by the hardware.
* Emit the r600_fragment_program_code that can be understood by the hardware.
* Input is a pre-transformed radeon_program.
*
* \author Ben Skeggs <darktama@iinet.net.au>
@@ -46,8 +46,8 @@
#define PROG_CODE \
struct r300_fragment_program_compiler *c = (struct r300_fragment_program_compiler*)data; \
struct r300_fragment_program_code *code = c->code
struct r600_fragment_program_compiler *c = (struct r600_fragment_program_compiler*)data; \
struct r600_fragment_program_code *code = c->code
#define error(fmt, args...) do { \
fprintf(stderr, "%s::%s(): " fmt "\n", \
@@ -83,7 +83,7 @@ static GLboolean emit_const(void* data, GLuint file, GLuint index, GLuint *hwind
/**
* Mark a temporary register as used.
*/
static void use_temporary(struct r300_fragment_program_code *code, GLuint index)
static void use_temporary(struct r600_fragment_program_code *code, GLuint index)
{
if (index > code->max_temp_idx)
code->max_temp_idx = index;
@@ -93,41 +93,41 @@ static void use_temporary(struct r300_fragment_program_code *code, GLuint index)
static GLuint translate_rgb_opcode(GLuint opcode)
{
switch(opcode) {
case OPCODE_CMP: return R300_ALU_OUTC_CMP;
case OPCODE_DP3: return R300_ALU_OUTC_DP3;
case OPCODE_DP4: return R300_ALU_OUTC_DP4;
case OPCODE_FRC: return R300_ALU_OUTC_FRC;
case OPCODE_CMP: return R600_ALU_OUTC_CMP;
case OPCODE_DP3: return R600_ALU_OUTC_DP3;
case OPCODE_DP4: return R600_ALU_OUTC_DP4;
case OPCODE_FRC: return R600_ALU_OUTC_FRC;
default:
error("translate_rgb_opcode(%i): Unknown opcode", opcode);
/* fall through */
case OPCODE_NOP:
/* fall through */
case OPCODE_MAD: return R300_ALU_OUTC_MAD;
case OPCODE_MAX: return R300_ALU_OUTC_MAX;
case OPCODE_MIN: return R300_ALU_OUTC_MIN;
case OPCODE_REPL_ALPHA: return R300_ALU_OUTC_REPL_ALPHA;
case OPCODE_MAD: return R600_ALU_OUTC_MAD;
case OPCODE_MAX: return R600_ALU_OUTC_MAX;
case OPCODE_MIN: return R600_ALU_OUTC_MIN;
case OPCODE_REPL_ALPHA: return R600_ALU_OUTC_REPL_ALPHA;
}
}
static GLuint translate_alpha_opcode(GLuint opcode)
{
switch(opcode) {
case OPCODE_CMP: return R300_ALU_OUTA_CMP;
case OPCODE_DP3: return R300_ALU_OUTA_DP4;
case OPCODE_DP4: return R300_ALU_OUTA_DP4;
case OPCODE_EX2: return R300_ALU_OUTA_EX2;
case OPCODE_FRC: return R300_ALU_OUTA_FRC;
case OPCODE_LG2: return R300_ALU_OUTA_LG2;
case OPCODE_CMP: return R600_ALU_OUTA_CMP;
case OPCODE_DP3: return R600_ALU_OUTA_DP4;
case OPCODE_DP4: return R600_ALU_OUTA_DP4;
case OPCODE_EX2: return R600_ALU_OUTA_EX2;
case OPCODE_FRC: return R600_ALU_OUTA_FRC;
case OPCODE_LG2: return R600_ALU_OUTA_LG2;
default:
error("translate_rgb_opcode(%i): Unknown opcode", opcode);
/* fall through */
case OPCODE_NOP:
/* fall through */
case OPCODE_MAD: return R300_ALU_OUTA_MAD;
case OPCODE_MAX: return R300_ALU_OUTA_MAX;
case OPCODE_MIN: return R300_ALU_OUTA_MIN;
case OPCODE_RCP: return R300_ALU_OUTA_RCP;
case OPCODE_RSQ: return R300_ALU_OUTA_RSQ;
case OPCODE_MAD: return R600_ALU_OUTA_MAD;
case OPCODE_MAX: return R600_ALU_OUTA_MAX;
case OPCODE_MIN: return R600_ALU_OUTA_MIN;
case OPCODE_RCP: return R600_ALU_OUTA_RCP;
case OPCODE_RSQ: return R600_ALU_OUTA_RSQ;
}
}
@@ -161,46 +161,46 @@ static GLboolean emit_alu(void* data, struct radeon_pair_instruction* inst)
use_temporary(code, inst->Alpha.Src[j].Index);
code->alu.inst[ip].inst3 |= src << (6*j);
GLuint arg = r300FPTranslateRGBSwizzle(inst->RGB.Arg[j].Source, inst->RGB.Arg[j].Swizzle);
GLuint arg = r600FPTranslateRGBSwizzle(inst->RGB.Arg[j].Source, inst->RGB.Arg[j].Swizzle);
arg |= inst->RGB.Arg[j].Abs << 6;
arg |= inst->RGB.Arg[j].Negate << 5;
code->alu.inst[ip].inst0 |= arg << (7*j);
arg = r300FPTranslateAlphaSwizzle(inst->Alpha.Arg[j].Source, inst->Alpha.Arg[j].Swizzle);
arg = r600FPTranslateAlphaSwizzle(inst->Alpha.Arg[j].Source, inst->Alpha.Arg[j].Swizzle);
arg |= inst->Alpha.Arg[j].Abs << 6;
arg |= inst->Alpha.Arg[j].Negate << 5;
code->alu.inst[ip].inst2 |= arg << (7*j);
}
if (inst->RGB.Saturate)
code->alu.inst[ip].inst0 |= R300_ALU_OUTC_CLAMP;
code->alu.inst[ip].inst0 |= R600_ALU_OUTC_CLAMP;
if (inst->Alpha.Saturate)
code->alu.inst[ip].inst2 |= R300_ALU_OUTA_CLAMP;
code->alu.inst[ip].inst2 |= R600_ALU_OUTA_CLAMP;
if (inst->RGB.WriteMask) {
use_temporary(code, inst->RGB.DestIndex);
code->alu.inst[ip].inst1 |=
(inst->RGB.DestIndex << R300_ALU_DSTC_SHIFT) |
(inst->RGB.WriteMask << R300_ALU_DSTC_REG_MASK_SHIFT);
(inst->RGB.DestIndex << R600_ALU_DSTC_SHIFT) |
(inst->RGB.WriteMask << R600_ALU_DSTC_REG_MASK_SHIFT);
}
if (inst->RGB.OutputWriteMask) {
code->alu.inst[ip].inst1 |= (inst->RGB.OutputWriteMask << R300_ALU_DSTC_OUTPUT_MASK_SHIFT);
code->node[code->cur_node].flags |= R300_RGBA_OUT;
code->alu.inst[ip].inst1 |= (inst->RGB.OutputWriteMask << R600_ALU_DSTC_OUTPUT_MASK_SHIFT);
code->node[code->cur_node].flags |= R600_RGBA_OUT;
}
if (inst->Alpha.WriteMask) {
use_temporary(code, inst->Alpha.DestIndex);
code->alu.inst[ip].inst3 |=
(inst->Alpha.DestIndex << R300_ALU_DSTA_SHIFT) |
R300_ALU_DSTA_REG;
(inst->Alpha.DestIndex << R600_ALU_DSTA_SHIFT) |
R600_ALU_DSTA_REG;
}
if (inst->Alpha.OutputWriteMask) {
code->alu.inst[ip].inst3 |= R300_ALU_DSTA_OUTPUT;
code->node[code->cur_node].flags |= R300_RGBA_OUT;
code->alu.inst[ip].inst3 |= R600_ALU_DSTA_OUTPUT;
code->node[code->cur_node].flags |= R600_RGBA_OUT;
}
if (inst->Alpha.DepthWriteMask) {
code->alu.inst[ip].inst3 |= R300_ALU_DSTA_DEPTH;
code->node[code->cur_node].flags |= R300_W_OUT;
code->alu.inst[ip].inst3 |= R600_ALU_DSTA_DEPTH;
code->node[code->cur_node].flags |= R600_W_OUT;
c->fp->WritesDepth = GL_TRUE;
}
@@ -211,10 +211,10 @@ static GLboolean emit_alu(void* data, struct radeon_pair_instruction* inst)
/**
* Finish the current node without advancing to the next one.
*/
static GLboolean finish_node(struct r300_fragment_program_compiler *c)
static GLboolean finish_node(struct r600_fragment_program_compiler *c)
{
struct r300_fragment_program_code *code = c->code;
struct r300_fragment_program_node *node = &code->node[code->cur_node];
struct r600_fragment_program_code *code = c->code;
struct r600_fragment_program_node *node = &code->node[code->cur_node];
if (node->alu_end < 0) {
/* Generate a single NOP for this node */
@@ -262,7 +262,7 @@ static GLboolean begin_tex(void* data)
if (!finish_node(c))
return GL_FALSE;
struct r300_fragment_program_node *node = &code->node[++code->cur_node];
struct r600_fragment_program_node *node = &code->node[++code->cur_node];
node->alu_offset = code->alu.length;
node->alu_end = -1;
node->tex_offset = code->tex.length;
@@ -285,10 +285,10 @@ static GLboolean emit_tex(void* data, struct prog_instruction* inst)
GLuint opcode;
switch(inst->Opcode) {
case OPCODE_KIL: opcode = R300_TEX_OP_KIL; break;
case OPCODE_TEX: opcode = R300_TEX_OP_LD; break;
case OPCODE_TXB: opcode = R300_TEX_OP_TXB; break;
case OPCODE_TXP: opcode = R300_TEX_OP_TXP; break;
case OPCODE_KIL: opcode = R600_TEX_OP_KIL; break;
case OPCODE_TEX: opcode = R600_TEX_OP_LD; break;
case OPCODE_TXB: opcode = R600_TEX_OP_TXB; break;
case OPCODE_TXP: opcode = R600_TEX_OP_TXP; break;
default:
error("Unknown texture opcode %i", inst->Opcode);
return GL_FALSE;
@@ -305,10 +305,10 @@ static GLboolean emit_tex(void* data, struct prog_instruction* inst)
code->node[code->cur_node].tex_end++;
code->tex.inst[code->tex.length++] =
(inst->SrcReg[0].Index << R300_SRC_ADDR_SHIFT) |
(dest << R300_DST_ADDR_SHIFT) |
(unit << R300_TEX_ID_SHIFT) |
(opcode << R300_TEX_INST_SHIFT);
(inst->SrcReg[0].Index << R600_SRC_ADDR_SHIFT) |
(dest << R600_DST_ADDR_SHIFT) |
(unit << R600_TEX_ID_SHIFT) |
(opcode << R600_TEX_INST_SHIFT);
return GL_TRUE;
}
@@ -325,15 +325,15 @@ static const struct radeon_pair_handler pair_handler = {
* Final compilation step: Turn the intermediate radeon_program into
* machine-readable instructions.
*/
GLboolean r300FragmentProgramEmit(struct r300_fragment_program_compiler *compiler)
GLboolean r600FragmentProgramEmit(struct r600_fragment_program_compiler *compiler)
{
struct r300_fragment_program_code *code = compiler->code;
struct r600_fragment_program_code *code = compiler->code;
_mesa_bzero(code, sizeof(struct r300_fragment_program_code));
_mesa_bzero(code, sizeof(struct r600_fragment_program_code));
code->node[0].alu_end = -1;
code->node[0].tex_end = -1;
if (!radeonPairProgram(compiler->r300->radeon.glCtx, compiler->program, &pair_handler, compiler))
if (!radeonPairProgram(compiler->r600->radeon.glCtx, compiler->program, &pair_handler, compiler))
return GL_FALSE;
if (!finish_node(compiler))
@@ -27,7 +27,7 @@
/**
* @file
* Utilities to deal with the somewhat odd restriction on R300 fragment
* Utilities to deal with the somewhat odd restriction on R600 fragment
* program swizzles.
*/
@@ -45,16 +45,16 @@ struct swizzle_data {
};
static const struct swizzle_data native_swizzles[] = {
{MAKE_SWZ3(X, Y, Z), R300_ALU_ARGC_SRC0C_XYZ, 4},
{MAKE_SWZ3(X, X, X), R300_ALU_ARGC_SRC0C_XXX, 4},
{MAKE_SWZ3(Y, Y, Y), R300_ALU_ARGC_SRC0C_YYY, 4},
{MAKE_SWZ3(Z, Z, Z), R300_ALU_ARGC_SRC0C_ZZZ, 4},
{MAKE_SWZ3(W, W, W), R300_ALU_ARGC_SRC0A, 1},
{MAKE_SWZ3(Y, Z, X), R300_ALU_ARGC_SRC0C_YZX, 1},
{MAKE_SWZ3(Z, X, Y), R300_ALU_ARGC_SRC0C_ZXY, 1},
{MAKE_SWZ3(W, Z, Y), R300_ALU_ARGC_SRC0CA_WZY, 1},
{MAKE_SWZ3(ONE, ONE, ONE), R300_ALU_ARGC_ONE, 0},
{MAKE_SWZ3(ZERO, ZERO, ZERO), R300_ALU_ARGC_ZERO, 0}
{MAKE_SWZ3(X, Y, Z), R600_ALU_ARGC_SRC0C_XYZ, 4},
{MAKE_SWZ3(X, X, X), R600_ALU_ARGC_SRC0C_XXX, 4},
{MAKE_SWZ3(Y, Y, Y), R600_ALU_ARGC_SRC0C_YYY, 4},
{MAKE_SWZ3(Z, Z, Z), R600_ALU_ARGC_SRC0C_ZZZ, 4},
{MAKE_SWZ3(W, W, W), R600_ALU_ARGC_SRC0A, 1},
{MAKE_SWZ3(Y, Z, X), R600_ALU_ARGC_SRC0C_YZX, 1},
{MAKE_SWZ3(Z, X, Y), R600_ALU_ARGC_SRC0C_ZXY, 1},
{MAKE_SWZ3(W, Z, Y), R600_ALU_ARGC_SRC0CA_WZY, 1},
{MAKE_SWZ3(ONE, ONE, ONE), R600_ALU_ARGC_ONE, 0},
{MAKE_SWZ3(ZERO, ZERO, ZERO), R600_ALU_ARGC_ZERO, 0}
};
static const int num_native_swizzles = sizeof(native_swizzles)/sizeof(native_swizzles[0]);
@@ -89,7 +89,7 @@ static const struct swizzle_data* lookup_native_swizzle(GLuint swizzle)
* Check whether the given instruction supports the swizzle and negate
* combinations in the given source register.
*/
GLboolean r300FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg)
GLboolean r600FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg)
{
if (reg.Abs)
reg.NegateBase = 0;
@@ -134,7 +134,7 @@ GLboolean r300FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg)
/**
* Generate MOV dst, src using only native swizzles.
*/
void r300FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst, struct prog_src_register src)
void r600FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst, struct prog_src_register src)
{
if (src.Abs)
src.NegateBase = 0;
@@ -196,7 +196,7 @@ void r300FPBuildSwizzle(struct nqssadce_state *s, struct prog_dst_register dst,
* Translate an RGB (XYZ) swizzle into the hardware code for the given
* instruction source.
*/
GLuint r300FPTranslateRGBSwizzle(GLuint src, GLuint swizzle)
GLuint r600FPTranslateRGBSwizzle(GLuint src, GLuint swizzle)
{
const struct swizzle_data* sd = lookup_native_swizzle(swizzle);
@@ -213,15 +213,15 @@ GLuint r300FPTranslateRGBSwizzle(GLuint src, GLuint swizzle)
* Translate an Alpha (W) swizzle into the hardware code for the given
* instruction source.
*/
GLuint r300FPTranslateAlphaSwizzle(GLuint src, GLuint swizzle)
GLuint r600FPTranslateAlphaSwizzle(GLuint src, GLuint swizzle)
{
if (swizzle < 3)
return swizzle + 3*src;
switch(swizzle) {
case SWIZZLE_W: return R300_ALU_ARGA_SRC0A + src;
case SWIZZLE_ONE: return R300_ALU_ARGA_ONE;
case SWIZZLE_ZERO: return R300_ALU_ARGA_ZERO;
default: return R300_ALU_ARGA_ONE;
case SWIZZLE_W: return R600_ALU_ARGA_SRC0A + src;
case SWIZZLE_ONE: return R600_ALU_ARGA_ONE;
case SWIZZLE_ZERO: return R600_ALU_ARGA_ZERO;
default: return R600_ALU_ARGA_ONE;
}
}
@@ -33,10 +33,10 @@
struct nqssadce_state;
GLboolean r300FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg);
void r300FPBuildSwizzle(struct nqssadce_state*, struct prog_dst_register dst, struct prog_src_register src);
GLboolean r600FPIsNativeSwizzle(GLuint opcode, struct prog_src_register reg);
void r600FPBuildSwizzle(struct nqssadce_state*, struct prog_dst_register dst, struct prog_src_register src);
GLuint r300FPTranslateRGBSwizzle(GLuint src, GLuint swizzle);
GLuint r300FPTranslateAlphaSwizzle(GLuint src, GLuint swizzle);
GLuint r600FPTranslateRGBSwizzle(GLuint src, GLuint swizzle);
GLuint r600FPTranslateAlphaSwizzle(GLuint src, GLuint swizzle);
#endif /* __R300_FRAGPROG_SWIZZLE_H_ */
#endif /* __R600_FRAGPROG_SWIZZLE_H_ */
+185 -185
View File
@@ -66,22 +66,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define CLEARBUFFER_DEPTH 0x2
#define CLEARBUFFER_STENCIL 0x4
static void r300EmitClearState(GLcontext * ctx);
static void r600EmitClearState(GLcontext * ctx);
static void r300UserClear(GLcontext *ctx, GLuint mask)
static void r600UserClear(GLcontext *ctx, GLuint mask)
{
radeon_clear_tris(ctx, mask);
}
static void r300ClearBuffer(r300ContextPtr r300, int flags,
static void r600ClearBuffer(r600ContextPtr r600, int flags,
struct radeon_renderbuffer *rrb,
struct radeon_renderbuffer *rrbd)
{
BATCH_LOCALS(&r300->radeon);
GLcontext *ctx = r300->radeon.glCtx;
__DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
BATCH_LOCALS(&r600->radeon);
GLcontext *ctx = r600->radeon.glCtx;
__DRIdrawablePrivate *dPriv = r600->radeon.dri.drawable;
GLuint cbpitch = 0;
r300ContextPtr rmesa = r300;
r600ContextPtr rmesa = r600;
if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "%s: buffer %p (%i,%i %ix%i)\n",
@@ -91,25 +91,25 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags,
if (rrb) {
cbpitch = (rrb->pitch / rrb->cpp);
if (rrb->cpp == 4)
cbpitch |= R300_COLOR_FORMAT_ARGB8888;
cbpitch |= R600_COLOR_FORMAT_ARGB8888;
else
cbpitch |= R300_COLOR_FORMAT_RGB565;
cbpitch |= R600_COLOR_FORMAT_RGB565;
if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE){
cbpitch |= R300_COLOR_TILE_ENABLE;
cbpitch |= R600_COLOR_TILE_ENABLE;
}
}
/* TODO in bufmgr */
cp_wait(&r300->radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
cp_wait(&r600->radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
end_3d(&rmesa->radeon);
if (flags & CLEARBUFFER_COLOR) {
assert(rrb != 0);
BEGIN_BATCH_NO_AUTOSTATE(6);
OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0, 1);
OUT_BATCH_REGSEQ(R600_RB3D_COLOROFFSET0, 1);
OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
OUT_BATCH_REGVAL(R300_RB3D_COLORPITCH0, cbpitch);
OUT_BATCH_REGVAL(R600_RB3D_COLORPITCH0, cbpitch);
END_BATCH();
}
#if 1
@@ -117,15 +117,15 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags,
assert(rrbd != 0);
cbpitch = (rrbd->pitch / rrbd->cpp);
if (rrbd->bo->flags & RADEON_BO_FLAGS_MACRO_TILE){
cbpitch |= R300_DEPTHMACROTILE_ENABLE;
cbpitch |= R600_DEPTHMACROTILE_ENABLE;
}
if (rrbd->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
cbpitch |= R300_DEPTHMICROTILE_TILED;
cbpitch |= R600_DEPTHMICROTILE_TILED;
}
BEGIN_BATCH_NO_AUTOSTATE(6);
OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
OUT_BATCH_REGSEQ(R600_ZB_DEPTHOFFSET, 1);
OUT_BATCH_RELOC(0, rrbd->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH, cbpitch);
OUT_BATCH_REGVAL(R600_ZB_DEPTHPITCH, cbpitch);
END_BATCH();
}
#endif
@@ -148,36 +148,36 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags,
t2 = 0x0;
if (flags & CLEARBUFFER_DEPTH) {
t1 |= R300_Z_ENABLE | R300_Z_WRITE_ENABLE;
t1 |= R600_Z_ENABLE | R600_Z_WRITE_ENABLE;
t2 |=
(R300_ZS_ALWAYS << R300_Z_FUNC_SHIFT);
(R600_ZS_ALWAYS << R600_Z_FUNC_SHIFT);
}
if (flags & CLEARBUFFER_STENCIL) {
t1 |= R300_STENCIL_ENABLE;
t1 |= R600_STENCIL_ENABLE;
t2 |=
(R300_ZS_ALWAYS <<
R300_S_FRONT_FUNC_SHIFT) |
(R300_ZS_REPLACE <<
R300_S_FRONT_SFAIL_OP_SHIFT) |
(R300_ZS_REPLACE <<
R300_S_FRONT_ZPASS_OP_SHIFT) |
(R300_ZS_REPLACE <<
R300_S_FRONT_ZFAIL_OP_SHIFT);
(R600_ZS_ALWAYS <<
R600_S_FRONT_FUNC_SHIFT) |
(R600_ZS_REPLACE <<
R600_S_FRONT_SFAIL_OP_SHIFT) |
(R600_ZS_REPLACE <<
R600_S_FRONT_ZPASS_OP_SHIFT) |
(R600_ZS_REPLACE <<
R600_S_FRONT_ZFAIL_OP_SHIFT);
}
OUT_BATCH_REGSEQ(R300_ZB_CNTL, 3);
OUT_BATCH_REGSEQ(R600_ZB_CNTL, 3);
OUT_BATCH(t1);
OUT_BATCH(t2);
OUT_BATCH(((ctx->Stencil.WriteMask[0] & R300_STENCILREF_MASK) <<
R300_STENCILWRITEMASK_SHIFT) |
(ctx->Stencil.Clear & R300_STENCILREF_MASK));
OUT_BATCH(((ctx->Stencil.WriteMask[0] & R600_STENCILREF_MASK) <<
R600_STENCILWRITEMASK_SHIFT) |
(ctx->Stencil.Clear & R600_STENCILREF_MASK));
END_BATCH();
}
if (!rmesa->radeon.radeonScreen->kernel_mm) {
BEGIN_BATCH_NO_AUTOSTATE(9);
OUT_BATCH(cmdpacket3(r300->radeon.radeonScreen, R300_CMD_PACKET3_CLEAR));
OUT_BATCH(cmdpacket3(r600->radeon.radeonScreen, R300_CMD_PACKET3_CLEAR));
OUT_BATCH_FLOAT32(dPriv->w / 2.0);
OUT_BATCH_FLOAT32(dPriv->h / 2.0);
OUT_BATCH_FLOAT32(ctx->Depth.Clear);
@@ -189,8 +189,8 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags,
END_BATCH();
} else {
OUT_BATCH(CP_PACKET3(R200_3D_DRAW_IMMD_2, 8));
OUT_BATCH(R300_PRIM_TYPE_POINT | R300_PRIM_WALK_RING |
(1 << R300_PRIM_NUM_VERTICES_SHIFT));
OUT_BATCH(R600_PRIM_TYPE_POINT | R600_PRIM_WALK_RING |
(1 << R600_PRIM_NUM_VERTICES_SHIFT));
OUT_BATCH_FLOAT32(dPriv->w / 2.0);
OUT_BATCH_FLOAT32(dPriv->h / 2.0);
OUT_BATCH_FLOAT32(ctx->Depth.Clear);
@@ -201,28 +201,28 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags,
OUT_BATCH_FLOAT32(ctx->Color.ClearColor[3]);
}
r300EmitCacheFlush(rmesa);
cp_wait(&r300->radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
r600EmitCacheFlush(rmesa);
cp_wait(&r600->radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
R300_STATECHANGE(r300, cb);
R300_STATECHANGE(r300, cmk);
R300_STATECHANGE(r300, zs);
R600_STATECHANGE(r600, cb);
R600_STATECHANGE(r600, cmk);
R600_STATECHANGE(r600, zs);
}
static void r300EmitClearState(GLcontext * ctx)
static void r600EmitClearState(GLcontext * ctx)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
BATCH_LOCALS(&r300->radeon);
__DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
r600ContextPtr r600 = R600_CONTEXT(ctx);
BATCH_LOCALS(&r600->radeon);
__DRIdrawablePrivate *dPriv = r600->radeon.dri.drawable;
int i;
int has_tcl = 1;
int is_r500 = 0;
GLuint vap_cntl;
if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
if (!(r600->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
has_tcl = 0;
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
if (r600->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
is_r500 = 1;
/* State atom dirty tracking is a little subtle here.
@@ -233,61 +233,61 @@ static void r300EmitClearState(GLcontext * ctx)
* BEGIN_BATCH cannot be a BEGIN_BATCH_NO_AUTOSTATE.
*
* On the other hand, implicit state emission clears the state atom
* dirty bits, so we have to call R300_STATECHANGE later than the
* dirty bits, so we have to call R600_STATECHANGE later than the
* first BEGIN_BATCH.
*
* The final trickiness is that, because we change state, we need
* to ensure that any stored swtcl primitives are flushed properly
* before we start changing state. See the R300_NEWPRIM in r300Clear
* before we start changing state. See the R600_NEWPRIM in r600Clear
* for this.
*/
BEGIN_BATCH(31);
OUT_BATCH_REGSEQ(R300_VAP_PROG_STREAM_CNTL_0, 1);
OUT_BATCH_REGSEQ(R600_VAP_PROG_STREAM_CNTL_0, 1);
if (!has_tcl)
OUT_BATCH(((((0 << R300_DST_VEC_LOC_SHIFT) | R300_DATA_TYPE_FLOAT_4) << R300_DATA_TYPE_0_SHIFT) |
((R300_LAST_VEC | (2 << R300_DST_VEC_LOC_SHIFT) | R300_DATA_TYPE_FLOAT_4) << R300_DATA_TYPE_1_SHIFT)));
OUT_BATCH(((((0 << R600_DST_VEC_LOC_SHIFT) | R600_DATA_TYPE_FLOAT_4) << R600_DATA_TYPE_0_SHIFT) |
((R600_LAST_VEC | (2 << R600_DST_VEC_LOC_SHIFT) | R600_DATA_TYPE_FLOAT_4) << R600_DATA_TYPE_1_SHIFT)));
else
OUT_BATCH(((((0 << R300_DST_VEC_LOC_SHIFT) | R300_DATA_TYPE_FLOAT_4) << R300_DATA_TYPE_0_SHIFT) |
((R300_LAST_VEC | (1 << R300_DST_VEC_LOC_SHIFT) | R300_DATA_TYPE_FLOAT_4) << R300_DATA_TYPE_1_SHIFT)));
OUT_BATCH(((((0 << R600_DST_VEC_LOC_SHIFT) | R600_DATA_TYPE_FLOAT_4) << R600_DATA_TYPE_0_SHIFT) |
((R600_LAST_VEC | (1 << R600_DST_VEC_LOC_SHIFT) | R600_DATA_TYPE_FLOAT_4) << R600_DATA_TYPE_1_SHIFT)));
OUT_BATCH_REGVAL(R300_FG_FOG_BLEND, 0);
OUT_BATCH_REGVAL(R300_VAP_PROG_STREAM_CNTL_EXT_0,
((((R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_SHIFT) |
(R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_SHIFT) |
(R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_SHIFT) |
(R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_SHIFT) |
((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W) << R300_WRITE_ENA_SHIFT))
<< R300_SWIZZLE0_SHIFT) |
(((R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_SHIFT) |
(R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_SHIFT) |
(R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_SHIFT) |
(R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_SHIFT) |
((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W) << R300_WRITE_ENA_SHIFT))
<< R300_SWIZZLE1_SHIFT)));
OUT_BATCH_REGVAL(R600_FG_FOG_BLEND, 0);
OUT_BATCH_REGVAL(R600_VAP_PROG_STREAM_CNTL_EXT_0,
((((R600_SWIZZLE_SELECT_X << R600_SWIZZLE_SELECT_X_SHIFT) |
(R600_SWIZZLE_SELECT_Y << R600_SWIZZLE_SELECT_Y_SHIFT) |
(R600_SWIZZLE_SELECT_Z << R600_SWIZZLE_SELECT_Z_SHIFT) |
(R600_SWIZZLE_SELECT_W << R600_SWIZZLE_SELECT_W_SHIFT) |
((R600_WRITE_ENA_X | R600_WRITE_ENA_Y | R600_WRITE_ENA_Z | R600_WRITE_ENA_W) << R600_WRITE_ENA_SHIFT))
<< R600_SWIZZLE0_SHIFT) |
(((R600_SWIZZLE_SELECT_X << R600_SWIZZLE_SELECT_X_SHIFT) |
(R600_SWIZZLE_SELECT_Y << R600_SWIZZLE_SELECT_Y_SHIFT) |
(R600_SWIZZLE_SELECT_Z << R600_SWIZZLE_SELECT_Z_SHIFT) |
(R600_SWIZZLE_SELECT_W << R600_SWIZZLE_SELECT_W_SHIFT) |
((R600_WRITE_ENA_X | R600_WRITE_ENA_Y | R600_WRITE_ENA_Z | R600_WRITE_ENA_W) << R600_WRITE_ENA_SHIFT))
<< R600_SWIZZLE1_SHIFT)));
/* R300_VAP_INPUT_CNTL_0, R300_VAP_INPUT_CNTL_1 */
OUT_BATCH_REGSEQ(R300_VAP_VTX_STATE_CNTL, 2);
OUT_BATCH((R300_SEL_USER_COLOR_0 << R300_COLOR_0_ASSEMBLY_SHIFT));
OUT_BATCH(R300_INPUT_CNTL_POS | R300_INPUT_CNTL_COLOR | R300_INPUT_CNTL_TC0);
/* R600_VAP_INPUT_CNTL_0, R600_VAP_INPUT_CNTL_1 */
OUT_BATCH_REGSEQ(R600_VAP_VTX_STATE_CNTL, 2);
OUT_BATCH((R600_SEL_USER_COLOR_0 << R600_COLOR_0_ASSEMBLY_SHIFT));
OUT_BATCH(R600_INPUT_CNTL_POS | R600_INPUT_CNTL_COLOR | R600_INPUT_CNTL_TC0);
/* comes from fglrx startup of clear */
OUT_BATCH_REGSEQ(R300_SE_VTE_CNTL, 2);
OUT_BATCH(R300_VTX_W0_FMT | R300_VPORT_X_SCALE_ENA |
R300_VPORT_X_OFFSET_ENA | R300_VPORT_Y_SCALE_ENA |
R300_VPORT_Y_OFFSET_ENA | R300_VPORT_Z_SCALE_ENA |
R300_VPORT_Z_OFFSET_ENA);
OUT_BATCH_REGSEQ(R600_SE_VTE_CNTL, 2);
OUT_BATCH(R600_VTX_W0_FMT | R600_VPORT_X_SCALE_ENA |
R600_VPORT_X_OFFSET_ENA | R600_VPORT_Y_SCALE_ENA |
R600_VPORT_Y_OFFSET_ENA | R600_VPORT_Z_SCALE_ENA |
R600_VPORT_Z_OFFSET_ENA);
OUT_BATCH(0x8);
OUT_BATCH_REGVAL(R300_VAP_PSC_SGN_NORM_CNTL, 0xaaaaaaaa);
OUT_BATCH_REGVAL(R600_VAP_PSC_SGN_NORM_CNTL, 0xaaaaaaaa);
OUT_BATCH_REGSEQ(R300_VAP_OUTPUT_VTX_FMT_0, 2);
OUT_BATCH(R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT |
R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT);
OUT_BATCH_REGSEQ(R600_VAP_OUTPUT_VTX_FMT_0, 2);
OUT_BATCH(R600_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT |
R600_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT);
OUT_BATCH(0); /* no textures */
OUT_BATCH_REGVAL(R300_TX_ENABLE, 0);
OUT_BATCH_REGVAL(R600_TX_ENABLE, 0);
OUT_BATCH_REGSEQ(R300_SE_VPORT_XSCALE, 6);
OUT_BATCH_REGSEQ(R600_SE_VPORT_XSCALE, 6);
OUT_BATCH_FLOAT32(1.0);
OUT_BATCH_FLOAT32(dPriv->x);
OUT_BATCH_FLOAT32(1.0);
@@ -295,59 +295,59 @@ static void r300EmitClearState(GLcontext * ctx)
OUT_BATCH_FLOAT32(1.0);
OUT_BATCH_FLOAT32(0.0);
OUT_BATCH_REGVAL(R300_FG_ALPHA_FUNC, 0);
OUT_BATCH_REGVAL(R600_FG_ALPHA_FUNC, 0);
OUT_BATCH_REGSEQ(R300_RB3D_CBLEND, 2);
OUT_BATCH_REGSEQ(R600_RB3D_CBLEND, 2);
OUT_BATCH(0x0);
OUT_BATCH(0x0);
END_BATCH();
R300_STATECHANGE(r300, vir[0]);
R300_STATECHANGE(r300, fogs);
R300_STATECHANGE(r300, vir[1]);
R300_STATECHANGE(r300, vic);
R300_STATECHANGE(r300, vte);
R300_STATECHANGE(r300, vof);
R300_STATECHANGE(r300, txe);
R300_STATECHANGE(r300, vpt);
R300_STATECHANGE(r300, at);
R300_STATECHANGE(r300, bld);
R300_STATECHANGE(r300, ps);
R600_STATECHANGE(r600, vir[0]);
R600_STATECHANGE(r600, fogs);
R600_STATECHANGE(r600, vir[1]);
R600_STATECHANGE(r600, vic);
R600_STATECHANGE(r600, vte);
R600_STATECHANGE(r600, vof);
R600_STATECHANGE(r600, txe);
R600_STATECHANGE(r600, vpt);
R600_STATECHANGE(r600, at);
R600_STATECHANGE(r600, bld);
R600_STATECHANGE(r600, ps);
if (has_tcl) {
R300_STATECHANGE(r300, vap_clip_cntl);
R600_STATECHANGE(r600, vap_clip_cntl);
BEGIN_BATCH_NO_AUTOSTATE(2);
OUT_BATCH_REGVAL(R300_VAP_CLIP_CNTL, R300_PS_UCP_MODE_CLIP_AS_TRIFAN | R300_CLIP_DISABLE);
OUT_BATCH_REGVAL(R600_VAP_CLIP_CNTL, R600_PS_UCP_MODE_CLIP_AS_TRIFAN | R600_CLIP_DISABLE);
END_BATCH();
}
BEGIN_BATCH_NO_AUTOSTATE(2);
OUT_BATCH_REGVAL(R300_GA_POINT_SIZE,
((dPriv->w * 6) << R300_POINTSIZE_X_SHIFT) |
((dPriv->h * 6) << R300_POINTSIZE_Y_SHIFT));
OUT_BATCH_REGVAL(R600_GA_POINT_SIZE,
((dPriv->w * 6) << R600_POINTSIZE_X_SHIFT) |
((dPriv->h * 6) << R600_POINTSIZE_Y_SHIFT));
END_BATCH();
if (!is_r500) {
R300_STATECHANGE(r300, ri);
R300_STATECHANGE(r300, rc);
R300_STATECHANGE(r300, rr);
R600_STATECHANGE(r600, ri);
R600_STATECHANGE(r600, rc);
R600_STATECHANGE(r600, rr);
BEGIN_BATCH(14);
OUT_BATCH_REGSEQ(R300_RS_IP_0, 8);
OUT_BATCH_REGSEQ(R600_RS_IP_0, 8);
for (i = 0; i < 8; ++i)
OUT_BATCH(R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3));
OUT_BATCH(R600_RS_SEL_T(1) | R600_RS_SEL_R(2) | R600_RS_SEL_Q(3));
OUT_BATCH_REGSEQ(R300_RS_COUNT, 2);
OUT_BATCH((1 << R300_IC_COUNT_SHIFT) | R300_HIRES_EN);
OUT_BATCH_REGSEQ(R600_RS_COUNT, 2);
OUT_BATCH((1 << R600_IC_COUNT_SHIFT) | R600_HIRES_EN);
OUT_BATCH(0x0);
OUT_BATCH_REGVAL(R300_RS_INST_0, R300_RS_INST_COL_CN_WRITE);
OUT_BATCH_REGVAL(R600_RS_INST_0, R600_RS_INST_COL_CN_WRITE);
END_BATCH();
} else {
R300_STATECHANGE(r300, ri);
R300_STATECHANGE(r300, rc);
R300_STATECHANGE(r300, rr);
R600_STATECHANGE(r600, ri);
R600_STATECHANGE(r600, rc);
R600_STATECHANGE(r600, rr);
BEGIN_BATCH(14);
OUT_BATCH_REGSEQ(R500_RS_IP_0, 8);
@@ -358,8 +358,8 @@ static void r300EmitClearState(GLcontext * ctx)
(R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT));
}
OUT_BATCH_REGSEQ(R300_RS_COUNT, 2);
OUT_BATCH((1 << R300_IC_COUNT_SHIFT) | R300_HIRES_EN);
OUT_BATCH_REGSEQ(R600_RS_COUNT, 2);
OUT_BATCH((1 << R600_IC_COUNT_SHIFT) | R600_HIRES_EN);
OUT_BATCH(0x0);
OUT_BATCH_REGVAL(R500_RS_INST_0, R500_RS_INST_COL_CN_WRITE);
@@ -367,38 +367,38 @@ static void r300EmitClearState(GLcontext * ctx)
}
if (!is_r500) {
R300_STATECHANGE(r300, fp);
R300_STATECHANGE(r300, fpi[0]);
R300_STATECHANGE(r300, fpi[1]);
R300_STATECHANGE(r300, fpi[2]);
R300_STATECHANGE(r300, fpi[3]);
R600_STATECHANGE(r600, fp);
R600_STATECHANGE(r600, fpi[0]);
R600_STATECHANGE(r600, fpi[1]);
R600_STATECHANGE(r600, fpi[2]);
R600_STATECHANGE(r600, fpi[3]);
BEGIN_BATCH(17);
OUT_BATCH_REGSEQ(R300_US_CONFIG, 3);
OUT_BATCH_REGSEQ(R600_US_CONFIG, 3);
OUT_BATCH(0x0);
OUT_BATCH(0x0);
OUT_BATCH(0x0);
OUT_BATCH_REGSEQ(R300_US_CODE_ADDR_0, 4);
OUT_BATCH_REGSEQ(R600_US_CODE_ADDR_0, 4);
OUT_BATCH(0x0);
OUT_BATCH(0x0);
OUT_BATCH(0x0);
OUT_BATCH(R300_RGBA_OUT);
OUT_BATCH(R600_RGBA_OUT);
OUT_BATCH_REGVAL(R300_US_ALU_RGB_INST_0,
OUT_BATCH_REGVAL(R600_US_ALU_RGB_INST_0,
FP_INSTRC(MAD, FP_ARGC(SRC0C_XYZ), FP_ARGC(ONE), FP_ARGC(ZERO)));
OUT_BATCH_REGVAL(R300_US_ALU_RGB_ADDR_0,
OUT_BATCH_REGVAL(R600_US_ALU_RGB_ADDR_0,
FP_SELC(0, NO, XYZ, FP_TMP(0), 0, 0));
OUT_BATCH_REGVAL(R300_US_ALU_ALPHA_INST_0,
OUT_BATCH_REGVAL(R600_US_ALU_ALPHA_INST_0,
FP_INSTRA(MAD, FP_ARGA(SRC0A), FP_ARGA(ONE), FP_ARGA(ZERO)));
OUT_BATCH_REGVAL(R300_US_ALU_ALPHA_ADDR_0,
OUT_BATCH_REGVAL(R600_US_ALU_ALPHA_ADDR_0,
FP_SELA(0, NO, W, FP_TMP(0), 0, 0));
END_BATCH();
} else {
struct radeon_state_atom r500fp;
uint32_t _cmd[10];
R300_STATECHANGE(r300, fp);
R300_STATECHANGE(r300, r500fp);
R600_STATECHANGE(r600, fp);
R600_STATECHANGE(r600, r500fp);
BEGIN_BATCH(7);
OUT_BATCH_REGSEQ(R500_US_CONFIG, 2);
@@ -412,7 +412,7 @@ static void r300EmitClearState(GLcontext * ctx)
r500fp.check = check_r500fp;
r500fp.cmd = _cmd;
r500fp.cmd[0] = cmdr500fp(r300->radeon.radeonScreen, 0, 1, 0, 0);
r500fp.cmd[0] = cmdr500fp(r600->radeon.radeonScreen, 0, 1, 0, 0);
r500fp.cmd[1] = R500_INST_TYPE_OUT |
R500_INST_TEX_SEM_WAIT |
R500_INST_LAST |
@@ -454,61 +454,61 @@ static void r300EmitClearState(GLcontext * ctx)
}
BEGIN_BATCH(2);
OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0);
OUT_BATCH_REGVAL(R600_VAP_PVS_STATE_FLUSH_REG, 0);
END_BATCH();
if (has_tcl) {
vap_cntl = ((10 << R300_PVS_NUM_SLOTS_SHIFT) |
(5 << R300_PVS_NUM_CNTLRS_SHIFT) |
(12 << R300_VF_MAX_VTX_NUM_SHIFT));
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
vap_cntl = ((10 << R600_PVS_NUM_SLOTS_SHIFT) |
(5 << R600_PVS_NUM_CNTLRS_SHIFT) |
(12 << R600_VF_MAX_VTX_NUM_SHIFT));
if (r600->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
vap_cntl |= R500_TCL_STATE_OPTIMIZATION;
} else {
vap_cntl = ((10 << R300_PVS_NUM_SLOTS_SHIFT) |
(5 << R300_PVS_NUM_CNTLRS_SHIFT) |
(5 << R300_VF_MAX_VTX_NUM_SHIFT));
vap_cntl = ((10 << R600_PVS_NUM_SLOTS_SHIFT) |
(5 << R600_PVS_NUM_CNTLRS_SHIFT) |
(5 << R600_VF_MAX_VTX_NUM_SHIFT));
}
if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV515)
vap_cntl |= (2 << R300_PVS_NUM_FPUS_SHIFT);
else if ((r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530) ||
(r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV560) ||
(r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV570))
vap_cntl |= (5 << R300_PVS_NUM_FPUS_SHIFT);
else if ((r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV410) ||
(r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R420))
vap_cntl |= (6 << R300_PVS_NUM_FPUS_SHIFT);
else if ((r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R520) ||
(r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_R580))
vap_cntl |= (8 << R300_PVS_NUM_FPUS_SHIFT);
if (r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV515)
vap_cntl |= (2 << R600_PVS_NUM_FPUS_SHIFT);
else if ((r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530) ||
(r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV560) ||
(r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV570))
vap_cntl |= (5 << R600_PVS_NUM_FPUS_SHIFT);
else if ((r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV410) ||
(r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_R420))
vap_cntl |= (6 << R600_PVS_NUM_FPUS_SHIFT);
else if ((r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_R520) ||
(r600->radeon.radeonScreen->chip_family == CHIP_FAMILY_R580))
vap_cntl |= (8 << R600_PVS_NUM_FPUS_SHIFT);
else
vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT);
vap_cntl |= (4 << R600_PVS_NUM_FPUS_SHIFT);
R300_STATECHANGE(r300, vap_cntl);
R600_STATECHANGE(r600, vap_cntl);
BEGIN_BATCH(2);
OUT_BATCH_REGVAL(R300_VAP_CNTL, vap_cntl);
OUT_BATCH_REGVAL(R600_VAP_CNTL, vap_cntl);
END_BATCH();
if (has_tcl) {
struct radeon_state_atom vpu;
uint32_t _cmd[10];
R300_STATECHANGE(r300, pvs);
R300_STATECHANGE(r300, vpi);
R600_STATECHANGE(r600, pvs);
R600_STATECHANGE(r600, vpi);
BEGIN_BATCH(4);
OUT_BATCH_REGSEQ(R300_VAP_PVS_CODE_CNTL_0, 3);
OUT_BATCH((0 << R300_PVS_FIRST_INST_SHIFT) |
(0 << R300_PVS_XYZW_VALID_INST_SHIFT) |
(1 << R300_PVS_LAST_INST_SHIFT));
OUT_BATCH((0 << R300_PVS_CONST_BASE_OFFSET_SHIFT) |
(0 << R300_PVS_MAX_CONST_ADDR_SHIFT));
OUT_BATCH(1 << R300_PVS_LAST_VTX_SRC_INST_SHIFT);
OUT_BATCH_REGSEQ(R600_VAP_PVS_CODE_CNTL_0, 3);
OUT_BATCH((0 << R600_PVS_FIRST_INST_SHIFT) |
(0 << R600_PVS_XYZW_VALID_INST_SHIFT) |
(1 << R600_PVS_LAST_INST_SHIFT));
OUT_BATCH((0 << R600_PVS_CONST_BASE_OFFSET_SHIFT) |
(0 << R600_PVS_MAX_CONST_ADDR_SHIFT));
OUT_BATCH(1 << R600_PVS_LAST_VTX_SRC_INST_SHIFT);
END_BATCH();
vpu.check = check_vpu;
vpu.cmd = _cmd;
vpu.cmd[0] = cmdvpu(r300->radeon.radeonScreen, 0, 2);
vpu.cmd[0] = cmdvpu(r600->radeon.radeonScreen, 0, 2);
vpu.cmd[1] = PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE,
0, 0xf, PVS_DST_REG_OUT);
@@ -536,24 +536,24 @@ static void r300EmitClearState(GLcontext * ctx)
PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
vpu.cmd[8] = 0x0;
r300->vap_flush_needed = GL_TRUE;
r600->vap_flush_needed = GL_TRUE;
emit_vpu(ctx, &vpu);
}
}
static void r300KernelClear(GLcontext *ctx, GLuint flags)
static void r600KernelClear(GLcontext *ctx, GLuint flags)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
r600ContextPtr r600 = R600_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = r600->radeon.dri.drawable;
struct radeon_framebuffer *rfb = dPriv->driverPrivate;
struct radeon_renderbuffer *rrb;
struct radeon_renderbuffer *rrbd;
int bits = 0;
/* Make sure it fits there. */
rcommonEnsureCmdBufSpace(&r300->radeon, 421 * 3, __FUNCTION__);
rcommonEnsureCmdBufSpace(&r600->radeon, 421 * 3, __FUNCTION__);
if (flags || bits)
r300EmitClearState(ctx);
r600EmitClearState(ctx);
rrbd = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH);
if (rrbd && (flags & BUFFER_BIT_DEPTH))
bits |= CLEARBUFFER_DEPTH;
@@ -563,24 +563,24 @@ static void r300KernelClear(GLcontext *ctx, GLuint flags)
if (flags & BUFFER_BIT_COLOR0) {
rrb = radeon_get_renderbuffer(&rfb->base, BUFFER_COLOR0);
r300ClearBuffer(r300, CLEARBUFFER_COLOR, rrb, NULL);
r600ClearBuffer(r600, CLEARBUFFER_COLOR, rrb, NULL);
bits = 0;
}
if (flags & BUFFER_BIT_FRONT_LEFT) {
rrb = radeon_get_renderbuffer(&rfb->base, BUFFER_FRONT_LEFT);
r300ClearBuffer(r300, bits | CLEARBUFFER_COLOR, rrb, rrbd);
r600ClearBuffer(r600, bits | CLEARBUFFER_COLOR, rrb, rrbd);
bits = 0;
}
if (flags & BUFFER_BIT_BACK_LEFT) {
rrb = radeon_get_renderbuffer(&rfb->base, BUFFER_BACK_LEFT);
r300ClearBuffer(r300, bits | CLEARBUFFER_COLOR, rrb, rrbd);
r600ClearBuffer(r600, bits | CLEARBUFFER_COLOR, rrb, rrbd);
bits = 0;
}
if (bits)
r300ClearBuffer(r300, bits, NULL, rrbd);
r600ClearBuffer(r600, bits, NULL, rrbd);
COMMIT_BATCH();
}
@@ -588,30 +588,30 @@ static void r300KernelClear(GLcontext *ctx, GLuint flags)
/**
* Buffer clear
*/
static void r300Clear(GLcontext * ctx, GLbitfield mask)
static void r600Clear(GLcontext * ctx, GLbitfield mask)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
r600ContextPtr r600 = R600_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = r600->radeon.dri.drawable;
const GLuint colorMask = *((GLuint *) & ctx->Color.ColorMask);
GLbitfield swrast_mask = 0, tri_mask = 0;
int i;
struct gl_framebuffer *fb = ctx->DrawBuffer;
if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "r300Clear\n");
fprintf(stderr, "r600Clear\n");
if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
LOCK_HARDWARE(&r300->radeon);
UNLOCK_HARDWARE(&r300->radeon);
if (!r600->radeon.radeonScreen->driScreen->dri2.enabled) {
LOCK_HARDWARE(&r600->radeon);
UNLOCK_HARDWARE(&r600->radeon);
if (dPriv->numClipRects == 0)
return;
}
/* Flush swtcl vertices if necessary, because we will change hardware
* state during clear. See also the state-related comment in
* r300EmitClearState.
* r600EmitClearState.
*/
R300_NEWPRIM(r300);
R600_NEWPRIM(r600);
if (colorMask == ~0)
tri_mask |= (mask & BUFFER_BITS_COLOR);
@@ -645,10 +645,10 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
swrast_mask = mask & ~tri_mask;
if (tri_mask) {
if (r300->radeon.radeonScreen->kernel_mm)
r300UserClear(ctx, tri_mask);
if (r600->radeon.radeonScreen->kernel_mm)
r600UserClear(ctx, tri_mask);
else
r300KernelClear(ctx, tri_mask);
r600KernelClear(ctx, tri_mask);
}
if (swrast_mask) {
if (RADEON_DEBUG & DEBUG_FALLBACKS)
@@ -659,9 +659,9 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
}
void r300InitIoctlFuncs(struct dd_function_table *functions)
void r600InitIoctlFuncs(struct dd_function_table *functions)
{
functions->Clear = r300Clear;
functions->Clear = r600Clear;
functions->Finish = radeonFinish;
functions->Flush = radeonFlush;
}
+1 -1
View File
@@ -39,6 +39,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "r600_context.h"
#include "radeon_drm.h"
extern void r300InitIoctlFuncs(struct dd_function_table *functions);
extern void r600InitIoctlFuncs(struct dd_function_table *functions);
#endif /* __R600_IOCTL_H__ */
File diff suppressed because it is too large Load Diff
+77 -77
View File
@@ -28,7 +28,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
/**
* \file
*
* \brief R300 Render (Vertex Buffer Implementation)
* \brief R600 Render (Vertex Buffer Implementation)
*
* The immediate implementation has been removed from CVS in favor of the vertex
* buffer implementation.
@@ -76,40 +76,40 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
extern int future_hw_tcl_on;
/**
* \brief Convert a OpenGL primitive type into a R300 primitive type.
* \brief Convert a OpenGL primitive type into a R600 primitive type.
*/
int r300PrimitiveType(r300ContextPtr rmesa, int prim)
int r600PrimitiveType(r600ContextPtr rmesa, int prim)
{
switch (prim & PRIM_MODE_MASK) {
case GL_POINTS:
return R300_VAP_VF_CNTL__PRIM_POINTS;
return R600_VAP_VF_CNTL__PRIM_POINTS;
break;
case GL_LINES:
return R300_VAP_VF_CNTL__PRIM_LINES;
return R600_VAP_VF_CNTL__PRIM_LINES;
break;
case GL_LINE_STRIP:
return R300_VAP_VF_CNTL__PRIM_LINE_STRIP;
return R600_VAP_VF_CNTL__PRIM_LINE_STRIP;
break;
case GL_LINE_LOOP:
return R300_VAP_VF_CNTL__PRIM_LINE_LOOP;
return R600_VAP_VF_CNTL__PRIM_LINE_LOOP;
break;
case GL_TRIANGLES:
return R300_VAP_VF_CNTL__PRIM_TRIANGLES;
return R600_VAP_VF_CNTL__PRIM_TRIANGLES;
break;
case GL_TRIANGLE_STRIP:
return R300_VAP_VF_CNTL__PRIM_TRIANGLE_STRIP;
return R600_VAP_VF_CNTL__PRIM_TRIANGLE_STRIP;
break;
case GL_TRIANGLE_FAN:
return R300_VAP_VF_CNTL__PRIM_TRIANGLE_FAN;
return R600_VAP_VF_CNTL__PRIM_TRIANGLE_FAN;
break;
case GL_QUADS:
return R300_VAP_VF_CNTL__PRIM_QUADS;
return R600_VAP_VF_CNTL__PRIM_QUADS;
break;
case GL_QUAD_STRIP:
return R300_VAP_VF_CNTL__PRIM_QUAD_STRIP;
return R600_VAP_VF_CNTL__PRIM_QUAD_STRIP;
break;
case GL_POLYGON:
return R300_VAP_VF_CNTL__PRIM_POLYGON;
return R600_VAP_VF_CNTL__PRIM_POLYGON;
break;
default:
assert(0);
@@ -118,7 +118,7 @@ int r300PrimitiveType(r300ContextPtr rmesa, int prim)
}
}
int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim)
int r600NumVerts(r600ContextPtr rmesa, int num_verts, int prim)
{
int verts_off = 0;
@@ -170,9 +170,9 @@ int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim)
return num_verts - verts_off;
}
static void r300EmitElts(GLcontext * ctx, void *elts, unsigned long n_elts)
static void r600EmitElts(GLcontext * ctx, void *elts, unsigned long n_elts)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
void *out;
radeonAllocDmaRegion(&rmesa->radeon, &rmesa->radeon.tcl.elt_dma_bo,
@@ -183,31 +183,31 @@ static void r300EmitElts(GLcontext * ctx, void *elts, unsigned long n_elts)
radeon_bo_unmap(rmesa->radeon.tcl.elt_dma_bo);
}
static void r300FireEB(r300ContextPtr rmesa, int vertex_count, int type)
static void r600FireEB(r600ContextPtr rmesa, int vertex_count, int type)
{
BATCH_LOCALS(&rmesa->radeon);
if (vertex_count > 0) {
BEGIN_BATCH(10);
OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_INDX_2, 0);
OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_INDICES |
OUT_BATCH_PACKET3(R600_PACKET3_3D_DRAW_INDX_2, 0);
OUT_BATCH(R600_VAP_VF_CNTL__PRIM_WALK_INDICES |
((vertex_count + 0) << 16) |
type |
R300_VAP_VF_CNTL__INDEX_SIZE_32bit);
R600_VAP_VF_CNTL__INDEX_SIZE_32bit);
if (!rmesa->radeon.radeonScreen->kernel_mm) {
OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
(R300_VAP_PORT_IDX0 >> 2));
OUT_BATCH_PACKET3(R600_PACKET3_INDX_BUFFER, 2);
OUT_BATCH(R600_INDX_BUFFER_ONE_REG_WR | (0 << R600_INDX_BUFFER_SKIP_SHIFT) |
(R600_VAP_PORT_IDX0 >> 2));
OUT_BATCH_RELOC(rmesa->radeon.tcl.elt_dma_offset,
rmesa->radeon.tcl.elt_dma_bo,
rmesa->radeon.tcl.elt_dma_offset,
RADEON_GEM_DOMAIN_GTT, 0, 0);
OUT_BATCH(vertex_count);
} else {
OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
(R300_VAP_PORT_IDX0 >> 2));
OUT_BATCH_PACKET3(R600_PACKET3_INDX_BUFFER, 2);
OUT_BATCH(R600_INDX_BUFFER_ONE_REG_WR | (0 << R600_INDX_BUFFER_SKIP_SHIFT) |
(R600_VAP_PORT_IDX0 >> 2));
OUT_BATCH(rmesa->radeon.tcl.elt_dma_offset);
OUT_BATCH(vertex_count);
radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
@@ -218,7 +218,7 @@ static void r300FireEB(r300ContextPtr rmesa, int vertex_count, int type)
}
}
static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
static void r600EmitAOS(r600ContextPtr rmesa, GLuint nr, GLuint offset)
{
BATCH_LOCALS(&rmesa->radeon);
uint32_t voffset;
@@ -232,7 +232,7 @@ static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
if (!rmesa->radeon.radeonScreen->kernel_mm) {
BEGIN_BATCH(sz+2+(nr * 2));
OUT_BATCH_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, sz - 1);
OUT_BATCH_PACKET3(R600_PACKET3_3D_LOAD_VBPNTR, sz - 1);
OUT_BATCH(nr);
for (i = 0; i + 1 < nr; i += 2) {
@@ -272,7 +272,7 @@ static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
} else {
BEGIN_BATCH(sz+2+(nr * 2));
OUT_BATCH_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, sz - 1);
OUT_BATCH_PACKET3(R600_PACKET3_3D_LOAD_VBPNTR, sz - 1);
OUT_BATCH(nr);
for (i = 0; i + 1 < nr; i += 2) {
@@ -323,25 +323,25 @@ static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
}
static void r300FireAOS(r300ContextPtr rmesa, int vertex_count, int type)
static void r600FireAOS(r600ContextPtr rmesa, int vertex_count, int type)
{
BATCH_LOCALS(&rmesa->radeon);
BEGIN_BATCH(3);
OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_VBUF_2, 0);
OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (vertex_count << 16) | type);
OUT_BATCH_PACKET3(R600_PACKET3_3D_DRAW_VBUF_2, 0);
OUT_BATCH(R600_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (vertex_count << 16) | type);
END_BATCH();
}
static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,
static void r600RunRenderPrimitive(r600ContextPtr rmesa, GLcontext * ctx,
int start, int end, int prim)
{
int type, num_verts;
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *vb = &tnl->vb;
type = r300PrimitiveType(rmesa, prim);
num_verts = r300NumVerts(rmesa, end - start, prim);
type = r600PrimitiveType(rmesa, prim);
num_verts = r600NumVerts(rmesa, end - start, prim);
if (type < 0 || num_verts <= 0)
return;
@@ -369,20 +369,20 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,
* allocating the index array might actually evict the vertex
* arrays. *sigh*
*/
r300EmitElts(ctx, vb->Elts, num_verts);
r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
r300FireEB(rmesa, num_verts, type);
r600EmitElts(ctx, vb->Elts, num_verts);
r600EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
r600FireEB(rmesa, num_verts, type);
} else {
r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
r300FireAOS(rmesa, num_verts, type);
r600EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
r600FireAOS(rmesa, num_verts, type);
}
COMMIT_BATCH();
}
static GLboolean r300RunRender(GLcontext * ctx,
static GLboolean r600RunRender(GLcontext * ctx,
struct tnl_pipeline_stage *stage)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
int i;
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *vb = &tnl->vb;
@@ -390,23 +390,23 @@ static GLboolean r300RunRender(GLcontext * ctx,
if (RADEON_DEBUG & DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
r300UpdateShaders(rmesa);
if (r300EmitArrays(ctx))
r600UpdateShaders(rmesa);
if (r600EmitArrays(ctx))
return GL_TRUE;
r300UpdateShaderStates(rmesa);
r600UpdateShaderStates(rmesa);
r300EmitCacheFlush(rmesa);
r600EmitCacheFlush(rmesa);
radeonEmitState(&rmesa->radeon);
for (i = 0; i < vb->PrimitiveCount; i++) {
GLuint prim = _tnl_translate_prim(&vb->Primitive[i]);
GLuint start = vb->Primitive[i].start;
GLuint end = vb->Primitive[i].start + vb->Primitive[i].count;
r300RunRenderPrimitive(rmesa, ctx, start, end, prim);
r600RunRenderPrimitive(rmesa, ctx, start, end, prim);
}
r300EmitCacheFlush(rmesa);
r600EmitCacheFlush(rmesa);
radeonReleaseArrays(ctx, ~0);
@@ -419,33 +419,33 @@ static GLboolean r300RunRender(GLcontext * ctx,
if (1 || RADEON_DEBUG & DEBUG_FALLBACKS) \
WARN_ONCE("Software fallback:%s\n", \
#expr); \
return R300_FALLBACK_RAST; \
return R600_FALLBACK_RAST; \
} \
} while(0)
static int r300Fallback(GLcontext * ctx)
static int r600Fallback(GLcontext * ctx)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
r600ContextPtr r600 = R600_CONTEXT(ctx);
const unsigned back = ctx->Stencil._BackFace;
FALLBACK_IF(r300->radeon.Fallback);
FALLBACK_IF(r600->radeon.Fallback);
/* Do we need to use new-style shaders?
* Also is there a better way to do this? */
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
if (r600->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
struct r500_fragment_program *fp = (struct r500_fragment_program *)
(char *)ctx->FragmentProgram._Current;
if (fp) {
if (!fp->translated) {
r500TranslateFragmentShader(r300, fp);
r500TranslateFragmentShader(r600, fp);
FALLBACK_IF(!fp->translated);
}
}
} else {
struct r300_fragment_program *fp = (struct r300_fragment_program *)
struct r600_fragment_program *fp = (struct r600_fragment_program *)
(char *)ctx->FragmentProgram._Current;
if (fp) {
if (!fp->translated) {
r300TranslateFragmentShader(r300, fp);
r600TranslateFragmentShader(r600, fp);
FALLBACK_IF(!fp->translated);
}
}
@@ -465,7 +465,7 @@ static int r300Fallback(GLcontext * ctx)
if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite)
FALLBACK_IF(ctx->Point.PointSprite);
if (!r300->disable_lowimpact_fallback) {
if (!r600->disable_lowimpact_fallback) {
FALLBACK_IF(ctx->Polygon.StippleFlag);
FALLBACK_IF(ctx->Multisample._Enabled);
FALLBACK_IF(ctx->Line.StippleFlag);
@@ -473,34 +473,34 @@ static int r300Fallback(GLcontext * ctx)
FALLBACK_IF(ctx->Point.SmoothFlag);
}
return R300_FALLBACK_NONE;
return R600_FALLBACK_NONE;
}
static GLboolean r300RunNonTCLRender(GLcontext * ctx,
static GLboolean r600RunNonTCLRender(GLcontext * ctx,
struct tnl_pipeline_stage *stage)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
if (RADEON_DEBUG & DEBUG_PRIMS)
fprintf(stderr, "%s\n", __FUNCTION__);
if (r300Fallback(ctx) >= R300_FALLBACK_RAST)
if (r600Fallback(ctx) >= R600_FALLBACK_RAST)
return GL_TRUE;
if (!(rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
return GL_TRUE;
if (!r300ValidateBuffers(ctx))
if (!r600ValidateBuffers(ctx))
return GL_TRUE;
return r300RunRender(ctx, stage);
return r600RunRender(ctx, stage);
}
static GLboolean r300RunTCLRender(GLcontext * ctx,
static GLboolean r600RunTCLRender(GLcontext * ctx,
struct tnl_pipeline_stage *stage)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
struct r300_vertex_program *vp;
r600ContextPtr rmesa = R600_CONTEXT(ctx);
struct r600_vertex_program *vp;
hw_tcl_on = future_hw_tcl_on;
@@ -510,39 +510,39 @@ static GLboolean r300RunTCLRender(GLcontext * ctx,
if (hw_tcl_on == GL_FALSE)
return GL_TRUE;
if (r300Fallback(ctx) >= R300_FALLBACK_TCL) {
if (r600Fallback(ctx) >= R600_FALLBACK_TCL) {
hw_tcl_on = GL_FALSE;
return GL_TRUE;
}
if (!r300ValidateBuffers(ctx))
if (!r600ValidateBuffers(ctx))
return GL_TRUE;
r300UpdateShaders(rmesa);
r600UpdateShaders(rmesa);
vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
vp = (struct r600_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
if (vp->native == GL_FALSE) {
hw_tcl_on = GL_FALSE;
return GL_TRUE;
}
return r300RunRender(ctx, stage);
return r600RunRender(ctx, stage);
}
const struct tnl_pipeline_stage _r300_render_stage = {
"r300 Hardware Rasterization",
const struct tnl_pipeline_stage _r600_render_stage = {
"r600 Hardware Rasterization",
NULL,
NULL,
NULL,
NULL,
r300RunNonTCLRender
r600RunNonTCLRender
};
const struct tnl_pipeline_stage _r300_tcl_stage = {
"r300 Hardware Transform, Clipping and Lighting",
const struct tnl_pipeline_stage _r600_tcl_stage = {
"r600 Hardware Transform, Clipping and Lighting",
NULL,
NULL,
NULL,
NULL,
r300RunTCLRender
r600RunTCLRender
};
+22 -22
View File
@@ -6,18 +6,18 @@
#include "r600_context.h"
#include "r600_fragprog.h"
static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
static struct gl_program *r600NewProgram(GLcontext * ctx, GLenum target,
GLuint id)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
struct r300_vertex_program_cont *vp;
struct r300_fragment_program *r300_fp;
r600ContextPtr rmesa = R600_CONTEXT(ctx);
struct r600_vertex_program_cont *vp;
struct r600_fragment_program *r600_fp;
struct r500_fragment_program *r500_fp;
switch (target) {
case GL_VERTEX_STATE_PROGRAM_NV:
case GL_VERTEX_PROGRAM_ARB:
vp = CALLOC_STRUCT(r300_vertex_program_cont);
vp = CALLOC_STRUCT(r600_vertex_program_cont);
return _mesa_init_vertex_program(ctx, &vp->mesa_program,
target, id);
case GL_FRAGMENT_PROGRAM_ARB:
@@ -27,8 +27,8 @@ static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
return _mesa_init_fragment_program(ctx, &r500_fp->mesa_program,
target, id);
} else {
r300_fp = CALLOC_STRUCT(r300_fragment_program);
return _mesa_init_fragment_program(ctx, &r300_fp->mesa_program,
r600_fp = CALLOC_STRUCT(r600_fragment_program);
return _mesa_init_fragment_program(ctx, &r600_fp->mesa_program,
target, id);
}
@@ -38,28 +38,28 @@ static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
return _mesa_init_fragment_program(ctx, &r500_fp->mesa_program,
target, id);
} else {
r300_fp = CALLOC_STRUCT(r300_fragment_program);
return _mesa_init_fragment_program(ctx, &r300_fp->mesa_program,
r600_fp = CALLOC_STRUCT(r600_fragment_program);
return _mesa_init_fragment_program(ctx, &r600_fp->mesa_program,
target, id);
}
default:
_mesa_problem(ctx, "Bad target in r300NewProgram");
_mesa_problem(ctx, "Bad target in r600NewProgram");
}
return NULL;
}
static void r300DeleteProgram(GLcontext * ctx, struct gl_program *prog)
static void r600DeleteProgram(GLcontext * ctx, struct gl_program *prog)
{
_mesa_delete_program(ctx, prog);
}
static void
r300ProgramStringNotify(GLcontext * ctx, GLenum target, struct gl_program *prog)
r600ProgramStringNotify(GLcontext * ctx, GLenum target, struct gl_program *prog)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
struct r300_vertex_program_cont *vp = (void *)prog;
struct r300_fragment_program *r300_fp = (struct r300_fragment_program *)prog;
r600ContextPtr rmesa = R600_CONTEXT(ctx);
struct r600_vertex_program_cont *vp = (void *)prog;
struct r600_fragment_program *r600_fp = (struct r600_fragment_program *)prog;
struct r500_fragment_program *r500_fp = (struct r500_fragment_program *)prog;
switch (target) {
@@ -70,7 +70,7 @@ r300ProgramStringNotify(GLcontext * ctx, GLenum target, struct gl_program *prog)
if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
r500_fp->translated = GL_FALSE;
else
r300_fp->translated = GL_FALSE;
r600_fp->translated = GL_FALSE;
break;
}
@@ -79,15 +79,15 @@ r300ProgramStringNotify(GLcontext * ctx, GLenum target, struct gl_program *prog)
}
static GLboolean
r300IsProgramNative(GLcontext * ctx, GLenum target, struct gl_program *prog)
r600IsProgramNative(GLcontext * ctx, GLenum target, struct gl_program *prog)
{
return GL_TRUE;
}
void r300InitShaderFuncs(struct dd_function_table *functions)
void r600InitShaderFuncs(struct dd_function_table *functions)
{
functions->NewProgram = r300NewProgram;
functions->DeleteProgram = r300DeleteProgram;
functions->ProgramStringNotify = r300ProgramStringNotify;
functions->IsProgramNative = r300IsProgramNative;
functions->NewProgram = r600NewProgram;
functions->DeleteProgram = r600DeleteProgram;
functions->ProgramStringNotify = r600ProgramStringNotify;
functions->IsProgramNative = r600IsProgramNative;
}
File diff suppressed because it is too large Load Diff
+15 -15
View File
@@ -37,29 +37,29 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "r600_context.h"
#define R300_NEWPRIM( rmesa ) \
#define R600_NEWPRIM( rmesa ) \
do { \
if ( rmesa->radeon.dma.flush ) \
rmesa->radeon.dma.flush( rmesa->radeon.glCtx ); \
} while (0)
#define R300_STATECHANGE(r300, atom) \
#define R600_STATECHANGE(r600, atom) \
do { \
R300_NEWPRIM(r300); \
r300->hw.atom.dirty = GL_TRUE; \
r300->radeon.hw.is_dirty = GL_TRUE; \
R600_NEWPRIM(r600); \
r600->hw.atom.dirty = GL_TRUE; \
r600->radeon.hw.is_dirty = GL_TRUE; \
} while(0)
// r300_state.c
// r600_state.c
extern int future_hw_tcl_on;
void _tnl_UpdateFixedFunctionProgram (GLcontext * ctx);
void r300UpdateViewportOffset (GLcontext * ctx);
void r300UpdateDrawBuffer (GLcontext * ctx);
void r300UpdateStateParameters (GLcontext * ctx, GLuint new_state);
void r300UpdateShaders (r300ContextPtr rmesa);
void r300UpdateShaderStates (r300ContextPtr rmesa);
void r300InitState (r300ContextPtr r300);
void r300UpdateClipPlanes (GLcontext * ctx);
void r300InitStateFuncs (struct dd_function_table *functions);
void r600UpdateViewportOffset (GLcontext * ctx);
void r600UpdateDrawBuffer (GLcontext * ctx);
void r600UpdateStateParameters (GLcontext * ctx, GLuint new_state);
void r600UpdateShaders (r600ContextPtr rmesa);
void r600UpdateShaderStates (r600ContextPtr rmesa);
void r600InitState (r600ContextPtr r600);
void r600UpdateClipPlanes (GLcontext * ctx);
void r600InitStateFuncs (struct dd_function_table *functions);
#endif /* __R300_STATE_H__ */
#endif /* __R600_STATE_H__ */
+107 -107
View File
@@ -63,9 +63,9 @@ do { \
++num_attrs; \
} while (0)
static void r300SwtclVAPSetup(GLcontext *ctx, GLuint InputsRead, GLuint OutputsWritten)
static void r600SwtclVAPSetup(GLcontext *ctx, GLuint InputsRead, GLuint OutputsWritten)
{
r300ContextPtr rmesa = R300_CONTEXT( ctx );
r600ContextPtr rmesa = R600_CONTEXT( ctx );
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
struct vertex_attribute *attrs = rmesa->swtcl.vert_attrs;
@@ -74,27 +74,27 @@ static void r300SwtclVAPSetup(GLcontext *ctx, GLuint InputsRead, GLuint OutputsW
uint32_t *vir0 = &rmesa->hw.vir[0].cmd[1];
uint32_t *vir1 = &rmesa->hw.vir[1].cmd[1];
for (i = 0; i < R300_VIR_CMDSIZE-1; ++i)
for (i = 0; i < R600_VIR_CMDSIZE-1; ++i)
vir0[i] = vir1[i] = 0;
for (i = 0, j = 0; i < rmesa->radeon.swtcl.vertex_attr_count; ++i) {
int tmp, data_format;
switch (attrs[i].format) {
case EMIT_1F:
data_format = R300_DATA_TYPE_FLOAT_1;
data_format = R600_DATA_TYPE_FLOAT_1;
break;
case EMIT_2F:
data_format = R300_DATA_TYPE_FLOAT_2;
data_format = R600_DATA_TYPE_FLOAT_2;
break;
case EMIT_3F:
data_format = R300_DATA_TYPE_FLOAT_3;
data_format = R600_DATA_TYPE_FLOAT_3;
break;
case EMIT_4F:
data_format = R300_DATA_TYPE_FLOAT_4;
data_format = R600_DATA_TYPE_FLOAT_4;
break;
case EMIT_4UB_4F_RGBA:
case EMIT_4UB_4F_ABGR:
data_format = R300_DATA_TYPE_BYTE | R300_NORMALIZE;
data_format = R600_DATA_TYPE_BYTE | R600_NORMALIZE;
break;
default:
fprintf(stderr, "%s: Invalid data format type", __FUNCTION__);
@@ -102,29 +102,29 @@ static void r300SwtclVAPSetup(GLcontext *ctx, GLuint InputsRead, GLuint OutputsW
break;
}
tmp = data_format | (attrs[i].dst_loc << R300_DST_VEC_LOC_SHIFT);
tmp = data_format | (attrs[i].dst_loc << R600_DST_VEC_LOC_SHIFT);
if (i % 2 == 0) {
vir0[j] = tmp << R300_DATA_TYPE_0_SHIFT;
vir1[j] = attrs[i].swizzle | (attrs[i].write_mask << R300_WRITE_ENA_SHIFT);
vir0[j] = tmp << R600_DATA_TYPE_0_SHIFT;
vir1[j] = attrs[i].swizzle | (attrs[i].write_mask << R600_WRITE_ENA_SHIFT);
} else {
vir0[j] |= tmp << R300_DATA_TYPE_1_SHIFT;
vir1[j] |= (attrs[i].swizzle | (attrs[i].write_mask << R300_WRITE_ENA_SHIFT)) << R300_SWIZZLE1_SHIFT;
vir0[j] |= tmp << R600_DATA_TYPE_1_SHIFT;
vir1[j] |= (attrs[i].swizzle | (attrs[i].write_mask << R600_WRITE_ENA_SHIFT)) << R600_SWIZZLE1_SHIFT;
++j;
}
}
reg_count = (rmesa->radeon.swtcl.vertex_attr_count + 1) >> 1;
if (rmesa->radeon.swtcl.vertex_attr_count % 2 != 0) {
vir0[reg_count-1] |= R300_LAST_VEC << R300_DATA_TYPE_0_SHIFT;
vir0[reg_count-1] |= R600_LAST_VEC << R600_DATA_TYPE_0_SHIFT;
} else {
vir0[reg_count-1] |= R300_LAST_VEC << R300_DATA_TYPE_1_SHIFT;
vir0[reg_count-1] |= R600_LAST_VEC << R600_DATA_TYPE_1_SHIFT;
}
R300_STATECHANGE(rmesa, vir[0]);
R300_STATECHANGE(rmesa, vir[1]);
R300_STATECHANGE(rmesa, vof);
R300_STATECHANGE(rmesa, vte);
R300_STATECHANGE(rmesa, vic);
R600_STATECHANGE(rmesa, vir[0]);
R600_STATECHANGE(rmesa, vir[1]);
R600_STATECHANGE(rmesa, vof);
R600_STATECHANGE(rmesa, vte);
R600_STATECHANGE(rmesa, vic);
if (rmesa->radeon.radeonScreen->kernel_mm) {
rmesa->hw.vir[0].cmd[0] &= 0xC000FFFF;
@@ -136,22 +136,22 @@ static void r300SwtclVAPSetup(GLcontext *ctx, GLuint InputsRead, GLuint OutputsW
((drm_r300_cmd_header_t *) rmesa->hw.vir[1].cmd)->packet0.count = reg_count;
}
rmesa->hw.vic.cmd[R300_VIC_CNTL_0] = r300VAPInputCntl0(ctx, InputsRead);
rmesa->hw.vic.cmd[R300_VIC_CNTL_1] = r300VAPInputCntl1(ctx, InputsRead);
rmesa->hw.vof.cmd[R300_VOF_CNTL_0] = r300VAPOutputCntl0(ctx, OutputsWritten);
rmesa->hw.vof.cmd[R300_VOF_CNTL_1] = r300VAPOutputCntl1(ctx, OutputsWritten);
rmesa->hw.vic.cmd[R600_VIC_CNTL_0] = r600VAPInputCntl0(ctx, InputsRead);
rmesa->hw.vic.cmd[R600_VIC_CNTL_1] = r600VAPInputCntl1(ctx, InputsRead);
rmesa->hw.vof.cmd[R600_VOF_CNTL_0] = r600VAPOutputCntl0(ctx, OutputsWritten);
rmesa->hw.vof.cmd[R600_VOF_CNTL_1] = r600VAPOutputCntl1(ctx, OutputsWritten);
vte = rmesa->hw.vte.cmd[1];
vte &= ~(R300_VTX_XY_FMT | R300_VTX_Z_FMT | R300_VTX_W0_FMT);
vte &= ~(R600_VTX_XY_FMT | R600_VTX_Z_FMT | R600_VTX_W0_FMT);
/* Important:
*/
if ( VB->NdcPtr != NULL ) {
VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
vte |= R300_VTX_XY_FMT | R300_VTX_Z_FMT;
vte |= R600_VTX_XY_FMT | R600_VTX_Z_FMT;
}
else {
VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr;
vte |= R300_VTX_W0_FMT;
vte |= R600_VTX_W0_FMT;
}
assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
@@ -161,9 +161,9 @@ static void r300SwtclVAPSetup(GLcontext *ctx, GLuint InputsRead, GLuint OutputsW
}
static void r300SetVertexFormat( GLcontext *ctx )
static void r600SetVertexFormat( GLcontext *ctx )
{
r300ContextPtr rmesa = R300_CONTEXT( ctx );
r600ContextPtr rmesa = R600_CONTEXT( ctx );
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
int fog_id = -1;
@@ -306,8 +306,8 @@ static void r300SetVertexFormat( GLcontext *ctx )
ADD_ATTR(VERT_ATTRIB_TEX0 + first_free_tex, EMIT_4F, SWTCL_OVM_TEX(first_free_tex), SWIZZLE_XYZW, MASK_XYZW);
}
R300_NEWPRIM(rmesa);
r300SwtclVAPSetup(ctx, InputsRead, OutputsWritten);
R600_NEWPRIM(rmesa);
r600SwtclVAPSetup(ctx, InputsRead, OutputsWritten);
rmesa->radeon.swtcl.vertex_size =
_tnl_install_attrs( ctx,
@@ -334,8 +334,8 @@ static GLuint reduced_prim[] = {
GL_TRIANGLES,
};
static void r300RasterPrimitive( GLcontext *ctx, GLuint prim );
static void r300RenderPrimitive( GLcontext *ctx, GLenum prim );
static void r600RasterPrimitive( GLcontext *ctx, GLuint prim );
static void r600RenderPrimitive( GLcontext *ctx, GLenum prim );
/***********************************************************************
* Emit primitives as inline vertices *
@@ -356,16 +356,16 @@ static void r300RenderPrimitive( GLcontext *ctx, GLenum prim );
#undef LOCAL_VARS
#undef ALLOC_VERTS
#define CTX_ARG r300ContextPtr rmesa
#define CTX_ARG r600ContextPtr rmesa
#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
#define ALLOC_VERTS( n, size ) rcommonAllocDmaLowVerts( &rmesa->radeon, n, size * 4 )
#define LOCAL_VARS \
r300ContextPtr rmesa = R300_CONTEXT(ctx); \
const char *r300verts = (char *)rmesa->radeon.swtcl.verts;
#define VERT(x) (r300Vertex *)(r300verts + ((x) * vertsize * sizeof(int)))
#define VERTEX r300Vertex
r600ContextPtr rmesa = R600_CONTEXT(ctx); \
const char *r600verts = (char *)rmesa->radeon.swtcl.verts;
#define VERT(x) (r600Vertex *)(r600verts + ((x) * vertsize * sizeof(int)))
#define VERTEX r600Vertex
#undef TAG
#define TAG(x) r300_##x
#define TAG(x) r600_##x
#include "tnl_dd/t_dd_triemit.h"
@@ -374,29 +374,29 @@ static void r300RenderPrimitive( GLcontext *ctx, GLenum prim );
* Macros for t_dd_tritmp.h to draw basic primitives *
***********************************************************************/
#define QUAD( a, b, c, d ) r300_quad( rmesa, a, b, c, d )
#define TRI( a, b, c ) r300_triangle( rmesa, a, b, c )
#define LINE( a, b ) r300_line( rmesa, a, b )
#define POINT( a ) r300_point( rmesa, a )
#define QUAD( a, b, c, d ) r600_quad( rmesa, a, b, c, d )
#define TRI( a, b, c ) r600_triangle( rmesa, a, b, c )
#define LINE( a, b ) r600_line( rmesa, a, b )
#define POINT( a ) r600_point( rmesa, a )
/***********************************************************************
* Build render functions from dd templates *
***********************************************************************/
#define R300_TWOSIDE_BIT 0x01
#define R300_UNFILLED_BIT 0x02
#define R300_MAX_TRIFUNC 0x04
#define R600_TWOSIDE_BIT 0x01
#define R600_UNFILLED_BIT 0x02
#define R600_MAX_TRIFUNC 0x04
static struct {
tnl_points_func points;
tnl_line_func line;
tnl_triangle_func triangle;
tnl_quad_func quad;
} rast_tab[R300_MAX_TRIFUNC];
} rast_tab[R600_MAX_TRIFUNC];
#define DO_FALLBACK 0
#define DO_UNFILLED (IND & R300_UNFILLED_BIT)
#define DO_TWOSIDE (IND & R300_TWOSIDE_BIT)
#define DO_UNFILLED (IND & R600_UNFILLED_BIT)
#define DO_TWOSIDE (IND & R600_TWOSIDE_BIT)
#define DO_FLAT 0
#define DO_OFFSET 0
#define DO_TRI 1
@@ -422,7 +422,7 @@ static struct {
#define VERT_SET_RGBA( v, c ) \
do { \
r300_color_t *color = (r300_color_t *)&((v)->ui[coloroffset]); \
r600_color_t *color = (r600_color_t *)&((v)->ui[coloroffset]); \
UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]); \
UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]); \
UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]); \
@@ -459,7 +459,7 @@ do { \
#undef INIT
#define LOCAL_VARS(n) \
r300ContextPtr rmesa = R300_CONTEXT(ctx); \
r600ContextPtr rmesa = R600_CONTEXT(ctx); \
GLuint color[n] = { 0, }, spec[n] = { 0, }; \
GLuint coloroffset = rmesa->swtcl.coloroffset; \
GLuint specoffset = rmesa->swtcl.specoffset; \
@@ -469,7 +469,7 @@ do { \
* Helpers for rendering unfilled primitives *
***********************************************************************/
#define RASTERIZE(x) r300RasterPrimitive( ctx, reduced_prim[x] )
#define RASTERIZE(x) r600RasterPrimitive( ctx, reduced_prim[x] )
#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
#undef TAG
#define TAG(x) x
@@ -486,15 +486,15 @@ do { \
#define TAG(x) x
#include "tnl_dd/t_dd_tritmp.h"
#define IND (R300_TWOSIDE_BIT)
#define IND (R600_TWOSIDE_BIT)
#define TAG(x) x##_twoside
#include "tnl_dd/t_dd_tritmp.h"
#define IND (R300_UNFILLED_BIT)
#define IND (R600_UNFILLED_BIT)
#define TAG(x) x##_unfilled
#include "tnl_dd/t_dd_tritmp.h"
#define IND (R300_TWOSIDE_BIT|R300_UNFILLED_BIT)
#define IND (R600_TWOSIDE_BIT|R600_UNFILLED_BIT)
#define TAG(x) x##_twoside_unfilled
#include "tnl_dd/t_dd_tritmp.h"
@@ -514,21 +514,21 @@ static void init_rast_tab( void )
#define RENDER_POINTS( start, count ) \
for ( ; start < count ; start++) \
r300_point( rmesa, VERT(start) )
r600_point( rmesa, VERT(start) )
#define RENDER_LINE( v0, v1 ) \
r300_line( rmesa, VERT(v0), VERT(v1) )
r600_line( rmesa, VERT(v0), VERT(v1) )
#define RENDER_TRI( v0, v1, v2 ) \
r300_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
r600_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
#define RENDER_QUAD( v0, v1, v2, v3 ) \
r300_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
r600_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
#define INIT(x) do { \
r300RenderPrimitive( ctx, x ); \
r600RenderPrimitive( ctx, x ); \
} while (0)
#undef LOCAL_VARS
#define LOCAL_VARS \
r300ContextPtr rmesa = R300_CONTEXT(ctx); \
r600ContextPtr rmesa = R600_CONTEXT(ctx); \
const GLuint vertsize = rmesa->radeon.swtcl.vertex_size; \
const char *r300verts = (char *)rmesa->radeon.swtcl.verts; \
const char *r600verts = (char *)rmesa->radeon.swtcl.verts; \
const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
const GLboolean stipple = ctx->Line.StippleFlag; \
(void) elt; (void) stipple;
@@ -536,11 +536,11 @@ static void init_rast_tab( void )
#define RESET_OCCLUSION
#define PRESERVE_VB_DEFS
#define ELT(x) (x)
#define TAG(x) r300_##x##_verts
#define TAG(x) r600_##x##_verts
#include "tnl/t_vb_rendertmp.h"
#undef ELT
#undef TAG
#define TAG(x) r300_##x##_elts
#define TAG(x) r600_##x##_elts
#define ELT(x) elt[x]
#include "tnl/t_vb_rendertmp.h"
@@ -550,15 +550,15 @@ static void init_rast_tab( void )
/**********************************************************************/
/* Choose render functions */
/**********************************************************************/
static void r300ChooseRenderState( GLcontext *ctx )
static void r600ChooseRenderState( GLcontext *ctx )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
GLuint index = 0;
GLuint flags = ctx->_TriangleCaps;
if (flags & DD_TRI_LIGHT_TWOSIDE) index |= R300_TWOSIDE_BIT;
if (flags & DD_TRI_UNFILLED) index |= R300_UNFILLED_BIT;
if (flags & DD_TRI_LIGHT_TWOSIDE) index |= R600_TWOSIDE_BIT;
if (flags & DD_TRI_UNFILLED) index |= R600_UNFILLED_BIT;
if (index != rmesa->radeon.swtcl.RenderIndex) {
tnl->Driver.Render.Points = rast_tab[index].points;
@@ -568,9 +568,9 @@ static void r300ChooseRenderState( GLcontext *ctx )
tnl->Driver.Render.Quad = rast_tab[index].quad;
if (index == 0) {
tnl->Driver.Render.PrimTabVerts = r300_render_tab_verts;
tnl->Driver.Render.PrimTabElts = r300_render_tab_elts;
tnl->Driver.Render.ClippedPolygon = r300_fast_clipped_poly;
tnl->Driver.Render.PrimTabVerts = r600_render_tab_verts;
tnl->Driver.Render.PrimTabElts = r600_render_tab_elts;
tnl->Driver.Render.ClippedPolygon = r600_fast_clipped_poly;
} else {
tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
@@ -582,19 +582,19 @@ static void r300ChooseRenderState( GLcontext *ctx )
}
static void r300RenderStart(GLcontext *ctx)
static void r600RenderStart(GLcontext *ctx)
{
r300ContextPtr rmesa = R300_CONTEXT( ctx );
r600ContextPtr rmesa = R600_CONTEXT( ctx );
r300ChooseRenderState(ctx);
r300SetVertexFormat(ctx);
r600ChooseRenderState(ctx);
r600SetVertexFormat(ctx);
r300ValidateBuffers(ctx);
r600ValidateBuffers(ctx);
r300UpdateShaders(rmesa);
r300UpdateShaderStates(rmesa);
r600UpdateShaders(rmesa);
r600UpdateShaderStates(rmesa);
r300EmitCacheFlush(rmesa);
r600EmitCacheFlush(rmesa);
/* investigate if we can put back flush optimisation if needed */
if (rmesa->radeon.dma.flush != NULL) {
@@ -602,40 +602,40 @@ static void r300RenderStart(GLcontext *ctx)
}
}
static void r300RenderFinish(GLcontext *ctx)
static void r600RenderFinish(GLcontext *ctx)
{
}
static void r300RasterPrimitive( GLcontext *ctx, GLuint hwprim )
static void r600RasterPrimitive( GLcontext *ctx, GLuint hwprim )
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
R300_NEWPRIM( rmesa );
R600_NEWPRIM( rmesa );
rmesa->radeon.swtcl.hw_primitive = hwprim;
}
}
static void r300RenderPrimitive(GLcontext *ctx, GLenum prim)
static void r600RenderPrimitive(GLcontext *ctx, GLenum prim)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
rmesa->radeon.swtcl.render_primitive = prim;
if ((prim == GL_TRIANGLES) && (ctx->_TriangleCaps & DD_TRI_UNFILLED))
return;
r300RasterPrimitive( ctx, reduced_prim[prim] );
r600RasterPrimitive( ctx, reduced_prim[prim] );
}
static void r300ResetLineStipple(GLcontext *ctx)
static void r600ResetLineStipple(GLcontext *ctx)
{
}
void r300InitSwtcl(GLcontext *ctx)
void r600InitSwtcl(GLcontext *ctx)
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
static int firsttime = 1;
if (firsttime) {
@@ -643,10 +643,10 @@ void r300InitSwtcl(GLcontext *ctx)
firsttime = 0;
}
tnl->Driver.Render.Start = r300RenderStart;
tnl->Driver.Render.Finish = r300RenderFinish;
tnl->Driver.Render.PrimitiveNotify = r300RenderPrimitive;
tnl->Driver.Render.ResetLineStipple = r300ResetLineStipple;
tnl->Driver.Render.Start = r600RenderStart;
tnl->Driver.Render.Finish = r600RenderFinish;
tnl->Driver.Render.PrimitiveNotify = r600RenderPrimitive;
tnl->Driver.Render.ResetLineStipple = r600ResetLineStipple;
tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
tnl->Driver.Render.CopyPV = _tnl_copy_pv;
tnl->Driver.Render.Interp = _tnl_interp;
@@ -664,14 +664,14 @@ void r300InitSwtcl(GLcontext *ctx)
_tnl_invalidate_vertices( ctx, ~0 );
_tnl_need_projected_coords( ctx, GL_FALSE );
r300ChooseRenderState(ctx);
r600ChooseRenderState(ctx);
}
void r300DestroySwtcl(GLcontext *ctx)
void r600DestroySwtcl(GLcontext *ctx)
{
}
static void r300EmitVertexAOS(r300ContextPtr rmesa, GLuint vertex_size, struct radeon_bo *bo, GLuint offset)
static void r600EmitVertexAOS(r600ContextPtr rmesa, GLuint vertex_size, struct radeon_bo *bo, GLuint offset)
{
BATCH_LOCALS(&rmesa->radeon);
@@ -680,43 +680,43 @@ static void r300EmitVertexAOS(r300ContextPtr rmesa, GLuint vertex_size, struct r
__FUNCTION__, vertex_size, offset);
BEGIN_BATCH(7);
OUT_BATCH_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, 2);
OUT_BATCH_PACKET3(R600_PACKET3_3D_LOAD_VBPNTR, 2);
OUT_BATCH(1);
OUT_BATCH(vertex_size | (vertex_size << 8));
OUT_BATCH_RELOC(offset, bo, offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
END_BATCH();
}
static void r300EmitVbufPrim(r300ContextPtr rmesa, GLuint primitive, GLuint vertex_nr)
static void r600EmitVbufPrim(r600ContextPtr rmesa, GLuint primitive, GLuint vertex_nr)
{
BATCH_LOCALS(&rmesa->radeon);
int type, num_verts;
type = r300PrimitiveType(rmesa, primitive);
num_verts = r300NumVerts(rmesa, vertex_nr, primitive);
type = r600PrimitiveType(rmesa, primitive);
num_verts = r600NumVerts(rmesa, vertex_nr, primitive);
BEGIN_BATCH(3);
OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_VBUF_2, 0);
OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (num_verts << 16) | type);
OUT_BATCH_PACKET3(R600_PACKET3_3D_DRAW_VBUF_2, 0);
OUT_BATCH(R600_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (num_verts << 16) | type);
END_BATCH();
}
void r300_swtcl_flush(GLcontext *ctx, uint32_t current_offset)
void r600_swtcl_flush(GLcontext *ctx, uint32_t current_offset)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
rcommonEnsureCmdBufSpace(&rmesa->radeon,
rmesa->radeon.hw.max_state_size + (12*sizeof(int)),
__FUNCTION__);
radeonEmitState(&rmesa->radeon);
r300EmitVertexAOS(rmesa,
r600EmitVertexAOS(rmesa,
rmesa->radeon.swtcl.vertex_size,
rmesa->radeon.dma.current,
current_offset);
r300EmitVbufPrim(rmesa,
r600EmitVbufPrim(rmesa,
rmesa->radeon.swtcl.hw_primitive,
rmesa->radeon.swtcl.numverts);
r300EmitCacheFlush(rmesa);
r600EmitCacheFlush(rmesa);
COMMIT_BATCH();
}
+8 -8
View File
@@ -39,11 +39,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "swrast/swrast.h"
#include "r600_context.h"
#define MASK_XYZW (R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W)
#define MASK_X R300_WRITE_ENA_X
#define MASK_Y R300_WRITE_ENA_Y
#define MASK_Z R300_WRITE_ENA_Z
#define MASK_W R300_WRITE_ENA_W
#define MASK_XYZW (R600_WRITE_ENA_X | R600_WRITE_ENA_Y | R600_WRITE_ENA_Z | R600_WRITE_ENA_W)
#define MASK_X R600_WRITE_ENA_X
#define MASK_Y R600_WRITE_ENA_Y
#define MASK_Z R600_WRITE_ENA_Z
#define MASK_W R600_WRITE_ENA_W
/*
* Here are definitions of OVM locations of vertex attributes for non TCL hw
@@ -55,8 +55,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define SWTCL_OVM_POINT_SIZE 15
extern void r300InitSwtcl( GLcontext *ctx );
extern void r300DestroySwtcl( GLcontext *ctx );
extern void r600InitSwtcl( GLcontext *ctx );
extern void r600DestroySwtcl( GLcontext *ctx );
extern void r300_swtcl_flush(GLcontext *ctx, uint32_t current_offset);
extern void r600_swtcl_flush(GLcontext *ctx, uint32_t current_offset);
#endif
+50 -50
View File
@@ -59,14 +59,14 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
static unsigned int translate_wrap_mode(GLenum wrapmode)
{
switch(wrapmode) {
case GL_REPEAT: return R300_TX_REPEAT;
case GL_CLAMP: return R300_TX_CLAMP;
case GL_CLAMP_TO_EDGE: return R300_TX_CLAMP_TO_EDGE;
case GL_CLAMP_TO_BORDER: return R300_TX_CLAMP_TO_BORDER;
case GL_MIRRORED_REPEAT: return R300_TX_REPEAT | R300_TX_MIRRORED;
case GL_MIRROR_CLAMP_EXT: return R300_TX_CLAMP | R300_TX_MIRRORED;
case GL_MIRROR_CLAMP_TO_EDGE_EXT: return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
case GL_MIRROR_CLAMP_TO_BORDER_EXT: return R300_TX_CLAMP_TO_BORDER | R300_TX_MIRRORED;
case GL_REPEAT: return R600_TX_REPEAT;
case GL_CLAMP: return R600_TX_CLAMP;
case GL_CLAMP_TO_EDGE: return R600_TX_CLAMP_TO_EDGE;
case GL_CLAMP_TO_BORDER: return R600_TX_CLAMP_TO_BORDER;
case GL_MIRRORED_REPEAT: return R600_TX_REPEAT | R600_TX_MIRRORED;
case GL_MIRROR_CLAMP_EXT: return R600_TX_CLAMP | R600_TX_MIRRORED;
case GL_MIRROR_CLAMP_TO_EDGE_EXT: return R600_TX_CLAMP_TO_EDGE | R600_TX_MIRRORED;
case GL_MIRROR_CLAMP_TO_BORDER_EXT: return R600_TX_CLAMP_TO_BORDER | R600_TX_MIRRORED;
default:
_mesa_problem(NULL, "bad wrap mode in %s", __FUNCTION__);
return 0;
@@ -79,35 +79,35 @@ static unsigned int translate_wrap_mode(GLenum wrapmode)
*
* \param t Texture object whose wrap modes are to be set
*/
static void r300UpdateTexWrap(radeonTexObjPtr t)
static void r600UpdateTexWrap(radeonTexObjPtr t)
{
struct gl_texture_object *tObj = &t->base;
t->pp_txfilter &=
~(R300_TX_WRAP_S_MASK | R300_TX_WRAP_T_MASK | R300_TX_WRAP_R_MASK);
~(R600_TX_WRAP_S_MASK | R600_TX_WRAP_T_MASK | R600_TX_WRAP_R_MASK);
t->pp_txfilter |= translate_wrap_mode(tObj->WrapS) << R300_TX_WRAP_S_SHIFT;
t->pp_txfilter |= translate_wrap_mode(tObj->WrapS) << R600_TX_WRAP_S_SHIFT;
if (tObj->Target != GL_TEXTURE_1D) {
t->pp_txfilter |= translate_wrap_mode(tObj->WrapT) << R300_TX_WRAP_T_SHIFT;
t->pp_txfilter |= translate_wrap_mode(tObj->WrapT) << R600_TX_WRAP_T_SHIFT;
if (tObj->Target == GL_TEXTURE_3D)
t->pp_txfilter |= translate_wrap_mode(tObj->WrapR) << R300_TX_WRAP_R_SHIFT;
t->pp_txfilter |= translate_wrap_mode(tObj->WrapR) << R600_TX_WRAP_R_SHIFT;
}
}
static GLuint aniso_filter(GLfloat anisotropy)
{
if (anisotropy >= 16.0) {
return R300_TX_MAX_ANISO_16_TO_1;
return R600_TX_MAX_ANISO_16_TO_1;
} else if (anisotropy >= 8.0) {
return R300_TX_MAX_ANISO_8_TO_1;
return R600_TX_MAX_ANISO_8_TO_1;
} else if (anisotropy >= 4.0) {
return R300_TX_MAX_ANISO_4_TO_1;
return R600_TX_MAX_ANISO_4_TO_1;
} else if (anisotropy >= 2.0) {
return R300_TX_MAX_ANISO_2_TO_1;
return R600_TX_MAX_ANISO_2_TO_1;
} else {
return R300_TX_MAX_ANISO_1_TO_1;
return R600_TX_MAX_ANISO_1_TO_1;
}
}
@@ -119,13 +119,13 @@ static GLuint aniso_filter(GLfloat anisotropy)
* \param magf Texture magnification mode
* \param anisotropy Maximum anisotropy level
*/
static void r300SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloat anisotropy)
static void r600SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloat anisotropy)
{
/* Force revalidation to account for switches from/to mipmapping. */
t->validated = GL_FALSE;
t->pp_txfilter &= ~(R300_TX_MIN_FILTER_MASK | R300_TX_MIN_FILTER_MIP_MASK | R300_TX_MAG_FILTER_MASK | R300_TX_MAX_ANISO_MASK);
t->pp_txfilter_1 &= ~R300_EDGE_ANISO_EDGE_ONLY;
t->pp_txfilter &= ~(R600_TX_MIN_FILTER_MASK | R600_TX_MIN_FILTER_MIP_MASK | R600_TX_MAG_FILTER_MASK | R600_TX_MAX_ANISO_MASK);
t->pp_txfilter_1 &= ~R600_EDGE_ANISO_EDGE_ONLY;
/* Note that EXT_texture_filter_anisotropic is extremely vague about
* how anisotropic filtering interacts with the "normal" filter modes.
@@ -133,9 +133,9 @@ static void r300SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloa
* filter settings completely. This includes driconf's settings.
*/
if (anisotropy >= 2.0 && (minf != GL_NEAREST) && (magf != GL_NEAREST)) {
t->pp_txfilter |= R300_TX_MAG_FILTER_ANISO
| R300_TX_MIN_FILTER_ANISO
| R300_TX_MIN_FILTER_MIP_LINEAR
t->pp_txfilter |= R600_TX_MAG_FILTER_ANISO
| R600_TX_MIN_FILTER_ANISO
| R600_TX_MIN_FILTER_MIP_LINEAR
| aniso_filter(anisotropy);
if (RADEON_DEBUG & DEBUG_TEXTURE)
fprintf(stderr, "Using maximum anisotropy of %f\n", anisotropy);
@@ -144,22 +144,22 @@ static void r300SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloa
switch (minf) {
case GL_NEAREST:
t->pp_txfilter |= R300_TX_MIN_FILTER_NEAREST;
t->pp_txfilter |= R600_TX_MIN_FILTER_NEAREST;
break;
case GL_LINEAR:
t->pp_txfilter |= R300_TX_MIN_FILTER_LINEAR;
t->pp_txfilter |= R600_TX_MIN_FILTER_LINEAR;
break;
case GL_NEAREST_MIPMAP_NEAREST:
t->pp_txfilter |= R300_TX_MIN_FILTER_NEAREST|R300_TX_MIN_FILTER_MIP_NEAREST;
t->pp_txfilter |= R600_TX_MIN_FILTER_NEAREST|R600_TX_MIN_FILTER_MIP_NEAREST;
break;
case GL_NEAREST_MIPMAP_LINEAR:
t->pp_txfilter |= R300_TX_MIN_FILTER_NEAREST|R300_TX_MIN_FILTER_MIP_LINEAR;
t->pp_txfilter |= R600_TX_MIN_FILTER_NEAREST|R600_TX_MIN_FILTER_MIP_LINEAR;
break;
case GL_LINEAR_MIPMAP_NEAREST:
t->pp_txfilter |= R300_TX_MIN_FILTER_LINEAR|R300_TX_MIN_FILTER_MIP_NEAREST;
t->pp_txfilter |= R600_TX_MIN_FILTER_LINEAR|R600_TX_MIN_FILTER_MIP_NEAREST;
break;
case GL_LINEAR_MIPMAP_LINEAR:
t->pp_txfilter |= R300_TX_MIN_FILTER_LINEAR|R300_TX_MIN_FILTER_MIP_LINEAR;
t->pp_txfilter |= R600_TX_MIN_FILTER_LINEAR|R600_TX_MIN_FILTER_MIP_LINEAR;
break;
}
@@ -168,15 +168,15 @@ static void r300SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloa
*/
switch (magf) {
case GL_NEAREST:
t->pp_txfilter |= R300_TX_MAG_FILTER_NEAREST;
t->pp_txfilter |= R600_TX_MAG_FILTER_NEAREST;
break;
case GL_LINEAR:
t->pp_txfilter |= R300_TX_MAG_FILTER_LINEAR;
t->pp_txfilter |= R600_TX_MAG_FILTER_LINEAR;
break;
}
}
static void r300SetTexBorderColor(radeonTexObjPtr t, GLubyte c[4])
static void r600SetTexBorderColor(radeonTexObjPtr t, GLubyte c[4])
{
t->pp_border_color = PACK_COLOR_8888(c[3], c[0], c[1], c[2]);
}
@@ -186,7 +186,7 @@ static void r300SetTexBorderColor(radeonTexObjPtr t, GLubyte c[4])
* next UpdateTextureState
*/
static void r300TexParameter(GLcontext * ctx, GLenum target,
static void r600TexParameter(GLcontext * ctx, GLenum target,
struct gl_texture_object *texObj,
GLenum pname, const GLfloat * params)
{
@@ -201,17 +201,17 @@ static void r300TexParameter(GLcontext * ctx, GLenum target,
case GL_TEXTURE_MIN_FILTER:
case GL_TEXTURE_MAG_FILTER:
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
r300SetTexFilter(t, texObj->MinFilter, texObj->MagFilter, texObj->MaxAnisotropy);
r600SetTexFilter(t, texObj->MinFilter, texObj->MagFilter, texObj->MaxAnisotropy);
break;
case GL_TEXTURE_WRAP_S:
case GL_TEXTURE_WRAP_T:
case GL_TEXTURE_WRAP_R:
r300UpdateTexWrap(t);
r600UpdateTexWrap(t);
break;
case GL_TEXTURE_BORDER_COLOR:
r300SetTexBorderColor(t, texObj->_BorderChan);
r600SetTexBorderColor(t, texObj->_BorderChan);
break;
case GL_TEXTURE_BASE_LEVEL:
@@ -235,7 +235,7 @@ static void r300TexParameter(GLcontext * ctx, GLenum target,
return;
if (texObj->Image[0][texObj->BaseLevel]->TexFormat->BaseFormat
== GL_DEPTH_COMPONENT) {
r300SetDepthTexMode(texObj);
r600SetDepthTexMode(texObj);
break;
} else {
/* If the texture isn't a depth texture, changing this
@@ -250,9 +250,9 @@ static void r300TexParameter(GLcontext * ctx, GLenum target,
}
}
static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
static void r600DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
radeonTexObj* t = radeon_tex_obj(texObj);
if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
@@ -265,7 +265,7 @@ static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
int i;
radeon_firevertices(&rmesa->radeon);
for(i = 0; i < R300_MAX_TEXTURE_UNITS; ++i)
for(i = 0; i < R600_MAX_TEXTURE_UNITS; ++i)
if (rmesa->hw.textures[i] == t)
rmesa->hw.textures[i] = 0;
}
@@ -289,11 +289,11 @@ static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
* allocate the default texture objects.
* Fixup MaxAnisotropy according to user preference.
*/
static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,
static struct gl_texture_object *r600NewTextureObject(GLcontext * ctx,
GLuint name,
GLenum target)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
@@ -306,14 +306,14 @@ static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,
t->base.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
/* Initialize hardware state */
r300UpdateTexWrap(t);
r300SetTexFilter(t, t->base.MinFilter, t->base.MagFilter, t->base.MaxAnisotropy);
r300SetTexBorderColor(t, t->base._BorderChan);
r600UpdateTexWrap(t);
r600SetTexFilter(t, t->base.MinFilter, t->base.MagFilter, t->base.MaxAnisotropy);
r600SetTexBorderColor(t, t->base._BorderChan);
return &t->base;
}
void r300InitTextureFuncs(struct dd_function_table *functions)
void r600InitTextureFuncs(struct dd_function_table *functions)
{
/* Note: we only plug in the functions we implement in the driver
* since _mesa_init_driver_functions() was already called.
@@ -332,11 +332,11 @@ void r300InitTextureFuncs(struct dd_function_table *functions)
functions->TexSubImage3D = radeonTexSubImage3D;
functions->GetTexImage = radeonGetTexImage;
functions->GetCompressedTexImage = radeonGetCompressedTexImage;
functions->NewTextureObject = r300NewTextureObject;
functions->DeleteTexture = r300DeleteTexture;
functions->NewTextureObject = r600NewTextureObject;
functions->DeleteTexture = r600DeleteTexture;
functions->IsTextureResident = driIsTextureResident;
functions->TexParameter = r300TexParameter;
functions->TexParameter = r600TexParameter;
functions->CompressedTexImage2D = radeonCompressedTexImage2D;
functions->CompressedTexSubImage2D = radeonCompressedTexSubImage2D;
+6 -6
View File
@@ -35,20 +35,20 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#ifndef __r600_TEX_H__
#define __r600_TEX_H__
extern void r300SetDepthTexMode(struct gl_texture_object *tObj);
extern void r600SetDepthTexMode(struct gl_texture_object *tObj);
extern void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target,
extern void r600SetTexBuffer(__DRIcontext *pDRICtx, GLint target,
__DRIdrawable *dPriv);
extern void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
extern void r600SetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
GLint format, __DRIdrawable *dPriv);
extern void r300SetTexOffset(__DRIcontext *pDRICtx, GLint texname,
extern void r600SetTexOffset(__DRIcontext *pDRICtx, GLint texname,
unsigned long long offset, GLint depth,
GLuint pitch);
extern GLboolean r300ValidateBuffers(GLcontext * ctx);
extern GLboolean r600ValidateBuffers(GLcontext * ctx);
extern void r300InitTextureFuncs(struct dd_function_table *functions);
extern void r600InitTextureFuncs(struct dd_function_table *functions);
#endif /* __r600_TEX_H__ */
+84 -84
View File
@@ -32,7 +32,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* \author Keith Whitwell <keith@tungstengraphics.com>
*
* \todo Enable R300 texture tiling code?
* \todo Enable R600 texture tiling code?
*/
#include "main/glheader.h"
@@ -63,8 +63,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* Note that the _REV formats are the same as the non-REV formats. This is
* because the REV and non-REV formats are identical as a byte string, but
* differ when accessed as 16-bit or 32-bit words depending on the endianness of
* the host. Since the textures are transferred to the R300 as a byte string
* (i.e. without any byte-swapping), the R300 sees the REV and non-REV formats
* the host. Since the textures are transferred to the R600 as a byte string
* (i.e. without any byte-swapping), the R600 sees the REV and non-REV formats
* identically. -- paulus
*/
@@ -73,73 +73,73 @@ static const struct tx_table {
} tx_table[] = {
/* *INDENT-OFF* */
#ifdef MESA_LITTLE_ENDIAN
_ASSIGN(RGBA8888, R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8)),
_ASSIGN(RGBA8888_REV, R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)),
_ASSIGN(ARGB8888, R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8)),
_ASSIGN(ARGB8888_REV, R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8)),
_ASSIGN(RGBA8888, R600_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8)),
_ASSIGN(RGBA8888_REV, R600_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)),
_ASSIGN(ARGB8888, R600_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8)),
_ASSIGN(ARGB8888_REV, R600_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8)),
#else
_ASSIGN(RGBA8888, R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)),
_ASSIGN(RGBA8888_REV, R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8)),
_ASSIGN(ARGB8888, R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8)),
_ASSIGN(ARGB8888_REV, R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8)),
_ASSIGN(RGBA8888, R600_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)),
_ASSIGN(RGBA8888_REV, R600_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8)),
_ASSIGN(ARGB8888, R600_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8)),
_ASSIGN(ARGB8888_REV, R600_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8)),
#endif
_ASSIGN(RGB888, R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8)),
_ASSIGN(RGB565, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)),
_ASSIGN(RGB565_REV, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)),
_ASSIGN(ARGB4444, R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4)),
_ASSIGN(ARGB4444_REV, R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4)),
_ASSIGN(ARGB1555, R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)),
_ASSIGN(ARGB1555_REV, R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)),
_ASSIGN(AL88, R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8)),
_ASSIGN(AL88_REV, R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8)),
_ASSIGN(RGB332, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z3Y3X2)),
_ASSIGN(A8, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X8)),
_ASSIGN(L8, R300_EASY_TX_FORMAT(X, X, X, ONE, X8)),
_ASSIGN(I8, R300_EASY_TX_FORMAT(X, X, X, X, X8)),
_ASSIGN(CI8, R300_EASY_TX_FORMAT(X, X, X, X, X8)),
_ASSIGN(YCBCR, R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE),
_ASSIGN(YCBCR_REV, R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE),
_ASSIGN(RGB_DXT1, R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1)),
_ASSIGN(RGBA_DXT1, R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1)),
_ASSIGN(RGBA_DXT3, R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3)),
_ASSIGN(RGBA_DXT5, R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5)),
_ASSIGN(RGBA_FLOAT32, R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R32G32B32A32)),
_ASSIGN(RGBA_FLOAT16, R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16)),
_ASSIGN(RGB888, R600_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8)),
_ASSIGN(RGB565, R600_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)),
_ASSIGN(RGB565_REV, R600_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)),
_ASSIGN(ARGB4444, R600_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4)),
_ASSIGN(ARGB4444_REV, R600_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4)),
_ASSIGN(ARGB1555, R600_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)),
_ASSIGN(ARGB1555_REV, R600_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)),
_ASSIGN(AL88, R600_EASY_TX_FORMAT(X, X, X, Y, Y8X8)),
_ASSIGN(AL88_REV, R600_EASY_TX_FORMAT(X, X, X, Y, Y8X8)),
_ASSIGN(RGB332, R600_EASY_TX_FORMAT(X, Y, Z, ONE, Z3Y3X2)),
_ASSIGN(A8, R600_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X8)),
_ASSIGN(L8, R600_EASY_TX_FORMAT(X, X, X, ONE, X8)),
_ASSIGN(I8, R600_EASY_TX_FORMAT(X, X, X, X, X8)),
_ASSIGN(CI8, R600_EASY_TX_FORMAT(X, X, X, X, X8)),
_ASSIGN(YCBCR, R600_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R600_TX_FORMAT_YUV_MODE),
_ASSIGN(YCBCR_REV, R600_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R600_TX_FORMAT_YUV_MODE),
_ASSIGN(RGB_DXT1, R600_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1)),
_ASSIGN(RGBA_DXT1, R600_EASY_TX_FORMAT(X, Y, Z, W, DXT1)),
_ASSIGN(RGBA_DXT3, R600_EASY_TX_FORMAT(X, Y, Z, W, DXT3)),
_ASSIGN(RGBA_DXT5, R600_EASY_TX_FORMAT(Y, Z, W, X, DXT5)),
_ASSIGN(RGBA_FLOAT32, R600_EASY_TX_FORMAT(Z, Y, X, W, FL_R32G32B32A32)),
_ASSIGN(RGBA_FLOAT16, R600_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16)),
_ASSIGN(RGB_FLOAT32, 0xffffffff),
_ASSIGN(RGB_FLOAT16, 0xffffffff),
_ASSIGN(ALPHA_FLOAT32, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I32)),
_ASSIGN(ALPHA_FLOAT16, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I16)),
_ASSIGN(LUMINANCE_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I32)),
_ASSIGN(LUMINANCE_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I16)),
_ASSIGN(LUMINANCE_ALPHA_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, Y, FL_I32A32)),
_ASSIGN(LUMINANCE_ALPHA_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, Y, FL_I16A16)),
_ASSIGN(INTENSITY_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, X, FL_I32)),
_ASSIGN(INTENSITY_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, X, FL_I16)),
_ASSIGN(Z16, R300_EASY_TX_FORMAT(X, X, X, X, X16)),
_ASSIGN(Z24_S8, R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8)),
_ASSIGN(Z32, R300_EASY_TX_FORMAT(X, X, X, X, X32)),
_ASSIGN(ALPHA_FLOAT32, R600_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I32)),
_ASSIGN(ALPHA_FLOAT16, R600_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I16)),
_ASSIGN(LUMINANCE_FLOAT32, R600_EASY_TX_FORMAT(X, X, X, ONE, FL_I32)),
_ASSIGN(LUMINANCE_FLOAT16, R600_EASY_TX_FORMAT(X, X, X, ONE, FL_I16)),
_ASSIGN(LUMINANCE_ALPHA_FLOAT32, R600_EASY_TX_FORMAT(X, X, X, Y, FL_I32A32)),
_ASSIGN(LUMINANCE_ALPHA_FLOAT16, R600_EASY_TX_FORMAT(X, X, X, Y, FL_I16A16)),
_ASSIGN(INTENSITY_FLOAT32, R600_EASY_TX_FORMAT(X, X, X, X, FL_I32)),
_ASSIGN(INTENSITY_FLOAT16, R600_EASY_TX_FORMAT(X, X, X, X, FL_I16)),
_ASSIGN(Z16, R600_EASY_TX_FORMAT(X, X, X, X, X16)),
_ASSIGN(Z24_S8, R600_EASY_TX_FORMAT(X, X, X, X, X24_Y8)),
_ASSIGN(Z32, R600_EASY_TX_FORMAT(X, X, X, X, X32)),
/* *INDENT-ON* */
};
#undef _ASSIGN
void r300SetDepthTexMode(struct gl_texture_object *tObj)
void r600SetDepthTexMode(struct gl_texture_object *tObj)
{
static const GLuint formats[3][3] = {
{
R300_EASY_TX_FORMAT(X, X, X, ONE, X16),
R300_EASY_TX_FORMAT(X, X, X, X, X16),
R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X16),
R600_EASY_TX_FORMAT(X, X, X, ONE, X16),
R600_EASY_TX_FORMAT(X, X, X, X, X16),
R600_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X16),
},
{
R300_EASY_TX_FORMAT(X, X, X, ONE, X24_Y8),
R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8),
R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X24_Y8),
R600_EASY_TX_FORMAT(X, X, X, ONE, X24_Y8),
R600_EASY_TX_FORMAT(X, X, X, X, X24_Y8),
R600_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X24_Y8),
},
{
R300_EASY_TX_FORMAT(X, X, X, ONE, X32),
R300_EASY_TX_FORMAT(X, X, X, X, X32),
R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X32),
R600_EASY_TX_FORMAT(X, X, X, ONE, X32),
R600_EASY_TX_FORMAT(X, X, X, X, X32),
R600_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X32),
},
};
const GLuint *format;
@@ -192,9 +192,9 @@ void r300SetDepthTexMode(struct gl_texture_object *tObj)
* Compute the cached hardware register values for the given texture object.
*
* \param rmesa Context pointer
* \param t the r300 texture object
* \param t the r600 texture object
*/
static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)
static void setup_hardware_state(r600ContextPtr rmesa, radeonTexObj *t)
{
const struct gl_texture_image *firstImage;
int firstlevel = t->mt ? t->mt->firstLevel : 0;
@@ -204,7 +204,7 @@ static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)
if (!t->image_override
&& VALID_FORMAT(firstImage->TexFormat->MesaFormat)) {
if (firstImage->TexFormat->BaseFormat == GL_DEPTH_COMPONENT) {
r300SetDepthTexMode(&t->base);
r600SetDepthTexMode(&t->base);
} else {
t->pp_txformat = tx_table[firstImage->TexFormat->MesaFormat].format;
}
@@ -219,22 +219,22 @@ static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)
if (t->image_override && t->bo)
return;
t->pp_txsize = (((firstImage->Width - 1) << R300_TX_WIDTHMASK_SHIFT)
| ((firstImage->Height - 1) << R300_TX_HEIGHTMASK_SHIFT)
| ((firstImage->DepthLog2) << R300_TX_DEPTHMASK_SHIFT)
| ((t->mt->lastLevel - t->mt->firstLevel) << R300_TX_MAX_MIP_LEVEL_SHIFT));
t->pp_txsize = (((firstImage->Width - 1) << R600_TX_WIDTHMASK_SHIFT)
| ((firstImage->Height - 1) << R600_TX_HEIGHTMASK_SHIFT)
| ((firstImage->DepthLog2) << R600_TX_DEPTHMASK_SHIFT)
| ((t->mt->lastLevel - t->mt->firstLevel) << R600_TX_MAX_MIP_LEVEL_SHIFT));
t->tile_bits = 0;
if (t->base.Target == GL_TEXTURE_CUBE_MAP)
t->pp_txformat |= R300_TX_FORMAT_CUBIC_MAP;
t->pp_txformat |= R600_TX_FORMAT_CUBIC_MAP;
if (t->base.Target == GL_TEXTURE_3D)
t->pp_txformat |= R300_TX_FORMAT_3D;
t->pp_txformat |= R600_TX_FORMAT_3D;
if (t->base.Target == GL_TEXTURE_RECTANGLE_NV) {
unsigned int align = (64 / t->mt->bpp) - 1;
t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
t->pp_txsize |= R600_TX_SIZE_TXPITCH_EN;
if (!t->image_override)
t->pp_txpitch = ((firstImage->Width + align) & ~align) - 1;
}
@@ -252,9 +252,9 @@ static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)
*
* Mostly this means populating the texture object's mipmap tree.
*/
static GLboolean r300_validate_texture(GLcontext * ctx, struct gl_texture_object *texObj)
static GLboolean r600_validate_texture(GLcontext * ctx, struct gl_texture_object *texObj)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
radeonTexObj *t = radeon_tex_obj(texObj);
if (!radeon_validate_texture_miptree(ctx, texObj))
@@ -271,9 +271,9 @@ static GLboolean r300_validate_texture(GLcontext * ctx, struct gl_texture_object
/**
* Ensure all enabled and complete textures are uploaded along with any buffers being used.
*/
GLboolean r300ValidateBuffers(GLcontext * ctx)
GLboolean r600ValidateBuffers(GLcontext * ctx)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
r600ContextPtr rmesa = R600_CONTEXT(ctx);
struct radeon_renderbuffer *rrb;
int i;
@@ -299,7 +299,7 @@ GLboolean r300ValidateBuffers(GLcontext * ctx)
if (!ctx->Texture.Unit[i]._ReallyEnabled)
continue;
if (!r300_validate_texture(ctx, ctx->Texture.Unit[i]._Current)) {
if (!r600_validate_texture(ctx, ctx->Texture.Unit[i]._Current)) {
_mesa_warning(ctx,
"failed to validate texture for unit %d.\n",
i);
@@ -319,10 +319,10 @@ GLboolean r300ValidateBuffers(GLcontext * ctx)
return radeon_revalidate_bos(ctx);
}
void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
unsigned long long offset, GLint depth, GLuint pitch)
{
r300ContextPtr rmesa = pDRICtx->driverPrivate;
r600ContextPtr rmesa = pDRICtx->driverPrivate;
struct gl_texture_object *tObj =
_mesa_lookup_texture(rmesa->radeon.glCtx, texname);
radeonTexObjPtr t = radeon_tex_obj(tObj);
@@ -343,18 +343,18 @@ void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
switch (depth) {
case 32:
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
t->pp_txformat = R600_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
t->pp_txfilter |= tx_table[2].filter;
pitch_val /= 4;
break;
case 24:
default:
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
t->pp_txformat = R600_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
t->pp_txfilter |= tx_table[4].filter;
pitch_val /= 4;
break;
case 16:
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
t->pp_txformat = R600_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
t->pp_txfilter |= tx_table[5].filter;
pitch_val /= 2;
break;
@@ -364,7 +364,7 @@ void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
t->pp_txpitch |= pitch_val;
}
void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_format, __DRIdrawable *dPriv)
void r600SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_format, __DRIdrawable *dPriv)
{
struct gl_texture_unit *texUnit;
struct gl_texture_object *texObj;
@@ -372,7 +372,7 @@ void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
struct radeon_renderbuffer *rb;
radeon_texture_image *rImage;
radeonContextPtr radeon;
r300ContextPtr rmesa;
r600ContextPtr rmesa;
struct radeon_framebuffer *rfb;
radeonTexObjPtr t;
uint32_t pitch_val;
@@ -449,26 +449,26 @@ void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
pitch_val = rb->pitch;
switch (rb->cpp) {
case 4:
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
t->pp_txformat = R600_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
t->pp_txfilter |= tx_table[2].filter;
pitch_val /= 4;
break;
case 3:
default:
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
t->pp_txformat = R600_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
t->pp_txfilter |= tx_table[4].filter;
pitch_val /= 4;
break;
case 2:
t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
t->pp_txformat = R600_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
t->pp_txfilter |= tx_table[5].filter;
pitch_val /= 2;
break;
}
pitch_val--;
t->pp_txsize = ((rb->width - 1) << R300_TX_WIDTHMASK_SHIFT) |
((rb->height - 1) << R300_TX_HEIGHTMASK_SHIFT);
t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
t->pp_txsize = ((rb->width - 1) << R600_TX_WIDTHMASK_SHIFT) |
((rb->height - 1) << R600_TX_HEIGHTMASK_SHIFT);
t->pp_txsize |= R600_TX_SIZE_TXPITCH_EN;
t->pp_txpitch |= pitch_val;
if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
@@ -482,7 +482,7 @@ void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
return;
}
void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
void r600SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
{
r300SetTexBuffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv);
r600SetTexBuffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv);
}
+79 -79
View File
@@ -69,8 +69,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
u_temp_i=VSF_MAX_FRAGMENT_TEMPS-1; \
} while (0)
int r300VertexProgUpdateParams(GLcontext * ctx,
struct r300_vertex_program_cont *vp, float *dst)
int r600VertexProgUpdateParams(GLcontext * ctx,
struct r600_vertex_program_cont *vp, float *dst)
{
int pi;
struct gl_vertex_program *mesa_vp = &vp->mesa_program;
@@ -152,7 +152,7 @@ static unsigned long t_dst_class(gl_register_file file)
}
}
static unsigned long t_dst_index(struct r300_vertex_program *vp,
static unsigned long t_dst_index(struct r600_vertex_program *vp,
struct prog_dst_register *dst)
{
if (dst->File == PROGRAM_OUTPUT)
@@ -193,7 +193,7 @@ static INLINE unsigned long t_swizzle(GLubyte swizzle)
}
#if 0
static void vp_dump_inputs(struct r300_vertex_program *vp, char *caller)
static void vp_dump_inputs(struct r600_vertex_program *vp, char *caller)
{
int i;
@@ -211,7 +211,7 @@ static void vp_dump_inputs(struct r300_vertex_program *vp, char *caller)
}
#endif
static unsigned long t_src_index(struct r300_vertex_program *vp,
static unsigned long t_src_index(struct r600_vertex_program *vp,
struct prog_src_register *src)
{
int i;
@@ -242,7 +242,7 @@ static unsigned long t_src_index(struct r300_vertex_program *vp,
/* these two functions should probably be merged... */
static unsigned long t_src(struct r300_vertex_program *vp,
static unsigned long t_src(struct r600_vertex_program *vp,
struct prog_src_register *src)
{
/* src->NegateBase uses the NEGATE_ flags from program_instruction.h,
@@ -257,7 +257,7 @@ static unsigned long t_src(struct r300_vertex_program *vp,
src->NegateBase) | (src->RelAddr << 4);
}
static unsigned long t_src_scalar(struct r300_vertex_program *vp,
static unsigned long t_src_scalar(struct r600_vertex_program *vp,
struct prog_src_register *src)
{
/* src->NegateBase uses the NEGATE_ flags from program_instruction.h,
@@ -274,7 +274,7 @@ static unsigned long t_src_scalar(struct r300_vertex_program *vp,
(src->RelAddr << 4);
}
static GLboolean valid_dst(struct r300_vertex_program *vp,
static GLboolean valid_dst(struct r600_vertex_program *vp,
struct prog_dst_register *dst)
{
if (dst->File == PROGRAM_OUTPUT && vp->outputs[dst->Index] == -1) {
@@ -286,7 +286,7 @@ static GLboolean valid_dst(struct r300_vertex_program *vp,
return GL_TRUE;
}
static GLuint *r300TranslateOpcodeABS(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeABS(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -314,7 +314,7 @@ static GLuint *r300TranslateOpcodeABS(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeADD(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeADD(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -332,7 +332,7 @@ static GLuint *r300TranslateOpcodeADD(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeARL(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeARL(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -350,7 +350,7 @@ static GLuint *r300TranslateOpcodeARL(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeDP3(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeDP3(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -386,7 +386,7 @@ static GLuint *r300TranslateOpcodeDP3(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeDP4(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeDP4(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -404,7 +404,7 @@ static GLuint *r300TranslateOpcodeDP4(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeDPH(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeDPH(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -431,7 +431,7 @@ static GLuint *r300TranslateOpcodeDPH(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeDST(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeDST(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -449,7 +449,7 @@ static GLuint *r300TranslateOpcodeDST(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeEX2(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeEX2(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -467,7 +467,7 @@ static GLuint *r300TranslateOpcodeEX2(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeEXP(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeEXP(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -485,7 +485,7 @@ static GLuint *r300TranslateOpcodeEXP(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeFLR(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeFLR(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3],
@@ -527,7 +527,7 @@ static GLuint *r300TranslateOpcodeFLR(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeFRC(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeFRC(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -545,7 +545,7 @@ static GLuint *r300TranslateOpcodeFRC(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeLG2(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeLG2(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -573,7 +573,7 @@ static GLuint *r300TranslateOpcodeLG2(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeLIT(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeLIT(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -615,7 +615,7 @@ static GLuint *r300TranslateOpcodeLIT(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeLOG(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeLOG(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -633,7 +633,7 @@ static GLuint *r300TranslateOpcodeLOG(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeMAD(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeMAD(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -651,7 +651,7 @@ static GLuint *r300TranslateOpcodeMAD(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeMAX(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeMAX(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -669,7 +669,7 @@ static GLuint *r300TranslateOpcodeMAX(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeMIN(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeMIN(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -687,7 +687,7 @@ static GLuint *r300TranslateOpcodeMIN(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeMOV(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeMOV(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -707,7 +707,7 @@ static GLuint *r300TranslateOpcodeMOV(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeMUL(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeMUL(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -725,7 +725,7 @@ static GLuint *r300TranslateOpcodeMUL(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodePOW(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodePOW(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -743,7 +743,7 @@ static GLuint *r300TranslateOpcodePOW(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeRCP(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeRCP(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -761,7 +761,7 @@ static GLuint *r300TranslateOpcodeRCP(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeRSQ(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeRSQ(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -779,7 +779,7 @@ static GLuint *r300TranslateOpcodeRSQ(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeSGE(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeSGE(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -797,7 +797,7 @@ static GLuint *r300TranslateOpcodeSGE(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeSLT(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeSLT(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -815,7 +815,7 @@ static GLuint *r300TranslateOpcodeSLT(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeSUB(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeSUB(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -864,7 +864,7 @@ static GLuint *r300TranslateOpcodeSUB(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeSWZ(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeSWZ(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3])
@@ -884,7 +884,7 @@ static GLuint *r300TranslateOpcodeSWZ(struct r300_vertex_program *vp,
return inst;
}
static GLuint *r300TranslateOpcodeXPD(struct r300_vertex_program *vp,
static GLuint *r600TranslateOpcodeXPD(struct r600_vertex_program *vp,
struct prog_instruction *vpi,
GLuint * inst,
struct prog_src_register src[3],
@@ -951,7 +951,7 @@ static GLuint *r300TranslateOpcodeXPD(struct r300_vertex_program *vp,
return inst;
}
static void t_inputs_outputs(struct r300_vertex_program *vp)
static void t_inputs_outputs(struct r600_vertex_program *vp)
{
int i;
int cur_reg = 0;
@@ -1005,14 +1005,14 @@ static void t_inputs_outputs(struct r300_vertex_program *vp)
}
}
static void r300TranslateVertexShader(struct r300_vertex_program *vp,
static void r600TranslateVertexShader(struct r600_vertex_program *vp,
struct prog_instruction *vpi)
{
int i;
GLuint *inst;
unsigned long num_operands;
/* Initial value should be last tmp reg that hw supports.
Strangely enough r300 doesnt mind even though these would be out of range.
Strangely enough r600 doesnt mind even though these would be out of range.
Smart enough to realize that it doesnt need it? */
int u_temp_i = VSF_MAX_FRAGMENT_TEMPS - 1;
struct prog_src_register src[3];
@@ -1104,86 +1104,86 @@ static void r300TranslateVertexShader(struct r300_vertex_program *vp,
switch (vpi->Opcode) {
case OPCODE_ABS:
inst = r300TranslateOpcodeABS(vp, vpi, inst, src);
inst = r600TranslateOpcodeABS(vp, vpi, inst, src);
break;
case OPCODE_ADD:
inst = r300TranslateOpcodeADD(vp, vpi, inst, src);
inst = r600TranslateOpcodeADD(vp, vpi, inst, src);
break;
case OPCODE_ARL:
inst = r300TranslateOpcodeARL(vp, vpi, inst, src);
inst = r600TranslateOpcodeARL(vp, vpi, inst, src);
break;
case OPCODE_DP3:
inst = r300TranslateOpcodeDP3(vp, vpi, inst, src);
inst = r600TranslateOpcodeDP3(vp, vpi, inst, src);
break;
case OPCODE_DP4:
inst = r300TranslateOpcodeDP4(vp, vpi, inst, src);
inst = r600TranslateOpcodeDP4(vp, vpi, inst, src);
break;
case OPCODE_DPH:
inst = r300TranslateOpcodeDPH(vp, vpi, inst, src);
inst = r600TranslateOpcodeDPH(vp, vpi, inst, src);
break;
case OPCODE_DST:
inst = r300TranslateOpcodeDST(vp, vpi, inst, src);
inst = r600TranslateOpcodeDST(vp, vpi, inst, src);
break;
case OPCODE_EX2:
inst = r300TranslateOpcodeEX2(vp, vpi, inst, src);
inst = r600TranslateOpcodeEX2(vp, vpi, inst, src);
break;
case OPCODE_EXP:
inst = r300TranslateOpcodeEXP(vp, vpi, inst, src);
inst = r600TranslateOpcodeEXP(vp, vpi, inst, src);
break;
case OPCODE_FLR:
inst = r300TranslateOpcodeFLR(vp, vpi, inst, src, /* FIXME */
inst = r600TranslateOpcodeFLR(vp, vpi, inst, src, /* FIXME */
&u_temp_i);
break;
case OPCODE_FRC:
inst = r300TranslateOpcodeFRC(vp, vpi, inst, src);
inst = r600TranslateOpcodeFRC(vp, vpi, inst, src);
break;
case OPCODE_LG2:
inst = r300TranslateOpcodeLG2(vp, vpi, inst, src);
inst = r600TranslateOpcodeLG2(vp, vpi, inst, src);
break;
case OPCODE_LIT:
inst = r300TranslateOpcodeLIT(vp, vpi, inst, src);
inst = r600TranslateOpcodeLIT(vp, vpi, inst, src);
break;
case OPCODE_LOG:
inst = r300TranslateOpcodeLOG(vp, vpi, inst, src);
inst = r600TranslateOpcodeLOG(vp, vpi, inst, src);
break;
case OPCODE_MAD:
inst = r300TranslateOpcodeMAD(vp, vpi, inst, src);
inst = r600TranslateOpcodeMAD(vp, vpi, inst, src);
break;
case OPCODE_MAX:
inst = r300TranslateOpcodeMAX(vp, vpi, inst, src);
inst = r600TranslateOpcodeMAX(vp, vpi, inst, src);
break;
case OPCODE_MIN:
inst = r300TranslateOpcodeMIN(vp, vpi, inst, src);
inst = r600TranslateOpcodeMIN(vp, vpi, inst, src);
break;
case OPCODE_MOV:
inst = r300TranslateOpcodeMOV(vp, vpi, inst, src);
inst = r600TranslateOpcodeMOV(vp, vpi, inst, src);
break;
case OPCODE_MUL:
inst = r300TranslateOpcodeMUL(vp, vpi, inst, src);
inst = r600TranslateOpcodeMUL(vp, vpi, inst, src);
break;
case OPCODE_POW:
inst = r300TranslateOpcodePOW(vp, vpi, inst, src);
inst = r600TranslateOpcodePOW(vp, vpi, inst, src);
break;
case OPCODE_RCP:
inst = r300TranslateOpcodeRCP(vp, vpi, inst, src);
inst = r600TranslateOpcodeRCP(vp, vpi, inst, src);
break;
case OPCODE_RSQ:
inst = r300TranslateOpcodeRSQ(vp, vpi, inst, src);
inst = r600TranslateOpcodeRSQ(vp, vpi, inst, src);
break;
case OPCODE_SGE:
inst = r300TranslateOpcodeSGE(vp, vpi, inst, src);
inst = r600TranslateOpcodeSGE(vp, vpi, inst, src);
break;
case OPCODE_SLT:
inst = r300TranslateOpcodeSLT(vp, vpi, inst, src);
inst = r600TranslateOpcodeSLT(vp, vpi, inst, src);
break;
case OPCODE_SUB:
inst = r300TranslateOpcodeSUB(vp, vpi, inst, src);
inst = r600TranslateOpcodeSUB(vp, vpi, inst, src);
break;
case OPCODE_SWZ:
inst = r300TranslateOpcodeSWZ(vp, vpi, inst, src);
inst = r600TranslateOpcodeSWZ(vp, vpi, inst, src);
break;
case OPCODE_XPD:
inst = r300TranslateOpcodeXPD(vp, vpi, inst, src, /* FIXME */
inst = r600TranslateOpcodeXPD(vp, vpi, inst, src, /* FIXME */
&u_temp_i);
break;
default:
@@ -1309,7 +1309,7 @@ static void position_invariant(struct gl_program *prog)
assert(vpi->Opcode == OPCODE_END);
}
static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
static void insert_wpos(struct r600_vertex_program *vp, struct gl_program *prog,
GLuint temp_index)
{
struct prog_instruction *vpi;
@@ -1361,7 +1361,7 @@ static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
assert(vpi->Opcode == OPCODE_END);
}
static void pos_as_texcoord(struct r300_vertex_program *vp,
static void pos_as_texcoord(struct r600_vertex_program *vp,
struct gl_program *prog)
{
struct prog_instruction *vpi;
@@ -1379,11 +1379,11 @@ static void pos_as_texcoord(struct r300_vertex_program *vp,
insert_wpos(vp, prog, tempregi);
}
static struct r300_vertex_program *build_program(struct r300_vertex_program_key
static struct r600_vertex_program *build_program(struct r600_vertex_program_key
*wanted_key, struct gl_vertex_program
*mesa_vp, GLint wpos_idx)
{
struct r300_vertex_program *vp;
struct r600_vertex_program *vp;
vp = _mesa_calloc(sizeof(*vp));
_mesa_memcpy(&vp->key, wanted_key, sizeof(vp->key));
@@ -1399,12 +1399,12 @@ static struct r300_vertex_program *build_program(struct r300_vertex_program_key
assert(mesa_vp->Base.NumInstructions);
vp->num_temporaries = mesa_vp->Base.NumTemporaries;
r300TranslateVertexShader(vp, mesa_vp->Base.Instructions);
r600TranslateVertexShader(vp, mesa_vp->Base.Instructions);
return vp;
}
static void add_outputs(struct r300_vertex_program_key *key, GLint vert)
static void add_outputs(struct r600_vertex_program_key *key, GLint vert)
{
if (key->OutputsWritten & (1 << vert))
return;
@@ -1413,17 +1413,17 @@ static void add_outputs(struct r300_vertex_program_key *key, GLint vert)
key->OutputsAdded |= 1 << vert;
}
void r300SelectVertexShader(r300ContextPtr r300)
void r600SelectVertexShader(r600ContextPtr r600)
{
GLcontext *ctx = ctx = r300->radeon.glCtx;
GLcontext *ctx = ctx = r600->radeon.glCtx;
GLuint InputsRead;
struct r300_vertex_program_key wanted_key = { 0 };
struct r600_vertex_program_key wanted_key = { 0 };
GLint i;
struct r300_vertex_program_cont *vpc;
struct r300_vertex_program *vp;
struct r600_vertex_program_cont *vpc;
struct r600_vertex_program *vp;
GLint wpos_idx;
vpc = (struct r300_vertex_program_cont *)ctx->VertexProgram._Current;
vpc = (struct r600_vertex_program_cont *)ctx->VertexProgram._Current;
wanted_key.InputsRead = vpc->mesa_program.Base.InputsRead;
wanted_key.OutputsWritten = vpc->mesa_program.Base.OutputsWritten;
InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
@@ -1467,7 +1467,7 @@ void r300SelectVertexShader(r300ContextPtr r300)
for (vp = vpc->progs; vp; vp = vp->next)
if (_mesa_memcmp(&vp->key, &wanted_key, sizeof(wanted_key))
== 0) {
r300->selected_vp = vp;
r600->selected_vp = vp;
return;
}
//_mesa_print_program(&vpc->mesa_program.Base);
@@ -1475,5 +1475,5 @@ void r300SelectVertexShader(r300ContextPtr r300)
vp = build_program(&wanted_key, &vpc->mesa_program, wpos_idx);
vp->next = vpc->progs;
vpc->progs = vp;
r300->selected_vp = vp;
r600->selected_vp = vp;
}
+14 -14
View File
@@ -189,13 +189,13 @@ static GLboolean transform_TEX(
}
static void update_params(r300ContextPtr r300, struct r500_fragment_program *fp)
static void update_params(r600ContextPtr r600, struct r500_fragment_program *fp)
{
struct gl_fragment_program *mp = &fp->mesa_program;
/* Ask Mesa nicely to fill in ParameterValues for us */
if (mp->Base.Parameters)
_mesa_load_state_parameters(r300->radeon.glCtx, mp->Base.Parameters);
_mesa_load_state_parameters(r600->radeon.glCtx, mp->Base.Parameters);
}
@@ -218,7 +218,7 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler)
return;
static gl_state_index tokens[STATE_LENGTH] = {
STATE_INTERNAL, STATE_R300_WINDOW_DIMENSION, 0, 0, 0
STATE_INTERNAL, STATE_R600_WINDOW_DIMENSION, 0, 0, 0
};
struct prog_instruction *fpi;
GLuint window_index;
@@ -419,7 +419,7 @@ static GLuint build_func(GLuint comparefunc)
* fragment program.
*/
static void build_state(
r300ContextPtr r300,
r600ContextPtr r600,
struct r500_fragment_program *fp,
struct r500_fragment_program_external_state *state)
{
@@ -429,7 +429,7 @@ static void build_state(
for(unit = 0; unit < 16; ++unit) {
if (fp->mesa_program.Base.ShadowSamplers & (1 << unit)) {
struct gl_texture_object* tex = r300->radeon.glCtx->Texture.Unit[unit]._Current;
struct gl_texture_object* tex = r600->radeon.glCtx->Texture.Unit[unit]._Current;
state->unit[unit].depth_texture_mode = build_dtm(tex->DepthMode);
state->unit[unit].texture_compare_func = build_func(tex->CompareFunc);
@@ -439,12 +439,12 @@ static void build_state(
static void dump_program(struct r500_fragment_program_code *code);
void r500TranslateFragmentShader(r300ContextPtr r300,
void r500TranslateFragmentShader(r600ContextPtr r600,
struct r500_fragment_program *fp)
{
struct r500_fragment_program_external_state state;
build_state(r300, fp, &state);
build_state(r600, fp, &state);
if (_mesa_memcmp(&fp->state, &state, sizeof(state))) {
/* TODO: cache compiled programs */
fp->translated = GL_FALSE;
@@ -454,10 +454,10 @@ void r500TranslateFragmentShader(r300ContextPtr r300,
if (!fp->translated) {
struct r500_fragment_program_compiler compiler;
compiler.r300 = r300;
compiler.r600 = r600;
compiler.fp = fp;
compiler.code = &fp->code;
compiler.program = _mesa_clone_program(r300->radeon.glCtx, &fp->mesa_program.Base);
compiler.program = _mesa_clone_program(r600->radeon.glCtx, &fp->mesa_program.Base);
if (RADEON_DEBUG & DEBUG_PIXEL) {
_mesa_printf("Compiler: Initial program:\n");
@@ -472,7 +472,7 @@ void r500TranslateFragmentShader(r300ContextPtr r300,
{ &radeonTransformDeriv, 0 },
{ &radeonTransformTrigScale, 0 }
};
radeonLocalTransform(r300->radeon.glCtx, compiler.program,
radeonLocalTransform(r600->radeon.glCtx, compiler.program,
4, transformations);
if (RADEON_DEBUG & DEBUG_PIXEL) {
@@ -486,7 +486,7 @@ void r500TranslateFragmentShader(r300ContextPtr r300,
.BuildSwizzle = &nqssadce_build_swizzle,
.RewriteDepthOut = GL_TRUE
};
radeonNqssaDce(r300->radeon.glCtx, compiler.program, &nqssadce);
radeonNqssaDce(r600->radeon.glCtx, compiler.program, &nqssadce);
if (RADEON_DEBUG & DEBUG_PIXEL) {
_mesa_printf("Compiler: after NqSSA-DCE:\n");
@@ -500,9 +500,9 @@ void r500TranslateFragmentShader(r300ContextPtr r300,
fp->mesa_program.Base.Parameters = compiler.program->Parameters;
compiler.program->Parameters = 0;
_mesa_reference_program(r300->radeon.glCtx, &compiler.program, 0);
_mesa_reference_program(r600->radeon.glCtx, &compiler.program, 0);
r300UpdateStateParameters(r300->radeon.glCtx, _NEW_PROGRAM);
r600UpdateStateParameters(r600->radeon.glCtx, _NEW_PROGRAM);
if (RADEON_DEBUG & DEBUG_PIXEL) {
if (fp->translated) {
@@ -513,7 +513,7 @@ void r500TranslateFragmentShader(r300ContextPtr r300,
}
update_params(r300, fp);
update_params(r600, fp);
}
+2 -2
View File
@@ -47,11 +47,11 @@
struct r500_fragment_program;
extern void r500TranslateFragmentShader(r300ContextPtr r300,
extern void r500TranslateFragmentShader(r600ContextPtr r600,
struct r500_fragment_program *fp);
struct r500_fragment_program_compiler {
r300ContextPtr r300;
r600ContextPtr r600;
struct r500_fragment_program *fp;
struct r500_fragment_program_code *code;
struct gl_program *program;
@@ -308,7 +308,7 @@ GLboolean r500FragmentProgramEmit(struct r500_fragment_program_compiler *compile
code->inst_offset = 0;
code->inst_end = -1;
if (!radeonPairProgram(compiler->r300->radeon.glCtx, compiler->program, &pair_handler, compiler))
if (!radeonPairProgram(compiler->r600->radeon.glCtx, compiler->program, &pair_handler, compiler))
return GL_FALSE;
if ((code->inst[code->inst_end].inst0 & R500_INST_TYPE_MASK) != R500_INST_TYPE_OUT) {
+8 -8
View File
@@ -398,15 +398,15 @@ static const __DRItexBufferExtension r300TexBufferExtension = {
#endif
#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600)
static const __DRItexOffsetExtension r300texOffsetExtension = {
static const __DRItexOffsetExtension r600texOffsetExtension = {
{ __DRI_TEX_OFFSET, __DRI_TEX_OFFSET_VERSION },
r300SetTexOffset,
r600SetTexOffset,
};
static const __DRItexBufferExtension r300TexBufferExtension = {
static const __DRItexBufferExtension r600TexBufferExtension = {
{ __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
r300SetTexBuffer,
r300SetTexBuffer2,
r600SetTexBuffer,
r600SetTexBuffer2,
};
#endif
@@ -1201,7 +1201,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
#endif
#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600)
screen->extensions[i++] = &r300texOffsetExtension.base;
screen->extensions[i++] = &r600texOffsetExtension.base;
#endif
}
@@ -1334,7 +1334,7 @@ radeonCreateScreen2(__DRIscreenPrivate *sPriv)
#endif
#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600)
screen->extensions[i++] = &r300TexBufferExtension.base;
screen->extensions[i++] = &r600TexBufferExtension.base;
#endif
screen->extensions[i++] = NULL;
@@ -1532,7 +1532,7 @@ static GLboolean radeonCreateContext(const __GLcontextModes * glVisual,
radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600)
if (IS_R600_CLASS(screen))
return r300CreateContext(glVisual, driContextPriv, sharedContextPriv);
return r600CreateContext(glVisual, driContextPriv, sharedContextPriv);
#endif
#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)