OSDN Git Service

Fix scaling of float color to RGB565.
authorNicolas Capens <capn@google.com>
Tue, 5 Apr 2016 14:51:45 +0000 (10:51 -0400)
committerNicolas Capens <capn@google.com>
Tue, 5 Apr 2016 23:39:40 +0000 (23:39 +0000)
The scaling factors ensure that the components are rounded correctly even after
alpha blending, which may multiply colors by colors.

Bug 24332884

Change-Id: Ib75602e89996b2fd1a319a132a681295fb2a18a6
Reviewed-on: https://swiftshader-review.googlesource.com/5048
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/Shader/PixelProgram.cpp

index 6eca4eb..7065330 100644 (file)
@@ -584,10 +584,20 @@ namespace sw
                                        Pointer<Byte> buffer = cBuffer[index] + q * *Pointer<Int>(data + OFFSET(DrawData, colorSliceB[index]));
                                        Vector4s color;
 
-                                       color.x = convertFixed16(c[index].x, false);
-                                       color.y = convertFixed16(c[index].y, false);
-                                       color.z = convertFixed16(c[index].z, false);
-                                       color.w = convertFixed16(c[index].w, false);
+                                       if(state.targetFormat[index] == FORMAT_R5G6B5)
+                                       {
+                                               color.x = UShort4(c[index].x * Float4(0xFBFF), false);
+                                               color.y = UShort4(c[index].y * Float4(0xFDFF), false);
+                                               color.z = UShort4(c[index].z * Float4(0xFBFF), false);
+                                               color.w = UShort4(c[index].w * Float4(0xFFFF), false);
+                                       }
+                                       else
+                                       {
+                                               color.x = convertFixed16(c[index].x, false);
+                                               color.y = convertFixed16(c[index].y, false);
+                                               color.z = convertFixed16(c[index].z, false);
+                                               color.w = convertFixed16(c[index].w, false);
+                                       }
 
                                        if(state.multiSampleMask & (1 << q))
                                        {