From 05d60f4fef5fb7377ed1f2f905b48e93926501b3 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 20 May 2015 13:48:16 +0200 Subject: Revert "OGL: Change the depth buffer type to GL_FLOAT." This reverts commit 4b2e04b862ef0e5166f1c855148a44bc7c88f381. --- Source/Core/VideoBackends/OGL/Render.cpp | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 1b13595386..b66e10d0cf 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -916,7 +916,7 @@ void ClearEFBCache() } } -void Renderer::UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const void* data) +void Renderer::UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const u32* data) { u32 cacheType = (type == PEEK_Z ? 0 : 1); @@ -938,18 +938,7 @@ void Renderer::UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRec u32 xEFB = efbPixelRc.left + xCache; u32 xPixel = (EFBToScaledX(xEFB) + EFBToScaledX(xEFB + 1)) / 2; u32 xData = xPixel - targetPixelRc.left; - u32 value; - if (type == PEEK_Z) - { - float* ptr = (float*)data; - value = MathUtil::Clamp((u32)(ptr[yData * targetPixelRcWidth + xData] * 16777216.0f), 0, 0xFFFFFF); - } - else - { - u32* ptr = (u32*)data; - value = ptr[yData * targetPixelRcWidth + xData]; - } - s_efbCache[cacheType][cacheRectIdx][yCache * EFB_CACHE_RECT_SIZE + xCache] = value; + s_efbCache[cacheType][cacheRectIdx][yCache * EFB_CACHE_RECT_SIZE + xCache] = data[yData * targetPixelRcWidth + xData]; } } @@ -1016,10 +1005,10 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) g_renderer->RestoreAPIState(); } - std::unique_ptr depthMap(new float[targetPixelRcWidth * targetPixelRcHeight]); + std::unique_ptr depthMap(new u32[targetPixelRcWidth * targetPixelRcHeight]); glReadPixels(targetPixelRc.left, targetPixelRc.bottom, targetPixelRcWidth, targetPixelRcHeight, - GL_DEPTH_COMPONENT, GL_FLOAT, depthMap.get()); + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, depthMap.get()); UpdateEFBCache(type, cacheRectIdx, efbPixelRc, targetPixelRc, depthMap.get()); } @@ -1028,10 +1017,18 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) u32 yRect = y % EFB_CACHE_RECT_SIZE; u32 z = s_efbCache[0][cacheRectIdx][yRect * EFB_CACHE_RECT_SIZE + xRect]; - // if Z is in 16 bit format you must return a 16 bit integer + // Scale the 32-bit value returned by glReadPixels to a 24-bit + // value (GC uses a 24-bit Z-buffer). + // TODO: in RE0 this value is often off by one, which causes lighting to disappear if (bpmem.zcontrol.pixel_format == PEControl::RGB565_Z16) + { + // if Z is in 16 bit format you must return a 16 bit integer + z = z >> 16; + } + else + { z = z >> 8; - + } return z; } -- cgit v1.2.3 From 05f42f94a0442fef64c994cb78f4d621bb1fc7ff Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 20 May 2015 13:48:34 +0200 Subject: OGL: Use floating point arithmetic to scale the depth value. --- Source/Core/VideoBackends/OGL/Render.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index b66e10d0cf..4f6fcdcffc 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -1019,17 +1019,18 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) // Scale the 32-bit value returned by glReadPixels to a 24-bit // value (GC uses a 24-bit Z-buffer). - // TODO: in RE0 this value is often off by one, which causes lighting to disappear + float val = z / float(0xFFFFFFFF); + u32 ret = 0; if (bpmem.zcontrol.pixel_format == PEControl::RGB565_Z16) { // if Z is in 16 bit format you must return a 16 bit integer - z = z >> 16; + ret = MathUtil::Clamp((u32)(val * 65536.0f), 0, 0xFFFF); } else { - z = z >> 8; + ret = MathUtil::Clamp((u32)(val * 16777216.0f), 0, 0xFFFFFF); } - return z; + return ret; } case PEEK_COLOR: // GXPeekARGB -- cgit v1.2.3