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

📄 r300_state.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	case GL_BLEND:	case GL_COLOR_LOGIC_OP:		r300_set_blend_state(ctx);		break;	case GL_DEPTH_TEST:		R300_STATECHANGE(r300, zs);		if (state) {			if (ctx->Depth.Mask)				newval = R300_RB3D_Z_TEST_AND_WRITE;			else				newval = R300_RB3D_Z_TEST;		} else			newval = R300_RB3D_Z_DISABLED_1;		r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_RB3D_STENCIL_ENABLE;		r300->hw.zs.cmd[R300_ZS_CNTL_0] |= newval;		update_early_z(ctx);		break;	case GL_STENCIL_TEST:		if (r300->state.stencil.hw_stencil) {			R300_STATECHANGE(r300, zs);			if (state) {				WARN_ONCE("TODO - double side stencil !\n");				r300->hw.zs.cmd[R300_ZS_CNTL_0] |=				    R300_RB3D_STENCIL_ENABLE;			} else {				r300->hw.zs.cmd[R300_ZS_CNTL_0] &=				    ~R300_RB3D_STENCIL_ENABLE;			}		} else {#if R200_MERGED			FALLBACK(&r300->radeon, RADEON_FALLBACK_STENCIL, state);#endif					}		break;	case GL_CULL_FACE:		r300UpdateCulling(ctx);		break;	case GL_POLYGON_OFFSET_POINT:	case GL_POLYGON_OFFSET_LINE:		break;	case GL_POLYGON_OFFSET_FILL:		R300_STATECHANGE(r300, unk42B4);		if(state){			r300->hw.unk42B4.cmd[1] |= (3<<0);		} else {			r300->hw.unk42B4.cmd[1] &= ~(3<<0);		}		break;	default:		radeonEnable(ctx, cap, state);		return;	}}static void r300UpdatePolygonMode(GLcontext *ctx){	r300ContextPtr r300 = R300_CONTEXT(ctx);	uint32_t hw_mode=0;	if (ctx->Polygon.FrontMode != GL_FILL ||	    ctx->Polygon.BackMode != GL_FILL) {		GLenum f, b;				if (ctx->Polygon.FrontFace == GL_CCW) {			f = ctx->Polygon.FrontMode;			b = ctx->Polygon.BackMode;		} else {			f = ctx->Polygon.BackMode;			b = ctx->Polygon.FrontMode;		}		hw_mode |= R300_PM_ENABLED;		switch (f) {		case GL_LINE:			hw_mode |= R300_PM_FRONT_LINE;		break;		case GL_POINT: /* noop */			hw_mode |= R300_PM_FRONT_POINT;		break;		case GL_FILL:			hw_mode |= R300_PM_FRONT_FILL;		break;		}		switch (b) {		case GL_LINE:			hw_mode |= R300_PM_BACK_LINE;		break;		case GL_POINT: /* noop */			hw_mode |= R300_PM_BACK_POINT;		break;		case GL_FILL:			hw_mode |= R300_PM_BACK_FILL;		break;		}	}	if (r300->hw.unk4288.cmd[1] != hw_mode) {		R300_STATECHANGE(r300, unk4288);		r300->hw.unk4288.cmd[1] = hw_mode;	}}/** * Change the culling mode. * * \note Mesa already filters redundant calls to this function. */static void r300CullFace(GLcontext* ctx, GLenum mode){	(void)mode;	r300UpdateCulling(ctx);}/** * Change the polygon orientation. * * \note Mesa already filters redundant calls to this function. */static void r300FrontFace(GLcontext* ctx, GLenum mode){	(void)mode;	r300UpdateCulling(ctx);	r300UpdatePolygonMode(ctx);}/** * Change the depth testing function. * * \note Mesa already filters redundant calls to this function. */static void r300DepthFunc(GLcontext* ctx, GLenum func){	r300ContextPtr r300 = R300_CONTEXT(ctx);	R300_STATECHANGE(r300, zs);	r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT);	switch(func) {	case GL_NEVER:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_NEVER << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	case GL_LESS:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_LESS << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	case GL_EQUAL:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_EQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	case GL_LEQUAL:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_LEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	case GL_GREATER:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_GREATER << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	case GL_NOTEQUAL:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_NOTEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	case GL_GEQUAL:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_GEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	case GL_ALWAYS:		r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_ALWAYS << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;		break;	}}/** * Enable/Disable depth writing. * * \note Mesa already filters redundant calls to this function. */static void r300DepthMask(GLcontext* ctx, GLboolean mask){	r300Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);}/** * Handle glColorMask() */static void r300ColorMask(GLcontext* ctx,			  GLboolean r, GLboolean g, GLboolean b, GLboolean a){	r300ContextPtr r300 = R300_CONTEXT(ctx);	int mask = (r ? R300_COLORMASK0_R : 0) |		   (g ? R300_COLORMASK0_G : 0) |		   (b ? R300_COLORMASK0_B : 0) |		   (a ? R300_COLORMASK0_A : 0);	if (mask != r300->hw.cmk.cmd[R300_CMK_COLORMASK]) {		R300_STATECHANGE(r300, cmk);		r300->hw.cmk.cmd[R300_CMK_COLORMASK] = mask;	}}/* ============================================================= * Point state */static void r300PointSize(GLcontext * ctx, GLfloat size){	r300ContextPtr r300 = R300_CONTEXT(ctx);	size = ctx->Point._Size;	R300_STATECHANGE(r300, ps);	r300->hw.ps.cmd[R300_PS_POINTSIZE] = 		((int)(size * 6) << R300_POINTSIZE_X_SHIFT) |		((int)(size * 6) << R300_POINTSIZE_Y_SHIFT);}/* ============================================================= * Line state */static void r300LineWidth(GLcontext *ctx, GLfloat widthf){	r300ContextPtr r300 = R300_CONTEXT(ctx);	widthf = ctx->Line._Width;	R300_STATECHANGE(r300, lcntl);	r300->hw.lcntl.cmd[1] = (int)(widthf * 6.0);	r300->hw.lcntl.cmd[1] |= R300_LINE_CNT_VE;}static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode){	(void)face;	(void)mode;		r300UpdatePolygonMode(ctx);}/* ============================================================= * Stencil */static int translate_stencil_func(int func){	switch (func) {	case GL_NEVER:		return R300_ZS_NEVER;	case GL_LESS:		return R300_ZS_LESS;	case GL_EQUAL:		return R300_ZS_EQUAL;	case GL_LEQUAL:		return R300_ZS_LEQUAL;	case GL_GREATER:		return R300_ZS_GREATER;	case GL_NOTEQUAL:		return R300_ZS_NOTEQUAL;	case GL_GEQUAL:		return R300_ZS_GEQUAL;	case GL_ALWAYS:		return R300_ZS_ALWAYS;	}	return 0;}static int translate_stencil_op(int op){	switch (op) {	case GL_KEEP:		return R300_ZS_KEEP;	case GL_ZERO:		return R300_ZS_ZERO;	case GL_REPLACE:		return R300_ZS_REPLACE;	case GL_INCR:		return R300_ZS_INCR;	case GL_DECR:		return R300_ZS_DECR;	case GL_INCR_WRAP_EXT:		return R300_ZS_INCR_WRAP;	case GL_DECR_WRAP_EXT:		return R300_ZS_DECR_WRAP;	case GL_INVERT:		return R300_ZS_INVERT;	default:		WARN_ONCE("Do not know how to translate stencil op");		return R300_ZS_KEEP;	}	return 0;}static void r300ShadeModel(GLcontext * ctx, GLenum mode){	r300ContextPtr rmesa = R300_CONTEXT(ctx);		R300_STATECHANGE(rmesa, unk4274);	switch (mode) {	case GL_FLAT:		rmesa->hw.unk4274.cmd[2] = R300_RE_SHADE_MODEL_FLAT;		break;	case GL_SMOOTH:		rmesa->hw.unk4274.cmd[2] = R300_RE_SHADE_MODEL_SMOOTH;		break;	default:		return;	}}static void r300StencilFuncSeparate(GLcontext * ctx, GLenum face,                                    GLenum func, GLint ref, GLuint mask){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	GLuint refmask = ((ctx->Stencil.Ref[0] << R300_RB3D_ZS2_STENCIL_REF_SHIFT) |			  (ctx->Stencil.ValueMask[0] << R300_RB3D_ZS2_STENCIL_MASK_SHIFT));			  	GLuint flag;	R300_STATECHANGE(rmesa, zs);	rmesa->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(		(R300_ZS_MASK << R300_RB3D_ZS1_FRONT_FUNC_SHIFT)		| (R300_ZS_MASK << R300_RB3D_ZS1_BACK_FUNC_SHIFT));		rmesa->hw.zs.cmd[R300_ZS_CNTL_2] &=  ~((R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_REF_SHIFT) |						(R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_MASK_SHIFT));		flag = translate_stencil_func(ctx->Stencil.Function[0]);	rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |= (flag << R300_RB3D_ZS1_FRONT_FUNC_SHIFT)					  | (flag << R300_RB3D_ZS1_BACK_FUNC_SHIFT);	rmesa->hw.zs.cmd[R300_ZS_CNTL_2] |= refmask;}static void r300StencilMaskSeparate(GLcontext * ctx, GLenum face, GLuint mask){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	R300_STATECHANGE(rmesa, zs);	rmesa->hw.zs.cmd[R300_ZS_CNTL_2]  &= ~(R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT);	rmesa->hw.zs.cmd[R300_ZS_CNTL_2] |= ctx->Stencil.WriteMask[0] << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT;}static void r300StencilOpSeparate(GLcontext * ctx, GLenum face, GLenum fail,                                  GLenum zfail, GLenum zpass){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	R300_STATECHANGE(rmesa, zs);		/* It is easier to mask what's left.. */	rmesa->hw.zs.cmd[R300_ZS_CNTL_1] &= 	    (R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT) | 	    (R300_ZS_MASK << R300_RB3D_ZS1_FRONT_FUNC_SHIFT) | 	    (R300_ZS_MASK << R300_RB3D_ZS1_BACK_FUNC_SHIFT);	rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=		 (translate_stencil_op(ctx->Stencil.FailFunc[0]) << R300_RB3D_ZS1_FRONT_FAIL_OP_SHIFT)		|(translate_stencil_op(ctx->Stencil.ZFailFunc[0]) << R300_RB3D_ZS1_FRONT_ZFAIL_OP_SHIFT)		|(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT)		|(translate_stencil_op(ctx->Stencil.FailFunc[0]) << R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT)		|(translate_stencil_op(ctx->Stencil.ZFailFunc[0]) << R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT)		|(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT);}static void r300ClearStencil(GLcontext * ctx, GLint s){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	rmesa->state.stencil.clear =	    ((GLuint) ctx->Stencil.Clear |	     (R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_MASK_SHIFT) |	     (ctx->Stencil.WriteMask[0] << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT));}/* ============================================================= * Window position and viewport transformation *//* * To correctly position primitives: */#define SUBPIXEL_X 0.125#define SUBPIXEL_Y 0.125void r300UpdateWindow(GLcontext * ctx){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	__DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;	GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0;	GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0;	const GLfloat *v = ctx->Viewport._WindowMap.m;	GLfloat sx = v[MAT_SX];	GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;	GLfloat sy = -v[MAT_SY];	GLfloat ty = (-v[MAT_TY]) + yoffset + SUBPIXEL_Y;	GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;	GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;	R300_FIREVERTICES(rmesa);	R300_STATECHANGE(rmesa, vpt);	rmesa->hw.vpt.cmd[R300_VPT_XSCALE]  = r300PackFloat32(sx);	rmesa->hw.vpt.cmd[R300_VPT_XOFFSET] = r300PackFloat32(tx);	rmesa->hw.vpt.cmd[R300_VPT_YSCALE]  = r300PackFloat32(sy);	rmesa->hw.vpt.cmd[R300_VPT_YOFFSET] = r300PackFloat32(ty);	rmesa->hw.vpt.cmd[R300_VPT_ZSCALE]  = r300PackFloat32(sz);	rmesa->hw.vpt.cmd[R300_VPT_ZOFFSET] = r300PackFloat32(tz);}static void r300Viewport(GLcontext * ctx, GLint x, GLint y,			 GLsizei width, GLsizei height){	/* Don't pipeline viewport changes, conflict with window offset	 * setting below.  Could apply deltas to rescue pipelined viewport	 * values, or keep the originals hanging around.	 */	r300UpdateWindow(ctx);}static void r300DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval){

⌨️ 快捷键说明

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