From bd1ae51b13535bc4438c663ffe91ded49db4890a Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 3 Feb 2012 08:17:24 -0700 Subject: swrast: fix span color type selection 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 | 3 +++ src/mesa/swrast/s_renderbuffer.c | 28 ++++++++++++++++++++++++++-- src/mesa/swrast/s_span.c | 14 +++++++------- 3 files changed, 36 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h index 363bdf03ad5..9388c356928 100644 --- a/src/mesa/swrast/s_context.h +++ b/src/mesa/swrast/s_context.h @@ -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; }; diff --git a/src/mesa/swrast/s_renderbuffer.c b/src/mesa/swrast/s_renderbuffer.c index 637a7b6dc1e..d8a7467b08d 100644 --- a/src/mesa/swrast/s_renderbuffer.c +++ b/src/mesa/swrast/s_renderbuffer.c @@ -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]); } } diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c index 422d86c00a7..025e7b2076d 100644 --- a/src/mesa/swrast/s_span.c +++ b/src/mesa/swrast/s_span.c @@ -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) { -- cgit v1.2.3