OGL: Use GL_OES_texture_storage_multisample_2d_array when supported

See https://bugs.dolphin-emu.org/issues/13198
This commit is contained in:
Pokechu22 2023-03-05 22:03:26 -08:00
parent 3f143d1bc9
commit 8b0bd31e72
4 changed files with 36 additions and 3 deletions

View File

@ -333,6 +333,7 @@ bool PopulateConfig(GLContext* m_main_gl_context)
g_ogl_config.bSupportsDebug = g_ogl_config.bSupportsDebug =
GLExtensions::Supports("GL_KHR_debug") || GLExtensions::Supports("GL_ARB_debug_output"); GLExtensions::Supports("GL_KHR_debug") || GLExtensions::Supports("GL_ARB_debug_output");
g_ogl_config.bSupportsTextureStorage = GLExtensions::Supports("GL_ARB_texture_storage"); 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.bSupportsImageLoadStore = GLExtensions::Supports("GL_ARB_shader_image_load_store");
g_ogl_config.bSupportsConservativeDepth = GLExtensions::Supports("GL_ARB_conservative_depth"); g_ogl_config.bSupportsConservativeDepth = GLExtensions::Supports("GL_ARB_conservative_depth");
g_ogl_config.bSupportsAniso = GLExtensions::Supports("GL_EXT_texture_filter_anisotropic"); 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_Config.backend_info.bSupportsFragmentStoresAndAtomics = true;
g_ogl_config.bSupportsMSAA = true; g_ogl_config.bSupportsMSAA = true;
g_ogl_config.bSupportsTextureStorage = 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.bSupportsBitfield = true;
g_Config.backend_info.bSupportsDynamicSamplerIndexing = g_ogl_config.bSupportsAEP; 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.bSupportsDebug = true;
g_ogl_config.bSupportsMSAA = true; g_ogl_config.bSupportsMSAA = true;
g_ogl_config.bSupportsTextureStorage = true; g_ogl_config.bSupportsTextureStorage = true;
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageCore;
g_Config.backend_info.bSupportsBitfield = true; g_Config.backend_info.bSupportsBitfield = true;
g_Config.backend_info.bSupportsDynamicSamplerIndexing = true; g_Config.backend_info.bSupportsDynamicSamplerIndexing = true;
g_Config.backend_info.bSupportsSettingObjectNames = true; g_Config.backend_info.bSupportsSettingObjectNames = true;
@ -440,6 +444,9 @@ bool PopulateConfig(GLContext* m_main_gl_context)
} }
else else
{ {
if (GLExtensions::Supports("GL_ARB_texture_storage_multisample"))
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageCore;
if (GLExtensions::Version() < 300) if (GLExtensions::Version() < 300)
{ {
PanicAlertFmtT("GPU: OGL ERROR: Need at least GLSL 1.30\n" 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.eSupportedGLSLVersion = Glsl430;
} }
g_ogl_config.bSupportsTextureStorage = true; g_ogl_config.bSupportsTextureStorage = true;
g_ogl_config.SupportedMultisampleTexStorage = MultisampleTexStorageType::TexStorageCore;
g_ogl_config.bSupportsImageLoadStore = true; g_ogl_config.bSupportsImageLoadStore = true;
g_Config.backend_info.bSupportsSSAA = true; g_Config.backend_info.bSupportsSSAA = true;
g_Config.backend_info.bSupportsSettingObjectNames = true; g_Config.backend_info.bSupportsSettingObjectNames = true;

View File

@ -45,6 +45,13 @@ enum class EsFbFetchType
FbFetchArm, FbFetchArm,
}; };
enum class MultisampleTexStorageType
{
TexStorageNone,
TexStorageCore,
TexStorageOes,
};
// ogl-only config, so not in VideoConfig.h // ogl-only config, so not in VideoConfig.h
struct VideoConfig struct VideoConfig
{ {
@ -62,6 +69,7 @@ struct VideoConfig
EsPointSizeType SupportedESPointSize; EsPointSizeType SupportedESPointSize;
EsTexbufType SupportedESTextureBuffer; EsTexbufType SupportedESTextureBuffer;
bool bSupportsTextureStorage; bool bSupportsTextureStorage;
MultisampleTexStorageType SupportedMultisampleTexStorage;
bool bSupportsConservativeDepth; bool bSupportsConservativeDepth;
bool bSupportsImageLoadStore; bool bSupportsImageLoadStore;
bool bSupportsAniso; bool bSupportsAniso;

View File

@ -130,13 +130,19 @@ OGLTexture::OGLTexture(const TextureConfig& tex_config, std::string_view name)
GLenum gl_internal_format = GetGLInternalFormatForTextureFormat(m_config.format, true); GLenum gl_internal_format = GetGLInternalFormatForTextureFormat(m_config.format, true);
if (tex_config.IsMultisampled()) 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, glTexStorage3DMultisample(target, tex_config.samples, gl_internal_format, m_config.width,
m_config.height, m_config.layers, GL_FALSE); m_config.height, m_config.layers, GL_FALSE);
}
else else
{
ASSERT(!g_ogl_config.bIsES);
glTexImage3DMultisample(target, tex_config.samples, gl_internal_format, m_config.width, glTexImage3DMultisample(target, tex_config.samples, gl_internal_format, m_config.width,
m_config.height, m_config.layers, GL_FALSE); m_config.height, m_config.layers, GL_FALSE);
} }
}
else if (g_ogl_config.bSupportsTextureStorage) else if (g_ogl_config.bSupportsTextureStorage)
{ {
glTexStorage3D(target, m_config.levels, gl_internal_format, m_config.width, m_config.height, glTexStorage3D(target, m_config.levels, gl_internal_format, m_config.width, m_config.height,

View File

@ -722,8 +722,12 @@ void ProgramShaderCache::CreateHeader()
break; break;
} }
// The sampler2DMSArray keyword is reserved in GLSL ES 3.0 and 3.1, but is available in 3.2. // The sampler2DMSArray keyword is reserved in GLSL ES 3.0 and 3.1, but is available in 3.2 and
const bool use_multisample_2d_array_precision = v >= GlslEs320; // 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; std::string shader_shuffle_string;
if (g_ogl_config.bSupportsKHRShaderSubgroup) if (g_ogl_config.bSupportsKHRShaderSubgroup)
@ -762,6 +766,7 @@ void ProgramShaderCache::CreateHeader()
"{}\n" // shader thread shuffle "{}\n" // shader thread shuffle
"{}\n" // derivative control "{}\n" // derivative control
"{}\n" // query levels "{}\n" // query levels
"{}\n" // OES multisample texture storage
// Precision defines for GLSL ES // Precision defines for GLSL ES
"{}\n" "{}\n"
@ -847,6 +852,12 @@ void ProgramShaderCache::CreateHeader()
g_ActiveConfig.backend_info.bSupportsTextureQueryLevels ? g_ActiveConfig.backend_info.bSupportsTextureQueryLevels ?
"#extension GL_ARB_texture_query_levels : enable" : "#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 float;" : "", is_glsles ? "precision highp int;" : "",
is_glsles ? "precision highp sampler2DArray;" : "", is_glsles ? "precision highp sampler2DArray;" : "",
(is_glsles && g_ActiveConfig.backend_info.bSupportsPaletteConversion) ? (is_glsles && g_ActiveConfig.backend_info.bSupportsPaletteConversion) ?