diff options
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_maos.c')
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_maos.c | 302 |
1 files changed, 1 insertions, 301 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_maos.c b/src/mesa/drivers/dri/r300/r300_maos.c index d9f8c031751..c2ff9c5d983 100644 --- a/src/mesa/drivers/dri/r300/r300_maos.c +++ b/src/mesa/drivers/dri/r300/r300_maos.c @@ -255,306 +255,8 @@ void r300EmitElts(GLcontext * ctx, void *elts, unsigned long n_elts, int elt_siz /* Emit vertex data to GART memory (unless immediate mode) * Route inputs to the vertex processor */ -void r300EmitArrays(GLcontext * ctx, GLboolean immd) -{ - r300ContextPtr rmesa = R300_CONTEXT(ctx); - r300ContextPtr r300 = rmesa; - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLuint nr = 0; - GLuint count = VB->Count; - GLuint dw,mask; - GLuint vic_1 = 0; /* R300_VAP_INPUT_CNTL_1 */ - GLuint aa_vap_reg = 0; /* VAP register assignment */ - GLuint i; - GLuint inputs = 0; - - -#define CONFIGURE_AOS(r, f, v, sz, cn) { \ - if (RADEON_DEBUG & DEBUG_STATE) \ - fprintf(stderr, "Enabling "#v "\n"); \ - if (++nr >= R300_MAX_AOS_ARRAYS) { \ - fprintf(stderr, "Aieee! AOS array count exceeded!\n"); \ - exit(-1); \ - } \ - \ - if (hw_tcl_on == GL_FALSE) \ - rmesa->state.aos[nr-1].aos_reg = aa_vap_reg++; \ - rmesa->state.aos[nr-1].aos_format = f; \ - if (immd) { \ - rmesa->state.aos[nr-1].aos_size = 4; \ - rmesa->state.aos[nr-1].aos_stride = 4; \ - rmesa->state.aos[nr-1].aos_offset = 0; \ - } else { \ - emit_vector(ctx, \ - &rmesa->state.aos[nr-1], \ - v->data, \ - sz, \ - v->stride, \ - cn); \ - rmesa->state.vap_reg.r=rmesa->state.aos[nr-1].aos_reg; \ - } \ -} - - if (hw_tcl_on) { - GLuint InputsRead = CURRENT_VERTEX_SHADER(ctx)->Base.InputsRead; - struct r300_vertex_program *prog=(struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx); - if (InputsRead & (1<<VERT_ATTRIB_POS)) { - inputs |= _TNL_BIT_POS; - rmesa->state.aos[nr++].aos_reg = prog->inputs[VERT_ATTRIB_POS]; - } - if (InputsRead & (1<<VERT_ATTRIB_NORMAL)) { - inputs |= _TNL_BIT_NORMAL; - rmesa->state.aos[nr++].aos_reg = prog->inputs[VERT_ATTRIB_NORMAL]; - } - if (InputsRead & (1<<VERT_ATTRIB_COLOR0)) { - inputs |= _TNL_BIT_COLOR0; - rmesa->state.aos[nr++].aos_reg = prog->inputs[VERT_ATTRIB_COLOR0]; - } - if (InputsRead & (1<<VERT_ATTRIB_COLOR1)) { - inputs |= _TNL_BIT_COLOR1; - rmesa->state.aos[nr++].aos_reg = prog->inputs[VERT_ATTRIB_COLOR1]; - } - if (InputsRead & (1<<VERT_ATTRIB_FOG)) { - inputs |= _TNL_BIT_FOG; - rmesa->state.aos[nr++].aos_reg = prog->inputs[VERT_ATTRIB_FOG]; - } - if(ctx->Const.MaxTextureUnits > 8) { /* Not sure if this can even happen... */ - fprintf(stderr, "%s: Cant handle that many inputs\n", __FUNCTION__); - exit(-1); - } - for (i=0;i<ctx->Const.MaxTextureUnits;i++) { - if (InputsRead & (1<<(VERT_ATTRIB_TEX0+i))) { - inputs |= _TNL_BIT_TEX0<<i; - rmesa->state.aos[nr++].aos_reg = prog->inputs[VERT_ATTRIB_TEX0+i]; - } - } - nr = 0; - } else { - inputs = TNL_CONTEXT(ctx)->render_inputs; - } - rmesa->state.render_inputs = inputs; - - if (inputs & _TNL_BIT_POS) { - CONFIGURE_AOS(i_coords, AOS_FORMAT_FLOAT, - VB->ObjPtr, - immd ? 4 : VB->ObjPtr->size, - count); - - vic_1 |= R300_INPUT_CNTL_POS; - } - - if (inputs & _TNL_BIT_NORMAL) { - CONFIGURE_AOS(i_normal, AOS_FORMAT_FLOAT, - VB->NormalPtr, - immd ? 4 : VB->NormalPtr->size, - count); - - vic_1 |= R300_INPUT_CNTL_NORMAL; - } - - if (inputs & _TNL_BIT_COLOR0) { - int emitsize=4; - - if (!immd) { - if (VB->ColorPtr[0]->size == 4 && - (VB->ColorPtr[0]->stride != 0 || - VB->ColorPtr[0]->data[0][3] != 1.0)) { - emitsize = 4; - } else { - emitsize = 3; - } - } - - CONFIGURE_AOS(i_color[0], AOS_FORMAT_FLOAT_COLOR, - VB->ColorPtr[0], - immd ? 4 : emitsize, - count); - - vic_1 |= R300_INPUT_CNTL_COLOR; - } - - if (inputs & _TNL_BIT_COLOR1) { - CONFIGURE_AOS(i_color[1], AOS_FORMAT_FLOAT_COLOR, - VB->SecondaryColorPtr[0], - immd ? 4 : VB->SecondaryColorPtr[0]->size, - count); - } - -#if 0 - if (inputs & _TNL_BIT_FOG) { - CONFIGURE_AOS( AOS_FORMAT_FLOAT, - VB->FogCoordPtr, - immd ? 4 : VB->FogCoordPtr->size, - count); - } -#endif - - r300->state.texture.tc_count = 0; - for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { - if (inputs & (_TNL_BIT_TEX0 << i)) { - CONFIGURE_AOS(i_tex[i], AOS_FORMAT_FLOAT, - VB->TexCoordPtr[i], - immd ? 4 : VB->TexCoordPtr[i]->size, - count); - - vic_1 |= R300_INPUT_CNTL_TC0 << i; - r300->state.texture.tc_count++; - } - } - -#define SHOW_INFO(n) do { \ - if (RADEON_DEBUG & DEBUG_ALL) { \ - fprintf(stderr, "RR[%d] - sz=%d, reg=%d, fmt=%d -- st=%d, of=0x%08x\n", \ - n, \ - r300->state.aos[n].aos_size, \ - r300->state.aos[n].aos_reg, \ - r300->state.aos[n].aos_format, \ - r300->state.aos[n].aos_stride, \ - r300->state.aos[n].aos_offset); \ - } \ -} while(0); - /* setup INPUT_ROUTE */ - R300_STATECHANGE(r300, vir[0]); - for(i=0;i+1<nr;i+=2){ - SHOW_INFO(i) - SHOW_INFO(i+1) - dw=(r300->state.aos[i].aos_size-1) - | ((r300->state.aos[i].aos_reg)<<8) - | (r300->state.aos[i].aos_format<<14) - | (((r300->state.aos[i+1].aos_size-1) - | ((r300->state.aos[i+1].aos_reg)<<8) - | (r300->state.aos[i+1].aos_format<<14))<<16); - - if(i+2==nr){ - dw|=(1<<(13+16)); - } - r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(i>>1)]=dw; - } - if(nr & 1){ - SHOW_INFO(nr-1) - dw=(r300->state.aos[nr-1].aos_size-1) - | (r300->state.aos[nr-1].aos_format<<14) - | ((r300->state.aos[nr-1].aos_reg)<<8) - | (1<<13); - r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(nr>>1)]=dw; - //fprintf(stderr, "vir0 dw=%08x\n", dw); - } - /* Set the rest of INPUT_ROUTE_0 to 0 */ - //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[0].cmd[R300_VIR_CNTL_0+i]=(0x0); - ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->packet0.count = (nr+1)>>1; - - - /* Mesa assumes that all missing components are from (0, 0, 0, 1) */ -#define ALL_COMPONENTS ((R300_INPUT_ROUTE_SELECT_X<<R300_INPUT_ROUTE_X_SHIFT) \ - | (R300_INPUT_ROUTE_SELECT_Y<<R300_INPUT_ROUTE_Y_SHIFT) \ - | (R300_INPUT_ROUTE_SELECT_Z<<R300_INPUT_ROUTE_Z_SHIFT) \ - | (R300_INPUT_ROUTE_SELECT_W<<R300_INPUT_ROUTE_W_SHIFT)) - -#define ALL_DEFAULT ((R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_X_SHIFT) \ - | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Y_SHIFT) \ - | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Z_SHIFT) \ - | (R300_INPUT_ROUTE_SELECT_ONE<<R300_INPUT_ROUTE_W_SHIFT)) - - R300_STATECHANGE(r300, vir[1]); - - for(i=0;i+1<nr;i+=2){ - /* do i first.. */ - mask=(1<<(r300->state.aos[i].aos_size*3))-1; - dw=(ALL_COMPONENTS & mask) - | (ALL_DEFAULT & ~mask) - | R300_INPUT_ROUTE_ENABLE; - - /* i+1 */ - mask=(1<<(r300->state.aos[i+1].aos_size*3))-1; - dw|=( - (ALL_COMPONENTS & mask) - | (ALL_DEFAULT & ~mask) - | R300_INPUT_ROUTE_ENABLE - )<<16; - - r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(i>>1)]=dw; - } - if(nr & 1){ - mask=(1<<(r300->state.aos[nr-1].aos_size*3))-1; - dw=(ALL_COMPONENTS & mask) - | (ALL_DEFAULT & ~mask) - | R300_INPUT_ROUTE_ENABLE; - r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(nr>>1)]=dw; - //fprintf(stderr, "vir1 dw=%08x\n", dw); - } - /* Set the rest of INPUT_ROUTE_1 to 0 */ - //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[1].cmd[R300_VIR_CNTL_0+i]=0x0; - ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->packet0.count = (nr+1)>>1; - - /* Set up input_cntl */ - /* I don't think this is needed for vertex buffers, but it doesn't hurt anything */ - R300_STATECHANGE(r300, vic); - r300->hw.vic.cmd[R300_VIC_CNTL_0]=0x5555; /* Hard coded value, no idea what it means */ - r300->hw.vic.cmd[R300_VIC_CNTL_1]=vic_1; - -#if 0 - r300->hw.vic.cmd[R300_VIC_CNTL_1]=0; - - if(r300->state.render_inputs & _TNL_BIT_POS) - r300->hw.vic.cmd[R300_VIC_CNTL_1]|=R300_INPUT_CNTL_POS; - - if(r300->state.render_inputs & _TNL_BIT_NORMAL) - r300->hw.vic.cmd[R300_VIC_CNTL_1]|=R300_INPUT_CNTL_NORMAL; - - if(r300->state.render_inputs & _TNL_BIT_COLOR0) - r300->hw.vic.cmd[R300_VIC_CNTL_1]|=R300_INPUT_CNTL_COLOR; - - for(i=0;i < ctx->Const.MaxTextureUnits;i++) - if(r300->state.render_inputs & (_TNL_BIT_TEX0<<i)) - r300->hw.vic.cmd[R300_VIC_CNTL_1]|=(R300_INPUT_CNTL_TC0<<i); -#endif - - /* Stage 3: VAP output */ - - R300_STATECHANGE(r300, vof); - - r300->hw.vof.cmd[R300_VOF_CNTL_0]=0; - r300->hw.vof.cmd[R300_VOF_CNTL_1]=0; - if (hw_tcl_on){ - GLuint OutputsWritten = CURRENT_VERTEX_SHADER(ctx)->Base.OutputsWritten; - - if(OutputsWritten & (1<<VERT_RESULT_HPOS)) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT; - if(OutputsWritten & (1<<VERT_RESULT_COL0)) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT; - if(OutputsWritten & (1<<VERT_RESULT_COL1)) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT; - /*if(OutputsWritten & (1<<VERT_RESULT_BFC0)) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT; - if(OutputsWritten & (1<<VERT_RESULT_BFC1)) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT;*/ - //if(OutputsWritten & (1<<VERT_RESULT_FOGC)) - - if(OutputsWritten & (1<<VERT_RESULT_PSIZ)) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT; - - for(i=0;i < ctx->Const.MaxTextureUnits;i++) - if(OutputsWritten & (1<<(VERT_RESULT_TEX0+i))) - r300->hw.vof.cmd[R300_VOF_CNTL_1] |= (4<<(3*i)); - } else { - if(inputs & _TNL_BIT_POS) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT; - if(inputs & _TNL_BIT_COLOR0) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT; - if(inputs & _TNL_BIT_COLOR1) - r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT; - - for(i=0;i < ctx->Const.MaxTextureUnits;i++) - if(inputs & (_TNL_BIT_TEX0<<i)) - r300->hw.vof.cmd[R300_VOF_CNTL_1]|=(4<<(3*i)); - } - - rmesa->state.aos_count = nr; -} - -#ifdef RADEON_VTXFMT_A -void r300EmitArraysVtx(GLcontext * ctx, GLboolean immd) +void r300EmitArrays(GLcontext * ctx, GLboolean immd) { r300ContextPtr rmesa = R300_CONTEXT(ctx); r300ContextPtr r300 = rmesa; @@ -568,7 +270,6 @@ void r300EmitArraysVtx(GLcontext * ctx, GLboolean immd) GLuint i; GLuint inputs = 0; -#undef CONFIGURE_AOS #define CONFIGURE_AOS(r, f, v, sz, cn) { \ if (RADEON_DEBUG & DEBUG_STATE) \ fprintf(stderr, "Enabling "#v "\n"); \ @@ -872,7 +573,6 @@ void r300EmitArraysVtx(GLcontext * ctx, GLboolean immd) rmesa->state.aos_count = nr; } -#endif #ifdef USER_BUFFERS void r300UseArrays(GLcontext * ctx) |