renderbuffer fixes (Sean D'Epagnier)
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 1 Aug 2006 14:33:05 +0000 (14:33 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 1 Aug 2006 14:33:05 +0000 (14:33 +0000)
src/mesa/drivers/fbdev/glfbdev.c

index eaebc50f8fa7384730c089e76c00900ff7e6b6f5..412c09955f8f6effe950c184f7c277421c8b3df5 100644 (file)
@@ -501,11 +501,13 @@ renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
 
 
 static struct GLFBDevRenderbufferRec *
-new_glfbdev_renderbuffer(void *bufferStart, int pixelFormat)
+new_glfbdev_renderbuffer(void *bufferStart, const GLFBDevVisualPtr visual)
 {
    struct GLFBDevRenderbufferRec *rb = CALLOC_STRUCT(GLFBDevRenderbufferRec);
    if (rb) {
       GLuint name = 0;
+      int pixelFormat = visual->pixelFormat;
+
       _mesa_init_renderbuffer(&rb->Base, name);
 
       rb->Base.Delete = delete_renderbuffer;
@@ -566,6 +568,20 @@ new_glfbdev_renderbuffer(void *bufferStart, int pixelFormat)
       }
       rb->Base.DataType = GL_UNSIGNED_BYTE;
       rb->Base.Data = bufferStart;
+
+      rb->rowStride = visual->var.xres_virtual * visual->var.bits_per_pixel / 8;
+      rb->bottom = (GLubyte *) bufferStart
+         + (visual->var.yres_virtual - 1) * rb->rowStride;
+
+      rb->Base.Width = visual->var.xres;
+      rb->Base.Height = visual->var.yres;
+
+      rb->Base.RedBits = visual->var.red.length;
+      rb->Base.GreenBits = visual->var.green.length;
+      rb->Base.BlueBits = visual->var.blue.length;
+      rb->Base.AlphaBits = visual->var.transp.length;
+
+      rb->Base.InternalFormat = pixelFormat;
    }
    return rb;
 }
@@ -603,12 +619,12 @@ glFBDevCreateBuffer( const struct fb_fix_screeninfo *fixInfo,
    /* basic framebuffer setup */
    _mesa_initialize_framebuffer(&buf->glframebuffer, &visual->glvisual);
    /* add front renderbuffer */
-   frontrb = new_glfbdev_renderbuffer(frontBuffer, visual->pixelFormat);
+   frontrb = new_glfbdev_renderbuffer(frontBuffer, visual);
    _mesa_add_renderbuffer(&buf->glframebuffer, BUFFER_FRONT_LEFT,
                           &frontrb->Base);
    /* add back renderbuffer */
    if (visual->glvisual.doubleBufferMode) {
-      backrb = new_glfbdev_renderbuffer(backBuffer, visual->pixelFormat);
+      backrb = new_glfbdev_renderbuffer(backBuffer, visual);
       _mesa_add_renderbuffer(&buf->glframebuffer, BUFFER_BACK_LEFT,
                              &backrb->Base);
    }
@@ -628,9 +644,6 @@ glFBDevCreateBuffer( const struct fb_fix_screeninfo *fixInfo,
    buf->visual = visual;  /* ptr assignment */
    buf->size = size;
    buf->bytesPerPixel = visual->var.bits_per_pixel / 8;
-   frontrb->rowStride = visual->var.xres_virtual * buf->bytesPerPixel;
-   frontrb->bottom = (GLubyte *) frontrb->Base.Data
-      + (visual->var.yres_virtual - 1) * frontrb->rowStride;
 
    if (visual->glvisual.doubleBufferMode) {
       if (!backBuffer) {
@@ -643,14 +656,12 @@ glFBDevCreateBuffer( const struct fb_fix_screeninfo *fixInfo,
          }
          backrb->mallocedBuffer = GL_TRUE;
       }
-      backrb->rowStride = frontrb->rowStride;
-      backrb->bottom = (GLubyte *) backrb->Base.Data
-         + (visual->var.yres_virtual - 1) * backrb->rowStride;
    }
+   /* this causes segfault:
    else {
       backrb->bottom = NULL;
       backrb->rowStride = 0;
-   }
+      }*/
 
    return buf;
 }