mirror of https://github.com/PCSX2/pcsx2.git
gsdx ogl: add a Tales of Abyss HLE shader
Again fast and efficient but it relies on CRC v2: forget to update the precompiled shader...
This commit is contained in:
parent
d5681ba01c
commit
d41613c46a
|
@ -767,7 +767,8 @@ GLuint GSDeviceOGL::CompilePS(PSSelector sel)
|
||||||
+ format("#define PS_DFMT %d\n", sel.dfmt)
|
+ format("#define PS_DFMT %d\n", sel.dfmt)
|
||||||
+ format("#define PS_DEPTH_FMT %d\n", sel.depth_fmt)
|
+ format("#define PS_DEPTH_FMT %d\n", sel.depth_fmt)
|
||||||
+ format("#define PS_CHANNEL_FETCH %d\n", sel.channel)
|
+ format("#define PS_CHANNEL_FETCH %d\n", sel.channel)
|
||||||
+ format("#define PS_URBAN_CHAOS_HACK %d\n", sel.urban_chaos_hack)
|
+ format("#define PS_URBAN_CHAOS_HLE %d\n", sel.urban_chaos_hle)
|
||||||
|
+ format("#define PS_TALES_OF_ABYSS_HLE %d\n", sel.tales_of_abyss_hle)
|
||||||
+ format("#define PS_AEM %d\n", sel.aem)
|
+ format("#define PS_AEM %d\n", sel.aem)
|
||||||
+ format("#define PS_TFX %d\n", sel.tfx)
|
+ format("#define PS_TFX %d\n", sel.tfx)
|
||||||
+ format("#define PS_TCC %d\n", sel.tcc)
|
+ format("#define PS_TCC %d\n", sel.tcc)
|
||||||
|
|
|
@ -289,9 +289,10 @@ class GSDeviceOGL final : public GSDevice
|
||||||
|
|
||||||
// Hack
|
// Hack
|
||||||
uint32 tcoffsethack:1;
|
uint32 tcoffsethack:1;
|
||||||
uint32 urban_chaos_hack:1;
|
uint32 urban_chaos_hle:1;
|
||||||
|
uint32 tales_of_abyss_hle:1;
|
||||||
|
|
||||||
uint32 _free2:15;
|
uint32 _free2:14;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint64 key;
|
uint64 key;
|
||||||
|
|
|
@ -678,6 +678,14 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
|
||||||
ps_sel.channel = 7;
|
ps_sel.channel = 7;
|
||||||
m_context->TEX0.TFX = TFX_DECAL;
|
m_context->TEX0.TFX = TFX_DECAL;
|
||||||
rt = tex->m_from_target;
|
rt = tex->m_from_target;
|
||||||
|
} else if ((tex->m_texture->GetType() == GSTexture::DepthStencil) && !(tex->m_32_bits_fmt)) {
|
||||||
|
if (m_game.title == CRC::TalesOfAbyss) {
|
||||||
|
GL_INS("Tales Of Abyss Crazyness (MSB 16b depth to Alpha)");
|
||||||
|
ps_sel.tales_of_abyss_hle = 1;
|
||||||
|
} else {
|
||||||
|
GL_INS("Urban Chaos Crazyness (Green extraction)");
|
||||||
|
ps_sel.urban_chaos_hle = 1;
|
||||||
|
}
|
||||||
} else if (m_context->CLAMP.WMS == 3 && ((m_context->CLAMP.MAXU & 0x8) == 8)) {
|
} else if (m_context->CLAMP.WMS == 3 && ((m_context->CLAMP.MAXU & 0x8) == 8)) {
|
||||||
// Read either blue or Alpha. Let's go for Blue ;)
|
// Read either blue or Alpha. Let's go for Blue ;)
|
||||||
// MGS3/Kill Zone
|
// MGS3/Kill Zone
|
||||||
|
@ -688,9 +696,6 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
|
||||||
// Pop
|
// Pop
|
||||||
GL_INS("Red channel");
|
GL_INS("Red channel");
|
||||||
ps_sel.channel = 1;
|
ps_sel.channel = 1;
|
||||||
} else if ((tex->m_texture->GetType() == GSTexture::DepthStencil) && !(tex->m_32_bits_fmt)) {
|
|
||||||
GL_INS("Urban Chaos Crazyness");
|
|
||||||
ps_sel.urban_chaos_hack = 1;
|
|
||||||
} else {
|
} else {
|
||||||
GL_INS("channel not supported");
|
GL_INS("channel not supported");
|
||||||
m_channel_shuffle = false;
|
m_channel_shuffle = false;
|
||||||
|
|
|
@ -235,7 +235,14 @@ vec4 sample_depth(vec2 st)
|
||||||
ivec2 uv = ivec2(uv_f);
|
ivec2 uv = ivec2(uv_f);
|
||||||
|
|
||||||
vec4 t;
|
vec4 t;
|
||||||
#if PS_URBAN_CHAOS_HACK == 1
|
#if PS_TALES_OF_ABYSS_HLE == 1
|
||||||
|
// Warning: UV can't be used in channel effect
|
||||||
|
int depth = fetch_raw_depth();
|
||||||
|
|
||||||
|
// Convert msb based on the palette
|
||||||
|
t = texelFetch(PaletteSampler, ivec2((depth >> 8) & 0xFF, 0), 0) * 255.0f;
|
||||||
|
|
||||||
|
#elif PS_URBAN_CHAOS_HLE == 1
|
||||||
// Depth buffer is read as a RGB5A1 texture. The game try to extract the green channel.
|
// Depth buffer is read as a RGB5A1 texture. The game try to extract the green channel.
|
||||||
// So it will do a first channel trick to extract lsb, value is right-shifted.
|
// So it will do a first channel trick to extract lsb, value is right-shifted.
|
||||||
// Then a new channel trick to extract msb which will shifted to the left.
|
// Then a new channel trick to extract msb which will shifted to the left.
|
||||||
|
|
|
@ -1079,7 +1079,14 @@ static const char* const tfx_fs_all_glsl =
|
||||||
" ivec2 uv = ivec2(uv_f);\n"
|
" ivec2 uv = ivec2(uv_f);\n"
|
||||||
"\n"
|
"\n"
|
||||||
" vec4 t;\n"
|
" vec4 t;\n"
|
||||||
"#if PS_URBAN_CHAOS_HACK == 1\n"
|
"#if PS_TALES_OF_ABYSS_HLE == 1\n"
|
||||||
|
" // Warning: UV can't be used in channel effect\n"
|
||||||
|
" int depth = fetch_raw_depth();\n"
|
||||||
|
"\n"
|
||||||
|
" // Convert msb based on the palette\n"
|
||||||
|
" t = texelFetch(PaletteSampler, ivec2((depth >> 8) & 0xFF, 0), 0) * 255.0f;\n"
|
||||||
|
"\n"
|
||||||
|
"#elif PS_URBAN_CHAOS_HLE == 1\n"
|
||||||
" // Depth buffer is read as a RGB5A1 texture. The game try to extract the green channel.\n"
|
" // Depth buffer is read as a RGB5A1 texture. The game try to extract the green channel.\n"
|
||||||
" // So it will do a first channel trick to extract lsb, value is right-shifted.\n"
|
" // So it will do a first channel trick to extract lsb, value is right-shifted.\n"
|
||||||
" // Then a new channel trick to extract msb which will shifted to the left.\n"
|
" // Then a new channel trick to extract msb which will shifted to the left.\n"
|
||||||
|
|
Loading…
Reference in New Issue