swrast: fix span color type selection
authorBrian Paul <brianp@vmware.com>
Fri, 3 Feb 2012 15:17:24 +0000 (08:17 -0700)
committerBrian Paul <brianp@vmware.com>
Sun, 12 Feb 2012 18:22:31 +0000 (11:22 -0700)
Fixes a regression from commit 660ed923ded3552e023ef8c3dd9f92e6792f1bd2.
The basic idea is to look at the format of the dest renderbuffer and
choose either GLubyte or GLfloat for colors.  The previous code used
_mesa_format_to_type_and_comps() which could return a bunch types other
than ubyte/float.

Determine the datatype at renderbuffer mapping time to avoid frequent
calls to the format query functions.

NOTE: This is a candidate for the 8.0 branch.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45578
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45577

src/mesa/swrast/s_context.h
src/mesa/swrast/s_renderbuffer.c
src/mesa/swrast/s_span.c

index 363bdf03ad5b906711bba61d70d4e7eb3ad823fa..9388c356928bafd6d0895424d29626dcfd00a1cb 100644 (file)
@@ -176,6 +176,9 @@ struct swrast_renderbuffer
    /** These fields are only valid while buffer is mapped for rendering */
    GLubyte *Map;
    GLint RowStride;    /**< in bytes */
+
+   /** For span rendering */
+   GLenum ColorType;
 };
 
 
index 637a7b6dc1e3e8461e97f05940ccf0db249e01e8..d8a7467b08daaae40ca919876daa5a88c357fac0 100644 (file)
@@ -615,8 +615,31 @@ unmap_attachment(struct gl_context *ctx,
 
    srb->Map = NULL;
 }
+
+
+/**
+ * Determine what type to use (ubyte vs. float) for span colors for the
+ * given renderbuffer.
+ * See also _swrast_write_rgba_span().
+ */
+static void
+find_renderbuffer_colortype(struct gl_renderbuffer *rb)
+{
+   struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
+   GLuint rbMaxBits = _mesa_get_format_max_bits(rb->Format);
+   GLenum rbDatatype = _mesa_get_format_datatype(rb->Format);
+
+   if (rbDatatype == GL_UNSIGNED_NORMALIZED && rbMaxBits <= 8) {
+      /* the buffer's values fit in GLubyte values */
+      srb->ColorType = GL_UNSIGNED_BYTE;
+   }
+   else {
+      /* use floats otherwise */
+      srb->ColorType = GL_FLOAT;
+   }
+}
+
+
 /**
  * Map the renderbuffers we'll use for tri/line/point rendering.
  */
@@ -641,6 +664,7 @@ _swrast_map_renderbuffers(struct gl_context *ctx)
 
    for (buf = 0; buf < fb->_NumColorDrawBuffers; buf++) {
       map_attachment(ctx, fb, fb->_ColorDrawBufferIndexes[buf]);
+      find_renderbuffer_colortype(fb->_ColorDrawBuffers[buf]);
    }
 }
  
index 422d86c00a719fa017702e961722cc30294789db..025e7b2076df2d339d7c4e32620e527479d4d0b1 100644 (file)
@@ -1320,15 +1320,15 @@ _swrast_write_rgba_span( struct gl_context *ctx, SWspan *span)
 
          if (rb) {
             GLchan rgbaSave[MAX_WIDTH][4];
+            struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
+            GLenum colorType = srb->ColorType;
 
-           GLenum datatype;
-           GLuint comps;
+            assert(colorType == GL_UNSIGNED_BYTE ||
+                   colorType == GL_FLOAT);
 
-           _mesa_format_to_type_and_comps(rb->Format, &datatype, &comps);
-
-            /* set span->array->rgba to colors for render buffer's datatype */
-            if (datatype != span->array->ChanType) {
-               convert_color_type(span, datatype, 0);
+            /* set span->array->rgba to colors for renderbuffer's datatype */
+            if (span->array->ChanType != colorType) {
+               convert_color_type(span, colorType, 0);
             }
             else {
                if (span->array->ChanType == GL_UNSIGNED_BYTE) {