summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/TextureConversionShader.cpp
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2013-03-27 13:19:23 +1100
committerskidau <skidau@gmail.com>2013-03-27 13:19:23 +1100
commit7784fa4c67cc8d2545f45694d83805e7e89cd583 (patch)
tree7724133aabe971ec417d1dea0977a525bb8debfb /Source/Core/VideoCommon/Src/TextureConversionShader.cpp
parentd33c19b0cd2bae982c8d35e86a9d3551f9e5c72f (diff)
parent5cea0d9defeaa23e7af94adf7615a44fb2c9c173 (diff)
Merge branch 'master' into wii-network
# By Ryan Houdek (185) and others # Via degasus (12) and others * master: (625 commits) Revert "Don't open/close file for every file operation." as it was crashing PokePark in Windows builds. Array overrun fixed in VertexShaderCache for the DX11 plugin. Fixed DSPTool build. Windows build fix Go back to assuming every HID device is a wiimote on Windows. Fixed issue 6117. Unfixed issue 6031. VideoSoftware: Improve fog range adjustment by using less magic and more comments. revert RasterFont for VideoSoftware ogl: fix virtual xfb Windows build fix from web interface... Adjusted the audio loop criteria, using >= on the Wii and == on GC. This fixes the audio static that occurred in Wii games after hours of play. Forced the exception check only for ARAM DMA transfers. Removed the Eternal Darkness boot hack and replaced it with an exception check. VideoSoftware: Implement fog range adjustment, fixing issue 6147. implement 4xSSAA for OGL move ogl-only settings into backend Fix description of disable fog, and move it to enhancements tab. Reverted rd76ca5783743 as it was made obsolete by r1d550f4496e4. Removed the tracking of the FIFO Writes as it was made obsolete by r1d550f4496e4. Forced the external exception check to occur sooner by changing the downcount. Mark the Direct3D9 backend deprecated. Prefer D3D11 and OpenGL over D3D9 by default. ... Conflicts: CMakeLists.txt Source/Core/Common/Common.vcxproj.filters Source/Core/Common/Src/CommonPaths.h Source/Core/Core/Core.vcxproj.filters Source/Core/Core/Src/Core.cpp Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp Source/VSProps/Dolphin.Win32.props Source/VSProps/Dolphin.x64.props
Diffstat (limited to 'Source/Core/VideoCommon/Src/TextureConversionShader.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/TextureConversionShader.cpp661
1 files changed, 346 insertions, 315 deletions
diff --git a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp
index 2132a25258..5a81c9e7d5 100644
--- a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp
+++ b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp
@@ -26,6 +26,7 @@
#include "PixelShaderGen.h"
#include "BPMemory.h"
#include "RenderBase.h"
+#include "VideoConfig.h"
#define WRITE p+=sprintf
@@ -38,23 +39,23 @@ namespace TextureConversionShader
u16 GetEncodedSampleCount(u32 format)
{
- switch (format) {
- case GX_TF_I4: return 8;
+ switch (format) {
+ case GX_TF_I4: return 8;
case GX_TF_I8: return 4;
case GX_TF_IA4: return 4;
- case GX_TF_IA8: return 2;
+ case GX_TF_IA8: return 2;
case GX_TF_RGB565: return 2;
case GX_TF_RGB5A3: return 2;
case GX_TF_RGBA8: return 1;
case GX_CTF_R4: return 8;
- case GX_CTF_RA4: return 4;
- case GX_CTF_RA8: return 2;
- case GX_CTF_A8: return 4;
- case GX_CTF_R8: return 4;
- case GX_CTF_G8: return 4;
- case GX_CTF_B8: return 4;
- case GX_CTF_RG8: return 2;
- case GX_CTF_GB8: return 2;
+ case GX_CTF_RA4: return 4;
+ case GX_CTF_RA8: return 2;
+ case GX_CTF_A8: return 4;
+ case GX_CTF_R8: return 4;
+ case GX_CTF_G8: return 4;
+ case GX_CTF_B8: return 4;
+ case GX_CTF_RG8: return 2;
+ case GX_CTF_GB8: return 2;
case GX_TF_Z8: return 4;
case GX_TF_Z16: return 2;
case GX_TF_Z24X8: return 1;
@@ -62,23 +63,35 @@ u16 GetEncodedSampleCount(u32 format)
case GX_CTF_Z8M: return 4;
case GX_CTF_Z8L: return 4;
case GX_CTF_Z16L: return 2;
- default: return 1;
- }
+ default: return 1;
+ }
+}
+
+const char* WriteRegister(API_TYPE ApiType, const char *prefix, const u32 num)
+{
+ if (ApiType == API_OPENGL)
+ return ""; // Once we switch to GLSL 1.3 we can do something here
+ static char result[64];
+ sprintf(result, " : register(%s%d)", prefix, num);
+ return result;
}
// block dimensions : widthStride, heightStride
// texture dims : width, height, x offset, y offset
void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
{
- WRITE(p, "uniform float4 blkDims : register(c%d);\n", C_COLORMATRIX);
- WRITE(p, "uniform float4 textureDims : register(c%d);\n", C_COLORMATRIX + 1);
+ // [0] left, top, right, bottom of source rectangle within source texture
+ // [1] width and height of destination texture in pixels
+ // Two were merged for GLSL
+ WRITE(p, "uniform float4 " I_COLORS"[2] %s;\n", WriteRegister(ApiType, "c", C_COLORS));
- float blkW = (float)TexDecoder_GetBlockWidthInTexels(format);
+ float blkW = (float)TexDecoder_GetBlockWidthInTexels(format);
float blkH = (float)TexDecoder_GetBlockHeightInTexels(format);
float samples = (float)GetEncodedSampleCount(format);
- if(ApiType == API_OPENGL)
+ if (ApiType == API_OPENGL)
{
- WRITE(p,"uniform samplerRECT samp0 : register(s0);\n");
+ WRITE(p, "#define samp0 samp9\n");
+ WRITE(p, "uniform sampler2DRect samp0;\n");
}
else if (ApiType & API_D3D9)
{
@@ -87,23 +100,31 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
else
{
WRITE(p,"sampler samp0 : register(s0);\n");
- WRITE(p, "Texture2D Tex0 : register(t0);\n");
+ WRITE(p, "Texture2D Tex0 : register(t0);\n");
}
-
- WRITE(p,"void main(\n");
- if(ApiType != API_D3D11)
+ if (ApiType == API_OPENGL)
{
- WRITE(p," out float4 ocol0 : COLOR0,\n");
+ WRITE(p, " out float4 ocol0;\n");
+ WRITE(p, " in float2 uv0;\n");
+ WRITE(p, "void main()\n");
}
else
{
- WRITE(p," out float4 ocol0 : SV_Target,\n");
+ WRITE(p,"void main(\n");
+ if (ApiType != API_D3D11)
+ {
+ WRITE(p," out float4 ocol0 : COLOR0,\n");
+ }
+ else
+ {
+ WRITE(p," out float4 ocol0 : SV_Target,\n");
+ }
+ WRITE(p," in float2 uv0 : TEXCOORD0)\n");
}
-
- WRITE(p," in float2 uv0 : TEXCOORD0)\n"
- "{\n"
- " float2 sampleUv;\n"
+
+ WRITE(p, "{\n"
+ " float2 sampleUv;\n"
" float2 uv1 = floor(uv0);\n");
WRITE(p, " uv1.x = uv1.x * %f;\n", samples);
@@ -113,7 +134,7 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
WRITE(p, " float yl = floor(uv1.y / %f);\n", blkH);
WRITE(p, " float yb = yl * %f;\n", blkH);
WRITE(p, " float yoff = uv1.y - yb;\n");
- WRITE(p, " float xp = uv1.x + (yoff * textureDims.x);\n");
+ WRITE(p, " float xp = uv1.x + (yoff * " I_COLORS"[1].x);\n");
WRITE(p, " float xel = floor(xp / %f);\n", blkW);
WRITE(p, " float xb = floor(xel / %f);\n", blkH);
WRITE(p, " float xoff = xel - (xb * %f);\n", blkH);
@@ -121,34 +142,37 @@ void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
WRITE(p, " sampleUv.x = xib + (xb * %f);\n", blkW);
WRITE(p, " sampleUv.y = yb + xoff;\n");
- WRITE(p, " sampleUv = sampleUv * blkDims.xy;\n");
+ WRITE(p, " sampleUv = sampleUv * " I_COLORS"[0].xy;\n");
+
+ if (ApiType == API_OPENGL)
+ WRITE(p," sampleUv.y = " I_COLORS"[1].y - sampleUv.y;\n");
- if(ApiType == API_OPENGL)
- WRITE(p," sampleUv.y = textureDims.y - sampleUv.y;\n");
-
- WRITE(p, " sampleUv = sampleUv + textureDims.zw;\n");
+ WRITE(p, " sampleUv = sampleUv + " I_COLORS"[1].zw;\n");
- if(ApiType != API_OPENGL)
+ if (ApiType != API_OPENGL)
{
WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this
- WRITE(p, " sampleUv = sampleUv / blkDims.zw;\n");
- }
+ WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n");
+ }
}
// block dimensions : widthStride, heightStride
// texture dims : width, height, x offset, y offset
void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType)
-{
- WRITE(p, "uniform float4 blkDims : register(c%d);\n", C_COLORMATRIX);
- WRITE(p, "uniform float4 textureDims : register(c%d);\n", C_COLORMATRIX + 1);
+{
+ // [0] left, top, right, bottom of source rectangle within source texture
+ // [1] width and height of destination texture in pixels
+ // Two were merged for GLSL
+ WRITE(p, "uniform float4 " I_COLORS"[2] %s;\n", WriteRegister(ApiType, "c", C_COLORS));
- float blkW = (float)TexDecoder_GetBlockWidthInTexels(format);
+ float blkW = (float)TexDecoder_GetBlockWidthInTexels(format);
float blkH = (float)TexDecoder_GetBlockHeightInTexels(format);
// 32 bit textures (RGBA8 and Z24) are store in 2 cache line increments
- if(ApiType == API_OPENGL)
+ if (ApiType == API_OPENGL)
{
- WRITE(p,"uniform samplerRECT samp0 : register(s0);\n");
+ WRITE(p, "#define samp0 samp9\n");
+ WRITE(p, "uniform sampler2DRect samp0;\n");
}
else if (ApiType & API_D3D9)
{
@@ -157,53 +181,61 @@ void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType)
else
{
WRITE(p,"sampler samp0 : register(s0);\n");
- WRITE(p, "Texture2D Tex0 : register(t0);\n");
+ WRITE(p, "Texture2D Tex0 : register(t0);\n");
}
-
- WRITE(p,"void main(\n");
- if(ApiType != API_D3D11)
+ if (ApiType == API_OPENGL)
{
- WRITE(p," out float4 ocol0 : COLOR0,\n");
+ WRITE(p, " out float4 ocol0;\n");
+ WRITE(p, " in float2 uv0;\n");
+ WRITE(p, "void main()\n");
}
else
{
- WRITE(p," out float4 ocol0 : SV_Target,\n");
+ WRITE(p,"void main(\n");
+ if(ApiType != API_D3D11)
+ {
+ WRITE(p," out float4 ocol0 : COLOR0,\n");
+ }
+ else
+ {
+ WRITE(p," out float4 ocol0 : SV_Target,\n");
+ }
+ WRITE(p," in float2 uv0 : TEXCOORD0)\n");
}
-
- WRITE(p," in float2 uv0 : TEXCOORD0)\n"
- "{\n"
- " float2 sampleUv;\n"
+
+
+ WRITE(p, "{\n"
+ " float2 sampleUv;\n"
" float2 uv1 = floor(uv0);\n");
-
+
WRITE(p, " float yl = floor(uv1.y / %f);\n", blkH);
WRITE(p, " float yb = yl * %f;\n", blkH);
WRITE(p, " float yoff = uv1.y - yb;\n");
- WRITE(p, " float xp = uv1.x + (yoff * textureDims.x);\n");
+ WRITE(p, " float xp = uv1.x + (yoff * " I_COLORS"[1].x);\n");
WRITE(p, " float xel = floor(xp / 2);\n");
WRITE(p, " float xb = floor(xel / %f);\n", blkH);
WRITE(p, " float xoff = xel - (xb * %f);\n", blkH);
-
+
WRITE(p, " float x2 = uv1.x * 2;\n");
WRITE(p, " float xl = floor(x2 / %f);\n", blkW);
WRITE(p, " float xib = x2 - (xl * %f);\n", blkW);
WRITE(p, " float halfxb = floor(xb / 2);\n");
-
WRITE(p, " sampleUv.x = xib + (halfxb * %f);\n", blkW);
WRITE(p, " sampleUv.y = yb + xoff;\n");
- WRITE(p, " sampleUv = sampleUv * blkDims.xy;\n");
-
- if(ApiType == API_OPENGL)
- WRITE(p," sampleUv.y = textureDims.y - sampleUv.y;\n");
-
- WRITE(p, " sampleUv = sampleUv + textureDims.zw;\n");
-
- if(ApiType != API_OPENGL)
+ WRITE(p, " sampleUv = sampleUv * " I_COLORS"[0].xy;\n");
+
+ if (ApiType == API_OPENGL)
+ WRITE(p," sampleUv.y = " I_COLORS"[1].y - sampleUv.y;\n");
+
+ WRITE(p, " sampleUv = sampleUv + " I_COLORS"[1].zw;\n");
+
+ if (ApiType != API_OPENGL)
{
WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this
- WRITE(p, " sampleUv = sampleUv / blkDims.zw;\n");
- }
+ WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n");
+ }
}
void WriteSampleColor(char*& p, const char* colorComp, const char* dest, API_TYPE ApiType)
@@ -214,14 +246,14 @@ void WriteSampleColor(char*& p, const char* colorComp, const char* dest, API_TYP
else if (ApiType == API_D3D11)
texSampleOpName = "tex0.Sample";
else
- texSampleOpName = "texRECT";
+ texSampleOpName = "texture2DRect";
// the increment of sampleUv.x is delayed, so we perform it here. see WriteIncrementSampleX.
const char* texSampleIncrementUnit;
- if(ApiType != API_OPENGL)
- texSampleIncrementUnit = "blkDims.x / blkDims.z";
+ if (ApiType != API_OPENGL)
+ texSampleIncrementUnit = I_COLORS"[0].x / " I_COLORS"[0].z";
else
- texSampleIncrementUnit = "blkDims.x";
+ texSampleIncrementUnit = I_COLORS"[0].x";
WRITE(p, " %s = %s(samp0, sampleUv + float2(%d * (%s), 0)).%s;\n",
dest, texSampleOpName, s_incrementSampleXCount, texSampleIncrementUnit, colorComp);
@@ -229,7 +261,7 @@ void WriteSampleColor(char*& p, const char* colorComp, const char* dest, API_TYP
void WriteColorToIntensity(char*& p, const char* src, const char* dest)
{
- if(!IntensityConstantAdded)
+ if (!IntensityConstantAdded)
{
WRITE(p, " float4 IntensityConst = float4(0.257f,0.504f,0.098f,0.0625f);\n");
IntensityConstantAdded = true;
@@ -263,7 +295,7 @@ void WriteToBitDepth(char*& p, u8 depth, const char* src, const char* dest)
WRITE(p, " %s = floor(%s * %ff);\n", dest, src, result);
}
-void WriteEncoderEnd(char* p)
+void WriteEncoderEnd(char* p, API_TYPE ApiType)
{
WRITE(p, "}\n");
IntensityConstantAdded = false;
@@ -272,65 +304,65 @@ void WriteEncoderEnd(char* p)
void WriteI8Encoder(char* p, API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_I8,ApiType);
+ WriteSwizzler(p, GX_TF_I8, ApiType);
WRITE(p, " float3 texSample;\n");
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.b");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.g");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.r");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.a");
WRITE(p, " ocol0.rgba += IntensityConst.aaaa;\n"); // see WriteColorToIntensity
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteI4Encoder(char* p, API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_I4,ApiType);
+ WriteSwizzler(p, GX_TF_I4, ApiType);
WRITE(p, " float3 texSample;\n");
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color0.b");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color1.b");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color0.g");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color1.g");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color0.r");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color1.r");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color0.a");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgb", "texSample",ApiType);
+ WriteSampleColor(p, "rgb", "texSample", ApiType);
WriteColorToIntensity(p, "texSample", "color1.a");
WRITE(p, " color0.rgba += IntensityConst.aaaa;\n");
@@ -340,51 +372,51 @@ void WriteI4Encoder(char* p, API_TYPE ApiType)
WriteToBitDepth(p, 4, "color1", "color1");
WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteIA8Encoder(char* p,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_IA8,ApiType);
+ WriteSwizzler(p, GX_TF_IA8, ApiType);
WRITE(p, " float4 texSample;\n");
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " ocol0.b = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "ocol0.g");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " ocol0.r = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "ocol0.a");
WRITE(p, " ocol0.ga += IntensityConst.aa;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteIA4Encoder(char* p,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_IA4,ApiType);
+ WriteSwizzler(p, GX_TF_IA4, ApiType);
WRITE(p, " float4 texSample;\n");
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " color0.b = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.b");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " color0.g = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.g");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " color0.r = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.r");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " color0.a = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.a");
@@ -394,20 +426,19 @@ void WriteIA4Encoder(char* p,API_TYPE ApiType)
WriteToBitDepth(p, 4, "color1", "color1");
WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteRGB565Encoder(char* p,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_RGB565,ApiType);
-
- WriteSampleColor(p, "rgb", "float3 texSample0",ApiType);
- WriteIncrementSampleX(p,ApiType);
- WriteSampleColor(p, "rgb", "float3 texSample1",ApiType);
-
- WRITE(p, " float2 texRs = {texSample0.r, texSample1.r};\n");
- WRITE(p, " float2 texGs = {texSample0.g, texSample1.g};\n");
- WRITE(p, " float2 texBs = {texSample0.b, texSample1.b};\n");
+ WriteSwizzler(p, GX_TF_RGB565, ApiType);
+
+ WriteSampleColor(p, "rgb", "float3 texSample0", ApiType);
+ WriteIncrementSampleX(p, ApiType);
+ WriteSampleColor(p, "rgb", "float3 texSample1", ApiType);
+ WRITE(p, " float2 texRs = float2(texSample0.r, texSample1.r);\n");
+ WRITE(p, " float2 texGs = float2(texSample0.g, texSample1.g);\n");
+ WRITE(p, " float2 texBs = float2(texSample0.b, texSample1.b);\n");
WriteToBitDepth(p, 6, "texGs", "float2 gInt");
WRITE(p, " float2 gUpper = floor(gInt / 8.0f);\n");
@@ -419,25 +450,25 @@ void WriteRGB565Encoder(char* p,API_TYPE ApiType)
WRITE(p, " ocol0.ga = ocol0.ga + gLower * 32.0f;\n");
WRITE(p, " ocol0 = ocol0 / 255.0f;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteRGB5A3Encoder(char* p,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_RGB5A3,ApiType);
+ WriteSwizzler(p, GX_TF_RGB5A3, ApiType);
WRITE(p, " float4 texSample;\n");
WRITE(p, " float color0;\n");
WRITE(p, " float gUpper;\n");
WRITE(p, " float gLower;\n");
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
- // 0.8784 = 224 / 255 which is the maximum alpha value that can be represented in 3 bits
- WRITE(p, "if(texSample.a > 0.878f) {\n");
+ // 0.8784 = 224 / 255 which is the maximum alpha value that can be represented in 3 bits
+ WRITE(p, "if(texSample.a > 0.878f) {\n");
WriteToBitDepth(p, 5, "texSample.g", "color0");
- WRITE(p, " gUpper = floor(color0 / 8.0f);\n");
+ WRITE(p, " gUpper = floor(color0 / 8.0f);\n");
WRITE(p, " gLower = color0 - gUpper * 8.0f;\n");
WriteToBitDepth(p, 5, "texSample.r", "ocol0.b");
@@ -445,27 +476,27 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType)
WriteToBitDepth(p, 5, "texSample.b", "ocol0.g");
WRITE(p, " ocol0.g = ocol0.g + gLower * 32.0f;\n");
- WRITE(p, "} else {\n");
+ WRITE(p, "} else {\n");
- WriteToBitDepth(p, 4, "texSample.r", "ocol0.b");
- WriteToBitDepth(p, 4, "texSample.b", "ocol0.g");
+ WriteToBitDepth(p, 4, "texSample.r", "ocol0.b");
+ WriteToBitDepth(p, 4, "texSample.b", "ocol0.g");
- WriteToBitDepth(p, 3, "texSample.a", "color0");
- WRITE(p, "ocol0.b = ocol0.b + color0 * 16.0f;\n");
+ WriteToBitDepth(p, 3, "texSample.a", "color0");
+ WRITE(p, "ocol0.b = ocol0.b + color0 * 16.0f;\n");
WriteToBitDepth(p, 4, "texSample.g", "color0");
- WRITE(p, "ocol0.g = ocol0.g + color0 * 16.0f;\n");
+ WRITE(p, "ocol0.g = ocol0.g + color0 * 16.0f;\n");
- WRITE(p, "}\n");
+ WRITE(p, "}\n");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
- WRITE(p, "if(texSample.a > 0.878f) {\n");
+ WRITE(p, "if(texSample.a > 0.878f) {\n");
WriteToBitDepth(p, 5, "texSample.g", "color0");
- WRITE(p, " gUpper = floor(color0 / 8.0f);\n");
+ WRITE(p, " gUpper = floor(color0 / 8.0f);\n");
WRITE(p, " gLower = color0 - gUpper * 8.0f;\n");
WriteToBitDepth(p, 5, "texSample.r", "ocol0.r");
@@ -473,51 +504,51 @@ void WriteRGB5A3Encoder(char* p,API_TYPE ApiType)
WriteToBitDepth(p, 5, "texSample.b", "ocol0.a");
WRITE(p, " ocol0.a = ocol0.a + gLower * 32.0f;\n");
- WRITE(p, "} else {\n");
+ WRITE(p, "} else {\n");
- WriteToBitDepth(p, 4, "texSample.r", "ocol0.r");
- WriteToBitDepth(p, 4, "texSample.b", "ocol0.a");
+ WriteToBitDepth(p, 4, "texSample.r", "ocol0.r");
+ WriteToBitDepth(p, 4, "texSample.b", "ocol0.a");
- WriteToBitDepth(p, 3, "texSample.a", "color0");
- WRITE(p, "ocol0.r = ocol0.r + color0 * 16.0f;\n");
+ WriteToBitDepth(p, 3, "texSample.a", "color0");
+ WRITE(p, "ocol0.r = ocol0.r + color0 * 16.0f;\n");
WriteToBitDepth(p, 4, "texSample.g", "color0");
- WRITE(p, "ocol0.a = ocol0.a + color0 * 16.0f;\n");
+ WRITE(p, "ocol0.a = ocol0.a + color0 * 16.0f;\n");
- WRITE(p, "}\n");
+ WRITE(p, "}\n");
WRITE(p, " ocol0 = ocol0 / 255.0f;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteRGBA4443Encoder(char* p,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_RGB5A3,ApiType);
+ WriteSwizzler(p, GX_TF_RGB5A3, ApiType);
WRITE(p, " float4 texSample;\n");
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WriteToBitDepth(p, 3, "texSample.a", "color0.b");
WriteToBitDepth(p, 4, "texSample.r", "color1.b");
WriteToBitDepth(p, 4, "texSample.g", "color0.g");
WriteToBitDepth(p, 4, "texSample.b", "color1.g");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WriteToBitDepth(p, 3, "texSample.a", "color0.r");
WriteToBitDepth(p, 4, "texSample.r", "color1.r");
WriteToBitDepth(p, 4, "texSample.g", "color0.a");
WriteToBitDepth(p, 4, "texSample.b", "color1.a");
WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteRGBA8Encoder(char* p,API_TYPE ApiType)
{
- Write32BitSwizzler(p, GX_TF_RGBA8,ApiType);
+ Write32BitSwizzler(p, GX_TF_RGBA8, ApiType);
WRITE(p, " float cl1 = xb - (halfxb * 2);\n");
WRITE(p, " float cl0 = 1.0f - cl1;\n");
@@ -526,15 +557,15 @@ void WriteRGBA8Encoder(char* p,API_TYPE ApiType)
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " color0.b = texSample.a;\n");
WRITE(p, " color0.g = texSample.r;\n");
WRITE(p, " color1.b = texSample.g;\n");
WRITE(p, " color1.g = texSample.b;\n");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "rgba", "texSample",ApiType);
+ WriteSampleColor(p, "rgba", "texSample", ApiType);
WRITE(p, " color0.r = texSample.a;\n");
WRITE(p, " color0.a = texSample.r;\n");
WRITE(p, " color1.r = texSample.g;\n");
@@ -542,86 +573,86 @@ void WriteRGBA8Encoder(char* p,API_TYPE ApiType)
WRITE(p, " ocol0 = (cl0 * color0) + (cl1 * color1);\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteC4Encoder(char* p, const char* comp,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_CTF_R4,ApiType);
+ WriteSwizzler(p, GX_CTF_R4, ApiType);
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
- WriteSampleColor(p, comp, "color0.b",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "color0.b", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "color1.b",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "color1.b", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "color0.g",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "color0.g", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "color1.g",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "color1.g", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "color0.r",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "color0.r", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "color1.r",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "color1.r", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "color0.a",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "color0.a", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "color1.a",ApiType);
+ WriteSampleColor(p, comp, "color1.a", ApiType);
WriteToBitDepth(p, 4, "color0", "color0");
WriteToBitDepth(p, 4, "color1", "color1");
WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteC8Encoder(char* p, const char* comp,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_CTF_R8,ApiType);
+ WriteSwizzler(p, GX_CTF_R8, ApiType);
- WriteSampleColor(p, comp, "ocol0.b",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "ocol0.b", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "ocol0.g",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "ocol0.g", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "ocol0.r",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "ocol0.r", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "ocol0.a",ApiType);
+ WriteSampleColor(p, comp, "ocol0.a", ApiType);
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteCC4Encoder(char* p, const char* comp,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_CTF_RA4,ApiType);
+ WriteSwizzler(p, GX_CTF_RA4, ApiType);
WRITE(p, " float2 texSample;\n");
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
- WriteSampleColor(p, comp, "texSample",ApiType);
+ WriteSampleColor(p, comp, "texSample", ApiType);
WRITE(p, " color0.b = texSample.x;\n");
WRITE(p, " color1.b = texSample.y;\n");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "texSample",ApiType);
+ WriteSampleColor(p, comp, "texSample", ApiType);
WRITE(p, " color0.g = texSample.x;\n");
WRITE(p, " color1.g = texSample.y;\n");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "texSample",ApiType);
+ WriteSampleColor(p, comp, "texSample", ApiType);
WRITE(p, " color0.r = texSample.x;\n");
WRITE(p, " color1.r = texSample.y;\n");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "texSample",ApiType);
+ WriteSampleColor(p, comp, "texSample", ApiType);
WRITE(p, " color0.a = texSample.x;\n");
WRITE(p, " color1.a = texSample.y;\n");
@@ -629,158 +660,158 @@ void WriteCC4Encoder(char* p, const char* comp,API_TYPE ApiType)
WriteToBitDepth(p, 4, "color1", "color1");
WRITE(p, " ocol0 = (color0 * 16.0f + color1) / 255.0f;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteCC8Encoder(char* p, const char* comp, API_TYPE ApiType)
{
- WriteSwizzler(p, GX_CTF_RA8,ApiType);
+ WriteSwizzler(p, GX_CTF_RA8, ApiType);
- WriteSampleColor(p, comp, "ocol0.bg",ApiType);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, comp, "ocol0.bg", ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, comp, "ocol0.ra",ApiType);
+ WriteSampleColor(p, comp, "ocol0.ra", ApiType);
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteZ8Encoder(char* p, const char* multiplier,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_CTF_Z8M,ApiType);
+ WriteSwizzler(p, GX_CTF_Z8M, ApiType);
- WRITE(p, " float depth;\n");
+ WRITE(p, " float depth;\n");
- WriteSampleColor(p, "b", "depth",ApiType);
- WRITE(p, "ocol0.b = frac(depth * %s);\n", multiplier);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, "b", "depth", ApiType);
+ WRITE(p, "ocol0.b = frac(depth * %s);\n", multiplier);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "b", "depth",ApiType);
- WRITE(p, "ocol0.g = frac(depth * %s);\n", multiplier);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, "b", "depth", ApiType);
+ WRITE(p, "ocol0.g = frac(depth * %s);\n", multiplier);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "b", "depth",ApiType);
- WRITE(p, "ocol0.r = frac(depth * %s);\n", multiplier);
- WriteIncrementSampleX(p,ApiType);
+ WriteSampleColor(p, "b", "depth", ApiType);
+ WRITE(p, "ocol0.r = frac(depth * %s);\n", multiplier);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "b", "depth",ApiType);
- WRITE(p, "ocol0.a = frac(depth * %s);\n", multiplier);
+ WriteSampleColor(p, "b", "depth", ApiType);
+ WRITE(p, "ocol0.a = frac(depth * %s);\n", multiplier);
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteZ16Encoder(char* p,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_TF_Z16,ApiType);
+ WriteSwizzler(p, GX_TF_Z16, ApiType);
- WRITE(p, " float depth;\n");
- WRITE(p, " float3 expanded;\n");
+ WRITE(p, " float depth;\n");
+ WRITE(p, " float3 expanded;\n");
- // byte order is reversed
+ // byte order is reversed
- WriteSampleColor(p, "b", "depth",ApiType);
+ WriteSampleColor(p, "b", "depth", ApiType);
- WRITE(p, " depth *= 16777215.0f;\n");
- WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
- WRITE(p, " depth -= expanded.r * 256 * 256;\n");
- WRITE(p, " expanded.g = floor(depth / 256);\n");
+ WRITE(p, " depth *= 16777215.0f;\n");
+ WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
+ WRITE(p, " depth -= expanded.r * 256 * 256;\n");
+ WRITE(p, " expanded.g = floor(depth / 256);\n");
- WRITE(p, " ocol0.b = expanded.g / 255;\n");
- WRITE(p, " ocol0.g = expanded.r / 255;\n");
+ WRITE(p, " ocol0.b = expanded.g / 255;\n");
+ WRITE(p, " ocol0.g = expanded.r / 255;\n");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "b", "depth",ApiType);
+ WriteSampleColor(p, "b", "depth", ApiType);
- WRITE(p, " depth *= 16777215.0f;\n");
- WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
- WRITE(p, " depth -= expanded.r * 256 * 256;\n");
- WRITE(p, " expanded.g = floor(depth / 256);\n");
+ WRITE(p, " depth *= 16777215.0f;\n");
+ WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
+ WRITE(p, " depth -= expanded.r * 256 * 256;\n");
+ WRITE(p, " expanded.g = floor(depth / 256);\n");
- WRITE(p, " ocol0.r = expanded.g / 255;\n");
- WRITE(p, " ocol0.a = expanded.r / 255;\n");
+ WRITE(p, " ocol0.r = expanded.g / 255;\n");
+ WRITE(p, " ocol0.a = expanded.r / 255;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteZ16LEncoder(char* p,API_TYPE ApiType)
{
- WriteSwizzler(p, GX_CTF_Z16L,ApiType);
+ WriteSwizzler(p, GX_CTF_Z16L, ApiType);
- WRITE(p, " float depth;\n");
- WRITE(p, " float3 expanded;\n");
+ WRITE(p, " float depth;\n");
+ WRITE(p, " float3 expanded;\n");
- // byte order is reversed
+ // byte order is reversed
- WriteSampleColor(p, "b", "depth",ApiType);
+ WriteSampleColor(p, "b", "depth", ApiType);
- WRITE(p, " depth *= 16777215.0f;\n");
- WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
- WRITE(p, " depth -= expanded.r * 256 * 256;\n");
- WRITE(p, " expanded.g = floor(depth / 256);\n");
- WRITE(p, " depth -= expanded.g * 256;\n");
- WRITE(p, " expanded.b = depth;\n");
+ WRITE(p, " depth *= 16777215.0f;\n");
+ WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
+ WRITE(p, " depth -= expanded.r * 256 * 256;\n");
+ WRITE(p, " expanded.g = floor(depth / 256);\n");
+ WRITE(p, " depth -= expanded.g * 256;\n");
+ WRITE(p, " expanded.b = depth;\n");
- WRITE(p, " ocol0.b = expanded.b / 255;\n");
- WRITE(p, " ocol0.g = expanded.g / 255;\n");
+ WRITE(p, " ocol0.b = expanded.b / 255;\n");
+ WRITE(p, " ocol0.g = expanded.g / 255;\n");
- WriteIncrementSampleX(p,ApiType);
+ WriteIncrementSampleX(p, ApiType);
- WriteSampleColor(p, "b", "depth",ApiType);
+ WriteSampleColor(p, "b", "depth", ApiType);
- WRITE(p, " depth *= 16777215.0f;\n");
- WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
- WRITE(p, " depth -= expanded.r * 256 * 256;\n");
- WRITE(p, " expanded.g = floor(depth / 256);\n");
- WRITE(p, " depth -= expanded.g * 256;\n");
- WRITE(p, " expanded.b = depth;\n");
+ WRITE(p, " depth *= 16777215.0f;\n");
+ WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
+ WRITE(p, " depth -= expanded.r * 256 * 256;\n");
+ WRITE(p, " expanded.g = floor(depth / 256);\n");
+ WRITE(p, " depth -= expanded.g * 256;\n");
+ WRITE(p, " expanded.b = depth;\n");
- WRITE(p, " ocol0.r = expanded.b;\n");
- WRITE(p, " ocol0.a = expanded.g;\n");
+ WRITE(p, " ocol0.r = expanded.b;\n");
+ WRITE(p, " ocol0.a = expanded.g;\n");
- WriteEncoderEnd(p);
+ WriteEncoderEnd(p, ApiType);
}
void WriteZ24Encoder(char* p, API_TYPE ApiType)
{
- Write32BitSwizzler(p, GX_TF_Z24X8,ApiType);
+ Write32BitSwizzler(p, GX_TF_Z24X8, ApiType);
WRITE(p, " float cl = xb - (halfxb * 2);\n");
WRITE(p, " float depth0;\n");
- WRITE(p, " float depth1;\n");
- WRITE(p, " float3 expanded0;\n");
- WRITE(p, " float3 expanded1;\n");
-
- WriteSampleColor(p, "b", "depth0",ApiType);
- WriteIncrementSampleX(p,ApiType);
- WriteSampleColor(p, "b", "depth1",ApiType);
-
- for (int i = 0; i < 2; i++)
- {
- WRITE(p, " depth%i *= 16777215.0f;\n", i);
-
- WRITE(p, " expanded%i.r = floor(depth%i / (256 * 256));\n", i, i);
- WRITE(p, " depth%i -= expanded%i.r * 256 * 256;\n", i, i);
- WRITE(p, " expanded%i.g = floor(depth%i / 256);\n", i, i);
- WRITE(p, " depth%i -= expanded%i.g * 256;\n", i, i);
- WRITE(p, " expanded%i.b = depth%i;\n", i, i);
- }
-
- WRITE(p, " if(cl > 0.5f) {\n");
- // upper 16
- WRITE(p, " ocol0.b = expanded0.g / 255;\n");
- WRITE(p, " ocol0.g = expanded0.b / 255;\n");
- WRITE(p, " ocol0.r = expanded1.g / 255;\n");
- WRITE(p, " ocol0.a = expanded1.b / 255;\n");
- WRITE(p, " } else {\n");
- // lower 8
- WRITE(p, " ocol0.b = 1.0f;\n");
- WRITE(p, " ocol0.g = expanded0.r / 255;\n");
- WRITE(p, " ocol0.r = 1.0f;\n");
- WRITE(p, " ocol0.a = expanded1.r / 255;\n");
- WRITE(p, " }\n");
-
- WriteEncoderEnd(p);
+ WRITE(p, " float depth1;\n");
+ WRITE(p, " float3 expanded0;\n");
+ WRITE(p, " float3 expanded1;\n");
+
+ WriteSampleColor(p, "b", "depth0", ApiType);
+ WriteIncrementSampleX(p, ApiType);
+ WriteSampleColor(p, "b", "depth1", ApiType);
+
+ for (int i = 0; i < 2; i++)
+ {
+ WRITE(p, " depth%i *= 16777215.0f;\n", i);
+
+ WRITE(p, " expanded%i.r = floor(depth%i / (256 * 256));\n", i, i);
+ WRITE(p, " depth%i -= expanded%i.r * 256 * 256;\n", i, i);
+ WRITE(p, " expanded%i.g = floor(depth%i / 256);\n", i, i);
+ WRITE(p, " depth%i -= expanded%i.g * 256;\n", i, i);
+ WRITE(p, " expanded%i.b = depth%i;\n", i, i);
+ }
+
+ WRITE(p, " if(cl > 0.5f) {\n");
+ // upper 16
+ WRITE(p, " ocol0.b = expanded0.g / 255;\n");
+ WRITE(p, " ocol0.g = expanded0.b / 255;\n");
+ WRITE(p, " ocol0.r = expanded1.g / 255;\n");
+ WRITE(p, " ocol0.a = expanded1.b / 255;\n");
+ WRITE(p, " } else {\n");
+ // lower 8
+ WRITE(p, " ocol0.b = 1.0f;\n");
+ WRITE(p, " ocol0.g = expanded0.r / 255;\n");
+ WRITE(p, " ocol0.r = 1.0f;\n");
+ WRITE(p, " ocol0.a = expanded1.r / 255;\n");
+ WRITE(p, " }\n");
+
+ WriteEncoderEnd(p, ApiType);
}
const char *GenerateEncodingShader(u32 format,API_TYPE ApiType)
@@ -790,76 +821,76 @@ const char *GenerateEncodingShader(u32 format,API_TYPE ApiType)
char *p = text;
- switch(format)
+ switch (format)
{
case GX_TF_I4:
- WriteI4Encoder(p,ApiType);
+ WriteI4Encoder(p, ApiType);
break;
case GX_TF_I8:
- WriteI8Encoder(p,ApiType);
+ WriteI8Encoder(p, ApiType);
break;
case GX_TF_IA4:
- WriteIA4Encoder(p,ApiType);
+ WriteIA4Encoder(p, ApiType);
break;
case GX_TF_IA8:
- WriteIA8Encoder(p,ApiType);
+ WriteIA8Encoder(p, ApiType);
break;
case GX_TF_RGB565:
- WriteRGB565Encoder(p,ApiType);
+ WriteRGB565Encoder(p, ApiType);
break;
case GX_TF_RGB5A3:
- WriteRGB5A3Encoder(p,ApiType);
+ WriteRGB5A3Encoder(p, ApiType);
break;
case GX_TF_RGBA8:
- WriteRGBA8Encoder(p,ApiType);
+ WriteRGBA8Encoder(p, ApiType);
break;
case GX_CTF_R4:
- WriteC4Encoder(p, "r",ApiType);
+ WriteC4Encoder(p, "r", ApiType);
break;
case GX_CTF_RA4:
- WriteCC4Encoder(p, "ar",ApiType);
+ WriteCC4Encoder(p, "ar", ApiType);
break;
case GX_CTF_RA8:
- WriteCC8Encoder(p, "ar",ApiType);
+ WriteCC8Encoder(p, "ar", ApiType);
break;
case GX_CTF_A8:
- WriteC8Encoder(p, "a",ApiType);
+ WriteC8Encoder(p, "a", ApiType);
break;
case GX_CTF_R8:
- WriteC8Encoder(p, "r",ApiType);
+ WriteC8Encoder(p, "r", ApiType);
break;
case GX_CTF_G8:
- WriteC8Encoder(p, "g",ApiType);
+ WriteC8Encoder(p, "g", ApiType);
break;
case GX_CTF_B8:
- WriteC8Encoder(p, "b",ApiType);
+ WriteC8Encoder(p, "b", ApiType);
break;
case GX_CTF_RG8:
- WriteCC8Encoder(p, "rg",ApiType);
+ WriteCC8Encoder(p, "rg", ApiType);
break;
case GX_CTF_GB8:
- WriteCC8Encoder(p, "gb",ApiType);
+ WriteCC8Encoder(p, "gb", ApiType);
break;
case GX_TF_Z8:
- WriteC8Encoder(p, "b",ApiType);
+ WriteC8Encoder(p, "b", ApiType);
break;
case GX_TF_Z16:
- WriteZ16Encoder(p,ApiType);
+ WriteZ16Encoder(p, ApiType);
break;
case GX_TF_Z24X8:
- WriteZ24Encoder(p,ApiType);
+ WriteZ24Encoder(p, ApiType);
break;
case GX_CTF_Z4:
- WriteC4Encoder(p, "b",ApiType);
+ WriteC4Encoder(p, "b", ApiType);
break;
case GX_CTF_Z8M:
- WriteZ8Encoder(p, "256.0f",ApiType);
+ WriteZ8Encoder(p, "256.0f", ApiType);
break;
case GX_CTF_Z8L:
- WriteZ8Encoder(p, "65536.0f" ,ApiType);
+ WriteZ8Encoder(p, "65536.0f" , ApiType);
break;
case GX_CTF_Z16L:
- WriteZ16LEncoder(p,ApiType);
+ WriteZ16LEncoder(p, ApiType);
break;
default:
PanicAlert("Unknown texture copy format: 0x%x\n", format);
@@ -870,7 +901,7 @@ const char *GenerateEncodingShader(u32 format,API_TYPE ApiType)
PanicAlert("TextureConversionShader generator - buffer too small, canary has been eaten!");
setlocale(LC_NUMERIC, ""); // restore locale
- return text;
+ return text;
}
void SetShaderParameters(float width, float height, float offsetX, float offsetY, float widthStride, float heightStride,float buffW,float buffH)