From 0340663eb732d39a64b8e047cab3b2bfa19ce912 Mon Sep 17 00:00:00 2001 From: Aapo Tahkola Date: Mon, 14 Feb 2005 13:14:16 +0000 Subject: [PATCH] Support for blend color(not tested), "proper line width/point size" clamps and fix for glxinfo problem. --- src/mesa/drivers/dri/r300/r300_context.c | 1 - src/mesa/drivers/dri/r300/r300_reg.h | 7 +++ src/mesa/drivers/dri/r300/r300_render.c | 4 +- src/mesa/drivers/dri/r300/r300_state.c | 76 +++++++++++++++++++----- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index dda8a339347..9466504cfca 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -219,7 +219,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual, ctx = r300->radeon.glCtx; if(ctx->Visual.doubleBufferMode == 0){ fprintf(stderr, "Help me! Single buffer mode doesnt work yet.\n"); - exit(-1); } ctx->Const.MaxTextureImageUnits = driQueryOptioni(&r300->radeon.optionCache, "texture_image_units"); diff --git a/src/mesa/drivers/dri/r300/r300_reg.h b/src/mesa/drivers/dri/r300/r300_reg.h index 1d4cd1fcbc4..883d9b944c5 100644 --- a/src/mesa/drivers/dri/r300/r300_reg.h +++ b/src/mesa/drivers/dri/r300/r300_reg.h @@ -1005,6 +1005,13 @@ I am fairly certain that they are correct unless stated otherwise in comments. # define R300_ALPHA_TEST_GREATER (5 << 8) # define R300_ALPHA_TEST_NEQUAL (6 << 8) # define R300_ALPHA_TEST_PASS (7 << 8) +/* // Possibly more correct values: +# define R300_ALPHA_TEST_LEQUAL (3 << 8) +# define R300_ALPHA_TEST_EQUAL (2 << 8) +# define R300_ALPHA_TEST_GEQUAL (6 << 8) +# define R300_ALPHA_TEST_GREATER (4 << 8) +# define R300_ALPHA_TEST_NEQUAL (5 << 8) +*/ # define R300_ALPHA_TEST_OP_MASK (7 << 8) # define R300_ALPHA_TEST_ENABLE (1 << 11) diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c index 8b78569e603..8f9d8929824 100644 --- a/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c @@ -485,7 +485,7 @@ static GLboolean r300_run_immediate_render(GLcontext *ctx, efloat(1.0); #endif -/* Why do we need this for immediate mode?? */ +/* Why do we need this for immediate mode?? Vertex processor needs it to know proper regs */ // r300EmitLOAD_VBPNTR(rmesa, 0); for(i=0; i < VB->PrimitiveCount; i++){ @@ -543,7 +543,7 @@ static GLboolean r300_run_vb_render(GLcontext *ctx, r300ReleaseArrays(ctx); r300EmitArrays(ctx, rmesa->state.render_inputs); - + // LOCK_HARDWARE(&(rmesa->radeon)); reg_start(R300_RB3D_DSTCACHE_CTLSTAT,0); diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index bbbf674ee1a..d0f49b75f0b 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -98,6 +98,7 @@ static void r300AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref) break; case GL_ALWAYS: pp_misc |= R300_ALPHA_TEST_PASS; + //pp_misc &= ~R300_ALPHA_TEST_ENABLE; break; } @@ -108,7 +109,17 @@ static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4]) { GLubyte color[4]; r300ContextPtr rmesa = R300_CONTEXT(ctx); - fprintf(stderr, "%s:%s is not implemented yet. Fixme !\n", __FILE__, __FUNCTION__); + + R300_STATECHANGE(rmesa, unk4E10); + + /* Ordering might be wrong */ + CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]); + CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]); + CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]); + CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]); + + rmesa->hw.unk4E10.cmd[1]=radeonPackColor(4, color[0], color[1], color[2], color[3]); + //fprintf(stderr, "%s:%s is not implemented yet. Fixme !\n", __FILE__, __FUNCTION__); #if 0 R200_STATECHANGE(rmesa, ctx); CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]); @@ -641,7 +652,8 @@ static void r300PointSize(GLcontext * ctx, GLfloat size) { r300ContextPtr r300 = R300_CONTEXT(ctx); - /* TODO: Validate point size */ + size = ctx->Point._Size; + R300_STATECHANGE(r300, ps); r300->hw.ps.cmd[R300_PS_POINTSIZE] = ((int)(size * 6) << R300_POINTSIZE_X_SHIFT) | @@ -660,10 +672,8 @@ static void r300PointSize(GLcontext * ctx, GLfloat size) static void r300LineWidth(GLcontext *ctx, GLfloat widthf) { r300ContextPtr r300 = R300_CONTEXT(ctx); - /* IMHO mesa isnt clamping line widths according to ctx->Const.*LineWidth - before calling this from the dd function table. - Since r300ResetHwState calls these with clamped values, - they must be set properly. */ + + widthf = ctx->Line._Width; R300_STATECHANGE(r300, lcntl); r300->hw.lcntl.cmd[1] = (int)(widthf * 6.0); @@ -696,9 +706,40 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode) r300ContextPtr r300 = R300_CONTEXT(ctx); unsigned long hw_mode=0; - hw_mode=r300->hw.unk4288.cmd[1]; + //hw_mode=r300->hw.unk4288.cmd[1]; hw_mode |= 1; /* enables point mode by default */ - + + switch (ctx->Polygon.FrontMode) { + case GL_LINE: + hw_mode &= ~PM_NOT_FRONT; + hw_mode |= PM_FRONT_LINE; + break; + case GL_POINT: + hw_mode &= ~PM_NOT_FRONT; + hw_mode &= ~PM_FRONT_LINE; + break; + /* I dont think fgl properly handles these... In any case, test program is needed */ + case GL_FILL: + break; + } + + switch (ctx->Polygon.BackMode) { + case GL_LINE: + hw_mode &= ~PM_NOT_BACK; + hw_mode |= PM_BACK_LINE; + break; + case GL_POINT: + hw_mode &= ~PM_NOT_BACK; + hw_mode &= ~PM_BACK_LINE; + break; + case GL_FILL: + break; + } + + if(hw_mode == 1) + hw_mode = 0; + +#if 0 switch (face) { case GL_FRONT: //fprintf(stderr, "front\n"); @@ -710,8 +751,7 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode) case GL_POINT: hw_mode &= ~PM_FRONT_LINE; break; - case GL_FILL: /* No idea */ - hw_mode = 0; + case GL_FILL: break; } break; @@ -726,8 +766,7 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode) case GL_POINT: hw_mode &= ~PM_BACK_LINE; break; - case GL_FILL: /* No idea */ - hw_mode = 0; + case GL_FILL: break; } break; @@ -751,6 +790,7 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode) } break; } +#endif //if( front and back fill) hw_mode=0; @@ -1887,7 +1927,7 @@ void r300ResetHwState(r300ContextPtr r300) r300->hw.unk4214.cmd[1] = 0x00050005; - r300PointSize(ctx, ctx->Point._Size); + r300PointSize(ctx, 0.0); #if 0 r300->hw.ps.cmd[R300_PS_POINTSIZE] = (6 << R300_POINTSIZE_X_SHIFT) | (6 << R300_POINTSIZE_Y_SHIFT); @@ -1897,7 +1937,7 @@ void r300ResetHwState(r300ContextPtr r300) r300->hw.unk4230.cmd[2] = 0x00020006; r300->hw.unk4230.cmd[3] = r300PackFloat32(1.0 / 192.0); - r300LineWidth(ctx, ctx->Line._Width); + r300LineWidth(ctx, 0.0); #ifdef EXP_C static int foobar=0; @@ -1968,7 +2008,8 @@ void r300ResetHwState(r300ContextPtr r300) r300->hw.unk4BC8.cmd[1] = 0; r300->hw.unk4BC8.cmd[2] = 0; r300->hw.unk4BC8.cmd[3] = 0; - + + //r300AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef); #if 0 r300->hw.at.cmd[R300_AT_ALPHA_TEST] = 0; #endif @@ -1982,8 +2023,11 @@ void r300ResetHwState(r300ContextPtr r300) r300->hw.bld.cmd[R300_BLD_CBLEND] = 0; r300->hw.bld.cmd[R300_BLD_ABLEND] = 0; #endif - + + r300BlendColor(ctx, ctx->Color.BlendColor); +#if 0 r300->hw.unk4E10.cmd[1] = 0; +#endif r300->hw.unk4E10.cmd[2] = 0; r300->hw.unk4E10.cmd[3] = 0; -- 2.30.2