Clamp unsigned floating-point formats.
GL_R11F_G11F_B10F is a renderable format (in the EXT_color_buffer_float
extension) with unsigned floating-point values, which we implement using
(signed) half- or single-precision floating-point types. So we need to
clamp values to a positive range before writing to them.
Change-Id: Ic21a5b0b33905c0aeab35299fc268158f8c679f9
Reviewed-on: https://swiftshader-review.googlesource.com/15448
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Shader/PixelRoutine.cpp b/src/Shader/PixelRoutine.cpp
index a5b6f56..1c300b0 100644
--- a/src/Shader/PixelRoutine.cpp
+++ b/src/Shader/PixelRoutine.cpp
@@ -2080,6 +2080,7 @@
break;
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
+ case FORMAT_X32B32G32R32F_UNSIGNED:
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
buffer = cBuffer;
@@ -2089,7 +2090,8 @@
pixel.z = *Pointer<Float4>(buffer + 16 * x, 16);
pixel.w = *Pointer<Float4>(buffer + 16 * x + 16, 16);
transpose4x4(pixel.x, pixel.y, pixel.z, pixel.w);
- if(state.targetFormat[index] == FORMAT_X32B32G32R32F)
+ if(state.targetFormat[index] == FORMAT_X32B32G32R32F ||
+ state.targetFormat[index] == FORMAT_X32B32G32R32F_UNSIGNED)
{
pixel.w = Float4(1.0f);
}
@@ -2241,6 +2243,7 @@
break;
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
+ case FORMAT_X32B32G32R32F_UNSIGNED:
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
case FORMAT_A16B16G16R16I:
@@ -2494,6 +2497,7 @@
break;
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
+ case FORMAT_X32B32G32R32F_UNSIGNED:
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
buffer = cBuffer + 16 * x;