Android: Support GLES3 and hardware renderers

This commit is contained in:
Connor McLaughlin
2019-12-01 21:57:27 +10:00
parent 299ee05cd9
commit adc3a2fac1
8 changed files with 153 additions and 142 deletions

View File

@ -15,7 +15,7 @@
#if defined(Y_CPU_X64)
#if defined(Y_PLATFORM_WINDOWS)
#define ABI_WIN64 1
#elif defined(Y_PLATFORM_LINUX) || defined(Y_PLATFORM_OSX)
#elif defined(Y_PLATFORM_LINUX) || defined(Y_PLATFORM_OSX) || defined(Y_PLATFORM_ANDROID)
#define ABI_SYSV 1
#else
#error Unknown ABI.

View File

@ -22,38 +22,43 @@ static void DefineMacro(std::stringstream& ss, const char* name, bool enabled)
ss << "#define " << name << " " << BoolToUInt32(enabled) << "\n";
}
void GPU_HW_ShaderGen::SetGLSLVersionString()
{
const char* glsl_version = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION));
void GPU_HW_ShaderGen::SetGLSLVersionString() {
const char *glsl_version = reinterpret_cast<const char *>(glGetString(
GL_SHADING_LANGUAGE_VERSION));
Assert(glsl_version != nullptr);
// Skip any strings in front of the version code.
const char *glsl_version_start = glsl_version;
while (*glsl_version_start != '\0' && (*glsl_version_start < '0' || *glsl_version_start > '9'))
glsl_version_start++;
int major_version = 0, minor_version = 0;
if (std::sscanf(glsl_version, "%d.%d", &major_version, &minor_version) != 2)
if (std::sscanf(glsl_version_start, "%d.%d", &major_version, &minor_version) == 2)
{
Log_ErrorPrintf("Invalid GLSL version string: '%s'", glsl_version);
// Cap at GLSL 3.3, we're not using anything newer for now.
if (!m_glsl_es && major_version >= 4) {
major_version = 3;
minor_version = 30;
} else if (m_glsl_es && (major_version > 3 || minor_version > 20)) {
major_version = 3;
minor_version = 20;
}
}
else
{
Log_ErrorPrintf("Invalid GLSL version string: '%s' ('%s')", glsl_version, glsl_version_start);
if (m_glsl_es) {
major_version = 3;
minor_version = 0;
}
m_glsl_version_string = m_glsl_es ? "300" : "130";
return;
}
// Cap at GLSL 3.3, we're not using anything newer for now.
if (!m_glsl_es && major_version >= 4)
{
major_version = 3;
minor_version = 30;
}
else if (m_glsl_es && (major_version > 3 || minor_version > 20))
{
major_version = 3;
minor_version = 20;
}
m_glsl_version_string = "#version ";
m_glsl_version_string += std::to_string(major_version);
m_glsl_version_string += std::to_string(minor_version);
if (!m_glsl_es && major_version >= 3 && minor_version >= 3)
m_glsl_version_string += " core";
else if (m_glsl_es)
m_glsl_version_string += " es";
char buf[128];
std::snprintf(buf, sizeof(buf), "#version %d%02d %s", major_version, minor_version,
(!m_glsl_es && major_version >= 3 && minor_version >= 3) ? "core" : (m_glsl_es ? "es" : ""));
m_glsl_version_string = buf;
}
void GPU_HW_ShaderGen::WriteHeader(std::stringstream& ss)
@ -61,14 +66,12 @@ void GPU_HW_ShaderGen::WriteHeader(std::stringstream& ss)
if (m_render_api == HostDisplay::RenderAPI::OpenGL || m_render_api == HostDisplay::RenderAPI::OpenGLES)
ss << m_glsl_version_string << "\n\n";
if (m_render_api == HostDisplay::RenderAPI::OpenGL)
{
ss << "#define API_OPENGL 1\n";
}
else if (m_render_api == HostDisplay::RenderAPI::OpenGLES)
{
ss << "#define API_OPENGL_ES 1\n";
DefineMacro(ss, "API_OPENGL", m_render_api == HostDisplay::RenderAPI::OpenGL);
DefineMacro(ss, "API_OPENGL_ES", m_render_api == HostDisplay::RenderAPI::OpenGLES);
DefineMacro(ss, "API_D3D11", m_render_api == HostDisplay::RenderAPI::D3D11);
if (m_render_api == HostDisplay::RenderAPI::OpenGLES)
{
ss << "precision highp float;\n";
ss << "precision highp int;\n";
ss << "precision highp sampler2D;\n";
@ -78,10 +81,6 @@ void GPU_HW_ShaderGen::WriteHeader(std::stringstream& ss)
ss << "\n";
}
else if (m_render_api == HostDisplay::RenderAPI::D3D11)
{
ss << "#define API_D3D11 1\n";
}
if (m_glsl)
{