From 7a2bad4efbe62058460494a6e2ce6df26d198450 Mon Sep 17 00:00:00 2001
From: Orphis <orphiss@gmail.com>
Date: Thu, 22 Oct 2009 01:42:21 +0000
Subject: [PATCH] OpenCL: Fixed and enabled CMPR decompression

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4448 8ced0084-cf51-0410-be5f-012b33b47a6e
---
 Data/User/OpenCL/TextureDecoder.cl                    | 11 +++++------
 .../Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp |  1 -
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/Data/User/OpenCL/TextureDecoder.cl b/Data/User/OpenCL/TextureDecoder.cl
index 052865021c..d3691b81cc 100644
--- a/Data/User/OpenCL/TextureDecoder.cl
+++ b/Data/User/OpenCL/TextureDecoder.cl
@@ -175,14 +175,13 @@ kernel void decodeCMPRBlock(global uchar *dst,
           ((color565 >> 8) & 0xF8) | ((color565 >> 13) & 0x7),
             0xFF, 0xFF));
     uint4 colors;
-    uint4 choice = (uint4)((color565.s0 - color565.s1) << 16);
+    //uint4 choice = (uint4)((color565.s0 - color565.s1) << 16);
     uint4 colorNoAlpha;
     //uchar4 frac = (color32.odd - color32.even) / 2;
     //frac = frac - (frac / 4);
     uchar4 frac = convert_uchar4((((convert_ushort4(color32.even) & 0xFF) - (convert_ushort4(color32.odd) & 0xFF)) * 3) / 8);
-    //colorNoAlpha = convert_uint4(frac);
-    colorNoAlpha = convert_uint4(color32.even - frac);
-    colorNoAlpha = (colorNoAlpha << 8) | convert_uint4(color32.odd + frac);
+    colorNoAlpha = convert_uint4(color32.odd + frac);
+    colorNoAlpha = (colorNoAlpha << 8) | convert_uint4(color32.even - frac);
     colorNoAlpha = (colorNoAlpha << 8) | convert_uint4(color32.odd);
     colorNoAlpha = (colorNoAlpha << 8) | convert_uint4(color32.even);
 
@@ -190,7 +189,6 @@ kernel void decodeCMPRBlock(global uchar *dst,
     //uchar4 midpoint = rhadd(color32.odd, color32.even);
     uchar4 midpoint = convert_uchar4((convert_ushort4(color32.odd) + convert_ushort4(color32.even) + 1) / 2);
     midpoint.s3 = 0xFF;
-    //colorAlpha = convert_uint4(color32.odd);
     colorAlpha = convert_uint4((uchar4)(0, 0, 0, 0));
     colorAlpha = (colorAlpha << 8) | convert_uint4(midpoint);    
     colorAlpha = (colorAlpha << 8) | convert_uint4(color32.odd);
@@ -199,7 +197,8 @@ kernel void decodeCMPRBlock(global uchar *dst,
     //colorNoAlpha = (uint4)(0xFFFFFFFF);
     //colorAlpha = (uint4)(0, 0, 0, 0xFFFFFFFF);
 
-    colors  = select(colorNoAlpha, colorAlpha, choice);
+    //colors  = select(colorAlpha, colorNoAlpha, choice);
+    colors = color565.s0 > color565.s1 ? colorNoAlpha : colorAlpha;
 
     uint16 colorsFull = (uint16)(colors, colors, colors, colors);
 
diff --git a/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp b/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp
index 43179d9821..4f8eb612fc 100644
--- a/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp
+++ b/Source/Core/VideoCommon/Src/OpenCL/OCLTextureDecoder.cpp
@@ -161,7 +161,6 @@ PC_TexFormat TexDecoder_Decode_OpenCL(u8 *dst, const u8 *src, int width, int hei
 			formatResult = PC_TEX_FMT_BGRA32;
 			break;
 		case GX_TF_CMPR:
-			return PC_TEX_FMT_NONE; // Remove to test CMPR
 			kernelToRun = Decoders[7].kernel;
 			sizeOfSrc = sizeof(u8) / 2.0f;
             sizeOfDst = sizeof(u32);