Support for blend color(not tested), "proper line width/point size" clamps and fix...
authorAapo Tahkola <aet@rasterburn.org>
Mon, 14 Feb 2005 13:14:16 +0000 (13:14 +0000)
committerAapo Tahkola <aet@rasterburn.org>
Mon, 14 Feb 2005 13:14:16 +0000 (13:14 +0000)
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/r300_reg.h
src/mesa/drivers/dri/r300/r300_render.c
src/mesa/drivers/dri/r300/r300_state.c

index dda8a33934718b55e45b9062e052d544fd92d799..9466504cfca741c96dd8c8afa59349ea19a7b6e2 100644 (file)
@@ -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");
index 1d4cd1fcbc4ee624f98cdd76c85c802c399a986c..883d9b944c513ffbe7f86632ea9334976da9f401 100644 (file)
@@ -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)
 
index 8b78569e603f48d622f5904b8e190f05e158c327..8f9d89298248179bf7264b40d844b29b3efa5f8c 100644 (file)
@@ -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);
index bbbf674ee1a6142cd88dde0dfbcfdd0d4d103681..d0f49b75f0b1b2d49f7008372bccea4de2a936b3 100644 (file)
@@ -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;