GPU: 24-bit display depth support

This commit is contained in:
Connor McLaughlin
2019-10-05 12:31:48 +10:00
parent 64aa3f56c3
commit c2baa7e834
4 changed files with 104 additions and 5 deletions

View File

@ -378,6 +378,68 @@ void main()
return ss.str();
}
std::string GPU_HW::GenerateRGB24DecodeFragmentShader()
{
std::stringstream ss;
GenerateShaderHeader(ss);
ss << R"(
in vec2 v_tex0;
out vec4 o_col0;
uniform sampler2D samp0;
uniform ivec2 u_base_coords;
void main()
{
// compute offset in dwords from the start of the 24-bit values
ivec2 base = ivec2(u_base_coords.x, u_base_coords.y + int(gl_FragCoord.y));
int xoff = int(gl_FragCoord.x);
int dword_index = (xoff / 2) + (xoff / 4);
// sample two adjacent dwords, or four 16-bit values as the 24-bit value will lie somewhere between these
uint s0 = RGBA8ToRGBA5551(texelFetch(samp0, ivec2(base.x + dword_index * 2 + 0, base.y), 0));
uint s1 = RGBA8ToRGBA5551(texelFetch(samp0, ivec2(base.x + dword_index * 2 + 1, base.y), 0));
uint s2 = RGBA8ToRGBA5551(texelFetch(samp0, ivec2(base.x + (dword_index + 1) * 2 + 0, base.y), 0));
uint s3 = RGBA8ToRGBA5551(texelFetch(samp0, ivec2(base.x + (dword_index + 1) * 2 + 1, base.y), 0));
// select the bit for this pixel depending on its offset in the 4-pixel block
uint r, g, b;
switch (xoff & 3)
{
case 0:
r = s0 & 0xFFu;
g = s0 >> 8;
b = s1 & 0xFFu;
break;
case 1:
r = s1 >> 8;
g = s2 & 0xFFu;
b = s2 >> 8;
break;
case 2:
r = s1 & 0xFFu;
g = s1 >> 8;
b = s2 & 0xFFu;
break;
case 3:
r = s2 >> 8;
g = s3 & 0xFFu;
b = s3 >> 8;
break;
}
// and normalize
o_col0 = vec4(float(r) / 255.0, float(g) / 255.0, float(b) / 255, 1.0);
}
)";
return ss.str();
}
GPU_HW::HWRenderBatch::Primitive GPU_HW::GetPrimitiveForCommand(RenderCommand rc)
{
if (rc.primitive == Primitive::Line)