Implement support for RGBA blitting. Change-Id: I1ad9fed9aea34cd20f8d78f4d4469c61aeb00ea6 Reviewed-on: https://swiftshader-review.googlesource.com/2753 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp index 6b893fc..53bd7cc 100644 --- a/src/Renderer/Blitter.cpp +++ b/src/Renderer/Blitter.cpp
@@ -39,15 +39,15 @@ bool flipX = destRect.x0 > destRect.x1; bool flipY = destRect.y0 > destRect.y1; - if(flipX) - { - swap(dRect.x0, dRect.x1); - swap(sRect.x0, sRect.x1); - } - if(flipY) - { - swap(dRect.y0, dRect.y1); - swap(sRect.y0, sRect.y1); + if(flipX) + { + swap(dRect.x0, dRect.x1); + swap(sRect.x0, sRect.x1); + } + if(flipY) + { + swap(dRect.y0, dRect.y1); + swap(sRect.y0, sRect.y1); } source->lockInternal(sRect.x0, sRect.y0, sRect.slice, sw::LOCK_READONLY, sw::PUBLIC); @@ -104,10 +104,17 @@ case FORMAT_A8R8G8B8: c = Float4(*Pointer<Byte4>(element)).zyxw; break; + case FORMAT_A8B8G8R8: + c = Float4(*Pointer<Byte4>(element)); + break; case FORMAT_X8R8G8B8: c = Float4(*Pointer<Byte4>(element)).zyxw; c.w = 1.0f; break; + case FORMAT_X8B8G8R8: + c = Float4(*Pointer<Byte4>(element)); + c.w = 1.0f; + break; case FORMAT_A16B16G16R16: c = Float4(*Pointer<UShort4>(element)); break; @@ -137,15 +144,15 @@ { Rect dRect = destRect; Rect sRect = sourceRect; - if(destRect.x0 > destRect.x1) - { - swap(dRect.x0, dRect.x1); - swap(sRect.x0, sRect.x1); - } - if(destRect.y0 > destRect.y1) - { - swap(dRect.y0, dRect.y1); - swap(sRect.y0, sRect.y1); + if(destRect.x0 > destRect.x1) + { + swap(dRect.x0, dRect.x1); + swap(sRect.x0, sRect.x1); + } + if(destRect.y0 > destRect.y1) + { + swap(dRect.y0, dRect.y1); + swap(sRect.y0, sRect.y1); } BlitState state; @@ -240,7 +247,9 @@ case FORMAT_L8: case FORMAT_A8: case FORMAT_A8R8G8B8: + case FORMAT_A8B8G8R8: case FORMAT_X8R8G8B8: + case FORMAT_X8B8G8R8: unscale = vector(255, 255, 255, 255); break; case FORMAT_A16B16G16R16: @@ -263,7 +272,9 @@ case FORMAT_L8: case FORMAT_A8: case FORMAT_A8R8G8B8: + case FORMAT_A8B8G8R8: case FORMAT_X8R8G8B8: + case FORMAT_X8B8G8R8: scale = vector(255, 255, 255, 255); break; case FORMAT_A16B16G16R16: @@ -311,6 +322,13 @@ *Pointer<UInt>(d) = UInt(As<Long>(c1)); } break; + case FORMAT_A8B8G8R8: + { + UShort4 c0 = As<UShort4>(RoundShort4(color)); + Byte8 c1 = Pack(c0, c0); + *Pointer<UInt>(d) = UInt(As<Long>(c1)); + } + break; case FORMAT_X8R8G8B8: { UShort4 c0 = As<UShort4>(RoundShort4(color.zyxw)); @@ -318,6 +336,13 @@ *Pointer<UInt>(d) = UInt(As<Long>(c1)) | 0xFF000000; } break; + case FORMAT_X8B8G8R8: + { + UShort4 c0 = As<UShort4>(RoundShort4(color)); + Byte8 c1 = Pack(c0, c0); + *Pointer<UInt>(d) = UInt(As<Long>(c1)) | 0xFF000000; + } + break; case FORMAT_A16B16G16R16: *Pointer<UShort4>(d) = UShort4(RoundInt(color)); break;