glsl: support channel effect on depth texture too

This commit is contained in:
Gregory Hainaut 2016-04-30 16:07:45 +02:00
parent e0581ee771
commit 5676acaef9
3 changed files with 49 additions and 8 deletions

View File

@ -129,6 +129,7 @@ GSTextureCache::Source* GSTextureCache::LookupDepthSource(const GIFRegTEX0& TEX0
src->m_texture = dst->m_texture; src->m_texture = dst->m_texture;
src->m_shared_texture = true; src->m_shared_texture = true;
src->m_target = true; // So renderer can check if a conversion is required src->m_target = true; // So renderer can check if a conversion is required
src->m_from_target = dst->m_texture; // avoid complex condition on the renderer
src->m_32_bits_fmt = dst->m_32_bits_fmt; src->m_32_bits_fmt = dst->m_32_bits_fmt;
// Insert the texture in the hash set to keep track of it. But don't bother with // Insert the texture in the hash set to keep track of it. But don't bother with

View File

@ -281,27 +281,47 @@ vec4 sample_depth(vec2 st)
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Fetch a Single Channel // Fetch a Single Channel
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
int fetch_raw_depth()
{
return int(texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0).r * exp2(32.0f));
}
vec4 fetch_raw_color()
{
return texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0);
}
vec4 fetch_red() vec4 fetch_red()
{ {
vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0); #if PS_DEPTH_FMT == 1 || PS_DEPTH_FMT == 2
int depth = (fetch_raw_depth()) & 0xFF;
vec4 rt = vec4(depth) / 255.0f;
#else
vec4 rt = fetch_raw_color();
#endif
return sample_p(rt.r) * 255.0f; return sample_p(rt.r) * 255.0f;
} }
vec4 fetch_blue() vec4 fetch_blue()
{ {
vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0); #if PS_DEPTH_FMT == 1 || PS_DEPTH_FMT == 2
int depth = (fetch_raw_depth() >> 16) & 0xFF;
vec4 rt = vec4(depth) / 255.0f;
#else
vec4 rt = fetch_raw_color();
#endif
return sample_p(rt.b) * 255.0f; return sample_p(rt.b) * 255.0f;
} }
vec4 fetch_green() vec4 fetch_green()
{ {
vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0); vec4 rt = fetch_raw_color();
return sample_p(rt.g) * 255.0f; return sample_p(rt.g) * 255.0f;
} }
vec4 fetch_alpha() vec4 fetch_alpha()
{ {
vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0); vec4 rt = fetch_raw_color();
return sample_p(rt.a) * 255.0f; return sample_p(rt.a) * 255.0f;
} }

View File

@ -1125,27 +1125,47 @@ static const char* const tfx_fs_all_glsl =
"//////////////////////////////////////////////////////////////////////\n" "//////////////////////////////////////////////////////////////////////\n"
"// Fetch a Single Channel\n" "// Fetch a Single Channel\n"
"//////////////////////////////////////////////////////////////////////\n" "//////////////////////////////////////////////////////////////////////\n"
"int fetch_raw_depth()\n"
"{\n"
" return int(texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0).r * exp2(32.0f));\n"
"}\n"
"\n"
"vec4 fetch_raw_color()\n"
"{\n"
" return texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0);\n"
"}\n"
"\n"
"vec4 fetch_red()\n" "vec4 fetch_red()\n"
"{\n" "{\n"
" vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0);\n" "#if PS_DEPTH_FMT == 1 || PS_DEPTH_FMT == 2\n"
" int depth = (fetch_raw_depth()) & 0xFF;\n"
" vec4 rt = vec4(depth) / 255.0f;\n"
"#else\n"
" vec4 rt = fetch_raw_color();\n"
"#endif\n"
" return sample_p(rt.r) * 255.0f;\n" " return sample_p(rt.r) * 255.0f;\n"
"}\n" "}\n"
"\n" "\n"
"vec4 fetch_blue()\n" "vec4 fetch_blue()\n"
"{\n" "{\n"
" vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0);\n" "#if PS_DEPTH_FMT == 1 || PS_DEPTH_FMT == 2\n"
" int depth = (fetch_raw_depth() >> 16) & 0xFF;\n"
" vec4 rt = vec4(depth) / 255.0f;\n"
"#else\n"
" vec4 rt = fetch_raw_color();\n"
"#endif\n"
" return sample_p(rt.b) * 255.0f;\n" " return sample_p(rt.b) * 255.0f;\n"
"}\n" "}\n"
"\n" "\n"
"vec4 fetch_green()\n" "vec4 fetch_green()\n"
"{\n" "{\n"
" vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0);\n" " vec4 rt = fetch_raw_color();\n"
" return sample_p(rt.g) * 255.0f;\n" " return sample_p(rt.g) * 255.0f;\n"
"}\n" "}\n"
"\n" "\n"
"vec4 fetch_alpha()\n" "vec4 fetch_alpha()\n"
"{\n" "{\n"
" vec4 rt = texelFetch(RawTextureSampler, ivec2(gl_FragCoord.xy), 0);\n" " vec4 rt = fetch_raw_color();\n"
" return sample_p(rt.a) * 255.0f;\n" " return sample_p(rt.a) * 255.0f;\n"
"}\n" "}\n"
"\n" "\n"