OGL: Use GL_OES_texture_storage_multisample_2d_array when supported
See https://bugs.dolphin-emu.org/issues/13198
This commit is contained in:
parent
3f143d1bc9
commit
8b0bd31e72
|
@ -333,6 +333,7 @@ bool PopulateConfig(GLContext* m_main_gl_context)
|
|||
g_ogl_config.bSupportsDebug =
|
||||
GLExtensions::Supports("GL_KHR_debug") || GLExtensions::Supports("GL_ARB_debug_output");
|
||||
g_ogl_config.bSupportsTextureStorage = GLExtensions::Supports("GL_ARB_texture_storage");
|
||||
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageNone;
|
||||
g_ogl_config.bSupportsImageLoadStore = GLExtensions::Supports("GL_ARB_shader_image_load_store");
|
||||
g_ogl_config.bSupportsConservativeDepth = GLExtensions::Supports("GL_ARB_conservative_depth");
|
||||
g_ogl_config.bSupportsAniso = GLExtensions::Supports("GL_EXT_texture_filter_anisotropic");
|
||||
|
@ -412,6 +413,8 @@ bool PopulateConfig(GLContext* m_main_gl_context)
|
|||
g_Config.backend_info.bSupportsFragmentStoresAndAtomics = true;
|
||||
g_ogl_config.bSupportsMSAA = true;
|
||||
g_ogl_config.bSupportsTextureStorage = true;
|
||||
if (GLExtensions::Supports("GL_OES_texture_storage_multisample_2d_array"))
|
||||
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageOes;
|
||||
g_Config.backend_info.bSupportsBitfield = true;
|
||||
g_Config.backend_info.bSupportsDynamicSamplerIndexing = g_ogl_config.bSupportsAEP;
|
||||
}
|
||||
|
@ -433,6 +436,7 @@ bool PopulateConfig(GLContext* m_main_gl_context)
|
|||
g_ogl_config.bSupportsDebug = true;
|
||||
g_ogl_config.bSupportsMSAA = true;
|
||||
g_ogl_config.bSupportsTextureStorage = true;
|
||||
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageCore;
|
||||
g_Config.backend_info.bSupportsBitfield = true;
|
||||
g_Config.backend_info.bSupportsDynamicSamplerIndexing = true;
|
||||
g_Config.backend_info.bSupportsSettingObjectNames = true;
|
||||
|
@ -440,6 +444,9 @@ bool PopulateConfig(GLContext* m_main_gl_context)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (GLExtensions::Supports("GL_ARB_texture_storage_multisample"))
|
||||
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageCore;
|
||||
|
||||
if (GLExtensions::Version() < 300)
|
||||
{
|
||||
PanicAlertFmtT("GPU: OGL ERROR: Need at least GLSL 1.30\n"
|
||||
|
@ -486,6 +493,7 @@ bool PopulateConfig(GLContext* m_main_gl_context)
|
|||
g_ogl_config.eSupportedGLSLVersion = Glsl430;
|
||||
}
|
||||
g_ogl_config.bSupportsTextureStorage = true;
|
||||
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageCore;
|
||||
g_ogl_config.bSupportsImageLoadStore = true;
|
||||
g_Config.backend_info.bSupportsSSAA = true;
|
||||
g_Config.backend_info.bSupportsSettingObjectNames = true;
|
||||
|
|
|
@ -45,6 +45,13 @@ enum class EsFbFetchType
|
|||
FbFetchArm,
|
||||
};
|
||||
|
||||
enum class MultisampleTexStorageType
|
||||
{
|
||||
TexStorageNone,
|
||||
TexStorageCore,
|
||||
TexStorageOes,
|
||||
};
|
||||
|
||||
// ogl-only config, so not in VideoConfig.h
|
||||
struct VideoConfig
|
||||
{
|
||||
|
@ -62,6 +69,7 @@ struct VideoConfig
|
|||
EsPointSizeType SupportedESPointSize;
|
||||
EsTexbufType SupportedESTextureBuffer;
|
||||
bool bSupportsTextureStorage;
|
||||
MultisampleTexStorageType SupportedMultisampleTexStorage;
|
||||
bool bSupportsConservativeDepth;
|
||||
bool bSupportsImageLoadStore;
|
||||
bool bSupportsAniso;
|
||||
|
|
|
@ -130,12 +130,18 @@ OGLTexture::OGLTexture(const TextureConfig& tex_config, std::string_view name)
|
|||
GLenum gl_internal_format = GetGLInternalFormatForTextureFormat(m_config.format, true);
|
||||
if (tex_config.IsMultisampled())
|
||||
{
|
||||
if (g_ogl_config.bSupportsTextureStorage)
|
||||
ASSERT(g_ogl_config.bSupportsMSAA);
|
||||
if (g_ogl_config.SupportedMultisampleTexStorage != MultisampleTexStorageType::TexStorageNone)
|
||||
{
|
||||
glTexStorage3DMultisample(target, tex_config.samples, gl_internal_format, m_config.width,
|
||||
m_config.height, m_config.layers, GL_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(!g_ogl_config.bIsES);
|
||||
glTexImage3DMultisample(target, tex_config.samples, gl_internal_format, m_config.width,
|
||||
m_config.height, m_config.layers, GL_FALSE);
|
||||
}
|
||||
}
|
||||
else if (g_ogl_config.bSupportsTextureStorage)
|
||||
{
|
||||
|
|
|
@ -722,8 +722,12 @@ void ProgramShaderCache::CreateHeader()
|
|||
break;
|
||||
}
|
||||
|
||||
// The sampler2DMSArray keyword is reserved in GLSL ES 3.0 and 3.1, but is available in 3.2.
|
||||
const bool use_multisample_2d_array_precision = v >= GlslEs320;
|
||||
// The sampler2DMSArray keyword is reserved in GLSL ES 3.0 and 3.1, but is available in 3.2 and
|
||||
// with GL_OES_texture_storage_multisample_2d_array for 3.1.
|
||||
// See https://bugs.dolphin-emu.org/issues/13198.
|
||||
const bool use_multisample_2d_array_precision =
|
||||
v >= GlslEs320 ||
|
||||
g_ogl_config.SupportedMultisampleTexStorage != MultisampleTexStorageType::TexStorageNone;
|
||||
|
||||
std::string shader_shuffle_string;
|
||||
if (g_ogl_config.bSupportsKHRShaderSubgroup)
|
||||
|
@ -762,6 +766,7 @@ void ProgramShaderCache::CreateHeader()
|
|||
"{}\n" // shader thread shuffle
|
||||
"{}\n" // derivative control
|
||||
"{}\n" // query levels
|
||||
"{}\n" // OES multisample texture storage
|
||||
|
||||
// Precision defines for GLSL ES
|
||||
"{}\n"
|
||||
|
@ -847,6 +852,12 @@ void ProgramShaderCache::CreateHeader()
|
|||
g_ActiveConfig.backend_info.bSupportsTextureQueryLevels ?
|
||||
"#extension GL_ARB_texture_query_levels : enable" :
|
||||
"",
|
||||
// Note: GL_ARB_texture_storage_multisample doesn't have an #extension, as it doesn't
|
||||
// need to change GLSL, but on GLES 3.1 sampler2DMSArray is a reserved keyword unless
|
||||
// the extension is enabled. Thus, we don't need to check TexStorageCore/have an ARB version.
|
||||
g_ogl_config.SupportedMultisampleTexStorage == MultisampleTexStorageType::TexStorageOes ?
|
||||
"#extension GL_OES_texture_storage_multisample_2d_array : enable" :
|
||||
"",
|
||||
is_glsles ? "precision highp float;" : "", is_glsles ? "precision highp int;" : "",
|
||||
is_glsles ? "precision highp sampler2DArray;" : "",
|
||||
(is_glsles && g_ActiveConfig.backend_info.bSupportsPaletteConversion) ?
|
||||
|
|
Loading…
Reference in New Issue