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

📄 r300_emit.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (InputsRead & (1 << VERT_ATTRIB_NORMAL))		vic_1 |= R300_INPUT_CNTL_NORMAL;	if (InputsRead & (1 << VERT_ATTRIB_COLOR0))		vic_1 |= R300_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;		}	return vic_1;}GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten){	GLuint ret = 0;	if (OutputsWritten & (1 << VERT_RESULT_HPOS))		ret |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT;	if (OutputsWritten & (1 << VERT_RESULT_COL0))		ret |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT;	if (OutputsWritten & (1 << VERT_RESULT_COL1))		ret |= R300_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;#if 0	if (OutputsWritten & (1 << VERT_RESULT_FOGC)) ;#endif	if (OutputsWritten & (1 << VERT_RESULT_PSIZ))		ret |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT;	return ret;}GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten){	GLuint i, ret = 0;	for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {		if (OutputsWritten & (1 << (VERT_RESULT_TEX0 + i))) {			ret |= (4 << (3 * i));		}	}	return ret;}/* Emit vertex data to GART memory * Route inputs to the vertex processor * This function should never return R300_FALLBACK_TCL when using software tcl. */int r300EmitArrays(GLcontext * ctx){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	TNLcontext *tnl = TNL_CONTEXT(ctx);	struct vertex_buffer *vb = &tnl->vb;	GLuint nr;	GLuint count = vb->Count;	GLuint i;	GLuint InputsRead = 0, OutputsWritten = 0;	int *inputs = NULL;	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);	if (hw_tcl_on) {		inputs = prog->inputs;		InputsRead = prog->key.InputsRead;		OutputsWritten = prog->key.OutputsWritten;	} else {		inputs = rmesa->state.sw_tcl_inputs;		DECLARE_RENDERINPUTS(render_inputs_bitset);		RENDERINPUTS_COPY(render_inputs_bitset, tnl->render_inputs_bitset);		vb->AttribPtr[VERT_ATTRIB_POS] = vb->ClipPtr;		assert(RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_POS));		assert(RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_NORMAL) == 0);		//assert(RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_COLOR0));		if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_POS)) {			InputsRead |= 1 << VERT_ATTRIB_POS;			OutputsWritten |= 1 << VERT_RESULT_HPOS;		}		if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_COLOR0)) {			InputsRead |= 1 << VERT_ATTRIB_COLOR0;			OutputsWritten |= 1 << VERT_RESULT_COL0;		}		if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_COLOR1)) {			InputsRead |= 1 << VERT_ATTRIB_COLOR1;			OutputsWritten |= 1 << VERT_RESULT_COL1;		}		for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {			if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_TEX(i))) {				InputsRead |= 1 << (VERT_ATTRIB_TEX0 + i);				OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i);			}		}		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 */		memcpy(vir_inputs, inputs, VERT_ATTRIB_MAX * sizeof(int));		inputs = vir_inputs;		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);		RENDERINPUTS_COPY(rmesa->state.render_inputs_bitset, render_inputs_bitset);	}	assert(InputsRead);	assert(OutputsWritten);	for (i = 0, nr = 0; i < VERT_ATTRIB_MAX; i++) {		if (InputsRead & (1 << i)) {			tab[nr++] = i;		}	}	if (nr > R300_MAX_AOS_ARRAYS) {		return R300_FALLBACK_TCL;	}	for (i = 0; i < nr; i++) {		int ci, fix, found = 0;		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;		}		if (r300IsGartMemory(rmesa, vb->AttribPtr[tab[i]]->data, 4)) {			if (vb->AttribPtr[tab[i]]->stride % 4) {				return R300_FALLBACK_TCL;			}			rmesa->state.aos[i].address = (void *)(vb->AttribPtr[tab[i]]->data);			rmesa->state.aos[i].start = 0;			rmesa->state.aos[i].aos_offset = r300GartOffsetFromVirtual(rmesa, vb->AttribPtr[tab[i]]->data);			rmesa->state.aos[i].aos_stride = vb->AttribPtr[tab[i]]->stride / 4;			rmesa->state.aos[i].aos_size = vb->AttribPtr[tab[i]]->size;		} else {			r300EmitVec(ctx, &rmesa->state.aos[i],				    vb->AttribPtr[tab[i]]->data,				    vb->AttribPtr[tab[i]]->size,				    vb->AttribPtr[tab[i]]->stride, count);		}		rmesa->state.aos[i].aos_size = vb->AttribPtr[tab[i]]->size;		for (fix = 0; fix <= 4 - vb->AttribPtr[tab[i]]->size; fix++) {			if ((rmesa->state.aos[i].aos_offset - _mesa_sizeof_type(GL_FLOAT) * fix) % 4) {				continue;			}			found = 1;			break;		}		if (found) {			if (fix > 0) {				WARN_ONCE("Feeling lucky?\n");			}			rmesa->state.aos[i].aos_offset -= _mesa_sizeof_type(GL_FLOAT) * fix;			for (ci = 0; ci < vb->AttribPtr[tab[i]]->size; ci++) {				swizzle[i][ci] += fix;			}		} else {			WARN_ONCE			    ("Cannot handle offset %x with stride %d, comp %d\n",			     rmesa->state.aos[i].aos_offset,			     rmesa->state.aos[i].aos_stride,			     vb->AttribPtr[tab[i]]->size);			return R300_FALLBACK_TCL;		}	}	/* Setup INPUT_ROUTE. */	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);	/* 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);	/* 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);	rmesa->state.aos_count = nr;	return R300_FALLBACK_NONE;}#ifdef USER_BUFFERSvoid r300UseArrays(GLcontext * ctx){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	int i;	if (rmesa->state.elt_dma.buf)		r300_mem_use(rmesa, rmesa->state.elt_dma.buf->id);	for (i = 0; i < rmesa->state.aos_count; i++) {		if (rmesa->state.aos[i].buf)			r300_mem_use(rmesa, rmesa->state.aos[i].buf->id);	}}#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__);	}}void r300EmitCacheFlush(r300ContextPtr rmesa){	int cmd_reserved = 0;	int cmd_written = 0;	drm_radeon_cmd_header_t *cmd = NULL;	reg_start(R300_RB3D_DSTCACHE_CTLSTAT, 0);	e32(R300_RB3D_DSTCACHE_CTLSTAT_DC_FREE_FREE_3D_TAGS |	    R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);	reg_start(R300_ZB_ZCACHE_CTLSTAT, 0);	e32(R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE |	    R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE);}

⌨️ 快捷键说明

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