2013-04-17 21:09:55 -06:00
|
|
|
// Copyright 2013 Dolphin Emulator Project
|
|
|
|
// Licensed under GPLv2
|
|
|
|
// Refer to the license.txt file included.
|
2009-02-22 23:15:48 -07:00
|
|
|
|
|
|
|
|
2009-09-03 13:24:16 -06:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <math.h>
|
2009-10-13 19:58:39 -06:00
|
|
|
#include <locale.h>
|
2013-06-15 05:21:57 -06:00
|
|
|
#ifdef __APPLE__
|
|
|
|
#include <xlocale.h>
|
|
|
|
#endif
|
2009-09-03 13:24:16 -06:00
|
|
|
|
2009-02-22 23:15:48 -07:00
|
|
|
#include "TextureConversionShader.h"
|
|
|
|
#include "TextureDecoder.h"
|
|
|
|
#include "PixelShaderManager.h"
|
|
|
|
#include "PixelShaderGen.h"
|
2009-06-22 03:31:30 -06:00
|
|
|
#include "BPMemory.h"
|
2011-01-30 18:28:32 -07:00
|
|
|
#include "RenderBase.h"
|
2011-12-08 00:51:08 -07:00
|
|
|
#include "VideoConfig.h"
|
2009-02-22 23:15:48 -07:00
|
|
|
|
|
|
|
#define WRITE p+=sprintf
|
|
|
|
|
|
|
|
static char text[16384];
|
2009-10-24 20:35:21 -06:00
|
|
|
static bool IntensityConstantAdded = false;
|
2010-12-19 14:05:41 -07:00
|
|
|
static int s_incrementSampleXCount = 0;
|
2009-02-22 23:15:48 -07:00
|
|
|
|
|
|
|
namespace TextureConversionShader
|
|
|
|
{
|
|
|
|
|
|
|
|
u16 GetEncodedSampleCount(u32 format)
|
|
|
|
{
|
2013-04-24 07:21:54 -06:00
|
|
|
switch (format)
|
|
|
|
{
|
2013-03-19 19:51:12 -06:00
|
|
|
case GX_TF_I4: return 8;
|
2009-02-22 23:15:48 -07:00
|
|
|
case GX_TF_I8: return 4;
|
|
|
|
case GX_TF_IA4: return 4;
|
2013-03-19 19:51:12 -06:00
|
|
|
case GX_TF_IA8: return 2;
|
2009-02-22 23:15:48 -07:00
|
|
|
case GX_TF_RGB565: return 2;
|
|
|
|
case GX_TF_RGB5A3: return 2;
|
|
|
|
case GX_TF_RGBA8: return 1;
|
|
|
|
case GX_CTF_R4: return 8;
|
2013-03-19 19:51:12 -06:00
|
|
|
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;
|
2009-02-22 23:15:48 -07:00
|
|
|
case GX_TF_Z8: return 4;
|
|
|
|
case GX_TF_Z16: return 2;
|
|
|
|
case GX_TF_Z24X8: return 1;
|
|
|
|
case GX_CTF_Z4: return 8;
|
|
|
|
case GX_CTF_Z8M: return 4;
|
|
|
|
case GX_CTF_Z8L: return 4;
|
|
|
|
case GX_CTF_Z16L: return 2;
|
2013-03-19 19:51:12 -06:00
|
|
|
default: return 1;
|
|
|
|
}
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
2011-12-25 22:15:54 -07:00
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
const char* WriteRegister(API_TYPE ApiType, const char *prefix, const u32 num)
|
|
|
|
{
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType == API_OPENGL)
|
2011-12-11 03:14:02 -07:00
|
|
|
return ""; // Once we switch to GLSL 1.3 we can do something here
|
2011-12-11 03:08:18 -07:00
|
|
|
static char result[64];
|
|
|
|
sprintf(result, " : register(%s%d)", prefix, num);
|
|
|
|
return result;
|
2011-12-02 18:04:37 -07:00
|
|
|
}
|
2011-12-25 22:15:54 -07:00
|
|
|
|
2009-03-22 03:00:43 -06:00
|
|
|
// block dimensions : widthStride, heightStride
|
2009-02-22 23:15:48 -07:00
|
|
|
// texture dims : width, height, x offset, y offset
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2013-01-14 04:37:31 -07:00
|
|
|
// [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);
|
2009-08-11 14:36:13 -06:00
|
|
|
float blkH = (float)TexDecoder_GetBlockHeightInTexels(format);
|
2009-03-22 03:00:43 -06:00
|
|
|
float samples = (float)GetEncodedSampleCount(format);
|
2011-12-02 18:04:37 -07:00
|
|
|
if (ApiType == API_OPENGL)
|
|
|
|
{
|
2013-01-18 16:39:31 -07:00
|
|
|
WRITE(p, "#define samp0 samp9\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WRITE(p, "uniform sampler2DRect samp0;\n");
|
|
|
|
}
|
2011-06-10 13:16:09 -06:00
|
|
|
else if (ApiType & API_D3D9)
|
2010-07-12 13:30:25 -06:00
|
|
|
{
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
WRITE(p,"uniform sampler samp0 : register(s0);\n");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
else
|
2010-07-12 13:30:25 -06:00
|
|
|
{
|
|
|
|
WRITE(p,"sampler samp0 : register(s0);\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "Texture2D Tex0 : register(t0);\n");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
|
|
|
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType == API_OPENGL)
|
2010-07-12 13:30:25 -06:00
|
|
|
{
|
2013-09-03 12:56:24 -06:00
|
|
|
WRITE(p, " out vec4 ocol0;\n");
|
2013-04-08 06:50:58 -06:00
|
|
|
WRITE(p, " VARYIN float2 uv0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WRITE(p, "void main()\n");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-12-02 18:04:37 -07:00
|
|
|
WRITE(p,"void main(\n");
|
2011-12-25 22:15:54 -07:00
|
|
|
if (ApiType != API_D3D11)
|
2011-12-02 18:04:37 -07:00
|
|
|
{
|
|
|
|
WRITE(p," out float4 ocol0 : COLOR0,\n");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WRITE(p," out float4 ocol0 : SV_Target,\n");
|
|
|
|
}
|
|
|
|
WRITE(p," in float2 uv0 : TEXCOORD0)\n");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
2013-03-19 19:51:12 -06:00
|
|
|
|
2011-12-07 21:47:13 -07:00
|
|
|
WRITE(p, "{\n"
|
2013-03-19 19:51:12 -06:00
|
|
|
" float2 sampleUv;\n"
|
2009-03-22 03:00:43 -06:00
|
|
|
" float2 uv1 = floor(uv0);\n");
|
|
|
|
|
|
|
|
WRITE(p, " uv1.x = uv1.x * %f;\n", samples);
|
|
|
|
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
WRITE(p, " float xl = floor(uv1.x / %f);\n", blkW);
|
2009-03-22 03:00:43 -06:00
|
|
|
WRITE(p, " float xib = uv1.x - (xl * %f);\n", blkW);
|
|
|
|
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");
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " float xp = uv1.x + (yoff * " I_COLORS"[1].x);\n");
|
2009-03-22 03:00:43 -06:00
|
|
|
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);
|
|
|
|
|
|
|
|
WRITE(p, " sampleUv.x = xib + (xb * %f);\n", blkW);
|
|
|
|
WRITE(p, " sampleUv.y = yb + xoff;\n");
|
|
|
|
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " sampleUv = sampleUv * " I_COLORS"[0].xy;\n");
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType == API_OPENGL)
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p," sampleUv.y = " I_COLORS"[1].y - sampleUv.y;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " sampleUv = sampleUv + " I_COLORS"[1].zw;\n");
|
2009-12-07 11:48:31 -07:00
|
|
|
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType != API_OPENGL)
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
{
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " sampleUv = sampleUv + float2(0.0,1.0);\n");// still to determine the reason for this
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
}
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2009-05-14 20:39:55 -06:00
|
|
|
// block dimensions : widthStride, heightStride
|
|
|
|
// texture dims : width, height, x offset, y offset
|
2010-07-12 13:30:25 -06:00
|
|
|
void Write32BitSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
2011-12-02 18:04:37 -07:00
|
|
|
{
|
2013-01-14 04:37:31 -07:00
|
|
|
// [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);
|
2009-08-11 14:36:13 -06:00
|
|
|
float blkH = (float)TexDecoder_GetBlockHeightInTexels(format);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
|
|
|
// 32 bit textures (RGBA8 and Z24) are store in 2 cache line increments
|
2011-12-25 22:15:54 -07:00
|
|
|
if (ApiType == API_OPENGL)
|
2011-12-02 18:04:37 -07:00
|
|
|
{
|
2013-01-18 16:39:31 -07:00
|
|
|
WRITE(p, "#define samp0 samp9\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WRITE(p, "uniform sampler2DRect samp0;\n");
|
|
|
|
}
|
2011-06-10 13:16:09 -06:00
|
|
|
else if (ApiType & API_D3D9)
|
2010-07-12 13:30:25 -06:00
|
|
|
{
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
WRITE(p,"uniform sampler samp0 : register(s0);\n");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
else
|
2010-07-12 13:30:25 -06:00
|
|
|
{
|
|
|
|
WRITE(p,"sampler samp0 : register(s0);\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "Texture2D Tex0 : register(t0);\n");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
|
|
|
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType == API_OPENGL)
|
2010-07-12 13:30:25 -06:00
|
|
|
{
|
2013-01-11 03:59:42 -07:00
|
|
|
WRITE(p, " out float4 ocol0;\n");
|
2013-04-08 06:50:58 -06:00
|
|
|
WRITE(p, " VARYIN float2 uv0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WRITE(p, "void main()\n");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-12-02 18:04:37 -07:00
|
|
|
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");
|
2010-07-12 13:30:25 -06:00
|
|
|
}
|
2013-03-19 19:51:12 -06:00
|
|
|
|
|
|
|
|
2011-12-07 22:01:14 -07:00
|
|
|
WRITE(p, "{\n"
|
2013-03-19 19:51:12 -06:00
|
|
|
" float2 sampleUv;\n"
|
2009-05-14 20:39:55 -06:00
|
|
|
" float2 uv1 = floor(uv0);\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
|
2009-05-14 20:39:55 -06:00
|
|
|
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");
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " float xp = uv1.x + (yoff * " I_COLORS"[1].x);\n");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " float xel = floor(xp / 2.0);\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
WRITE(p, " float xb = floor(xel / %f);\n", blkH);
|
|
|
|
WRITE(p, " float xoff = xel - (xb * %f);\n", blkH);
|
2013-03-19 19:51:12 -06:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " float x2 = uv1.x * 2.0;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
WRITE(p, " float xl = floor(x2 / %f);\n", blkW);
|
|
|
|
WRITE(p, " float xib = x2 - (xl * %f);\n", blkW);
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " float halfxb = floor(xb / 2.0);\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
|
2009-05-14 20:39:55 -06:00
|
|
|
WRITE(p, " sampleUv.x = xib + (halfxb * %f);\n", blkW);
|
|
|
|
WRITE(p, " sampleUv.y = yb + xoff;\n");
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " sampleUv = sampleUv * " I_COLORS"[0].xy;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType == API_OPENGL)
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p," sampleUv.y = " I_COLORS"[1].y - sampleUv.y;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " sampleUv = sampleUv + " I_COLORS"[1].zw;\n");
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType != API_OPENGL)
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
{
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " sampleUv = sampleUv + float2(0.0,1.0);\n");// still to determine the reason for this
|
2012-12-19 15:42:22 -07:00
|
|
|
WRITE(p, " sampleUv = sampleUv / " I_COLORS"[0].zw;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
}
|
2009-05-14 20:39:55 -06:00
|
|
|
}
|
|
|
|
|
2010-12-19 14:05:41 -07:00
|
|
|
void WriteSampleColor(char*& p, const char* colorComp, const char* dest, API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2010-12-19 14:05:41 -07:00
|
|
|
const char* texSampleOpName;
|
2011-06-10 13:16:09 -06:00
|
|
|
if (ApiType & API_D3D9)
|
2010-12-19 14:05:41 -07:00
|
|
|
texSampleOpName = "tex2D";
|
2010-07-12 13:30:25 -06:00
|
|
|
else if (ApiType == API_D3D11)
|
2010-12-19 14:05:41 -07:00
|
|
|
texSampleOpName = "tex0.Sample";
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
else
|
2013-01-21 16:18:42 -07:00
|
|
|
texSampleOpName = "texture2DRect";
|
2010-12-19 14:05:41 -07:00
|
|
|
|
|
|
|
// the increment of sampleUv.x is delayed, so we perform it here. see WriteIncrementSampleX.
|
|
|
|
const char* texSampleIncrementUnit;
|
2012-12-27 21:46:29 -07:00
|
|
|
if (ApiType != API_OPENGL)
|
2012-12-19 15:42:22 -07:00
|
|
|
texSampleIncrementUnit = I_COLORS"[0].x / " I_COLORS"[0].z";
|
2010-12-19 14:05:41 -07:00
|
|
|
else
|
2011-12-02 18:04:37 -07:00
|
|
|
texSampleIncrementUnit = I_COLORS"[0].x";
|
2010-12-19 14:05:41 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " %s = %s(samp0, sampleUv + float2(%d.0 * (%s), 0.0)).%s;\n",
|
2010-12-19 14:05:41 -07:00
|
|
|
dest, texSampleOpName, s_incrementSampleXCount, texSampleIncrementUnit, colorComp);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void WriteColorToIntensity(char*& p, const char* src, const char* dest)
|
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
if (!IntensityConstantAdded)
|
2009-10-24 20:35:21 -06:00
|
|
|
{
|
|
|
|
WRITE(p, " float4 IntensityConst = float4(0.257f,0.504f,0.098f,0.0625f);\n");
|
|
|
|
IntensityConstantAdded = true;
|
|
|
|
}
|
2010-12-19 14:05:41 -07:00
|
|
|
WRITE(p, " %s = dot(IntensityConst.rgb, %s.rgb);\n", dest, src);
|
|
|
|
// don't add IntensityConst.a yet, because doing it later is faster and uses less instructions, due to vectorization
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteIncrementSampleX(char*& p,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2010-12-19 14:05:41 -07:00
|
|
|
// the shader compiler apparently isn't smart or aggressive enough to recognize that:
|
|
|
|
// foo1 = lookup(x)
|
|
|
|
// x = x + increment;
|
|
|
|
// foo2 = lookup(x)
|
|
|
|
// x = x + increment;
|
|
|
|
// foo3 = lookup(x)
|
|
|
|
// can be replaced with this:
|
|
|
|
// foo1 = lookup(x + 0.0 * increment)
|
|
|
|
// foo2 = lookup(x + 1.0 * increment)
|
|
|
|
// foo3 = lookup(x + 2.0 * increment)
|
|
|
|
// which looks like the same operations but uses considerably fewer ALU instruction slots.
|
|
|
|
// thus, instead of using the former method, we only increment a counter internally here,
|
|
|
|
// and we wait until WriteSampleColor to write out the constant multiplier
|
|
|
|
// to achieve the increment as in the latter case.
|
|
|
|
s_incrementSampleXCount++;
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void WriteToBitDepth(char*& p, u8 depth, const char* src, const char* dest)
|
|
|
|
{
|
2013-10-06 02:12:13 -06:00
|
|
|
float result = 255 / pow(2.0, (8 - depth));
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " %s = floor(%s * %ff);\n", dest, src, result);
|
|
|
|
}
|
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
void WriteEncoderEnd(char* p, API_TYPE ApiType)
|
2009-10-24 20:35:21 -06:00
|
|
|
{
|
|
|
|
WRITE(p, "}\n");
|
|
|
|
IntensityConstantAdded = false;
|
2010-12-19 14:05:41 -07:00
|
|
|
s_incrementSampleXCount = 0;
|
2009-10-24 20:35:21 -06:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteI8Encoder(char* p, API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_TF_I8, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " float3 texSample;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "ocol0.b");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "ocol0.g");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "ocol0.r");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "ocol0.a");
|
|
|
|
|
2010-12-19 14:05:41 -07:00
|
|
|
WRITE(p, " ocol0.rgba += IntensityConst.aaaa;\n"); // see WriteColorToIntensity
|
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteI4Encoder(char* p, API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_TF_I4, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " float3 texSample;\n");
|
|
|
|
WRITE(p, " float4 color0;\n");
|
|
|
|
WRITE(p, " float4 color1;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color0.b");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color1.b");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color0.g");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color1.g");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color0.r");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color1.r");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color0.a");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteColorToIntensity(p, "texSample", "color1.a");
|
|
|
|
|
2010-12-19 14:05:41 -07:00
|
|
|
WRITE(p, " color0.rgba += IntensityConst.aaaa;\n");
|
|
|
|
WRITE(p, " color1.rgba += IntensityConst.aaaa;\n");
|
|
|
|
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteToBitDepth(p, 4, "color0", "color0");
|
|
|
|
WriteToBitDepth(p, 4, "color1", "color1");
|
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteIA8Encoder(char* p,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_TF_IA8, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " float4 texSample;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " ocol0.b = texSample.a;\n");
|
|
|
|
WriteColorToIntensity(p, "texSample", "ocol0.g");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " ocol0.r = texSample.a;\n");
|
|
|
|
WriteColorToIntensity(p, "texSample", "ocol0.a");
|
|
|
|
|
2010-12-19 14:05:41 -07:00
|
|
|
WRITE(p, " ocol0.ga += IntensityConst.aa;\n");
|
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteIA4Encoder(char* p,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_TF_IA4, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " float4 texSample;\n");
|
|
|
|
WRITE(p, " float4 color0;\n");
|
|
|
|
WRITE(p, " float4 color1;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.b = texSample.a;\n");
|
|
|
|
WriteColorToIntensity(p, "texSample", "color1.b");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.g = texSample.a;\n");
|
|
|
|
WriteColorToIntensity(p, "texSample", "color1.g");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.r = texSample.a;\n");
|
|
|
|
WriteColorToIntensity(p, "texSample", "color1.r");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.a = texSample.a;\n");
|
2009-03-22 03:00:43 -06:00
|
|
|
WriteColorToIntensity(p, "texSample", "color1.a");
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2010-12-19 14:05:41 -07:00
|
|
|
WRITE(p, " color1.rgba += IntensityConst.aaaa;\n");
|
|
|
|
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteToBitDepth(p, 4, "color0", "color0");
|
|
|
|
WriteToBitDepth(p, 4, "color1", "color1");
|
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteRGB565Encoder(char* p,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_TF_RGB565, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgb", "float3 texSample0", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
|
|
|
WriteSampleColor(p, "rgb", "float3 texSample1", ApiType);
|
2011-12-07 21:47:13 -07:00
|
|
|
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");
|
2010-12-19 14:05:41 -07:00
|
|
|
|
|
|
|
WriteToBitDepth(p, 6, "texGs", "float2 gInt");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " float2 gUpper = floor(gInt / 8.0);\n");
|
|
|
|
WRITE(p, " float2 gLower = gInt - gUpper * 8.0;\n");
|
2010-12-19 14:05:41 -07:00
|
|
|
|
|
|
|
WriteToBitDepth(p, 5, "texRs", "ocol0.br");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.br = ocol0.br * 8.0 + gUpper;\n");
|
2010-12-19 14:05:41 -07:00
|
|
|
WriteToBitDepth(p, 5, "texBs", "ocol0.ga");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.ga = ocol0.ga + gLower * 32.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0 = ocol0 / 255.0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-03-21 21:25:59 -06:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteRGB5A3Encoder(char* p,API_TYPE ApiType)
|
2009-03-21 21:25:59 -06:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_TF_RGB5A3, ApiType);
|
2009-03-21 21:25:59 -06:00
|
|
|
|
|
|
|
WRITE(p, " float4 texSample;\n");
|
|
|
|
WRITE(p, " float color0;\n");
|
|
|
|
WRITE(p, " float gUpper;\n");
|
|
|
|
WRITE(p, " float gLower;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
// 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");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
|
|
|
WriteToBitDepth(p, 5, "texSample.g", "color0");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " gUpper = floor(color0 / 8.0);\n");
|
|
|
|
WRITE(p, " gLower = color0 - gUpper * 8.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
|
|
|
WriteToBitDepth(p, 5, "texSample.r", "ocol0.b");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.b = ocol0.b * 4.0 + gUpper + 128.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
WriteToBitDepth(p, 5, "texSample.b", "ocol0.g");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.g = ocol0.g + gLower * 32.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "} else {\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteToBitDepth(p, 4, "texSample.r", "ocol0.b");
|
|
|
|
WriteToBitDepth(p, 4, "texSample.b", "ocol0.g");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteToBitDepth(p, 3, "texSample.a", "color0");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, "ocol0.b = ocol0.b + color0 * 16.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
WriteToBitDepth(p, 4, "texSample.g", "color0");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, "ocol0.g = ocol0.g + color0 * 16.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "}\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "if(texSample.a > 0.878f) {\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
|
|
|
WriteToBitDepth(p, 5, "texSample.g", "color0");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " gUpper = floor(color0 / 8.0);\n");
|
|
|
|
WRITE(p, " gLower = color0 - gUpper * 8.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
|
|
|
WriteToBitDepth(p, 5, "texSample.r", "ocol0.r");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.r = ocol0.r * 4.0 + gUpper + 128.0;\n");
|
2009-02-22 23:15:48 -07:00
|
|
|
WriteToBitDepth(p, 5, "texSample.b", "ocol0.a");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.a = ocol0.a + gLower * 32.0;\n");
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "} else {\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteToBitDepth(p, 4, "texSample.r", "ocol0.r");
|
|
|
|
WriteToBitDepth(p, 4, "texSample.b", "ocol0.a");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteToBitDepth(p, 3, "texSample.a", "color0");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, "ocol0.r = ocol0.r + color0 * 16.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
WriteToBitDepth(p, 4, "texSample.g", "color0");
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, "ocol0.a = ocol0.a + color0 * 16.0;\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "}\n");
|
2009-03-21 21:25:59 -06:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0 = ocol0 / 255.0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteRGBA4443Encoder(char* p,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_TF_RGB5A3, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
|
|
|
WRITE(p, " float4 texSample;\n");
|
|
|
|
WRITE(p, " float4 color0;\n");
|
|
|
|
WRITE(p, " float4 color1;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
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");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
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");
|
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteRGBA8Encoder(char* p,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
Write32BitSwizzler(p, GX_TF_RGBA8, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " float cl1 = xb - (halfxb * 2.0);\n");
|
|
|
|
WRITE(p, " float cl0 = 1.0 - cl1;\n");
|
2009-02-22 23:15:48 -07:00
|
|
|
|
|
|
|
WRITE(p, " float4 texSample;\n");
|
|
|
|
WRITE(p, " float4 color0;\n");
|
|
|
|
WRITE(p, " float4 color1;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
WRITE(p, " color0.b = texSample.a;\n");
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.g = texSample.r;\n");
|
|
|
|
WRITE(p, " color1.b = texSample.g;\n");
|
|
|
|
WRITE(p, " color1.g = texSample.b;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "rgba", "texSample", ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
WRITE(p, " color0.r = texSample.a;\n");
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.a = texSample.r;\n");
|
|
|
|
WRITE(p, " color1.r = texSample.g;\n");
|
|
|
|
WRITE(p, " color1.a = texSample.b;\n");
|
|
|
|
|
2009-03-22 03:00:43 -06:00
|
|
|
WRITE(p, " ocol0 = (cl0 * color0) + (cl1 * color1);\n");
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteC4Encoder(char* p, const char* comp,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_CTF_R4, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " float4 color0;\n");
|
|
|
|
WRITE(p, " float4 color1;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color0.b", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color1.b", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color0.g", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color1.g", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color0.r", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color1.r", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color0.a", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "color1.a", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
|
|
|
WriteToBitDepth(p, 4, "color0", "color0");
|
|
|
|
WriteToBitDepth(p, 4, "color1", "color1");
|
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteC8Encoder(char* p, const char* comp,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_CTF_R8, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "ocol0.b", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "ocol0.g", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "ocol0.r", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "ocol0.a", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteCC4Encoder(char* p, const char* comp,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_CTF_RA4, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " float2 texSample;\n");
|
|
|
|
WRITE(p, " float4 color0;\n");
|
|
|
|
WRITE(p, " float4 color1;\n");
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.b = texSample.x;\n");
|
|
|
|
WRITE(p, " color1.b = texSample.y;\n");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.g = texSample.x;\n");
|
|
|
|
WRITE(p, " color1.g = texSample.y;\n");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.r = texSample.x;\n");
|
|
|
|
WRITE(p, " color1.r = texSample.y;\n");
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "texSample", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
WRITE(p, " color0.a = texSample.x;\n");
|
|
|
|
WRITE(p, " color1.a = texSample.y;\n");
|
|
|
|
|
|
|
|
WriteToBitDepth(p, 4, "color0", "color0");
|
|
|
|
WriteToBitDepth(p, 4, "color1", "color1");
|
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0 = (color0 * 16.0 + color1) / 255.0;\n");
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteCC8Encoder(char* p, const char* comp, API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_CTF_RA8, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "ocol0.bg", ApiType);
|
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, comp, "ocol0.ra", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteZ8Encoder(char* p, const char* multiplier,API_TYPE ApiType)
|
2009-05-14 20:39:55 -06:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSwizzler(p, GX_CTF_Z8M, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " float depth;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, "ocol0.b = frac(depth * %s);\n", multiplier);
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
|
|
|
WRITE(p, "ocol0.g = frac(depth * %s);\n", multiplier);
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
|
|
|
WRITE(p, "ocol0.r = frac(depth * %s);\n", multiplier);
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
|
|
|
WRITE(p, "ocol0.a = frac(depth * %s);\n", multiplier);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2011-12-02 18:04:37 -07:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteZ16Encoder(char* p,API_TYPE ApiType)
|
2009-05-14 20:39:55 -06:00
|
|
|
{
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSwizzler(p, GX_TF_Z16, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " float depth;\n");
|
|
|
|
WRITE(p, " float3 expanded;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
// byte order is reversed
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " depth *= 16777215.0;\n");
|
|
|
|
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
|
|
|
|
WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n");
|
|
|
|
WRITE(p, " expanded.g = floor(depth / 256.0);\n");
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.b = expanded.g / 255.0;\n");
|
|
|
|
WRITE(p, " ocol0.g = expanded.r / 255.0;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " depth *= 16777215.0;\n");
|
|
|
|
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
|
|
|
|
WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n");
|
|
|
|
WRITE(p, " expanded.g = floor(depth / 256.0);\n");
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.r = expanded.g / 255.0;\n");
|
|
|
|
WRITE(p, " ocol0.a = expanded.r / 255.0;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteZ16LEncoder(char* p,API_TYPE ApiType)
|
2009-05-14 20:39:55 -06:00
|
|
|
{
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSwizzler(p, GX_CTF_Z16L, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " float depth;\n");
|
|
|
|
WRITE(p, " float3 expanded;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
// byte order is reversed
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " depth *= 16777215.0;\n");
|
|
|
|
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
|
|
|
|
WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n");
|
|
|
|
WRITE(p, " expanded.g = floor(depth / 256.0);\n");
|
|
|
|
WRITE(p, " depth -= expanded.g * 256.0;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " expanded.b = depth;\n");
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.b = expanded.b / 255.0;\n");
|
|
|
|
WRITE(p, " ocol0.g = expanded.g / 255.0;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteSampleColor(p, "b", "depth", ApiType);
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " depth *= 16777215.0;\n");
|
|
|
|
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
|
|
|
|
WRITE(p, " depth -= expanded.r * 256.0 * 256.0;\n");
|
|
|
|
WRITE(p, " expanded.g = floor(depth / 256.0);\n");
|
|
|
|
WRITE(p, " depth -= expanded.g * 256.0;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " expanded.b = depth;\n");
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " ocol0.r = expanded.b;\n");
|
|
|
|
WRITE(p, " ocol0.a = expanded.g;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
void WriteZ24Encoder(char* p, API_TYPE ApiType)
|
2009-05-14 20:39:55 -06:00
|
|
|
{
|
2011-12-25 22:15:54 -07:00
|
|
|
Write32BitSwizzler(p, GX_TF_Z24X8, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " float cl = xb - (halfxb * 2.0);\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
|
|
|
WRITE(p, " float depth0;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " float depth1;\n");
|
|
|
|
WRITE(p, " float3 expanded0;\n");
|
|
|
|
WRITE(p, " float3 expanded1;\n");
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteSampleColor(p, "b", "depth0", ApiType);
|
2013-03-19 19:51:12 -06:00
|
|
|
WriteIncrementSampleX(p, ApiType);
|
|
|
|
WriteSampleColor(p, "b", "depth1", ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
|
2013-03-19 19:51:12 -06:00
|
|
|
for (int i = 0; i < 2; i++)
|
|
|
|
{
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " depth%i *= 16777215.0;\n", i);
|
2009-12-01 21:17:18 -07:00
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " expanded%i.r = floor(depth%i / (256.0 * 256.0));\n", i, i);
|
|
|
|
WRITE(p, " depth%i -= expanded%i.r * 256.0 * 256.0;\n", i, i);
|
|
|
|
WRITE(p, " expanded%i.g = floor(depth%i / 256.0);\n", i, i);
|
|
|
|
WRITE(p, " depth%i -= expanded%i.g * 256.0;\n", i, i);
|
2011-12-25 22:15:54 -07:00
|
|
|
WRITE(p, " expanded%i.b = depth%i;\n", i, i);
|
2013-03-19 19:51:12 -06:00
|
|
|
}
|
|
|
|
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " if(cl > 0.5) {\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
// upper 16
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.b = expanded0.g / 255.0;\n");
|
|
|
|
WRITE(p, " ocol0.g = expanded0.b / 255.0;\n");
|
|
|
|
WRITE(p, " ocol0.r = expanded1.g / 255.0;\n");
|
|
|
|
WRITE(p, " ocol0.a = expanded1.b / 255.0;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " } else {\n");
|
|
|
|
// lower 8
|
2013-10-06 02:12:13 -06:00
|
|
|
WRITE(p, " ocol0.b = 1.0;\n");
|
|
|
|
WRITE(p, " ocol0.g = expanded0.r / 255.0;\n");
|
|
|
|
WRITE(p, " ocol0.r = 1.0;\n");
|
|
|
|
WRITE(p, " ocol0.a = expanded1.r / 255.0;\n");
|
2013-03-19 19:51:12 -06:00
|
|
|
WRITE(p, " }\n");
|
|
|
|
|
|
|
|
WriteEncoderEnd(p, ApiType);
|
2009-05-14 20:39:55 -06:00
|
|
|
}
|
|
|
|
|
2010-07-12 13:30:25 -06:00
|
|
|
const char *GenerateEncodingShader(u32 format,API_TYPE ApiType)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2013-06-16 06:34:23 -06:00
|
|
|
#ifndef ANDROID
|
2013-06-15 05:21:57 -06:00
|
|
|
locale_t locale = newlocale(LC_NUMERIC_MASK, "C", NULL); // New locale for compilation
|
|
|
|
locale_t old_locale = uselocale(locale); // Apply the locale for this thread
|
2013-06-16 06:34:23 -06:00
|
|
|
#endif
|
2009-02-22 23:15:48 -07:00
|
|
|
text[sizeof(text) - 1] = 0x7C; // canary
|
|
|
|
|
|
|
|
char *p = text;
|
|
|
|
|
2011-12-25 22:15:54 -07:00
|
|
|
switch (format)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
|
|
|
case GX_TF_I4:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteI4Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_I8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteI8Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_IA4:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIA4Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_IA8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteIA8Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_RGB565:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteRGB565Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_RGB5A3:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteRGB5A3Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_RGBA8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteRGBA8Encoder(p, ApiType);
|
2009-03-22 03:00:43 -06:00
|
|
|
break;
|
2009-02-22 23:15:48 -07:00
|
|
|
case GX_CTF_R4:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteC4Encoder(p, "r", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_RA4:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteCC4Encoder(p, "ar", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_RA8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteCC8Encoder(p, "ar", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_A8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteC8Encoder(p, "a", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_R8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteC8Encoder(p, "r", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_G8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteC8Encoder(p, "g", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_B8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteC8Encoder(p, "b", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_RG8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteCC8Encoder(p, "rg", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_GB8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteCC8Encoder(p, "gb", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_Z8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteC8Encoder(p, "b", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_Z16:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteZ16Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_TF_Z24X8:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteZ24Encoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_Z4:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteC4Encoder(p, "b", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_Z8M:
|
2013-10-06 02:12:13 -06:00
|
|
|
WriteZ8Encoder(p, "256.0", ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_Z8L:
|
2013-10-06 02:12:13 -06:00
|
|
|
WriteZ8Encoder(p, "65536.0" , ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
|
|
|
case GX_CTF_Z16L:
|
2011-12-25 22:15:54 -07:00
|
|
|
WriteZ16LEncoder(p, ApiType);
|
2009-02-22 23:15:48 -07:00
|
|
|
break;
|
2009-03-22 03:00:43 -06:00
|
|
|
default:
|
2009-02-22 23:15:48 -07:00
|
|
|
PanicAlert("Unknown texture copy format: 0x%x\n", format);
|
2009-03-22 03:00:43 -06:00
|
|
|
break;
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (text[sizeof(text) - 1] != 0x7C)
|
|
|
|
PanicAlert("TextureConversionShader generator - buffer too small, canary has been eaten!");
|
2013-06-16 06:34:23 -06:00
|
|
|
|
|
|
|
#ifndef ANDROID
|
2013-06-15 05:21:57 -06:00
|
|
|
uselocale(old_locale); // restore locale
|
|
|
|
freelocale(locale);
|
2013-06-16 06:34:23 -06:00
|
|
|
#endif
|
2013-03-19 19:51:12 -06:00
|
|
|
return text;
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 11:46:30 -07:00
|
|
|
void SetShaderParameters(float width, float height, float offsetX, float offsetY, float widthStride, float heightStride,float buffW,float buffH)
|
2009-02-22 23:15:48 -07:00
|
|
|
{
|
2011-01-30 18:28:32 -07:00
|
|
|
g_renderer->SetPSConstant4f(C_COLORMATRIX, widthStride, heightStride, buffW, buffH);
|
|
|
|
g_renderer->SetPSConstant4f(C_COLORMATRIX + 1, width, (height - 1), offsetX, offsetY);
|
2009-02-22 23:15:48 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|