Cleaned up the software TCL code a bit. Renamed nv30_tris.[c,h] to
authorStephane Marchesin <marchesin@icps.u-strasbg.fr>
Mon, 6 Mar 2006 15:32:31 +0000 (15:32 +0000)
committerStephane Marchesin <marchesin@icps.u-strasbg.fr>
Mon, 6 Mar 2006 15:32:31 +0000 (15:32 +0000)
    nv20_swtcl.[c,h].

src/mesa/drivers/dri/nouveau/Makefile
src/mesa/drivers/dri/nouveau/nouveau_reg.h
src/mesa/drivers/dri/nouveau/nv20_swtcl.c [moved from src/mesa/drivers/dri/nouveau/nv30_tris.c with 86% similarity]
src/mesa/drivers/dri/nouveau/nv20_swtcl.h [moved from src/mesa/drivers/dri/nouveau/nv30_tris.h with 87% similarity]

index 3fd237e..3e40240 100644 (file)
@@ -16,7 +16,7 @@ DRIVER_SOURCES = \
        nouveau_span.c           \
        nouveau_tex.c            \
        nouveau_tris.c           \
-       nv30_tris.c
+       nv20_swtcl.c
 
 C_SOURCES = \
        $(COMMON_SOURCES) \
index 8b936a5..4f35283 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
 
-Copyright 2006 Stephane Marchesin
+Copyright 2006 Stephane Marchesin, Sylvain Munaut
 All Rights Reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining a
@@ -58,3 +58,14 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NV03_FIFO_CMD_JUMP_OFFSET_MASK                     0x1ffffffc
 #define NV03_FIFO_CMD_REWIND                               (NV03_FIFO_CMD_JUMP | (0 & NV03_FIFO_CMD_JUMP_OFFSET_MASK))
 
+/* Rendering commands */
+#define NV20_PRIMITIVE                                     0x000017fc
+#define NV30_PRIMITIVE                                     0x00001808
+#define NV20_BEGIN_VERTICES                                0x00001818
+
+/* Vertex attributes */
+#define NV20_VERTEX_ATTRIBUTE(i)                           (0x00001760+i*4)
+#define NV30_VERTEX_ATTRIBUTES                             0x00001740
+#define NV30_UNKNOWN_0                                     0x00001718
+
+
similarity index 86%
rename from src/mesa/drivers/dri/nouveau/nv30_tris.c
rename to src/mesa/drivers/dri/nouveau/nv20_swtcl.c
index 6b949bd..9f1327b 100644 (file)
@@ -23,7 +23,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
-/* Software TCL for NV30, NV40, G70 */
+/* Software TCL for NV20, NV30, NV40, G70 */
 
 #include <stdio.h>
 #include <math.h>
@@ -41,7 +41,7 @@
 #include "tnl/t_pipeline.h"
 
 #include "nouveau_tris.h"
-#include "nv30_tris.h"
+#include "nv20_swtcl.h"
 #include "nouveau_context.h"
 #include "nouveau_span.h"
 #include "nouveau_ioctl.h"
@@ -52,8 +52,8 @@
 /* XXX hack for now */
 #define channel 1
 
-static void nv30RenderPrimitive( GLcontext *ctx, GLenum prim );
-static void nv30RasterPrimitive( GLcontext *ctx, GLenum rprim, GLuint hwprim );
+static void nv20RenderPrimitive( GLcontext *ctx, GLenum prim );
+static void nv20RasterPrimitive( GLcontext *ctx, GLenum rprim, GLuint hwprim );
 
 
 /***********************************************************************
@@ -67,31 +67,39 @@ static void nv30RasterPrimitive( GLcontext *ctx, GLenum rprim, GLuint hwprim );
 
 
 /* the free room we want before we start a vertex batch. this is a performance-tunable */
-#define NV30_MIN_PRIM_SIZE (32/4)
+#define NV20_MIN_PRIM_SIZE (32/4)
+/* the size above which we fire the ring. this is a performance-tunable */
+#define NV20_FIRE_SIZE (2048/4)
 
-static inline void nv30StartPrimitive(struct nouveau_context* nmesa)
+static inline void nv20StartPrimitive(struct nouveau_context* nmesa)
 {
-       BEGIN_RING_SIZE(channel,0x1808,1);
+       if (nmesa->screen->card_type==NV20)
+               BEGIN_RING_SIZE(channel,NV20_PRIMITIVE,1);
+       else
+               BEGIN_RING_SIZE(channel,NV30_PRIMITIVE,1);
        OUT_RING(nmesa->current_primitive);
-       BEGIN_RING_PRIM(channel,0x1818,NV30_MIN_PRIM_SIZE);
+       BEGIN_RING_PRIM(channel,NV20_BEGIN_VERTICES,NV20_MIN_PRIM_SIZE);
 }
 
-static inline void nv30FinishPrimitive(struct nouveau_context *nmesa)
+static inline void nv20FinishPrimitive(struct nouveau_context *nmesa)
 {
        FINISH_RING_PRIM();
-       BEGIN_RING_SIZE(channel,0x1808,1);
+       if (nmesa->screen->card_type==NV20)
+               BEGIN_RING_SIZE(channel,NV20_PRIMITIVE,1);
+       else
+               BEGIN_RING_SIZE(channel,NV30_PRIMITIVE,1);
        OUT_RING(0x0);
        FIRE_RING();
 }
 
 
-static inline void nv30ExtendPrimitive(struct nouveau_context* nmesa, int size)
+static inline void nv20ExtendPrimitive(struct nouveau_context* nmesa, int size)
 {
        /* when the fifo has enough stuff (2048 bytes) or there is not enough room, fire */
-       if ((RING_AHEAD()>=2048/4)||(RING_AVAILABLE()<size/4))
+       if ((RING_AHEAD()>=NV20_FIRE_SIZE)||(RING_AVAILABLE()<size/4))
        {
-               nv30FinishPrimitive(nmesa);
-               nv30StartPrimitive(nmesa);
+               nv20FinishPrimitive(nmesa);
+               nv20StartPrimitive(nmesa);
        }
 
        /* make sure there's enough room. if not, wait */
@@ -101,14 +109,14 @@ static inline void nv30ExtendPrimitive(struct nouveau_context* nmesa, int size)
        }
 }
 
-static inline void nv30_draw_quad(nouveauContextPtr nmesa,
+static inline void nv20_draw_quad(nouveauContextPtr nmesa,
                nouveauVertexPtr v0,
                nouveauVertexPtr v1,
                nouveauVertexPtr v2,
                nouveauVertexPtr v3)
 {
        GLuint vertsize = nmesa->vertex_size;
-       nv30ExtendPrimitive(nmesa, 4 * 4 * vertsize);
+       nv20ExtendPrimitive(nmesa, 4 * 4 * vertsize);
 
        OUT_RINGp(v0,vertsize);
        OUT_RINGp(v1,vertsize);
@@ -116,34 +124,34 @@ static inline void nv30_draw_quad(nouveauContextPtr nmesa,
        OUT_RINGp(v3,vertsize);
 }
 
-static inline void nv30_draw_triangle(nouveauContextPtr nmesa,
+static inline void nv20_draw_triangle(nouveauContextPtr nmesa,
                nouveauVertexPtr v0,
                nouveauVertexPtr v1,
                nouveauVertexPtr v2)
 {
        GLuint vertsize = nmesa->vertex_size;
-       nv30ExtendPrimitive(nmesa, 3 * 4 * vertsize);
+       nv20ExtendPrimitive(nmesa, 3 * 4 * vertsize);
 
        OUT_RINGp(v0,vertsize);
        OUT_RINGp(v1,vertsize);
        OUT_RINGp(v2,vertsize);
 }
 
-static inline void nv30_draw_line(nouveauContextPtr nmesa,
+static inline void nv20_draw_line(nouveauContextPtr nmesa,
                nouveauVertexPtr v0,
                nouveauVertexPtr v1)
 {
        GLuint vertsize = nmesa->vertex_size;
-       nv30ExtendPrimitive(nmesa, 2 * 4 * vertsize);
+       nv20ExtendPrimitive(nmesa, 2 * 4 * vertsize);
        OUT_RINGp(v0,vertsize);
        OUT_RINGp(v1,vertsize);
 }
 
-static inline void nv30_draw_point(nouveauContextPtr nmesa,
+static inline void nv20_draw_point(nouveauContextPtr nmesa,
                nouveauVertexPtr v0)
 {
        GLuint vertsize = nmesa->vertex_size;
-       nv30ExtendPrimitive(nmesa, 1 * 4 * vertsize);
+       nv20ExtendPrimitive(nmesa, 1 * 4 * vertsize);
        OUT_RINGp(v0,vertsize);
 }
 
@@ -158,7 +166,7 @@ static inline void nv30_draw_point(nouveauContextPtr nmesa,
                if (DO_FALLBACK)                            \
                nmesa->draw_tri(nmesa, a, b, c);            \
                else                                        \
-               nv30_draw_triangle(nmesa, a, b, c);         \
+               nv20_draw_triangle(nmesa, a, b, c);         \
        } while (0)
 
 #define QUAD(a, b, c, d)                                    \
@@ -168,7 +176,7 @@ static inline void nv30_draw_point(nouveauContextPtr nmesa,
                        nmesa->draw_tri(nmesa, b, c, d);    \
                }                                           \
                else                                        \
-               nv30_draw_quad(nmesa, a, b, c, d);          \
+               nv20_draw_quad(nmesa, a, b, c, d);          \
        } while (0)
 
 #define LINE(v0, v1)                                        \
@@ -176,7 +184,7 @@ static inline void nv30_draw_point(nouveauContextPtr nmesa,
                if (DO_FALLBACK)                            \
                nmesa->draw_line(nmesa, v0, v1);            \
                else                                        \
-               nv30_draw_line(nmesa, v0, v1);              \
+               nv20_draw_line(nmesa, v0, v1);              \
        } while (0)
 
 #define POINT(v0)                                           \
@@ -184,7 +192,7 @@ static inline void nv30_draw_point(nouveauContextPtr nmesa,
                if (DO_FALLBACK)                            \
                nmesa->draw_point(nmesa, v0);               \
                else                                        \
-               nv30_draw_point(nmesa, v0);                 \
+               nv20_draw_point(nmesa, v0);                 \
        } while (0)
 
 
@@ -304,7 +312,7 @@ static const GLuint hw_prim[GL_POLYGON+1] = {
        GL_TRIANGLES+1
 };
 
-#define RASTERIZE(x) nv30RasterPrimitive( ctx, x, hw_prim[x] )
+#define RASTERIZE(x) nv20RasterPrimitive( ctx, x, hw_prim[x] )
 #define RENDER_PRIMITIVE nmesa->renderPrimitive
 #define TAG(x) x
 #define IND NOUVEAU_FALLBACK_BIT
@@ -432,7 +440,7 @@ static void init_rast_tab(void)
 #define RENDER_LINE(v0, v1)         LINE(V(v0), V(v1))
 #define RENDER_TRI( v0, v1, v2)     TRI( V(v0), V(v1), V(v2))
 #define RENDER_QUAD(v0, v1, v2, v3) QUAD(V(v0), V(v1), V(v2), V(v3))
-#define INIT(x) nv30RasterPrimitive(ctx, x, hw_prim[x])
+#define INIT(x) nv20RasterPrimitive(ctx, x, hw_prim[x])
 #undef LOCAL_VARS
 #define LOCAL_VARS                                              \
        struct nouveau_context *nmesa = NOUVEAU_CONTEXT(ctx);                     \
@@ -501,7 +509,7 @@ static void nouveauFastRenderClippedPoly(GLcontext *ctx, const GLuint *elts,
 {
        struct nouveau_context *nmesa = NOUVEAU_CONTEXT(ctx);
        GLuint vertsize = nmesa->vertex_size;
-       nv30ExtendPrimitive(nmesa, (n - 2) * 3 * 4 * vertsize);
+       nv20ExtendPrimitive(nmesa, (n - 2) * 3 * 4 * vertsize);
        GLubyte *vertptr = (GLubyte *)nmesa->verts;
        const GLuint *start = (const GLuint *)V(elts[0]);
        int i;
@@ -541,16 +549,16 @@ do {                                                                      \
 } while (0)
 
 
-static void nv30ChooseRenderState(GLcontext *ctx)
+static void nv20ChooseRenderState(GLcontext *ctx)
 {
        TNLcontext *tnl = TNL_CONTEXT(ctx);
        struct nouveau_context *nmesa = NOUVEAU_CONTEXT(ctx);
        GLuint flags = ctx->_TriangleCaps;
        GLuint index = 0;
 
-       nmesa->draw_point = nv30_draw_point;
-       nmesa->draw_line = nv30_draw_line;
-       nmesa->draw_tri = nv30_draw_triangle;
+       nmesa->draw_point = nv20_draw_point;
+       nmesa->draw_line = nv20_draw_line;
+       nmesa->draw_tri = nv20_draw_triangle;
 
        if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS)) {
                if (flags & DD_TRI_LIGHT_TWOSIDE)    index |= NOUVEAU_TWOSIDE_BIT;
@@ -601,7 +609,7 @@ static void nv30ChooseRenderState(GLcontext *ctx)
 
 
 
-static inline void nv30OutputVertexFormat(struct nouveau_context* nmesa, GLuint index)
+static inline void nv20OutputVertexFormat(struct nouveau_context* nmesa, GLuint index)
 {
        GLcontext* ctx=nmesa->glCtx;
        TNLcontext *tnl = TNL_CONTEXT(ctx);
@@ -673,42 +681,31 @@ static inline void nv30OutputVertexFormat(struct nouveau_context* nmesa, GLuint
        /* 
         * Tell the hardware about the vertex format
         */
-       switch(nmesa->screen->card_type)
-       {
-               case NV_20:
-                       {
-                               for(i=0;i<16;i++)
-                               {
-                                       int size=attr_size[i];
-                                       BEGIN_RING_SIZE(channel,0x1760+i*4,1);
-                                       OUT_RING(0x00000002|(size*0x10));
-                               }
-                       }
-                       break;
-               case NV_30:
-               case NV_40:
-               case G_70:
-                       {
-                               BEGIN_RING_SIZE(channel,0x1740,slots);
-                               for(i=0;i<slots;i++)
-                               {
-                                       int size=attr_size[i];
-                                       OUT_RING(0x00000002|(size*0x10));
-                               }
-                               BEGIN_RING_SIZE(channel,0x1718,1);
-                               OUT_RING(0);
-                               BEGIN_RING_SIZE(channel,0x1718,1);
-                               OUT_RING(0);
-                               BEGIN_RING_SIZE(channel,0x1718,1);
-                               OUT_RING(0);
-                       }
-                       break;
-               
+       if (nmesa->screen->card_type==NV_20) {
+               for(i=0;i<16;i++)
+               {
+                       int size=attr_size[i];
+                       BEGIN_RING_SIZE(channel,NV20_VERTEX_ATTRIBUTE(i),1);
+                       OUT_RING(0x00000002|(size*0x10));
+               }
+       } else {
+               BEGIN_RING_SIZE(channel,NV30_VERTEX_ATTRIBUTES,slots);
+               for(i=0;i<slots;i++)
+               {
+                       int size=attr_size[i];
+                       OUT_RING(0x00000002|(size*0x10));
+               }
+               BEGIN_RING_SIZE(channel,NV30_UNKNOWN_0,1);
+               OUT_RING(0);
+               BEGIN_RING_SIZE(channel,NV30_UNKNOWN_0,1);
+               OUT_RING(0);
+               BEGIN_RING_SIZE(channel,NV30_UNKNOWN_0,1);
+               OUT_RING(0);
        }
 }
 
 
-static void nv30ChooseVertexState( GLcontext *ctx )
+static void nv20ChooseVertexState( GLcontext *ctx )
 {
        struct nouveau_context *nmesa = NOUVEAU_CONTEXT(ctx);
        TNLcontext *tnl = TNL_CONTEXT(ctx);
@@ -717,7 +714,7 @@ static void nv30ChooseVertexState( GLcontext *ctx )
        if (index!=nmesa->render_inputs)
        {
                nmesa->render_inputs=index;
-               nv30OutputVertexFormat(nmesa,index);
+               nv20OutputVertexFormat(nmesa,index);
        }
 }
 
@@ -727,7 +724,7 @@ static void nv30ChooseVertexState( GLcontext *ctx )
 /**********************************************************************/
 
 
-static void nv30RenderStart(GLcontext *ctx)
+static void nv20RenderStart(GLcontext *ctx)
 {
        struct nouveau_context *nmesa = NOUVEAU_CONTEXT(ctx);
 
@@ -742,23 +739,23 @@ static void nv30RenderStart(GLcontext *ctx)
        }
 
        if (nmesa->newRenderState) {
-               nv30ChooseVertexState(ctx);
-               nv30ChooseRenderState(ctx);
+               nv20ChooseVertexState(ctx);
+               nv20ChooseRenderState(ctx);
                nmesa->newRenderState = 0;
        }
 }
 
-static void nv30RenderFinish(GLcontext *ctx)
+static void nv20RenderFinish(GLcontext *ctx)
 {
        struct nouveau_context *nmesa = NOUVEAU_CONTEXT(ctx);
-       nv30FinishPrimitive(nmesa);
+       nv20FinishPrimitive(nmesa);
 }
 
 
 /* System to flush dma and emit state changes based on the rasterized
  * primitive.
  */
-void nv30RasterPrimitive(GLcontext *ctx,
+void nv20RasterPrimitive(GLcontext *ctx,
                GLenum glprim,
                GLuint hwprim)
 {
@@ -775,9 +772,9 @@ void nv30RasterPrimitive(GLcontext *ctx,
 
 /* Callback for mesa:
  */
-static void nv30RenderPrimitive( GLcontext *ctx, GLuint prim )
+static void nv20RenderPrimitive( GLcontext *ctx, GLuint prim )
 {
-       nv30RasterPrimitive( ctx, prim, hw_prim[prim] );
+       nv20RasterPrimitive( ctx, prim, hw_prim[prim] );
 }
 
 
@@ -799,9 +796,9 @@ void nouveauInitTriFuncs(GLcontext *ctx)
        }
 
        tnl->Driver.RunPipeline = nouveauRunPipeline;
-       tnl->Driver.Render.Start = nv30RenderStart;
-       tnl->Driver.Render.Finish = nv30RenderFinish;
-       tnl->Driver.Render.PrimitiveNotify = nv30RenderPrimitive;
+       tnl->Driver.Render.Start = nv20RenderStart;
+       tnl->Driver.Render.Finish = nv20RenderFinish;
+       tnl->Driver.Render.PrimitiveNotify = nv20RenderPrimitive;
        tnl->Driver.Render.ResetLineStipple = nouveauResetLineStipple;
        tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
        tnl->Driver.Render.CopyPV = _tnl_copy_pv;
similarity index 87%
rename from src/mesa/drivers/dri/nouveau/nv30_tris.h
rename to src/mesa/drivers/dri/nouveau/nv20_swtcl.h
index 680b578..ed589d8 100644 (file)
@@ -26,14 +26,14 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
 
-#ifndef __NV30_TRIS_H__
-#define __NV30_TRIS_H__
+#ifndef __NV20_SWTCL_H__
+#define __NV20_SWTCL_H__
 
 #include "mtypes.h"
 
-extern void nv30TriInitFunctions( GLcontext *ctx );
-extern void nv30Fallback( GLcontext *ctx, GLuint bit, GLboolean mode );
+extern void nv20TriInitFunctions( GLcontext *ctx );
+extern void nv20Fallback( GLcontext *ctx, GLuint bit, GLboolean mode );
 #define FALLBACK( nmesa, bit, mode ) nouveauFallback( nmesa->glCtx, bit, mode )
 
-#endif /* __NV30_TRIS_H__ */
+#endif /* __NV20_SWTCL_H__ */