swrast: fix span color type selection
Fixes a regression from commit 660ed923de.
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
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user