Merge pull request #8828 from stenzek/gles-readpixels
FramebufferManager: Copy to color format for depth readbacks on GLES
This commit is contained in:
commit
68706973d2
|
@ -92,6 +92,7 @@ void VideoBackend::FillBackendInfo()
|
||||||
g_Config.backend_info.bSupportsGPUTextureDecoding = true;
|
g_Config.backend_info.bSupportsGPUTextureDecoding = true;
|
||||||
g_Config.backend_info.bSupportsCopyToVram = true;
|
g_Config.backend_info.bSupportsCopyToVram = true;
|
||||||
g_Config.backend_info.bSupportsLargePoints = false;
|
g_Config.backend_info.bSupportsLargePoints = false;
|
||||||
|
g_Config.backend_info.bSupportsDepthReadback = true;
|
||||||
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
||||||
g_Config.backend_info.bSupportsBitfield = false;
|
g_Config.backend_info.bSupportsBitfield = false;
|
||||||
g_Config.backend_info.bSupportsDynamicSamplerIndexing = false;
|
g_Config.backend_info.bSupportsDynamicSamplerIndexing = false;
|
||||||
|
|
|
@ -77,6 +77,7 @@ void VideoBackend::FillBackendInfo()
|
||||||
g_Config.backend_info.bSupportsFramebufferFetch = false;
|
g_Config.backend_info.bSupportsFramebufferFetch = false;
|
||||||
g_Config.backend_info.bSupportsBackgroundCompiling = true;
|
g_Config.backend_info.bSupportsBackgroundCompiling = true;
|
||||||
g_Config.backend_info.bSupportsLargePoints = false;
|
g_Config.backend_info.bSupportsLargePoints = false;
|
||||||
|
g_Config.backend_info.bSupportsDepthReadback = true;
|
||||||
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
||||||
g_Config.backend_info.Adapters = D3DCommon::GetAdapterNames();
|
g_Config.backend_info.Adapters = D3DCommon::GetAdapterNames();
|
||||||
g_Config.backend_info.AAModes = DXContext::GetAAModes(g_Config.iAdapter);
|
g_Config.backend_info.AAModes = DXContext::GetAAModes(g_Config.iAdapter);
|
||||||
|
|
|
@ -52,6 +52,7 @@ void VideoBackend::InitBackendInfo()
|
||||||
g_Config.backend_info.bSupportsBackgroundCompiling = false;
|
g_Config.backend_info.bSupportsBackgroundCompiling = false;
|
||||||
g_Config.backend_info.bSupportsLogicOp = false;
|
g_Config.backend_info.bSupportsLogicOp = false;
|
||||||
g_Config.backend_info.bSupportsLargePoints = false;
|
g_Config.backend_info.bSupportsLargePoints = false;
|
||||||
|
g_Config.backend_info.bSupportsDepthReadback = false;
|
||||||
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
||||||
g_Config.backend_info.bSupportsShaderBinaries = false;
|
g_Config.backend_info.bSupportsShaderBinaries = false;
|
||||||
g_Config.backend_info.bSupportsPipelineCacheData = false;
|
g_Config.backend_info.bSupportsPipelineCacheData = false;
|
||||||
|
|
|
@ -521,6 +521,10 @@ Renderer::Renderer(std::unique_ptr<GLContext> main_gl_context, float backbuffer_
|
||||||
// GLES does not support logic op.
|
// GLES does not support logic op.
|
||||||
g_Config.backend_info.bSupportsLogicOp = false;
|
g_Config.backend_info.bSupportsLogicOp = false;
|
||||||
|
|
||||||
|
// glReadPixels() can't be used with non-color formats. But, if we support
|
||||||
|
// ARB_get_texture_sub_image (unlikely, except maybe on NVIDIA), we can use that instead.
|
||||||
|
g_Config.backend_info.bSupportsDepthReadback = g_ogl_config.bSupportsTextureSubImage;
|
||||||
|
|
||||||
if (GLExtensions::Supports("GL_EXT_shader_framebuffer_fetch"))
|
if (GLExtensions::Supports("GL_EXT_shader_framebuffer_fetch"))
|
||||||
{
|
{
|
||||||
g_ogl_config.SupportedFramebufferFetch = EsFbFetchType::FbFetchExt;
|
g_ogl_config.SupportedFramebufferFetch = EsFbFetchType::FbFetchExt;
|
||||||
|
|
|
@ -89,6 +89,7 @@ void VideoBackend::InitBackendInfo()
|
||||||
g_Config.backend_info.bSupportsMultithreading = false;
|
g_Config.backend_info.bSupportsMultithreading = false;
|
||||||
g_Config.backend_info.bSupportsCopyToVram = true;
|
g_Config.backend_info.bSupportsCopyToVram = true;
|
||||||
g_Config.backend_info.bSupportsLargePoints = true;
|
g_Config.backend_info.bSupportsLargePoints = true;
|
||||||
|
g_Config.backend_info.bSupportsDepthReadback = true;
|
||||||
g_Config.backend_info.bSupportsPartialDepthCopies = true;
|
g_Config.backend_info.bSupportsPartialDepthCopies = true;
|
||||||
g_Config.backend_info.bSupportsShaderBinaries = false;
|
g_Config.backend_info.bSupportsShaderBinaries = false;
|
||||||
g_Config.backend_info.bSupportsPipelineCacheData = false;
|
g_Config.backend_info.bSupportsPipelineCacheData = false;
|
||||||
|
|
|
@ -77,6 +77,7 @@ void VideoSoftware::InitBackendInfo()
|
||||||
g_Config.backend_info.bSupportsBPTCTextures = false;
|
g_Config.backend_info.bSupportsBPTCTextures = false;
|
||||||
g_Config.backend_info.bSupportsCopyToVram = false;
|
g_Config.backend_info.bSupportsCopyToVram = false;
|
||||||
g_Config.backend_info.bSupportsLargePoints = false;
|
g_Config.backend_info.bSupportsLargePoints = false;
|
||||||
|
g_Config.backend_info.bSupportsDepthReadback = false;
|
||||||
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
||||||
g_Config.backend_info.bSupportsFramebufferFetch = false;
|
g_Config.backend_info.bSupportsFramebufferFetch = false;
|
||||||
g_Config.backend_info.bSupportsBackgroundCompiling = false;
|
g_Config.backend_info.bSupportsBackgroundCompiling = false;
|
||||||
|
|
|
@ -513,7 +513,8 @@ bool FramebufferManager::CreateReadbackFramebuffer()
|
||||||
|
|
||||||
// Since we can't partially copy from a depth buffer directly to the staging texture in D3D, we
|
// Since we can't partially copy from a depth buffer directly to the staging texture in D3D, we
|
||||||
// use an intermediate buffer to avoid copying the whole texture.
|
// use an intermediate buffer to avoid copying the whole texture.
|
||||||
if ((IsUsingTiledEFBCache() && !g_ActiveConfig.backend_info.bSupportsPartialDepthCopies) ||
|
if (!g_ActiveConfig.backend_info.bSupportsDepthReadback ||
|
||||||
|
(IsUsingTiledEFBCache() && !g_ActiveConfig.backend_info.bSupportsPartialDepthCopies) ||
|
||||||
!AbstractTexture::IsCompatibleDepthAndColorFormats(m_efb_depth_texture->GetFormat(),
|
!AbstractTexture::IsCompatibleDepthAndColorFormats(m_efb_depth_texture->GetFormat(),
|
||||||
GetEFBDepthCopyFormat()) ||
|
GetEFBDepthCopyFormat()) ||
|
||||||
g_renderer->GetEFBScale() != 1)
|
g_renderer->GetEFBScale() != 1)
|
||||||
|
@ -577,7 +578,8 @@ void FramebufferManager::PopulateEFBCache(bool depth, u32 tile_index)
|
||||||
// buffer directly to a staging texture (must be the whole resource).
|
// buffer directly to a staging texture (must be the whole resource).
|
||||||
const bool force_intermediate_copy =
|
const bool force_intermediate_copy =
|
||||||
depth &&
|
depth &&
|
||||||
((!g_ActiveConfig.backend_info.bSupportsPartialDepthCopies && IsUsingTiledEFBCache()) ||
|
(!g_ActiveConfig.backend_info.bSupportsDepthReadback ||
|
||||||
|
(!g_ActiveConfig.backend_info.bSupportsPartialDepthCopies && IsUsingTiledEFBCache()) ||
|
||||||
!AbstractTexture::IsCompatibleDepthAndColorFormats(m_efb_depth_texture->GetFormat(),
|
!AbstractTexture::IsCompatibleDepthAndColorFormats(m_efb_depth_texture->GetFormat(),
|
||||||
GetEFBDepthCopyFormat()));
|
GetEFBDepthCopyFormat()));
|
||||||
|
|
||||||
|
|
|
@ -229,6 +229,7 @@ struct VideoConfig final
|
||||||
bool bSupportsBackgroundCompiling;
|
bool bSupportsBackgroundCompiling;
|
||||||
bool bSupportsLargePoints;
|
bool bSupportsLargePoints;
|
||||||
bool bSupportsPartialDepthCopies;
|
bool bSupportsPartialDepthCopies;
|
||||||
|
bool bSupportsDepthReadback;
|
||||||
bool bSupportsShaderBinaries;
|
bool bSupportsShaderBinaries;
|
||||||
bool bSupportsPipelineCacheData;
|
bool bSupportsPipelineCacheData;
|
||||||
} backend_info;
|
} backend_info;
|
||||||
|
|
Loading…
Reference in New Issue