mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-30 22:20:27 +01:00
swrast: fix multiple color buffer writing
If a fragment program wrote to more than one color buffer, the
first fragment color got replicated to all dest buffers. This
fixes 5 piglit FBO tests, including fbo-drawbuffers-arbfp.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45348
Cc: "10.4, 10.5" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
(cherry picked from commit 89c96afe3c)
This commit is contained in:
parent
afe00ddc20
commit
d7fe0d9ce7
1 changed files with 14 additions and 11 deletions
|
|
@ -933,19 +933,19 @@ clamp_colors(SWspan *span)
|
|||
* \param output which fragment program color output is being processed
|
||||
*/
|
||||
static inline void
|
||||
convert_color_type(SWspan *span, GLenum newType, GLuint output)
|
||||
convert_color_type(SWspan *span, GLenum srcType, GLenum newType, GLuint output)
|
||||
{
|
||||
GLvoid *src, *dst;
|
||||
|
||||
if (output > 0 || span->array->ChanType == GL_FLOAT) {
|
||||
if (output > 0 || srcType == GL_FLOAT) {
|
||||
src = span->array->attribs[VARYING_SLOT_COL0 + output];
|
||||
span->array->ChanType = GL_FLOAT;
|
||||
}
|
||||
else if (span->array->ChanType == GL_UNSIGNED_BYTE) {
|
||||
else if (srcType == GL_UNSIGNED_BYTE) {
|
||||
src = span->array->rgba8;
|
||||
}
|
||||
else {
|
||||
ASSERT(span->array->ChanType == GL_UNSIGNED_SHORT);
|
||||
ASSERT(srcType == GL_UNSIGNED_SHORT);
|
||||
src = span->array->rgba16;
|
||||
}
|
||||
|
||||
|
|
@ -979,7 +979,7 @@ shade_texture_span(struct gl_context *ctx, SWspan *span)
|
|||
ctx->ATIFragmentShader._Enabled) {
|
||||
/* programmable shading */
|
||||
if (span->primitive == GL_BITMAP && span->array->ChanType != GL_FLOAT) {
|
||||
convert_color_type(span, GL_FLOAT, 0);
|
||||
convert_color_type(span, span->array->ChanType, GL_FLOAT, 0);
|
||||
}
|
||||
else {
|
||||
span->array->rgba = (void *) span->array->attribs[VARYING_SLOT_COL0];
|
||||
|
|
@ -1314,6 +1314,8 @@ _swrast_write_rgba_span( struct gl_context *ctx, SWspan *span)
|
|||
const GLboolean multiFragOutputs =
|
||||
_swrast_use_fragment_program(ctx)
|
||||
&& fp->Base.OutputsWritten >= (1 << FRAG_RESULT_DATA0);
|
||||
/* Save srcColorType because convert_color_type() can change it */
|
||||
const GLenum srcColorType = span->array->ChanType;
|
||||
GLuint buf;
|
||||
|
||||
for (buf = 0; buf < numBuffers; buf++) {
|
||||
|
|
@ -1325,17 +1327,18 @@ _swrast_write_rgba_span( struct gl_context *ctx, SWspan *span)
|
|||
/* re-use one of the attribute array buffers for rgbaSave */
|
||||
GLchan (*rgbaSave)[4] = (GLchan (*)[4]) span->array->attribs[0];
|
||||
struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
|
||||
GLenum colorType = srb->ColorType;
|
||||
const GLenum dstColorType = srb->ColorType;
|
||||
|
||||
assert(colorType == GL_UNSIGNED_BYTE ||
|
||||
colorType == GL_FLOAT);
|
||||
assert(dstColorType == GL_UNSIGNED_BYTE ||
|
||||
dstColorType == GL_FLOAT);
|
||||
|
||||
/* set span->array->rgba to colors for renderbuffer's datatype */
|
||||
if (span->array->ChanType != colorType) {
|
||||
convert_color_type(span, colorType, 0);
|
||||
if (srcColorType != dstColorType) {
|
||||
convert_color_type(span, srcColorType, dstColorType,
|
||||
multiFragOutputs ? buf : 0);
|
||||
}
|
||||
else {
|
||||
if (span->array->ChanType == GL_UNSIGNED_BYTE) {
|
||||
if (srcColorType == GL_UNSIGNED_BYTE) {
|
||||
span->array->rgba = span->array->rgba8;
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue