Commit 7a473b78 by Nicolas Capens Committed by Nicolas Capens

Fix rendering to single-channel color buffers.

Render targets with only a red or alpha component were getting swapped values within pixel quads at the edge of primitives. Also provide format mappings for GL_EXT_texture_rg. Change-Id: Ifb395039fb2958400ab36d5d184d7952d60fa9c6 Reviewed-on: https://swiftshader-review.googlesource.com/13268Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 57eb063d
...@@ -489,6 +489,26 @@ namespace egl ...@@ -489,6 +489,26 @@ namespace egl
default: UNREACHABLE(type); default: UNREACHABLE(type);
} }
break; break;
case GL_RG:
switch(type)
{
case GL_UNSIGNED_BYTE: return sw::FORMAT_G8R8;
case GL_HALF_FLOAT: return sw::FORMAT_G16R16F;
case GL_HALF_FLOAT_OES: return sw::FORMAT_G16R16F;
case GL_FLOAT: return sw::FORMAT_G32R32F;
default: UNREACHABLE(type);
}
break;
case GL_RED:
switch(type)
{
case GL_UNSIGNED_BYTE: return sw::FORMAT_R8;
case GL_HALF_FLOAT: return sw::FORMAT_R16F;
case GL_HALF_FLOAT_OES: return sw::FORMAT_R16F;
case GL_FLOAT: return sw::FORMAT_R32F;
default: UNREACHABLE(type);
}
break;
case GL_ALPHA: case GL_ALPHA:
switch(type) switch(type)
{ {
......
...@@ -1071,6 +1071,16 @@ namespace sw ...@@ -1071,6 +1071,16 @@ namespace sw
pixel.y = Short4(0x0000); pixel.y = Short4(0x0000);
pixel.z = Short4(0x0000); pixel.z = Short4(0x0000);
break; break;
case FORMAT_R8:
buffer = cBuffer + 1 * x;
pixel.x = Insert(pixel.x, *Pointer<Short>(buffer), 0);
buffer += *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index]));
pixel.x = Insert(pixel.x, *Pointer<Short>(buffer), 1);
pixel.x = UnpackLow(As<Byte8>(pixel.x), As<Byte8>(pixel.x));
pixel.y = Short4(0x0000);
pixel.z = Short4(0x0000);
pixel.w = Short4(0xFFFFu);
break;
case FORMAT_X8R8G8B8: case FORMAT_X8R8G8B8:
buffer = cBuffer + 4 * x; buffer = cBuffer + 4 * x;
c01 = *Pointer<Short4>(buffer); c01 = *Pointer<Short4>(buffer);
...@@ -1753,7 +1763,6 @@ namespace sw ...@@ -1753,7 +1763,6 @@ namespace sw
value = Insert(value, *Pointer<Short>(buffer), 0); value = Insert(value, *Pointer<Short>(buffer), 0);
Int pitch = *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index])); Int pitch = *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index]));
value = Insert(value, *Pointer<Short>(buffer + pitch), 1); value = Insert(value, *Pointer<Short>(buffer + pitch), 1);
value = UnpackLow(As<Byte8>(value), As<Byte8>(value));
current.x &= *Pointer<Short4>(constants + OFFSET(Constants, maskB4Q) + 8 * xMask); current.x &= *Pointer<Short4>(constants + OFFSET(Constants, maskB4Q) + 8 * xMask);
value &= *Pointer<Short4>(constants + OFFSET(Constants, invMaskB4Q) + 8 * xMask); value &= *Pointer<Short4>(constants + OFFSET(Constants, invMaskB4Q) + 8 * xMask);
...@@ -1771,7 +1780,6 @@ namespace sw ...@@ -1771,7 +1780,6 @@ namespace sw
value = Insert(value, *Pointer<Short>(buffer), 0); value = Insert(value, *Pointer<Short>(buffer), 0);
Int pitch = *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index])); Int pitch = *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = Insert(value, *Pointer<Short>(buffer + pitch), 1); value = Insert(value, *Pointer<Short>(buffer + pitch), 1);
value = UnpackLow(As<Byte8>(value), As<Byte8>(value));
current.w &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q) + 8 * xMask); current.w &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q) + 8 * xMask);
value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q) + 8 * xMask); value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q) + 8 * xMask);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment