nouveau: Modify span routines to use nouveau_renderbuffer instead of driRenderbuffer
authorBen Skeggs <darktama@iinet.net.au>
Sat, 23 Dec 2006 13:13:34 +0000 (00:13 +1100)
committerBen Skeggs <darktama@iinet.net.au>
Sat, 23 Dec 2006 13:13:34 +0000 (00:13 +1100)
src/mesa/drivers/dri/nouveau/nouveau_buffers.c
src/mesa/drivers/dri/nouveau/nouveau_fifo.c
src/mesa/drivers/dri/nouveau/nouveau_span.c

index e3e2a8099e25111f922ce9dc797064d2483ea812..f6a03ecd9cf1f10a0ef2019d6ff4bcdfee5da8cf 100644 (file)
@@ -288,6 +288,12 @@ nouveau_build_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
    return GL_TRUE;
 }
 
+static void
+nouveauDrawBuffer(GLcontext *ctx, GLenum buffer)
+{
+   nouveau_build_framebuffer(ctx, ctx->DrawBuffer);
+}
+
 static struct gl_framebuffer *
 nouveauNewFramebuffer(GLcontext *ctx, GLuint name)
 {
@@ -341,6 +347,8 @@ nouveauFinishRenderTexture(GLcontext *ctx,
 void
 nouveauInitBufferFuncs(struct dd_function_table *func)
 {
+   func->DrawBuffer             = nouveauDrawBuffer;
+
    func->NewFramebuffer                 = nouveauNewFramebuffer;
    func->NewRenderbuffer        = nouveauNewRenderbuffer;
    func->BindFramebuffer        = nouveauBindFramebuffer;
index 0b745e1e74076dd1be02846106c4d951a29d9d11..fcfc0ebe14c22e0c414d443638515ee66c646175 100644 (file)
@@ -77,6 +77,12 @@ void nouveauWaitForIdleLocked(nouveauContextPtr nmesa)
        FIRE_RING();
        while(RING_AHEAD()>0);
 
+       /* We can't wait on PGRAPH going idle..
+        *  1) We don't have the regs mapped
+        *  2) PGRAPH may not go idle with multiple channels active
+        * Look into replacing this with a NOTIFY/NOP + wait notifier sequence.
+        */
+#if 0
        for(i=0;i<1000000;i++) /* 1 second */
        {
                switch(nmesa->screen->card->type)
@@ -100,6 +106,7 @@ void nouveauWaitForIdleLocked(nouveauContextPtr nmesa)
                        return;
                DO_USLEEP(1);
        }
+#endif
 }
 
 void nouveauWaitForIdle(nouveauContextPtr nmesa)
index 6d99728b852588c42fc19bc8a1b0cc223e4ab9c0..74dec66afcf36c0d2178d4a48bac4a23bb7dafbd 100644 (file)
@@ -37,12 +37,21 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define HAVE_HW_STENCIL_SPANS  0
 #define HAVE_HW_STENCIL_PIXELS 0
 
+#define HW_CLIPLOOP()                                                  \
+   do {                                                                        \
+      int _nc = nmesa->numClipRects;                                   \
+      while ( _nc-- ) {                                                        \
+        int minx = nmesa->pClipRects[_nc].x1 - nmesa->drawX;           \
+        int miny = nmesa->pClipRects[_nc].y1 - nmesa->drawY;           \
+        int maxx = nmesa->pClipRects[_nc].x2 - nmesa->drawX;           \
+        int maxy = nmesa->pClipRects[_nc].y2 - nmesa->drawY;
+
 #define LOCAL_VARS                                                     \
    nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);                     \
-   __DRIscreenPrivate *sPriv = nmesa->driScreen;                       \
-   __DRIdrawablePrivate *dPriv = nmesa->driDrawable;                   \
-   driRenderbuffer *drb = (driRenderbuffer *) rb;                      \
-   GLuint height = dPriv->h;                                           \
+   nouveau_renderbuffer *nrb = (nouveau_renderbuffer *)rb;             \
+   GLuint height = nrb->mesa.Height;                                   \
+   GLubyte *map = (GLubyte *)(nrb->map ? nrb->map : nrb->mem->map) +    \
+        (nmesa->drawY * nrb->pitch) + (nmesa->drawX * nrb->cpp);       \
    GLuint p;                                                           \
    (void) p;
 
@@ -64,8 +73,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define TAG(x)    nouveau##x##_RGB565
 #define TAG2(x,y) nouveau##x##_RGB565##y
-#define GET_PTR(X,Y) (sPriv->pFB + drb->flippedOffset          \
-     + ((dPriv->y + (Y)) * drb->flippedPitch + (dPriv->x + (X))) * drb->cpp)
+#define GET_PTR(X,Y) (map + (Y)*nrb->pitch + (X)*nrb->cpp)
 #include "spantmp2.h"
 
 
@@ -75,8 +83,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define TAG(x)    nouveau##x##_ARGB8888
 #define TAG2(x,y) nouveau##x##_ARGB8888##y
-#define GET_PTR(X,Y) (sPriv->pFB + drb->flippedOffset          \
-     + ((dPriv->y + (Y)) * drb->flippedPitch + (dPriv->x + (X))) * drb->cpp)
+#define GET_PTR(X,Y) (map + (Y)*nrb->pitch + (X)*nrb->cpp)
 #include "spantmp2.h"
 
 static void