Get Polygon offset fill to work.
authorVladimir Dergachev <volodya@freedesktop.org>
Thu, 3 Feb 2005 03:43:01 +0000 (03:43 +0000)
committerVladimir Dergachev <volodya@freedesktop.org>
Thu, 3 Feb 2005 03:43:01 +0000 (03:43 +0000)
Make WARN_ONCE message more informative.

src/mesa/drivers/dri/r300/r300_cmdbuf.c
src/mesa/drivers/dri/r300/r300_context.h
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 7505f7ba33d6a416b5488cd281868786d6ec49cf..a478b37ecdba9259d5b6e6501c5283e9ed30c10c 100644 (file)
@@ -301,6 +301,8 @@ void r300InitCmdBuf(r300ContextPtr r300)
        /* Initialize state atoms */
        ALLOC_STATE( vpt, always, R300_VPT_CMDSIZE, "vpt", 0 );
                r300->hw.vpt.cmd[R300_VPT_CMD_0] = cmducs(R300_SE_VPORT_XSCALE, 6);
+       ALLOC_STATE( zbs, always, R300_ZBS_CMDSIZE, "zbs", 0 );
+               r300->hw.zbs.cmd[R300_ZBS_CMD_0] = cmducs(R300_SE_ZBIAS_FACTOR, 2);
        ALLOC_STATE( unk2080, always, 2, "unk2080", 0 );
                r300->hw.unk2080.cmd[0] = cmducs(0x2080, 1);
        ALLOC_STATE( vte, always, 3, "vte", 0 );
@@ -460,6 +462,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
        r300->hw.atomlist.name = "atom-list";
 
        insert_at_tail(&r300->hw.atomlist, &r300->hw.vpt);
+       insert_at_tail(&r300->hw.atomlist, &r300->hw.zbs);
        insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2080);
        insert_at_tail(&r300->hw.atomlist, &r300->hw.vte);
        insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2134);
index 14f06fba4ccf1e77151d68050bcea3faffcc75ba..a5d034e0cd494782f680996bb57e090758a12f68 100644 (file)
@@ -57,11 +57,11 @@ typedef struct r300_context *r300ContextPtr;
 /* Checkpoint.. for convenience */
 #define CPT    { fprintf(stderr, "%s:%s line %d\n", __FILE__, __FUNCTION__, __LINE__); }
 #define WARN_ONCE(a)   { \
-       static int warn=1; \
-       if(warn){ \
+       static int warn##__LINE__=1; \
+       if(warn##__LINE__){ \
                fprintf(stderr, "%s:%s line %d ***WARN_ONCE*** " a, \
                        __FILE__, __FUNCTION__, __LINE__); \
-               warn=0;\
+               warn##__LINE__=0;\
                } \
        }
 
@@ -209,6 +209,11 @@ struct r300_state_atom {
 #define R300_VPT_ZOFFSET       6
 #define R300_VPT_CMDSIZE       7
 
+#define R300_ZBS_CMD_0         0
+#define R300_ZBS_FACTOR                1
+#define R300_ZBS_CONSTANT      2
+#define R300_ZBS_CMDSIZE       3
+
 #define R300_VIR_CMD_0         0 /* vir is variable size (at least 1) */
 #define R300_VIR_CNTL_0                1
 #define R300_VIR_CNTL_1                2
@@ -371,6 +376,7 @@ struct r300_hw_state {
        int             max_state_size; /* in dwords */
 
        struct r300_state_atom vpt;     /* viewport (1D98) */
+       struct r300_state_atom zbs;     /* zbias (1DB0) */
        struct r300_state_atom unk2080; /* (2080) */
        struct r300_state_atom vof;     /* VAP output format register 0x2090 */
        struct r300_state_atom vte;     /* (20B0) */
index b7e2cca63b38925bd1dda2c9d7ca9963a0884176..526bb1148786023f28b3f04eb9100d538f452ef5 100644 (file)
@@ -16,6 +16,8 @@ I am fairly certain that they are correct unless stated otherwise in comments.
 #define R300_SE_VPORT_ZSCALE                0x1DA8
 #define R300_SE_VPORT_ZOFFSET               0x1DAC
 
+#define R300_SE_ZBIAS_FACTOR                0x1DB0
+#define R300_SE_ZBIAS_CONSTANT              0x1DB4
 
 /* This register is written directly and also starts data section in many 3d CP_PACKET3's */
 #define R300_VAP_VF_CNTL       0x2084
@@ -634,9 +636,9 @@ I am fairly certain that they are correct unless stated otherwise in comments.
 #      define R300_TX_FORMAT_DXT3                  0x10
 #      define R300_TX_FORMAT_DXT5                  0x11
 #      define R300_TX_FORMAT_D3DMFT_CxV8U8         0x12     /* no swizzle */
-#      define R300_TX_FORMA_A8R8G8B8               0x13     /* no swizzle */
-#      define R300_TX_FORMA_B8G8_B8G8              0x14     /* no swizzle */
-#      define R300_TX_FORMA_G8R8_G8B8              0x15     /* no swizzle */
+#      define R300_TX_FORMAT_A8R8G8B8              0x13     /* no swizzle */
+#      define R300_TX_FORMAT_B8G8_B8G8             0x14     /* no swizzle */
+#      define R300_TX_FORMAT_G8R8_G8B8             0x15     /* no swizzle */
                                                  /* 0x16 - some 16 bit green format.. ?? */
        /* gap */
        /* Floating point formats */
index dac7006e5752cf8f5909b5c6647a0d17b55df1aa..16b7258481b64641d29a88920ef7e16e4e57adbb 100644 (file)
@@ -208,18 +208,22 @@ static void r300_render_immediate_primitive(r300ContextPtr rmesa,
    if(type<0)return;
    
    if(!VB->ObjPtr){
-       fprintf(stderr, "FIXME: Dont know how to handle GL_ARB_vertex_buffer_object "
-                       "correctly\n");
+       WARN_ONCE("FIXME: Don't know how to handle GL_ARB_vertex_buffer_object correctly\n");
        return;
    }
    /* A packet cannot have more than 16383 data words.. */
    if(((end-start)*4*rmesa->state.aos_count)>16380){
-       fprintf(stderr, "%s:%s: Too many vertices to paint. Fix me !\n");
+       WARN_ONCE("Too many vertices to paint. Fix me !\n");
        return;         
        }
 
    //fprintf(stderr, "aos_count=%d start=%d end=%d\n", rmesa->state.aos_count, start, end);
-       
+
+   if(rmesa->state.aos_count==0){
+       WARN_ONCE("Aeiee ! aos_count==0, while it shouldn't. Skipping rendering\n");
+       return;
+       }
+   
    start_immediate_packet(end-start, type, 4*rmesa->state.aos_count);
 
        for(i=start;i<end;i++){
@@ -622,7 +626,7 @@ static void r300_check_render(GLcontext *ctx, struct tnl_pipeline_stage *stage)
        FALLBACK_IF(ctx->Polygon.OffsetPoint); // GL_POLYGON_OFFSET_POINT
        FALLBACK_IF(ctx->Polygon.OffsetLine); // GL_POLYGON_OFFSET_LINE
        //FALLBACK_IF(ctx->Polygon.OffsetFill); // GL_POLYGON_OFFSET_FILL
-       if(ctx->Polygon.OffsetFill)WARN_ONCE("Polygon.OffsetFill not implemented, ignoring\n");
+       //if(ctx->Polygon.OffsetFill)WARN_ONCE("Polygon.OffsetFill not implemented, ignoring\n");
        FALLBACK_IF(ctx->Polygon.SmoothFlag); // GL_POLYGON_SMOOTH
        FALLBACK_IF(ctx->Polygon.StippleFlag); // GL_POLYGON_STIPPLE
        //FALLBACK_IF(ctx->Stencil.Enabled); // GL_STENCIL_TEST
index 306a921b9b29fec9635445c83dfec70ab5666e01..72dfe7a3b6f93d6e58f1cefc98650476f2092ec4 100644 (file)
@@ -417,9 +417,8 @@ static void r300UpdateCulling(GLcontext* ctx)
                if (ctx->Polygon.FrontFace == GL_CW)
                        val |= R300_FRONT_FACE_CW;
                else
-                       val |= R300_FRONT_FACE_CCW;
+                       val |= R300_FRONT_FACE_CCW;             
        }
-
        r300->hw.cul.cmd[R300_CUL_CULL] = val;
 }
 
@@ -479,15 +478,8 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
 
        case GL_STENCIL_TEST:
 
-               {
-               static int stencil=1;
-               if(stencil){
-                       fprintf(stderr, "%s:%s - do not know how to enable stencil. Help me !\n",
-                               __FILE__, __FUNCTION__);
-                       stencil=0;
-                       }
-               }
-
+               WARN_ONCE("Do not know how to enable stencil. Help me !\n");
+               
                if (r300->state.hw_stencil) {
                        //fprintf(stderr, "Stencil %s\n", state ? "enabled" : "disabled");
                        R300_STATECHANGE(r300, zs);
@@ -506,6 +498,14 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
        case GL_CULL_FACE:
                r300UpdateCulling(ctx);
                break;
+       case GL_POLYGON_OFFSET_FILL:
+               R300_STATECHANGE(r300, unk42B4);
+               if (state) {
+                       r300->hw.unk42B4.cmd[1] = (1<<1);
+               } else {
+                       r300->hw.unk42B4.cmd[1] = 0;
+               }
+               break;
        case GL_VERTEX_PROGRAM_ARB:
                //TCL_FALLBACK(rmesa->glCtx, R200_TCL_FALLBACK_TCL_DISABLE, state);
        break;
@@ -684,6 +684,9 @@ static void r300PointSize(GLcontext * ctx, GLfloat size)
                    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;
        }
 }
 
@@ -804,6 +807,28 @@ static void r300DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval)
        r300UpdateWindow(ctx);
 }
 
+/* =============================================================
+ * Polygon state
+ */
+
+static void r300PolygonOffset(GLcontext * ctx, GLfloat factor, GLfloat units)
+{
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
+       GLfloat constant = units * rmesa->state.depth.scale;
+
+/*    factor *= 2; */
+/*    constant *= 2; */
+
+/*    fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */
+
+       WARN_ONCE("ZBIAS registers locations might not be correct\n");
+
+       R200_STATECHANGE(rmesa, zbs);
+       rmesa->hw.zbs.cmd[R300_ZBS_FACTOR] = r300PackFloat32(factor);
+       rmesa->hw.zbs.cmd[R300_ZBS_CONSTANT] = r300PackFloat32(constant);
+}
+
+
 /* Routing and texture-related */
 
 void r300_setup_routing(GLcontext *ctx, GLboolean immediate)
@@ -1637,8 +1662,10 @@ void r300ResetHwState(r300ContextPtr r300)
 
        r300->hw.unk42A0.cmd[1] = 0x00000000;
 
+       #if 0
        r300->hw.unk42B4.cmd[1] = 0x00000000;
-
+       #endif
+       
        r300->hw.unk42C0.cmd[1] = 0x4B7FFFFF;
        r300->hw.unk42C0.cmd[2] = 0x00000000;
 
@@ -1836,4 +1863,7 @@ void r300InitStateFuncs(struct dd_function_table* functions)
        functions->Viewport = r300Viewport;
        functions->DepthRange = r300DepthRange;
        functions->PointSize = r300PointSize;
+       
+       
+       functions->PolygonOffset = r300PolygonOffset;
 }