mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
Add floating point version of reinterpret shaders
This commit is contained in:
1 parent
99404f0a15
commit
048a556ada
3 files changed
+39
-8
No files matched your search
@@ -687,7 +687,7 @@ void FramebufferManagerCommon::CopyToColorFromOverlappingFramebuffers(VirtualFra
|
||||
pipeline = Get2DPipeline(DRAW2D_COPY_COLOR);
|
||||
pass_name = "copy_color";
|
||||
} else if (IsBufferFormat16Bit(src->fb_format) && IsBufferFormat16Bit(dst->fb_format)) {
|
||||
if (PSP_CoreParameter().compat.flags().ReinterpretFramebuffers && draw_->GetDeviceCaps().fragmentShaderInt32Supported) {
|
||||
if (PSP_CoreParameter().compat.flags().ReinterpretFramebuffers) {
|
||||
if (PSP_CoreParameter().compat.flags().BlueToAlpha) {
|
||||
WARN_LOG_ONCE(bta, G3D, "WARNING: Reinterpret encountered with BlueToAlpha on");
|
||||
}
|
||||
|
||||
@@ -65,8 +65,44 @@ Draw2DPipelineInfo GenerateReinterpretFragmentShader(ShaderWriter &writer, GEBuf
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// TODO
|
||||
writer.C("outColor = vec4(1.0, 0.0, 1.0, 1.0);\n");
|
||||
// Floating point can comfortably represent integers up to 16 million, we only need 65536 since these textures are 16-bit.
|
||||
switch (from) {
|
||||
case GE_FORMAT_4444:
|
||||
writer.C(" float color = (floor(val.r * 15.99) + floor(val.g * 15.99) * 16.0) + (floor(val.b * 15.99) * 256.0 + floor(val.a * 15.99) * 4096.0);\n");
|
||||
break;
|
||||
case GE_FORMAT_5551:
|
||||
writer.C(" float color = floor(val.r * 31.99) + floor(val.g * 31.99) * 32.0 + floor(val.b * 31.99) * 1024.0;\n");
|
||||
writer.C(" if (val.a >= 0.5) color += 32768.0;\n");
|
||||
break;
|
||||
case GE_FORMAT_565:
|
||||
writer.C(" float color = floor(val.r * 31.99) + floor(val.g * 63.99) * 32.0 + floor(val.b * 31.99) * 2048.0;\n");
|
||||
break;
|
||||
default:
|
||||
_assert_(false);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (to) {
|
||||
case GE_FORMAT_4444:
|
||||
writer.C(" vec4 outColor = vec4(mod(floor(color), 16.0), mod(floor(color / 16.0), 16.0),");
|
||||
writer.C(" mod(floor(color / 256.0), 16.0), mod(floor(color / 4096.0), 16.0)); \n");
|
||||
writer.C(" outColor *= 1.0 / 15.0;\n");
|
||||
break;
|
||||
case GE_FORMAT_5551:
|
||||
writer.C(" vec4 outColor = vec4(mod(floor(color), 32.0), mod(floor(color / 32.0), 32.0), mod(floor(color / 1024.0), 32.0), 0.0);\n");
|
||||
writer.C(" outColor.rgb *= 1.0 / 31.0;\n");
|
||||
writer.C(" outColor.a = floor(color / 32768.0);\n");
|
||||
break;
|
||||
case GE_FORMAT_565:
|
||||
writer.C(" vec4 outColor = vec4(mod(floor(color), 32.0), mod(floor(color / 32.0), 64.0), mod(floor(color / 2048.0), 32.0), 0.0);\n");
|
||||
writer.C(" outColor.rb *= 1.0 / 31.0;\n");
|
||||
writer.C(" outColor.g *= 1.0 / 63.0;\n");
|
||||
writer.C(" outColor.a = 1.0;\n");
|
||||
break;
|
||||
default:
|
||||
_assert_(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
writer.EndFSMain("outColor", FSFLAG_NONE);
|
||||
|
||||
@@ -185,11 +185,6 @@ bool TestReinterpretShaders() {
|
||||
|
||||
ShaderLanguageDesc desc(languages[k]);
|
||||
|
||||
// These require bitwise operations.
|
||||
if (!desc.bitwiseOps) {
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string errorMessage;
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
|
||||
Reference in new issue
Block a user