Enables stereo rendering with OpenGL ES 3.1 + AEP.

If the host device supports GLES 3.1 and AEP we can have stereo rendering.
Just need to make sure to grab the correct function pointer that GL_EXT_geometry_shader provides, and enable AEP in the shaders.

We can't just check if AEP is in the extension list for support because Qualcomm has failed once more.
With the Nexus 6 it reports support for AEP but doesn't support OpenGL ES 3.1, which is an impossible combination.
From reports on their forum it seems that attempting to use any AEP things results in nothing happening, seems like a stub implementation.
This commit is contained in:
Ryan Houdek 2014-12-07 05:29:36 +00:00
parent 40f2333145
commit ce7c52eca0
4 changed files with 14 additions and 2 deletions

View File

@ -1576,6 +1576,9 @@ const GLFunc gl_function_array[] =
// ARB_buffer_storage // ARB_buffer_storage
GLFUNC_REQUIRES(glBufferStorage, "GL_ARB_buffer_storage"), GLFUNC_REQUIRES(glBufferStorage, "GL_ARB_buffer_storage"),
GLFUNC_REQUIRES(glNamedBufferStorageEXT, "GL_ARB_buffer_storage GL_EXT_direct_state_access"), GLFUNC_REQUIRES(glNamedBufferStorageEXT, "GL_ARB_buffer_storage GL_EXT_direct_state_access"),
// EXT_geometry_shader
GLFUNC_SUFFIX(glFramebufferTexture, EXT, "GL_EXT_geometry_shader !VERSION_3_2"),
}; };
namespace GLExtensions namespace GLExtensions

View File

@ -505,6 +505,7 @@ void ProgramShaderCache::Shutdown()
void ProgramShaderCache::CreateHeader() void ProgramShaderCache::CreateHeader()
{ {
GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion;
snprintf(s_glsl_header, sizeof(s_glsl_header), snprintf(s_glsl_header, sizeof(s_glsl_header),
"%s\n" "%s\n"
"%s\n" // ubo "%s\n" // ubo
@ -515,6 +516,7 @@ void ProgramShaderCache::CreateHeader()
"%s\n" // Sampler binding "%s\n" // Sampler binding
"%s\n" // storage buffer "%s\n" // storage buffer
"%s\n" // shader5 "%s\n" // shader5
"%s\n" // AEP
// Precision defines for GLSL ES // Precision defines for GLSL ES
"%s\n" "%s\n"
@ -549,6 +551,7 @@ void ProgramShaderCache::CreateHeader()
, g_ActiveConfig.backend_info.bSupportsBindingLayout ? "#define SAMPLER_BINDING(x) layout(binding = x)" : "#define SAMPLER_BINDING(x)" , g_ActiveConfig.backend_info.bSupportsBindingLayout ? "#define SAMPLER_BINDING(x) layout(binding = x)" : "#define SAMPLER_BINDING(x)"
, g_ActiveConfig.backend_info.bSupportsBBox ? "#extension GL_ARB_shader_storage_buffer_object : enable" : "" , g_ActiveConfig.backend_info.bSupportsBBox ? "#extension GL_ARB_shader_storage_buffer_object : enable" : ""
, g_ActiveConfig.backend_info.bSupportsGSInstancing ? "#extension GL_ARB_gpu_shader5 : enable" : "" , g_ActiveConfig.backend_info.bSupportsGSInstancing ? "#extension GL_ARB_gpu_shader5 : enable" : ""
, g_ogl_config.bSupportsAEP ? "#extension GL_ANDROID_extension_pack_es31a : enable" : ""
, v>=GLSLES_300 ? "precision highp float;" : "" , v>=GLSLES_300 ? "precision highp float;" : ""
, v>=GLSLES_300 ? "precision highp int;" : "" , v>=GLSLES_300 ? "precision highp int;" : ""

View File

@ -497,15 +497,17 @@ Renderer::Renderer()
if (strstr(g_ogl_config.glsl_version, "3.0")) if (strstr(g_ogl_config.glsl_version, "3.0"))
{ {
g_ogl_config.eSupportedGLSLVersion = GLSLES_300; g_ogl_config.eSupportedGLSLVersion = GLSLES_300;
g_ogl_config.bSupportsAEP = false;
g_Config.backend_info.bSupportsStereoscopy = false;
} }
else else
{ {
g_ogl_config.eSupportedGLSLVersion = GLSLES_310; g_ogl_config.eSupportedGLSLVersion = GLSLES_310;
g_ogl_config.bSupportsAEP = GLExtensions::Supports("GL_ANDROID_extension_pack_es31a");
g_Config.backend_info.bSupportsBindingLayout = true; g_Config.backend_info.bSupportsBindingLayout = true;
g_Config.backend_info.bSupportsEarlyZ = true; g_Config.backend_info.bSupportsEarlyZ = true;
g_Config.backend_info.bSupportsStereoscopy = g_ogl_config.bSupportsAEP;
} }
// TODO: OpenGL ES 3.1 provides the necessary features as extensions.
g_Config.backend_info.bSupportsStereoscopy = false;
} }
else else
{ {
@ -532,6 +534,9 @@ Renderer::Renderer()
{ {
g_ogl_config.eSupportedGLSLVersion = GLSL_150; g_ogl_config.eSupportedGLSLVersion = GLSL_150;
} }
// Desktop OpenGL can't have the Android Extension Pack
g_ogl_config.bSupportsAEP = false;
} }
if (GLExtensions::Supports("GL_KHR_debug")) if (GLExtensions::Supports("GL_KHR_debug"))

View File

@ -30,6 +30,7 @@ struct VideoConfig
GLSL_VERSION eSupportedGLSLVersion; GLSL_VERSION eSupportedGLSLVersion;
bool bSupportOGL31; bool bSupportOGL31;
bool bSupportViewportFloat; bool bSupportViewportFloat;
bool bSupportsAEP;
const char* gl_vendor; const char* gl_vendor;
const char* gl_renderer; const char* gl_renderer;