summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/Render.cpp
diff options
context:
space:
mode:
authorMarkus Wick <markus+github@selfnet.de>2015-05-20 18:15:05 +0200
committerMarkus Wick <markus+github@selfnet.de>2015-05-20 18:15:05 +0200
commit63ff03ee3e3acd11f13cf5f67631ea3c71a83503 (patch)
treec6b28f49b7ba24ccd353a265dc75f8db5a2329f7 /Source/Core/VideoBackends/OGL/Render.cpp
parent7b322df5300c17b2e570d02cf9b149bdba935a92 (diff)
parent05f42f94a0442fef64c994cb78f4d621bb1fc7ff (diff)
Merge pull request #2425 from Armada651/ogl-integer
Revert "OGL: Switch depth buffers to GL_DEPTH_COMPONENT32F format."
Diffstat (limited to 'Source/Core/VideoBackends/OGL/Render.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/Render.cpp36
1 files changed, 17 insertions, 19 deletions
diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp
index 1b13595386..4f6fcdcffc 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>((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<float> depthMap(new float[targetPixelRcWidth * targetPixelRcHeight]);
+ std::unique_ptr<u32> 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,11 +1017,20 @@ 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).
+ float val = z / float(0xFFFFFFFF);
+ u32 ret = 0;
if (bpmem.zcontrol.pixel_format == PEControl::RGB565_Z16)
- z = z >> 8;
-
- return z;
+ {
+ // if Z is in 16 bit format you must return a 16 bit integer
+ ret = MathUtil::Clamp<u32>((u32)(val * 65536.0f), 0, 0xFFFF);
+ }
+ else
+ {
+ ret = MathUtil::Clamp<u32>((u32)(val * 16777216.0f), 0, 0xFFFFFF);
+ }
+ return ret;
}
case PEEK_COLOR: // GXPeekARGB