osmesa: use swrast_renderbuffer
authorBrian Paul <brianp@vmware.com>
Mon, 16 Jan 2012 20:01:35 +0000 (13:01 -0700)
committerBrian Paul <brianp@vmware.com>
Tue, 24 Jan 2012 21:12:32 +0000 (14:12 -0700)
src/mesa/drivers/osmesa/osmesa.c

index 1c4f52b7cd2311898ebf21c5c9340dc06df48227..0a42741418594c932fa134cab70f736dbe3ca0e7 100644 (file)
@@ -67,7 +67,7 @@ struct osmesa_context
 {
    struct gl_context mesa;             /*< Base class - this must be first */
    struct gl_config *gl_visual;                /*< Describes the buffers */
-   struct gl_renderbuffer *rb;  /*< The user's colorbuffer */
+   struct swrast_renderbuffer *srb;     /*< The user's colorbuffer */
    struct gl_framebuffer *gl_buffer;   /*< The framebuffer, containing user's rb */
    GLenum format;              /*< User-specified context format */
    GLint userRowLength;                /*< user-specified number of pixels per row */
@@ -354,16 +354,16 @@ static void
 compute_row_addresses( OSMesaContext osmesa )
 {
    GLint bytesPerRow, i;
-   GLubyte *origin = (GLubyte *) osmesa->rb->Buffer;
+   GLubyte *origin = (GLubyte *) osmesa->srb->Buffer;
    GLint rowlength; /* in pixels */
-   GLint height = osmesa->rb->Height;
+   GLint height = osmesa->srb->Base.Height;
 
    if (osmesa->userRowLength)
       rowlength = osmesa->userRowLength;
    else
-      rowlength = osmesa->rb->Width;
+      rowlength = osmesa->srb->Base.Width;
 
-   bytesPerRow = rowlength * _mesa_get_format_bytes(osmesa->rb->Format);
+   bytesPerRow = rowlength * _mesa_get_format_bytes(osmesa->srb->Base.Format);
 
    if (osmesa->yup) {
       /* Y=0 is bottom line of window */
@@ -505,21 +505,25 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
 /**
  * Allocate a new renderbuffer to describe the user-provided color buffer.
  */
-static struct gl_renderbuffer *
+static struct swrast_renderbuffer *
 new_osmesa_renderbuffer(struct gl_context *ctx, GLenum format, GLenum type)
 {
    const GLuint name = 0;
-   struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name);
-   if (rb) {
-      rb->RefCount = 1;
-      rb->Delete = osmesa_delete_renderbuffer;
-      rb->AllocStorage = osmesa_renderbuffer_storage;
-      rb->ClassID = OSMESA_RENDERBUFFER_CLASS;
-
-      rb->InternalFormat = GL_RGBA;
-      rb->_BaseFormat = GL_RGBA;
+   struct swrast_renderbuffer *srb = CALLOC_STRUCT(swrast_renderbuffer);
+
+   if (srb) {
+      _mesa_init_renderbuffer(&srb->Base, name);
+
+      srb->Base.ClassID = OSMESA_RENDERBUFFER_CLASS;
+      srb->Base.Delete = osmesa_delete_renderbuffer;
+      srb->Base.AllocStorage = osmesa_renderbuffer_storage;
+
+      srb->Base.InternalFormat = GL_RGBA;
+      srb->Base._BaseFormat = GL_RGBA;
+
+      return srb;
    }
-   return rb;
+   return NULL;
 }
 
 
@@ -535,6 +539,7 @@ osmesa_MapRenderbuffer(struct gl_context *ctx,
 
    if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) {
       /* this is an OSMesa renderbuffer which wraps user memory */
+      struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
       const GLuint bpp = _mesa_get_format_bytes(rb->Format);
       GLint rowStride; /* in bytes */
 
@@ -552,7 +557,7 @@ osmesa_MapRenderbuffer(struct gl_context *ctx,
          *rowStrideOut = rowStride;
       }
 
-      *mapOut = (GLubyte *) rb->Data + y * rowStride + x * bpp;
+      *mapOut = (GLubyte *) srb->Buffer + y * rowStride + x * bpp;
    }
    else {
       _swrast_map_soft_renderbuffer(ctx, rb, x, y, w, h, mode,
@@ -795,8 +800,8 @@ GLAPI void GLAPIENTRY
 OSMesaDestroyContext( OSMesaContext osmesa )
 {
    if (osmesa) {
-      if (osmesa->rb)
-         _mesa_reference_renderbuffer(&osmesa->rb, NULL);
+      if (osmesa->srb)
+         _mesa_reference_renderbuffer((struct gl_renderbuffer **) &osmesa->srb, NULL);
 
       _mesa_meta_free( &osmesa->mesa );
 
@@ -879,11 +884,12 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type,
     * that converts rendering from CHAN_BITS to the user-requested channel
     * size.
     */
-   if (!osmesa->rb) {
-      osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type);
+   if (!osmesa->srb) {
+      osmesa->srb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type);
       _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT);
-      _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb);
-      assert(osmesa->rb->RefCount == 2);
+      _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT,
+                             &osmesa->srb->Base);
+      assert(osmesa->srb->Base.RefCount == 2);
    }
 
    osmesa->DataType = type;
@@ -891,8 +897,8 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type,
    /* Set renderbuffer fields.  Set width/height = 0 to force 
     * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer()
     */
-   osmesa->rb->Buffer = buffer;
-   osmesa->rb->Width = osmesa->rb->Height = 0;
+   osmesa->srb->Buffer = buffer;
+   osmesa->srb->Base.Width = osmesa->srb->Base.Height = 0;
 
    /* Set the framebuffer's size.  This causes the
     * osmesa_renderbuffer_storage() function to get called.
@@ -906,7 +912,8 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type,
     * renderbuffer adaptor/wrapper if needed (for bpp conversion).
     */
    _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT);
-   _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb);
+   _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT,
+                          &osmesa->srb->Base);
 
 
    /* this updates the visual's red/green/blue/alphaBits fields */
@@ -981,12 +988,7 @@ OSMesaGetIntegerv( GLint pname, GLint *value )
          return;
       case OSMESA_TYPE:
          /* current color buffer's data type */
-         if (osmesa->rb) {
-            *value = osmesa->DataType;
-         }
-         else {
-            *value = 0;
-         }
+         *value = osmesa->DataType;
          return;
       case OSMESA_ROW_LENGTH:
          *value = osmesa->userRowLength;
@@ -1019,12 +1021,13 @@ GLAPI GLboolean GLAPIENTRY
 OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
                       GLint *bytesPerValue, void **buffer )
 {
-   struct gl_renderbuffer *rb = NULL;
+   struct swrast_renderbuffer *srb = NULL;
 
    if (c->gl_buffer)
-      rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer;
+      srb = swrast_renderbuffer(c->gl_buffer->
+                                Attachment[BUFFER_DEPTH].Renderbuffer);
 
-   if (!rb || !rb->Buffer) {
+   if (!srb || !srb->Buffer) {
       *width = 0;
       *height = 0;
       *bytesPerValue = 0;
@@ -1032,13 +1035,13 @@ OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
       return GL_FALSE;
    }
    else {
-      *width = rb->Width;
-      *height = rb->Height;
+      *width = srb->Base.Width;
+      *height = srb->Base.Height;
       if (c->gl_visual->depthBits <= 16)
          *bytesPerValue = sizeof(GLushort);
       else
          *bytesPerValue = sizeof(GLuint);
-      *buffer = (void *) rb->Buffer;
+      *buffer = (void *) srb->Buffer;
       return GL_TRUE;
    }
 }
@@ -1056,11 +1059,11 @@ GLAPI GLboolean GLAPIENTRY
 OSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width,
                       GLint *height, GLint *format, void **buffer )
 {
-   if (osmesa->rb && osmesa->rb->Buffer) {
-      *width = osmesa->rb->Width;
-      *height = osmesa->rb->Height;
+   if (osmesa->srb && osmesa->srb->Buffer) {
+      *width = osmesa->srb->Base.Width;
+      *height = osmesa->srb->Base.Height;
       *format = osmesa->format;
-      *buffer = (void *) osmesa->rb->Buffer;
+      *buffer = (void *) osmesa->srb->Buffer;
       return GL_TRUE;
    }
    else {