OSDN Git Service

Fragment output RG, RGBA 16-bit formats.
authorMeng-Lin Wu <marleymoo@google.com>
Mon, 20 Jun 2016 19:08:42 +0000 (15:08 -0400)
committerMeng-Lin Wu <marleymoo@google.com>
Thu, 30 Jun 2016 15:50:26 +0000 (15:50 +0000)
Relevant dEQP tests:
dEQP-GLES3.functional.fragment_out.basic.int.rg16i*
dEQP-GLES3.functional.fragment_out.basic.uint.rg16ui*
dEQP-GLES3.functional.fragment_out.basic.int.rgba16i*
dEQP-GLES3.functional.fragment_out.basic.uint.rgba16ui*

Change-Id: If57f6edb895c576f78cb4cdf6048c2063d884a6f
Reviewed-on: https://swiftshader-review.googlesource.com/5651
Tested-by: Meng-Lin Wu <marleymoo@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/Shader/PixelRoutine.cpp

index ce2d20f..cc46ab3 100644 (file)
@@ -2387,7 +2387,33 @@ namespace sw
                        break;
                case FORMAT_G16R16I:
                case FORMAT_G16R16UI:
-                       ASSERT(false);
+                       if((rgbaWriteMask & 0x00000003) != 0x0)
+                       {
+                               buffer = cBuffer + 4 * x;
+
+                               UInt2 rgbaMask;
+                               UShort4 packedCol = UShort4(As<Int4>(oC.x));
+                               UShort4 value = *Pointer<UShort4>(buffer);
+                               UInt2 mergedMask = *Pointer<UInt2>(constants + OFFSET(Constants, maskD01Q) + xMask * 8);
+                               if((rgbaWriteMask & 0x3) != 0x3)
+                               {
+                                       Int tmpMask = *Pointer<Int>(constants + OFFSET(Constants, maskW4Q[rgbaWriteMask & 0x3][0]));
+                                       rgbaMask = As<UInt2>(Int2(tmpMask, tmpMask));
+                                       mergedMask &= rgbaMask;
+                               }
+                               *Pointer<UInt2>(buffer) = (As<UInt2>(packedCol) & mergedMask) | (As<UInt2>(value) & ~mergedMask);
+
+                               buffer += *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index]));
+
+                               packedCol = UShort4(As<Int4>(oC.y));
+                               value = *Pointer<UShort4>(buffer);
+                               mergedMask = *Pointer<UInt2>(constants + OFFSET(Constants, maskD23Q) + xMask * 8);
+                               if((rgbaWriteMask & 0x3) != 0x3)
+                               {
+                                       mergedMask &= rgbaMask;
+                               }
+                               *Pointer<UInt2>(buffer) = (As<UInt2>(packedCol) & mergedMask) | (As<UInt2>(value) & ~mergedMask);
+                       }
                        break;
                case FORMAT_G8R8I:
                case FORMAT_G8R8UI:
@@ -2503,7 +2529,33 @@ namespace sw
                        break;
                case FORMAT_A16B16G16R16I:
                case FORMAT_A16B16G16R16UI:
-                       ASSERT(false);
+                       if((rgbaWriteMask & 0x0000000F) != 0x0)
+                       {
+                               buffer = cBuffer + 8 * x;
+
+                               UInt4 rgbaMask;
+                               UShort8 value = *Pointer<UShort8>(buffer);
+                               UShort8 packedCol = UShort8(UShort4(As<Int4>(oC.x)), UShort4(As<Int4>(oC.y)));
+                               UInt4 mergedMask = *Pointer<UInt4>(constants + OFFSET(Constants, maskQ01X) + xMask * 16);
+                               if((rgbaWriteMask & 0xF) != 0xF)
+                               {
+                                       UInt2 tmpMask = *Pointer<UInt2>(constants + OFFSET(Constants, maskW4Q[rgbaWriteMask][0]));
+                                       rgbaMask = UInt4(tmpMask, tmpMask);
+                                       mergedMask &= rgbaMask;
+                               }
+                               *Pointer<UInt4>(buffer) = (As<UInt4>(packedCol) & mergedMask) | (As<UInt4>(value) & ~mergedMask);
+
+                               buffer += *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index]));
+
+                               value = *Pointer<UShort8>(buffer);
+                               packedCol = UShort8(UShort4(As<Int4>(oC.z)), UShort4(As<Int4>(oC.w)));
+                               mergedMask = *Pointer<UInt4>(constants + OFFSET(Constants, maskQ23X) + xMask * 16);
+                               if((rgbaWriteMask & 0xF) != 0xF)
+                               {
+                                       mergedMask &= rgbaMask;
+                               }
+                               *Pointer<UInt4>(buffer) = (As<UInt4>(packedCol) & mergedMask) | (As<UInt4>(value) & ~mergedMask);
+                       }
                        break;
                case FORMAT_A8B8G8R8I:
                case FORMAT_A8B8G8R8UI: