nouveau: Always render offscreen, emulate front buffer rendering.
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_screen.c
index 881b20149f0011f7dbcbe6d18132ce671f2c4382..065aa81746c96127ecf07af37d0c00f8ba87a785 100644 (file)
@@ -132,10 +132,11 @@ nouveauCreateBuffer(__DRIscreenPrivate *driScrnPriv,
                     GLboolean isPixmap)
 {
        nouveauScreenPtr screen = (nouveauScreenPtr) driScrnPriv->private;
-       nouveau_renderbuffer  *nrb;
+       nouveau_renderbuffer_t *nrb;
        struct gl_framebuffer *fb;
        const GLboolean swAccum = mesaVis->accumRedBits > 0;
-       const GLboolean swStencil = mesaVis->stencilBits > 0 && mesaVis->depthBits != 24;
+       const GLboolean swStencil = (mesaVis->stencilBits > 0 &&
+                                    mesaVis->depthBits != 24);
        GLenum color_format = screen->fbFormat == 4 ? GL_RGBA8 : GL_RGB5;
 
        if (isPixmap)
@@ -146,44 +147,26 @@ nouveauCreateBuffer(__DRIscreenPrivate *driScrnPriv,
                return GL_FALSE;
 
        /* Front buffer */
-       nrb = nouveau_renderbuffer_new(color_format,
-                                      driScrnPriv->pFB + screen->frontOffset,
-                                      screen->frontOffset,
-                                      screen->frontPitch * screen->fbFormat,
-                                      driDrawPriv);
-       nouveauSpanSetFunctions(nrb, mesaVis);
+       nrb = nouveau_renderbuffer_new(color_format);
        _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &nrb->mesa);
 
-       if (0 /* unified buffers if we choose to support them.. */) {
-       } else {
-               if (mesaVis->doubleBufferMode) {
-                       nrb = nouveau_renderbuffer_new(color_format, NULL,
-                                                      0, 0,
-                                                      NULL);
-                       nouveauSpanSetFunctions(nrb, mesaVis);
-                       _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &nrb->mesa);
-               }
+       if (mesaVis->doubleBufferMode) {
+               nrb = nouveau_renderbuffer_new(color_format);
+               _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &nrb->mesa);
+       }
 
-               if (mesaVis->depthBits == 24 && mesaVis->stencilBits == 8) {
-                       nrb = nouveau_renderbuffer_new(GL_DEPTH24_STENCIL8_EXT, NULL,
-                                                      0, 0,
-                                                      NULL);
-                       nouveauSpanSetFunctions(nrb, mesaVis);
-                       _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &nrb->mesa);
-                       _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &nrb->mesa);
-               } else if (mesaVis->depthBits == 24) {
-                       nrb = nouveau_renderbuffer_new(GL_DEPTH_COMPONENT24, NULL,
-                                                      0, 0,
-                                                      NULL);
-                       nouveauSpanSetFunctions(nrb, mesaVis);
-                       _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &nrb->mesa);
-               } else if (mesaVis->depthBits == 16) {
-                       nrb = nouveau_renderbuffer_new(GL_DEPTH_COMPONENT16, NULL,
-                                                      0, 0,
-                                                      NULL);
-                       nouveauSpanSetFunctions(nrb, mesaVis);
-                       _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &nrb->mesa);
-               }
+       if (mesaVis->depthBits == 24 && mesaVis->stencilBits == 8) {
+               nrb = nouveau_renderbuffer_new(GL_DEPTH24_STENCIL8_EXT);
+               _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &nrb->mesa);
+               _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &nrb->mesa);
+       } else
+       if (mesaVis->depthBits == 24) {
+               nrb = nouveau_renderbuffer_new(GL_DEPTH_COMPONENT24);
+               _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &nrb->mesa);
+       } else
+       if (mesaVis->depthBits == 16) {
+               nrb = nouveau_renderbuffer_new(GL_DEPTH_COMPONENT16);
+               _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &nrb->mesa);
        }
 
        _mesa_add_soft_renderbuffers(fb,
@@ -202,7 +185,7 @@ nouveauCreateBuffer(__DRIscreenPrivate *driScrnPriv,
 static void
 nouveauDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
 {
-       _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate));
+       _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
 }
 
 static int
@@ -327,8 +310,10 @@ void * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn, __DRIsc
        __DRIscreenPrivate *psp;
        static const __DRIversion ddx_expected = { 1, 2, 0 };
        static const __DRIversion dri_expected = { 4, 0, 0 };
-       static const __DRIversion drm_expected = { 0, 0, 3 };
-
+       static const __DRIversion drm_expected = { 0, 0, NOUVEAU_DRM_HEADER_PATCHLEVEL };
+#if NOUVEAU_DRM_HEADER_PATCHLEVEL != 10
+#error nouveau_drm.h version doesn't match expected version
+#endif
        dri_interface = interface;
 
        if (!driCheckDriDdxDrmVersions2("nouveau",