⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r300_maos.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			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->AttribPtr[VERT_ATTRIB_POS],						immd ? 4 : VB->AttribPtr[VERT_ATTRIB_POS].size,						count);		vic_1 |= R300_INPUT_CNTL_POS;	}	if (inputs & _TNL_BIT_NORMAL) {		CONFIGURE_AOS(i_normal,	AOS_FORMAT_FLOAT,						VB->AttribPtr[VERT_ATTRIB_NORMAL],						immd ? 4 : VB->AttribPtr[VERT_ATTRIB_NORMAL].size,						count);		vic_1 |= R300_INPUT_CNTL_NORMAL;	}	if (inputs & _TNL_BIT_COLOR0) {		int emitsize=4;		if (!immd) {			if (VB->AttribPtr[VERT_ATTRIB_COLOR0].size == 4 &&			    (VB->AttribPtr[VERT_ATTRIB_COLOR0].stride != 0 ||			     ((float*)VB->AttribPtr[VERT_ATTRIB_COLOR0].data)[3] != 1.0)) {				emitsize = 4;			} else {				emitsize = 3;			}//emitsize = VB->AttribPtr[VERT_ATTRIB_COLOR0].size;		}		if(VB->AttribPtr[VERT_ATTRIB_COLOR0].type == GL_UNSIGNED_BYTE)			emitsize = 1;		CONFIGURE_AOS(i_color[0], VB->AttribPtr[VERT_ATTRIB_COLOR0].type == GL_UNSIGNED_BYTE ? AOS_FORMAT_UBYTE : AOS_FORMAT_FLOAT_COLOR,						VB->AttribPtr[VERT_ATTRIB_COLOR0],						immd ? 4 : emitsize,						count);		vic_1 |= R300_INPUT_CNTL_COLOR;	}	if (inputs & _TNL_BIT_COLOR1) {		int emitsize=4;		if (!immd) {			if (VB->AttribPtr[VERT_ATTRIB_COLOR1].size == 4 &&			    (VB->AttribPtr[VERT_ATTRIB_COLOR1].stride != 0 ||			     ((float*)VB->AttribPtr[VERT_ATTRIB_COLOR1].data)[3] != 1.0)) {				emitsize = 4;			} else {				emitsize = 3;			}//emitsize = VB->AttribPtr[VERT_ATTRIB_COLOR1].size;		}		if(VB->AttribPtr[VERT_ATTRIB_COLOR1].type == GL_UNSIGNED_BYTE)			emitsize = 1;		CONFIGURE_AOS(i_color[1], VB->AttribPtr[VERT_ATTRIB_COLOR1].type == GL_UNSIGNED_BYTE ? AOS_FORMAT_UBYTE : AOS_FORMAT_FLOAT_COLOR,						VB->AttribPtr[VERT_ATTRIB_COLOR1],						immd ? 4 : VB->AttribPtr[VERT_ATTRIB_COLOR1].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->AttribPtr[VERT_ATTRIB_TEX0+i],							immd ? 4 : VB->AttribPtr[VERT_ATTRIB_TEX0+i].size,							count);			vic_1 |= R300_INPUT_CNTL_TC0 << i;			r300->state.texture.tc_count++;		}	}	for(i=0; i < nr; i++)		if(r300->state.aos[i].aos_format == 2){			assert(r300->state.aos[i].aos_size == 1);			r300->state.aos[i].aos_size=5;		}	#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 < nr; i++)		if(r300->state.aos[i].aos_format == 2){			assert(r300->state.aos[i].aos_size == 5);			r300->state.aos[i].aos_size=/*3*/4; /* XXX */		}					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;		//fprintf(stderr, "vir1 dw=%08x\n", dw);		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;	for(i=0; i < nr; i++)		if(r300->state.aos[i].aos_format == 2){			assert(r300->state.aos[i].aos_size == /*3*/4); /* XXX */			r300->state.aos[i].aos_size=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 USER_BUFFERSvoid r300UseArrays(GLcontext * ctx){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	int i;		if(rmesa->state.elt_dma.buf)		radeon_mm_use(rmesa, rmesa->state.elt_dma.buf->id);		for (i=0; i < rmesa->state.aos_count;i++) {		if (rmesa->state.aos[i].buf)			radeon_mm_use(rmesa, rmesa->state.aos[i].buf->id);	}	#ifdef HW_VBOS	#define USE_VBO(a) if (ctx->Array.a.BufferObj->Name && ctx->Array.a.Enabled) \		radeon_mm_use(rmesa, ((struct r300_buffer_object *)ctx->Array.a.BufferObj)->id)		if (ctx->Array.ElementArrayBufferObj->Name && ctx->Array.ElementArrayBufferObj->OnCard)		radeon_mm_use(rmesa, ((struct r300_buffer_object *)ctx->Array.ElementArrayBufferObj)->id);		USE_VBO(Vertex);	USE_VBO(Normal);	USE_VBO(Color);	USE_VBO(SecondaryColor);	USE_VBO(FogCoord);		for (i=0; i < MAX_TEXTURE_COORD_UNITS; i++)		USE_VBO(TexCoord[i]);#endif	}#endifvoid r300ReleaseArrays(GLcontext * ctx){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	int i;	r300ReleaseDmaRegion(rmesa, &rmesa->state.elt_dma, __FUNCTION__);	for (i=0;i<rmesa->state.aos_count;i++) {		r300ReleaseDmaRegion(rmesa, &rmesa->state.aos[i], __FUNCTION__);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -