Merge pull request #2541 from Armada651/revert-revert
Revert "Revert "OGL: Switch depth buffers to GL_DEPTH_COMPONENT32F format.""
This commit is contained in:
commit
b0afb08170
|
@ -91,7 +91,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
|||
|
||||
glBindTexture(m_textureType, m_efbDepth);
|
||||
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||
glTexImage3D(m_textureType, 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
glTexImage3D(m_textureType, 0, GL_DEPTH_COMPONENT32F, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
|
||||
|
||||
glBindTexture(m_textureType, m_efbColorSwap);
|
||||
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||
|
@ -111,7 +111,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
|||
glTexImage3DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, m_EFBLayers, false);
|
||||
|
||||
glBindTexture(m_textureType, m_efbDepth);
|
||||
glTexImage3DMultisample(m_textureType, m_msaaSamples, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, m_EFBLayers, false);
|
||||
glTexImage3DMultisample(m_textureType, m_msaaSamples, GL_DEPTH_COMPONENT32F, m_targetWidth, m_targetHeight, m_EFBLayers, false);
|
||||
|
||||
glBindTexture(m_textureType, m_efbColorSwap);
|
||||
glTexImage3DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, m_EFBLayers, false);
|
||||
|
@ -125,7 +125,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
|||
glTexImage2DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, false);
|
||||
|
||||
glBindTexture(m_textureType, m_efbDepth);
|
||||
glTexImage2DMultisample(m_textureType, m_msaaSamples, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, false);
|
||||
glTexImage2DMultisample(m_textureType, m_msaaSamples, GL_DEPTH_COMPONENT32F, m_targetWidth, m_targetHeight, false);
|
||||
|
||||
glBindTexture(m_textureType, m_efbColorSwap);
|
||||
glTexImage2DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, false);
|
||||
|
@ -146,7 +146,7 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
|||
|
||||
glBindTexture(resolvedType, m_resolvedDepthTexture);
|
||||
glTexParameteri(resolvedType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||
glTexImage3D(resolvedType, 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
glTexImage3D(resolvedType, 0, GL_DEPTH_COMPONENT32F, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
|
||||
|
||||
// Bind resolved textures to resolved framebuffer.
|
||||
glGenFramebuffers(m_EFBLayers, m_resolvedFramebuffer);
|
||||
|
|
|
@ -920,7 +920,7 @@ void ClearEFBCache()
|
|||
}
|
||||
}
|
||||
|
||||
void Renderer::UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const u32* data)
|
||||
void Renderer::UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const void* data)
|
||||
{
|
||||
u32 cacheType = (type == PEEK_Z ? 0 : 1);
|
||||
|
||||
|
@ -942,7 +942,18 @@ 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;
|
||||
s_efbCache[cacheType][cacheRectIdx][yCache * EFB_CACHE_RECT_SIZE + xCache] = data[yData * targetPixelRcWidth + xData];
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1009,10 +1020,10 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
|
|||
g_renderer->RestoreAPIState();
|
||||
}
|
||||
|
||||
std::unique_ptr<u32> depthMap(new u32[targetPixelRcWidth * targetPixelRcHeight]);
|
||||
std::unique_ptr<float> depthMap(new float[targetPixelRcWidth * targetPixelRcHeight]);
|
||||
|
||||
glReadPixels(targetPixelRc.left, targetPixelRc.bottom, targetPixelRcWidth, targetPixelRcHeight,
|
||||
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, depthMap.get());
|
||||
GL_DEPTH_COMPONENT, GL_FLOAT, depthMap.get());
|
||||
|
||||
UpdateEFBCache(type, cacheRectIdx, efbPixelRc, targetPixelRc, depthMap.get());
|
||||
}
|
||||
|
@ -1021,20 +1032,11 @@ 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];
|
||||
|
||||
// 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 Z is in 16 bit format you must return a 16 bit integer
|
||||
if (bpmem.zcontrol.pixel_format == PEControl::RGB565_Z16)
|
||||
{
|
||||
// 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;
|
||||
z = z >> 8;
|
||||
|
||||
return z;
|
||||
}
|
||||
|
||||
case PEEK_COLOR: // GXPeekARGB
|
||||
|
|
|
@ -96,7 +96,7 @@ public:
|
|||
int GetMaxTextureSize() override;
|
||||
|
||||
private:
|
||||
void UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const u32* data);
|
||||
void UpdateEFBCache(EFBAccessType type, u32 cacheRectIdx, const EFBRectangle& efbPixelRc, const TargetRectangle& targetPixelRc, const void* data);
|
||||
|
||||
void BlitScreen(TargetRectangle src, TargetRectangle dst, GLuint src_texture, int src_width, int src_height);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue