hopefully fixed zww issue with new efb to ram.

implemented new efb to ram in opengl
modified TextureConversionShader preparing the implementation of new efb to ram in dx11
please test for regressions

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5874 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Rodolfo Osvaldo Bogado
2010-07-12 19:30:25 +00:00
parent dcc51e0ef8
commit 9cb41e7c70
11 changed files with 445 additions and 287 deletions

View File

@ -19,7 +19,6 @@
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include "Common.h"
#include "TextureConversionShader.h"
#include "TextureDecoder.h"
@ -67,7 +66,7 @@ u16 GetEncodedSampleCount(u32 format)
// block dimensions : widthStride, heightStride
// texture dims : width, height, x offset, y offset
void WriteSwizzler(char*& p, u32 format,bool HLSL)
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);
@ -75,14 +74,32 @@ void WriteSwizzler(char*& p, u32 format,bool HLSL)
float blkW = (float)TexDecoder_GetBlockWidthInTexels(format);
float blkH = (float)TexDecoder_GetBlockHeightInTexels(format);
float samples = (float)GetEncodedSampleCount(format);
if(HLSL)
WRITE(p,"uniform sampler samp0 : register(s0);\n");
else
if(ApiType == API_OPENGL)
{
WRITE(p,"uniform samplerRECT samp0 : register(s0);\n");
WRITE(p,
"void main(\n"
" out float4 ocol0 : COLOR0,\n"
" in float2 uv0 : TEXCOORD0)\n"
}
else if (ApiType == API_D3D9)
{
WRITE(p,"uniform sampler samp0 : register(s0);\n");
}
else
{
WRITE(p,"sampler samp0 : register(s0);\n");
WRITE(p, "Texture2D Tex0 : register(t0);\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"
"{\n"
" float2 sampleUv;\n"
" float2 uv1 = floor(uv0);\n");
@ -104,12 +121,12 @@ void WriteSwizzler(char*& p, u32 format,bool HLSL)
WRITE(p, " sampleUv = sampleUv * blkDims.xy;\n");
if(!HLSL)
if(ApiType == API_OPENGL)
WRITE(p," sampleUv.y = textureDims.y - sampleUv.y;\n");
WRITE(p, " sampleUv = sampleUv + textureDims.zw;\n");
if(HLSL)
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");
@ -118,7 +135,7 @@ void WriteSwizzler(char*& p, u32 format,bool HLSL)
// block dimensions : widthStride, heightStride
// texture dims : width, height, x offset, y offset
void Write32BitSwizzler(char*& p, u32 format, bool HLSL)
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);
@ -127,15 +144,33 @@ void Write32BitSwizzler(char*& p, u32 format, bool HLSL)
float blkH = (float)TexDecoder_GetBlockHeightInTexels(format);
// 32 bit textures (RGBA8 and Z24) are store in 2 cache line increments
if(HLSL)
WRITE(p,"uniform sampler samp0 : register(s0);\n");
else
if(ApiType == API_OPENGL)
{
WRITE(p,"uniform samplerRECT samp0 : register(s0);\n");
WRITE(p,
"void main(\n"
" out float4 ocol0 : COLOR0,\n"
" in float2 uv0 : TEXCOORD0)\n"
"{\n"
}
else if (ApiType == API_D3D9)
{
WRITE(p,"uniform sampler samp0 : register(s0);\n");
}
else
{
WRITE(p,"sampler samp0 : register(s0);\n");
WRITE(p, "Texture2D Tex0 : register(t0);\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"
"{\n"
" float2 sampleUv;\n"
" float2 uv1 = floor(uv0);\n");
@ -157,22 +192,24 @@ void Write32BitSwizzler(char*& p, u32 format, bool HLSL)
WRITE(p, " sampleUv.y = yb + xoff;\n");
WRITE(p, " sampleUv = sampleUv * blkDims.xy;\n");
if(!HLSL)
if(ApiType == API_OPENGL)
WRITE(p," sampleUv.y = textureDims.y - sampleUv.y;\n");
WRITE(p, " sampleUv = sampleUv + textureDims.zw;\n");
if(HLSL)
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");
}
}
void WriteSampleColor(char*& p, const char* colorComp, const char* dest,bool HLSL)
void WriteSampleColor(char*& p, const char* colorComp, const char* dest,API_TYPE ApiType)
{
if(HLSL)
if (ApiType == API_D3D9)
WRITE(p, " %s = tex2D(samp0, sampleUv).%s;\n", dest, colorComp);
else if (ApiType == API_D3D11)
WRITE(p, " %s = tex0.Sample(samp0, sampleUv).%s;\n", dest, colorComp);
else
WRITE(p, " %s = texRECT(samp0, sampleUv).%s;\n", dest, colorComp);
}
@ -187,9 +224,9 @@ void WriteColorToIntensity(char*& p, const char* src, const char* dest)
WRITE(p, " %s = dot(IntensityConst.rgb, %s.rgb) + IntensityConst.a;\n", dest, src);
}
void WriteIncrementSampleX(char*& p,bool HLSL)
void WriteIncrementSampleX(char*& p,API_TYPE ApiType)
{
if(HLSL)
if(ApiType != API_OPENGL)
WRITE(p, " sampleUv.x = sampleUv.x + blkDims.x / blkDims.z;\n");
else
WRITE(p, " sampleUv.x = sampleUv.x + blkDims.x;\n");
@ -207,65 +244,65 @@ void WriteEncoderEnd(char* p)
IntensityConstantAdded = false;
}
void WriteI8Encoder(char* p, bool HLSL)
void WriteI8Encoder(char* p, API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_I8,HLSL);
WriteSwizzler(p, GX_TF_I8,ApiType);
WRITE(p, " float3 texSample;\n");
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.b");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.g");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.r");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "ocol0.a");
WriteEncoderEnd(p);
}
void WriteI4Encoder(char* p, bool HLSL)
void WriteI4Encoder(char* p, API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_I4,HLSL);
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",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color0.b");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color1.b");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color0.g");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color1.g");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color0.r");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color1.r");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color0.a");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteColorToIntensity(p, "texSample", "color1.a");
WriteToBitDepth(p, 4, "color0", "color0");
@ -275,46 +312,46 @@ void WriteI4Encoder(char* p, bool HLSL)
WriteEncoderEnd(p);
}
void WriteIA8Encoder(char* p,bool HLSL)
void WriteIA8Encoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_IA8,HLSL);
WriteSwizzler(p, GX_TF_IA8,ApiType);
WRITE(p, " float4 texSample;\n");
WriteSampleColor(p, "rgba", "texSample",HLSL);
WriteSampleColor(p, "rgba", "texSample",ApiType);
WRITE(p, " ocol0.b = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "ocol0.g");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgba", "texSample",HLSL);
WriteSampleColor(p, "rgba", "texSample",ApiType);
WRITE(p, " ocol0.r = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "ocol0.a");
WriteEncoderEnd(p);
}
void WriteIA4Encoder(char* p,bool HLSL)
void WriteIA4Encoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_IA4,HLSL);
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",HLSL);
WriteSampleColor(p, "rgba", "texSample",ApiType);
WRITE(p, " color0.b = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.b");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgba", "texSample",HLSL);
WriteSampleColor(p, "rgba", "texSample",ApiType);
WRITE(p, " color0.g = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.g");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgba", "texSample",HLSL);
WriteSampleColor(p, "rgba", "texSample",ApiType);
WRITE(p, " color0.r = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.r");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgba", "texSample",HLSL);
WriteSampleColor(p, "rgba", "texSample",ApiType);
WRITE(p, " color0.a = texSample.a;\n");
WriteColorToIntensity(p, "texSample", "color1.a");
@ -325,16 +362,16 @@ void WriteIA4Encoder(char* p,bool HLSL)
WriteEncoderEnd(p);
}
void WriteRGB565Encoder(char* p,bool HLSL)
void WriteRGB565Encoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_RGB565,HLSL);
WriteSwizzler(p, GX_TF_RGB565,ApiType);
WRITE(p, " float3 texSample;\n");
WRITE(p, " float gInt;\n");
WRITE(p, " float gUpper;\n");
WRITE(p, " float gLower;\n");
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteToBitDepth(p, 6, "texSample.g", "gInt");
WRITE(p, " gUpper = floor(gInt / 8.0f);\n");
WRITE(p, " gLower = gInt - gUpper * 8.0f;\n");
@ -344,9 +381,9 @@ void WriteRGB565Encoder(char* p,bool HLSL)
WriteToBitDepth(p, 5, "texSample.b", "ocol0.g");
WRITE(p, " ocol0.g = ocol0.g + gLower * 32.0f;\n");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgb", "texSample",HLSL);
WriteSampleColor(p, "rgb", "texSample",ApiType);
WriteToBitDepth(p, 6, "texSample.g", "gInt");
WRITE(p, " gUpper = floor(gInt / 8.0f);\n");
WRITE(p, " gLower = gInt - gUpper * 8.0f;\n");
@ -360,16 +397,16 @@ void WriteRGB565Encoder(char* p,bool HLSL)
WriteEncoderEnd(p);
}
void WriteRGB5A3Encoder(char* p,bool HLSL)
void WriteRGB5A3Encoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_RGB5A3,HLSL);
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",HLSL);
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");
@ -396,9 +433,9 @@ void WriteRGB5A3Encoder(char* p,bool HLSL)
WRITE(p, "}\n");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgba", "texSample",HLSL);
WriteSampleColor(p, "rgba", "texSample",ApiType);
WRITE(p, "if(texSample.a > 0.878f) {\n");
@ -427,23 +464,23 @@ void WriteRGB5A3Encoder(char* p,bool HLSL)
WriteEncoderEnd(p);
}
void WriteRGBA4443Encoder(char* p,bool HLSL)
void WriteRGBA4443Encoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_RGB5A3,HLSL);
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",HLSL);
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,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgba", "texSample",HLSL);
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");
@ -453,9 +490,9 @@ void WriteRGBA4443Encoder(char* p,bool HLSL)
WriteEncoderEnd(p);
}
void WriteRGBA8Encoder(char* p,bool HLSL)
void WriteRGBA8Encoder(char* p,API_TYPE ApiType)
{
Write32BitSwizzler(p, GX_TF_RGBA8,HLSL);
Write32BitSwizzler(p, GX_TF_RGBA8,ApiType);
WRITE(p, " float cl1 = xb - (halfxb * 2);\n");
WRITE(p, " float cl0 = 1.0f - cl1;\n");
@ -464,15 +501,15 @@ void WriteRGBA8Encoder(char* p,bool HLSL)
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
WriteSampleColor(p, "rgba", "texSample",HLSL);
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,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "rgba", "texSample",HLSL);
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");
@ -483,34 +520,34 @@ void WriteRGBA8Encoder(char* p,bool HLSL)
WriteEncoderEnd(p);
}
void WriteC4Encoder(char* p, const char* comp,bool HLSL)
void WriteC4Encoder(char* p, const char* comp,API_TYPE ApiType)
{
WriteSwizzler(p, GX_CTF_R4,HLSL);
WriteSwizzler(p, GX_CTF_R4,ApiType);
WRITE(p, " float4 color0;\n");
WRITE(p, " float4 color1;\n");
WriteSampleColor(p, comp, "color0.b",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "color0.b",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "color1.b",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "color1.b",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "color0.g",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "color0.g",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "color1.g",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "color1.g",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "color0.r",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "color0.r",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "color1.r",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "color1.r",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "color0.a",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "color0.a",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "color1.a",HLSL);
WriteSampleColor(p, comp, "color1.a",ApiType);
WriteToBitDepth(p, 4, "color0", "color0");
WriteToBitDepth(p, 4, "color1", "color1");
@ -519,47 +556,47 @@ void WriteC4Encoder(char* p, const char* comp,bool HLSL)
WriteEncoderEnd(p);
}
void WriteC8Encoder(char* p, const char* comp,bool HLSL)
void WriteC8Encoder(char* p, const char* comp,API_TYPE ApiType)
{
WriteSwizzler(p, GX_CTF_R8,HLSL);
WriteSwizzler(p, GX_CTF_R8,ApiType);
WriteSampleColor(p, comp, "ocol0.b",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "ocol0.b",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "ocol0.g",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "ocol0.g",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "ocol0.r",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "ocol0.r",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "ocol0.a",HLSL);
WriteSampleColor(p, comp, "ocol0.a",ApiType);
WriteEncoderEnd(p);
}
void WriteCC4Encoder(char* p, const char* comp,bool HLSL)
void WriteCC4Encoder(char* p, const char* comp,API_TYPE ApiType)
{
WriteSwizzler(p, GX_CTF_RA4,HLSL);
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",HLSL);
WriteSampleColor(p, comp, "texSample",ApiType);
WRITE(p, " color0.b = texSample.x;\n");
WRITE(p, " color1.b = texSample.y;\n");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "texSample",HLSL);
WriteSampleColor(p, comp, "texSample",ApiType);
WRITE(p, " color0.g = texSample.x;\n");
WRITE(p, " color1.g = texSample.y;\n");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "texSample",HLSL);
WriteSampleColor(p, comp, "texSample",ApiType);
WRITE(p, " color0.r = texSample.x;\n");
WRITE(p, " color1.r = texSample.y;\n");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "texSample",HLSL);
WriteSampleColor(p, comp, "texSample",ApiType);
WRITE(p, " color0.a = texSample.x;\n");
WRITE(p, " color1.a = texSample.y;\n");
@ -570,52 +607,52 @@ void WriteCC4Encoder(char* p, const char* comp,bool HLSL)
WriteEncoderEnd(p);
}
void WriteCC8Encoder(char* p, const char* comp, bool HLSL)
void WriteCC8Encoder(char* p, const char* comp, API_TYPE ApiType)
{
WriteSwizzler(p, GX_CTF_RA8,HLSL);
WriteSwizzler(p, GX_CTF_RA8,ApiType);
WriteSampleColor(p, comp, "ocol0.bg",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, comp, "ocol0.bg",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, comp, "ocol0.ra",HLSL);
WriteSampleColor(p, comp, "ocol0.ra",ApiType);
WriteEncoderEnd(p);
}
void WriteZ8Encoder(char* p, const char* multiplier,bool HLSL)
void WriteZ8Encoder(char* p, const char* multiplier,API_TYPE ApiType)
{
WriteSwizzler(p, GX_CTF_Z8M,HLSL);
WriteSwizzler(p, GX_CTF_Z8M,ApiType);
WRITE(p, " float depth;\n");
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, "ocol0.b = frac(depth * %s);\n", multiplier);
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, "ocol0.g = frac(depth * %s);\n", multiplier);
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, "ocol0.r = frac(depth * %s);\n", multiplier);
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, "ocol0.a = frac(depth * %s);\n", multiplier);
WriteEncoderEnd(p);
}
void WriteZ16Encoder(char* p,bool HLSL)
void WriteZ16Encoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_TF_Z16,HLSL);
WriteSwizzler(p, GX_TF_Z16,ApiType);
WRITE(p, " float depth;\n");
WRITE(p, " float3 expanded;\n");
// byte order is reversed
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, " depth *= 16777215.0f;\n");
WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
@ -625,9 +662,9 @@ void WriteZ16Encoder(char* p,bool HLSL)
WRITE(p, " ocol0.b = expanded.g / 255;\n");
WRITE(p, " ocol0.g = expanded.r / 255;\n");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, " depth *= 16777215.0f;\n");
WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
@ -640,16 +677,16 @@ void WriteZ16Encoder(char* p,bool HLSL)
WriteEncoderEnd(p);
}
void WriteZ16LEncoder(char* p,bool HLSL)
void WriteZ16LEncoder(char* p,API_TYPE ApiType)
{
WriteSwizzler(p, GX_CTF_Z16L,HLSL);
WriteSwizzler(p, GX_CTF_Z16L,ApiType);
WRITE(p, " float depth;\n");
WRITE(p, " float3 expanded;\n");
// byte order is reversed
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, " depth *= 16777215.0f;\n");
WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
@ -661,9 +698,9 @@ void WriteZ16LEncoder(char* p,bool HLSL)
WRITE(p, " ocol0.b = expanded.b / 255;\n");
WRITE(p, " ocol0.g = expanded.g / 255;\n");
WriteIncrementSampleX(p,HLSL);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "b", "depth",HLSL);
WriteSampleColor(p, "b", "depth",ApiType);
WRITE(p, " depth *= 16777215.0f;\n");
WRITE(p, " expanded.r = floor(depth / (256 * 256));\n");
@ -678,9 +715,9 @@ void WriteZ16LEncoder(char* p,bool HLSL)
WriteEncoderEnd(p);
}
void WriteZ24Encoder(char* p, bool HLSL)
void WriteZ24Encoder(char* p, API_TYPE ApiType)
{
Write32BitSwizzler(p, GX_TF_Z24X8,HLSL);
Write32BitSwizzler(p, GX_TF_Z24X8,ApiType);
WRITE(p, " float cl = xb - (halfxb * 2);\n");
@ -689,9 +726,9 @@ void WriteZ24Encoder(char* p, bool HLSL)
WRITE(p, " float3 expanded0;\n");
WRITE(p, " float3 expanded1;\n");
WriteSampleColor(p, "b", "depth0",HLSL);
WriteIncrementSampleX(p,HLSL);
WriteSampleColor(p, "b", "depth1",HLSL);
WriteSampleColor(p, "b", "depth0",ApiType);
WriteIncrementSampleX(p,ApiType);
WriteSampleColor(p, "b", "depth1",ApiType);
for (int i = 0; i < 2; i++)
{
@ -721,7 +758,7 @@ void WriteZ24Encoder(char* p, bool HLSL)
WriteEncoderEnd(p);
}
const char *GenerateEncodingShader(u32 format,bool HLSL)
const char *GenerateEncodingShader(u32 format,API_TYPE ApiType)
{
setlocale(LC_NUMERIC, "C"); // Reset locale for compilation
text[sizeof(text) - 1] = 0x7C; // canary
@ -731,73 +768,73 @@ const char *GenerateEncodingShader(u32 format,bool HLSL)
switch(format)
{
case GX_TF_I4:
WriteI4Encoder(p,HLSL);
WriteI4Encoder(p,ApiType);
break;
case GX_TF_I8:
WriteI8Encoder(p,HLSL);
WriteI8Encoder(p,ApiType);
break;
case GX_TF_IA4:
WriteIA4Encoder(p,HLSL);
WriteIA4Encoder(p,ApiType);
break;
case GX_TF_IA8:
WriteIA8Encoder(p,HLSL);
WriteIA8Encoder(p,ApiType);
break;
case GX_TF_RGB565:
WriteRGB565Encoder(p,HLSL);
WriteRGB565Encoder(p,ApiType);
break;
case GX_TF_RGB5A3:
WriteRGB5A3Encoder(p,HLSL);
WriteRGB5A3Encoder(p,ApiType);
break;
case GX_TF_RGBA8:
WriteRGBA8Encoder(p,HLSL);
WriteRGBA8Encoder(p,ApiType);
break;
case GX_CTF_R4:
WriteC4Encoder(p, "r",HLSL);
WriteC4Encoder(p, "r",ApiType);
break;
case GX_CTF_RA4:
WriteCC4Encoder(p, "ar",HLSL);
WriteCC4Encoder(p, "ar",ApiType);
break;
case GX_CTF_RA8:
WriteCC8Encoder(p, "ar",HLSL);
WriteCC8Encoder(p, "ar",ApiType);
break;
case GX_CTF_A8:
WriteC8Encoder(p, "a",HLSL);
WriteC8Encoder(p, "a",ApiType);
break;
case GX_CTF_R8:
WriteC8Encoder(p, "r",HLSL);
WriteC8Encoder(p, "r",ApiType);
break;
case GX_CTF_G8:
WriteC8Encoder(p, "g",HLSL);
WriteC8Encoder(p, "g",ApiType);
break;
case GX_CTF_B8:
WriteC8Encoder(p, "b",HLSL);
WriteC8Encoder(p, "b",ApiType);
break;
case GX_CTF_RG8:
WriteCC8Encoder(p, "rg",HLSL);
WriteCC8Encoder(p, "rg",ApiType);
break;
case GX_CTF_GB8:
WriteCC8Encoder(p, "gb",HLSL);
WriteCC8Encoder(p, "gb",ApiType);
break;
case GX_TF_Z8:
WriteC8Encoder(p, "b",HLSL);
WriteC8Encoder(p, "b",ApiType);
break;
case GX_TF_Z16:
WriteZ16Encoder(p,HLSL);
WriteZ16Encoder(p,ApiType);
break;
case GX_TF_Z24X8:
WriteZ24Encoder(p,HLSL);
WriteZ24Encoder(p,ApiType);
break;
case GX_CTF_Z4:
WriteC4Encoder(p, "b",HLSL);
WriteC4Encoder(p, "b",ApiType);
break;
case GX_CTF_Z8M:
WriteZ8Encoder(p, "256.0f",HLSL);
WriteZ8Encoder(p, "256.0f",ApiType);
break;
case GX_CTF_Z8L:
WriteZ8Encoder(p, "65536.0f" ,HLSL);
WriteZ8Encoder(p, "65536.0f" ,ApiType);
break;
case GX_CTF_Z16L:
WriteZ16LEncoder(p,HLSL);
WriteZ16LEncoder(p,ApiType);
break;
default:
PanicAlert("Unknown texture copy format: 0x%x\n", format);