|
|
@@ -104,159 +104,156 @@ static GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr, |
|
|
|
|
|
|
|
static void r300SetVertexFormat( GLcontext *ctx ) |
|
|
|
{ |
|
|
|
r300ContextPtr rmesa = R300_CONTEXT( ctx ); |
|
|
|
TNLcontext *tnl = TNL_CONTEXT(ctx); |
|
|
|
struct vertex_buffer *VB = &tnl->vb; |
|
|
|
DECLARE_RENDERINPUTS(index_bitset); |
|
|
|
GLuint InputsRead = 0, OutputsWritten = 0; |
|
|
|
int vap_fmt_0 = 0; |
|
|
|
int vap_vte_cntl = 0; |
|
|
|
int offset = 0; |
|
|
|
int vte = 0; |
|
|
|
GLint inputs[VERT_ATTRIB_MAX]; |
|
|
|
GLint tab[VERT_ATTRIB_MAX]; |
|
|
|
int swizzle[VERT_ATTRIB_MAX][4]; |
|
|
|
GLuint i, nr; |
|
|
|
|
|
|
|
DECLARE_RENDERINPUTS(render_inputs_bitset); |
|
|
|
|
|
|
|
RENDERINPUTS_COPY(render_inputs_bitset, tnl->render_inputs_bitset); |
|
|
|
|
|
|
|
RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset ); |
|
|
|
|
|
|
|
RENDERINPUTS_COPY(rmesa->state.render_inputs_bitset, render_inputs_bitset); |
|
|
|
|
|
|
|
/* Important: |
|
|
|
*/ |
|
|
|
if ( VB->NdcPtr != NULL ) { |
|
|
|
VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr; |
|
|
|
} |
|
|
|
else { |
|
|
|
VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr; |
|
|
|
} |
|
|
|
|
|
|
|
assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL ); |
|
|
|
rmesa->swtcl.vertex_attr_count = 0; |
|
|
|
|
|
|
|
/* EMIT_ATTR's must be in order as they tell t_vertex.c how to |
|
|
|
* build up a hardware vertex. |
|
|
|
*/ |
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_POS)) { |
|
|
|
vap_vte_cntl |= R300_VTX_W0_FMT; |
|
|
|
InputsRead |= 1 << VERT_ATTRIB_POS; |
|
|
|
OutputsWritten |= 1 << VERT_RESULT_HPOS; |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F ); |
|
|
|
} else |
|
|
|
EMIT_PAD(4 * sizeof(float)); |
|
|
|
|
|
|
|
offset = 4; |
|
|
|
|
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_POINTSIZE )) { |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_POINTSIZE, EMIT_1F ); |
|
|
|
vap_fmt_0 |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT; |
|
|
|
offset += 1; |
|
|
|
} |
|
|
|
|
|
|
|
rmesa->swtcl.coloroffset = offset; |
|
|
|
if (RENDERINPUTS_TEST(index_bitset, _TNL_ATTRIB_COLOR0)) { |
|
|
|
InputsRead |= 1 << VERT_ATTRIB_COLOR0; |
|
|
|
OutputsWritten |= 1 << VERT_RESULT_COL0; |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4F ); |
|
|
|
} else |
|
|
|
EMIT_PAD(4*sizeof(float)); |
|
|
|
|
|
|
|
offset += 4; |
|
|
|
|
|
|
|
rmesa->swtcl.specoffset = 0; |
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) { |
|
|
|
rmesa->swtcl.specoffset = offset; |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_4F ); |
|
|
|
InputsRead |= 1 << VERT_ATTRIB_COLOR1; |
|
|
|
OutputsWritten |= 1 << VERT_RESULT_COL1; |
|
|
|
} |
|
|
|
|
|
|
|
if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) { |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { |
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) { |
|
|
|
InputsRead |= 1 << (VERT_ATTRIB_TEX0 + i); |
|
|
|
OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i); |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_4F ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0, nr = 0; i < VERT_ATTRIB_MAX; i++) { |
|
|
|
if (InputsRead & (1 << i)) { |
|
|
|
inputs[i] = nr++; |
|
|
|
} else { |
|
|
|
inputs[i] = -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Fixed, apply to vir0 only */ |
|
|
|
if (InputsRead & VERT_ATTRIB_POS) |
|
|
|
inputs[VERT_ATTRIB_POS] = 0; |
|
|
|
if (InputsRead & (1 << VERT_ATTRIB_COLOR0)) |
|
|
|
inputs[VERT_ATTRIB_COLOR0] = 2; |
|
|
|
if (InputsRead & (1 << VERT_ATTRIB_COLOR1)) |
|
|
|
inputs[VERT_ATTRIB_COLOR1] = 3; |
|
|
|
for (i = VERT_ATTRIB_TEX0; i <= VERT_ATTRIB_TEX7; i++) |
|
|
|
if (InputsRead & (1 << i)) |
|
|
|
inputs[i] = 6 + (i - VERT_ATTRIB_TEX0); |
|
|
|
|
|
|
|
for (i = 0, nr = 0; i < VERT_ATTRIB_MAX; i++) { |
|
|
|
if (InputsRead & (1 << i)) { |
|
|
|
tab[nr++] = i; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < nr; i++) { |
|
|
|
int ci; |
|
|
|
|
|
|
|
swizzle[i][0] = SWIZZLE_ZERO; |
|
|
|
swizzle[i][1] = SWIZZLE_ZERO; |
|
|
|
swizzle[i][2] = SWIZZLE_ZERO; |
|
|
|
swizzle[i][3] = SWIZZLE_ONE; |
|
|
|
|
|
|
|
for (ci = 0; ci < VB->AttribPtr[tab[i]]->size; ci++) { |
|
|
|
swizzle[i][ci] = ci; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
R300_NEWPRIM(rmesa); |
|
|
|
R300_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], |
|
|
|
VB->AttribPtr, inputs, tab, nr); |
|
|
|
R300_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, |
|
|
|
nr); |
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
rmesa->swtcl.vertex_size = |
|
|
|
_tnl_install_attrs( ctx, |
|
|
|
rmesa->swtcl.vertex_attrs, |
|
|
|
rmesa->swtcl.vertex_attr_count, |
|
|
|
NULL, 0 ); |
|
|
|
r300ContextPtr rmesa = R300_CONTEXT( ctx ); |
|
|
|
TNLcontext *tnl = TNL_CONTEXT(ctx); |
|
|
|
struct vertex_buffer *VB = &tnl->vb; |
|
|
|
DECLARE_RENDERINPUTS(index_bitset); |
|
|
|
GLuint InputsRead = 0, OutputsWritten = 0; |
|
|
|
int vap_fmt_0 = 0; |
|
|
|
int vap_vte_cntl = 0; |
|
|
|
int offset = 0; |
|
|
|
int vte = 0; |
|
|
|
GLint inputs[VERT_ATTRIB_MAX]; |
|
|
|
GLint tab[VERT_ATTRIB_MAX]; |
|
|
|
int swizzle[VERT_ATTRIB_MAX][4]; |
|
|
|
GLuint i, nr; |
|
|
|
|
|
|
|
DECLARE_RENDERINPUTS(render_inputs_bitset); |
|
|
|
RENDERINPUTS_COPY(render_inputs_bitset, tnl->render_inputs_bitset); |
|
|
|
RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset ); |
|
|
|
RENDERINPUTS_COPY(rmesa->state.render_inputs_bitset, render_inputs_bitset); |
|
|
|
|
|
|
|
/* Important: |
|
|
|
*/ |
|
|
|
if ( VB->NdcPtr != NULL ) { |
|
|
|
VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr; |
|
|
|
} |
|
|
|
else { |
|
|
|
VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr; |
|
|
|
} |
|
|
|
|
|
|
|
assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL ); |
|
|
|
rmesa->swtcl.vertex_attr_count = 0; |
|
|
|
|
|
|
|
/* EMIT_ATTR's must be in order as they tell t_vertex.c how to |
|
|
|
* build up a hardware vertex. |
|
|
|
*/ |
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_POS)) { |
|
|
|
vap_vte_cntl |= R300_VTX_W0_FMT; |
|
|
|
InputsRead |= 1 << VERT_ATTRIB_POS; |
|
|
|
OutputsWritten |= 1 << VERT_RESULT_HPOS; |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F ); |
|
|
|
} else |
|
|
|
EMIT_PAD(4 * sizeof(float)); |
|
|
|
|
|
|
|
offset = 4; |
|
|
|
|
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_POINTSIZE )) { |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_POINTSIZE, EMIT_1F ); |
|
|
|
vap_fmt_0 |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT; |
|
|
|
offset += 1; |
|
|
|
} |
|
|
|
|
|
|
|
rmesa->swtcl.coloroffset = offset; |
|
|
|
if (RENDERINPUTS_TEST(index_bitset, _TNL_ATTRIB_COLOR0)) { |
|
|
|
InputsRead |= 1 << VERT_ATTRIB_COLOR0; |
|
|
|
OutputsWritten |= 1 << VERT_RESULT_COL0; |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4F ); |
|
|
|
} else |
|
|
|
EMIT_PAD(4*sizeof(float)); |
|
|
|
|
|
|
|
offset += 4; |
|
|
|
|
|
|
|
rmesa->swtcl.specoffset = 0; |
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) { |
|
|
|
rmesa->swtcl.specoffset = offset; |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_4F ); |
|
|
|
InputsRead |= 1 << VERT_ATTRIB_COLOR1; |
|
|
|
OutputsWritten |= 1 << VERT_RESULT_COL1; |
|
|
|
} |
|
|
|
|
|
|
|
if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) { |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { |
|
|
|
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) { |
|
|
|
InputsRead |= 1 << (VERT_ATTRIB_TEX0 + i); |
|
|
|
OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i); |
|
|
|
EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_4F ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0, nr = 0; i < VERT_ATTRIB_MAX; i++) { |
|
|
|
if (InputsRead & (1 << i)) { |
|
|
|
inputs[i] = nr++; |
|
|
|
} else { |
|
|
|
inputs[i] = -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Fixed, apply to vir0 only */ |
|
|
|
if (InputsRead & VERT_ATTRIB_POS) |
|
|
|
inputs[VERT_ATTRIB_POS] = 0; |
|
|
|
if (InputsRead & (1 << VERT_ATTRIB_COLOR0)) |
|
|
|
inputs[VERT_ATTRIB_COLOR0] = 2; |
|
|
|
if (InputsRead & (1 << VERT_ATTRIB_COLOR1)) |
|
|
|
inputs[VERT_ATTRIB_COLOR1] = 3; |
|
|
|
for (i = VERT_ATTRIB_TEX0; i <= VERT_ATTRIB_TEX7; i++) |
|
|
|
if (InputsRead & (1 << i)) |
|
|
|
inputs[i] = 6 + (i - VERT_ATTRIB_TEX0); |
|
|
|
|
|
|
|
for (i = 0, nr = 0; i < VERT_ATTRIB_MAX; i++) { |
|
|
|
if (InputsRead & (1 << i)) { |
|
|
|
tab[nr++] = i; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < nr; i++) { |
|
|
|
int ci; |
|
|
|
|
|
|
|
swizzle[i][0] = SWIZZLE_ZERO; |
|
|
|
swizzle[i][1] = SWIZZLE_ZERO; |
|
|
|
swizzle[i][2] = SWIZZLE_ZERO; |
|
|
|
swizzle[i][3] = SWIZZLE_ONE; |
|
|
|
|
|
|
|
for (ci = 0; ci < VB->AttribPtr[tab[i]]->size; ci++) { |
|
|
|
swizzle[i][ci] = ci; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
R300_NEWPRIM(rmesa); |
|
|
|
R300_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], |
|
|
|
VB->AttribPtr, inputs, tab, nr); |
|
|
|
R300_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, |
|
|
|
nr); |
|
|
|
|
|
|
|
rmesa->swtcl.vertex_size /= 4; |
|
|
|
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); |
|
|
|
|
|
|
|
RENDERINPUTS_COPY( rmesa->tnl_index_bitset, index_bitset ); |
|
|
|
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); |
|
|
|
|
|
|
|
vte = rmesa->hw.vte.cmd[1]; |
|
|
|
R300_STATECHANGE(rmesa, vte); |
|
|
|
rmesa->hw.vte.cmd[1] = vte; |
|
|
|
rmesa->hw.vte.cmd[2] = rmesa->swtcl.vertex_size; |
|
|
|
rmesa->swtcl.vertex_size = |
|
|
|
_tnl_install_attrs( ctx, |
|
|
|
rmesa->swtcl.vertex_attrs, |
|
|
|
rmesa->swtcl.vertex_attr_count, |
|
|
|
NULL, 0 ); |
|
|
|
|
|
|
|
rmesa->swtcl.vertex_size /= 4; |
|
|
|
|
|
|
|
RENDERINPUTS_COPY( rmesa->tnl_index_bitset, index_bitset ); |
|
|
|
|
|
|
|
vte = rmesa->hw.vte.cmd[1]; |
|
|
|
R300_STATECHANGE(rmesa, vte); |
|
|
|
rmesa->hw.vte.cmd[1] = vte; |
|
|
|
rmesa->hw.vte.cmd[2] = rmesa->swtcl.vertex_size; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@@ -264,39 +261,39 @@ static void r300SetVertexFormat( GLcontext *ctx ) |
|
|
|
*/ |
|
|
|
static void flush_last_swtcl_prim( r300ContextPtr rmesa ) |
|
|
|
{ |
|
|
|
if (RADEON_DEBUG & DEBUG_IOCTL) |
|
|
|
fprintf(stderr, "%s\n", __FUNCTION__); |
|
|
|
|
|
|
|
rmesa->dma.flush = NULL; |
|
|
|
|
|
|
|
if (rmesa->dma.current.buf) { |
|
|
|
struct r300_dma_region *current = &rmesa->dma.current; |
|
|
|
GLuint current_offset = GET_START(current); |
|
|
|
|
|
|
|
assert (current->start + |
|
|
|
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 == |
|
|
|
current->ptr); |
|
|
|
|
|
|
|
if (rmesa->dma.current.start != rmesa->dma.current.ptr) { |
|
|
|
|
|
|
|
r300EnsureCmdBufSpace( rmesa, rmesa->hw.max_state_size + (12*sizeof(int)), __FUNCTION__); |
|
|
|
|
|
|
|
r300EmitState(rmesa); |
|
|
|
|
|
|
|
r300EmitVertexAOS( rmesa, |
|
|
|
rmesa->swtcl.vertex_size, |
|
|
|
current_offset); |
|
|
|
if (RADEON_DEBUG & DEBUG_IOCTL) |
|
|
|
fprintf(stderr, "%s\n", __FUNCTION__); |
|
|
|
|
|
|
|
r300EmitVbufPrim( rmesa, |
|
|
|
rmesa->swtcl.hw_primitive, |
|
|
|
rmesa->swtcl.numverts); |
|
|
|
|
|
|
|
r300EmitCacheFlush(rmesa); |
|
|
|
} |
|
|
|
|
|
|
|
rmesa->swtcl.numverts = 0; |
|
|
|
current->start = current->ptr; |
|
|
|
} |
|
|
|
rmesa->dma.flush = NULL; |
|
|
|
|
|
|
|
if (rmesa->dma.current.buf) { |
|
|
|
struct r300_dma_region *current = &rmesa->dma.current; |
|
|
|
GLuint current_offset = GET_START(current); |
|
|
|
|
|
|
|
assert (current->start + |
|
|
|
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 == |
|
|
|
current->ptr); |
|
|
|
|
|
|
|
if (rmesa->dma.current.start != rmesa->dma.current.ptr) { |
|
|
|
|
|
|
|
r300EnsureCmdBufSpace( rmesa, rmesa->hw.max_state_size + (12*sizeof(int)), __FUNCTION__); |
|
|
|
|
|
|
|
r300EmitState(rmesa); |
|
|
|
|
|
|
|
r300EmitVertexAOS( rmesa, |
|
|
|
rmesa->swtcl.vertex_size, |
|
|
|
current_offset); |
|
|
|
|
|
|
|
r300EmitVbufPrim( rmesa, |
|
|
|
rmesa->swtcl.hw_primitive, |
|
|
|
rmesa->swtcl.numverts); |
|
|
|
|
|
|
|
r300EmitCacheFlush(rmesa); |
|
|
|
} |
|
|
|
|
|
|
|
rmesa->swtcl.numverts = 0; |
|
|
|
current->start = current->ptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Alloc space in the current dma region. |
|
|
@@ -304,30 +301,28 @@ static void flush_last_swtcl_prim( r300ContextPtr rmesa ) |
|
|
|
static void * |
|
|
|
r300AllocDmaLowVerts( r300ContextPtr rmesa, int nverts, int vsize ) |
|
|
|
{ |
|
|
|
GLuint bytes = vsize * nverts; |
|
|
|
|
|
|
|
if ( rmesa->dma.current.ptr + bytes > rmesa->dma.current.end ) |
|
|
|
r300RefillCurrentDmaRegion( rmesa, bytes); |
|
|
|
GLuint bytes = vsize * nverts; |
|
|
|
|
|
|
|
if (!rmesa->dma.flush) { |
|
|
|
rmesa->radeon.glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; |
|
|
|
rmesa->dma.flush = flush_last_swtcl_prim; |
|
|
|
} |
|
|
|
if ( rmesa->dma.current.ptr + bytes > rmesa->dma.current.end ) |
|
|
|
r300RefillCurrentDmaRegion( rmesa, bytes); |
|
|
|
|
|
|
|
ASSERT( vsize == rmesa->swtcl.vertex_size * 4 ); |
|
|
|
ASSERT( rmesa->dma.flush == flush_last_swtcl_prim ); |
|
|
|
ASSERT( rmesa->dma.current.start + |
|
|
|
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 == |
|
|
|
rmesa->dma.current.ptr ); |
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
GLubyte *head = (GLubyte *) (rmesa->dma.current.address + rmesa->dma.current.ptr); |
|
|
|
rmesa->dma.current.ptr += bytes; |
|
|
|
rmesa->swtcl.numverts += nverts; |
|
|
|
return head; |
|
|
|
} |
|
|
|
if (!rmesa->dma.flush) { |
|
|
|
rmesa->radeon.glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; |
|
|
|
rmesa->dma.flush = flush_last_swtcl_prim; |
|
|
|
} |
|
|
|
|
|
|
|
ASSERT( vsize == rmesa->swtcl.vertex_size * 4 ); |
|
|
|
ASSERT( rmesa->dma.flush == flush_last_swtcl_prim ); |
|
|
|
ASSERT( rmesa->dma.current.start + |
|
|
|
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 == |
|
|
|
rmesa->dma.current.ptr ); |
|
|
|
|
|
|
|
{ |
|
|
|
GLubyte *head = (GLubyte *) (rmesa->dma.current.address + rmesa->dma.current.ptr); |
|
|
|
rmesa->dma.current.ptr += bytes; |
|
|
|
rmesa->swtcl.numverts += nverts; |
|
|
|
return head; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static GLuint reduced_prim[] = { |
|
|
@@ -558,33 +553,33 @@ static void init_rast_tab( void ) |
|
|
|
/**********************************************************************/ |
|
|
|
static void r300ChooseRenderState( GLcontext *ctx ) |
|
|
|
{ |
|
|
|
TNLcontext *tnl = TNL_CONTEXT(ctx); |
|
|
|
r300ContextPtr rmesa = R300_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 (index != rmesa->swtcl.RenderIndex) { |
|
|
|
tnl->Driver.Render.Points = rast_tab[index].points; |
|
|
|
tnl->Driver.Render.Line = rast_tab[index].line; |
|
|
|
tnl->Driver.Render.ClippedLine = rast_tab[index].line; |
|
|
|
tnl->Driver.Render.Triangle = rast_tab[index].triangle; |
|
|
|
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; |
|
|
|
} else { |
|
|
|
tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; |
|
|
|
tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; |
|
|
|
tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon; |
|
|
|
} |
|
|
|
|
|
|
|
rmesa->swtcl.RenderIndex = index; |
|
|
|
} |
|
|
|
TNLcontext *tnl = TNL_CONTEXT(ctx); |
|
|
|
r300ContextPtr rmesa = R300_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 (index != rmesa->swtcl.RenderIndex) { |
|
|
|
tnl->Driver.Render.Points = rast_tab[index].points; |
|
|
|
tnl->Driver.Render.Line = rast_tab[index].line; |
|
|
|
tnl->Driver.Render.ClippedLine = rast_tab[index].line; |
|
|
|
tnl->Driver.Render.Triangle = rast_tab[index].triangle; |
|
|
|
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; |
|
|
|
} else { |
|
|
|
tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; |
|
|
|
tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; |
|
|
|
tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon; |
|
|
|
} |
|
|
|
|
|
|
|
rmesa->swtcl.RenderIndex = index; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@@ -602,7 +597,7 @@ static void r300RenderStart(GLcontext *ctx) |
|
|
|
|
|
|
|
if (rmesa->dma.flush != 0 && |
|
|
|
rmesa->dma.flush != flush_last_swtcl_prim) |
|
|
|
rmesa->dma.flush( rmesa ); |
|
|
|
rmesa->dma.flush( rmesa ); |
|
|
|
|
|
|
|
} |
|
|
|
|