Commit 08dcfed6 by Geoff Lang

Encapsulate GL version and standard into a struct and enum.

Change-Id: I9f51971c1bfd51424605b2687b5fd107d58c9a67 Reviewed-on: https://chromium-review.googlesource.com/273139Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/273572Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 51d4f044
//
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Version.h: Encapsulation of a GL version.
#ifndef LIBANGLE_VERSION_H_
#define LIBANGLE_VERSION_H_
#include <angle_gl.h>
namespace gl
{
struct Version
{
Version();
Version(GLuint major, GLuint minor);
GLuint major;
GLuint minor;
};
bool operator>=(const Version &a, const Version &b);
}
#include "Version.inl"
#endif // LIBANGLE_VERSION_H_
//
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Version.inl: Encapsulation of a GL version.
namespace gl
{
inline Version::Version()
: Version(0, 0)
{
}
inline Version::Version(GLuint major_, GLuint minor_)
{
major = major_;
minor = minor_;
}
inline bool operator>=(const Version &a, const Version &b)
{
return a.major > b.major || (a.major == b.major && a.minor >= b.minor);
}
}
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
namespace rx namespace rx
{ {
static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, GLuint *outMajorVersion, GLuint *outMinorVersion, static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, gl::Version *outVersion, StandardGL *outStandard)
bool *outIsES)
{ {
const std::string version = reinterpret_cast<const char*>(getStringFunction(GL_VERSION)); const std::string version = reinterpret_cast<const char*>(getStringFunction(GL_VERSION));
if (version.find("OpenGL ES") == std::string::npos) if (version.find("OpenGL ES") == std::string::npos)
...@@ -27,17 +26,15 @@ static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, GLuint *outMajorV ...@@ -27,17 +26,15 @@ static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, GLuint *outMajorV
// The version number is either of the form major number.minor number or major // The version number is either of the form major number.minor number or major
// number.minor number.release number, where the numbers all have one or more // number.minor number.release number, where the numbers all have one or more
// digits // digits
*outIsES = false; *outStandard = STANDARD_GL_DESKTOP;
*outMajorVersion = version[0] - '0'; *outVersion = gl::Version(version[0] - '0', version[2] - '0');
*outMinorVersion = version[2] - '0';
} }
else else
{ {
// ES spec states that the GL_VERSION string will be in the following format: // ES spec states that the GL_VERSION string will be in the following format:
// "OpenGL ES N.M vendor-specific information" // "OpenGL ES N.M vendor-specific information"
*outIsES = true; *outStandard = STANDARD_GL_ES;
*outMajorVersion = version[10] - '0'; *outVersion = gl::Version(version[10] - '0', version[12] - '0');
*outMinorVersion = version[12] - '0';
} }
} }
...@@ -83,9 +80,8 @@ static void AssignGLExtensionEntryPoint(const std::vector<std::string> &extensio ...@@ -83,9 +80,8 @@ static void AssignGLExtensionEntryPoint(const std::vector<std::string> &extensio
} }
FunctionsGL::FunctionsGL() FunctionsGL::FunctionsGL()
: majorVersion(0), : version(),
minorVersion(0), standard(),
openGLES(false),
extensions(), extensions(),
blendFunc(nullptr), blendFunc(nullptr),
...@@ -777,10 +773,10 @@ void FunctionsGL::initialize() ...@@ -777,10 +773,10 @@ void FunctionsGL::initialize()
{ {
// Grab the version number // Grab the version number
AssignGLEntryPoint(loadProcAddress("glGetString"), &getString); AssignGLEntryPoint(loadProcAddress("glGetString"), &getString);
GetGLVersion(getString, &majorVersion, &minorVersion, &openGLES); GetGLVersion(getString, &version, &standard);
// Grab the GL extensions // Grab the GL extensions
if (majorVersion >= 3) if (isAtLeastGL(gl::Version(3, 0)))
{ {
AssignGLEntryPoint(loadProcAddress("glGetIntegerv"), &getIntegerv); AssignGLEntryPoint(loadProcAddress("glGetIntegerv"), &getIntegerv);
AssignGLEntryPoint(loadProcAddress("glGetStringi"), &getStringi); AssignGLEntryPoint(loadProcAddress("glGetStringi"), &getStringi);
...@@ -793,7 +789,7 @@ void FunctionsGL::initialize() ...@@ -793,7 +789,7 @@ void FunctionsGL::initialize()
} }
// 1.0 // 1.0
if (majorVersion >= 1) if (isAtLeastGL(gl::Version(1, 0)))
{ {
AssignGLEntryPoint(loadProcAddress("glBlendFunc"), &blendFunc); AssignGLEntryPoint(loadProcAddress("glBlendFunc"), &blendFunc);
AssignGLEntryPoint(loadProcAddress("glClear"), &clear); AssignGLEntryPoint(loadProcAddress("glClear"), &clear);
...@@ -846,7 +842,7 @@ void FunctionsGL::initialize() ...@@ -846,7 +842,7 @@ void FunctionsGL::initialize()
} }
// 1.1 // 1.1
if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 1)) if (isAtLeastGL(gl::Version(1, 1)))
{ {
AssignGLEntryPoint(loadProcAddress("glBindTexture"), &bindTexture); AssignGLEntryPoint(loadProcAddress("glBindTexture"), &bindTexture);
AssignGLEntryPoint(loadProcAddress("glCopyTexImage1D"), &copyTexImage1D); AssignGLEntryPoint(loadProcAddress("glCopyTexImage1D"), &copyTexImage1D);
...@@ -879,7 +875,7 @@ void FunctionsGL::initialize() ...@@ -879,7 +875,7 @@ void FunctionsGL::initialize()
} }
// 1.2 // 1.2
if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 2)) if (isAtLeastGL(gl::Version(1, 2)))
{ {
AssignGLEntryPoint(loadProcAddress("glBlendColor"), &blendColor); AssignGLEntryPoint(loadProcAddress("glBlendColor"), &blendColor);
AssignGLEntryPoint(loadProcAddress("glBlendEquation"), &blendEquation); AssignGLEntryPoint(loadProcAddress("glBlendEquation"), &blendEquation);
...@@ -906,7 +902,7 @@ void FunctionsGL::initialize() ...@@ -906,7 +902,7 @@ void FunctionsGL::initialize()
} }
// 1.3 // 1.3
if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 3)) if (isAtLeastGL(gl::Version(1, 3)))
{ {
AssignGLEntryPoint(loadProcAddress("glActiveTexture"), &activeTexture); AssignGLEntryPoint(loadProcAddress("glActiveTexture"), &activeTexture);
AssignGLEntryPoint(loadProcAddress("glCompressedTexImage1D"), &compressedTexImage1D); AssignGLEntryPoint(loadProcAddress("glCompressedTexImage1D"), &compressedTexImage1D);
...@@ -920,7 +916,7 @@ void FunctionsGL::initialize() ...@@ -920,7 +916,7 @@ void FunctionsGL::initialize()
} }
// 1.4 // 1.4
if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 4)) if (isAtLeastGL(gl::Version(1, 4)))
{ {
AssignGLEntryPoint(loadProcAddress("glBlendFuncSeparate"), &blendFuncSeparate); AssignGLEntryPoint(loadProcAddress("glBlendFuncSeparate"), &blendFuncSeparate);
AssignGLEntryPoint(loadProcAddress("glMultiDrawArrays"), &multiDrawArrays); AssignGLEntryPoint(loadProcAddress("glMultiDrawArrays"), &multiDrawArrays);
...@@ -932,7 +928,7 @@ void FunctionsGL::initialize() ...@@ -932,7 +928,7 @@ void FunctionsGL::initialize()
} }
// 1.5 // 1.5
if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 5)) if (isAtLeastGL(gl::Version(1, 5)))
{ {
AssignGLEntryPoint(loadProcAddress("glBeginQuery"), &beginQuery); AssignGLEntryPoint(loadProcAddress("glBeginQuery"), &beginQuery);
AssignGLEntryPoint(loadProcAddress("glBindBuffer"), &bindBuffer); AssignGLEntryPoint(loadProcAddress("glBindBuffer"), &bindBuffer);
...@@ -956,7 +952,7 @@ void FunctionsGL::initialize() ...@@ -956,7 +952,7 @@ void FunctionsGL::initialize()
} }
// 2.0 // 2.0
if (majorVersion >= 2) if (isAtLeastGL(gl::Version(2, 0)))
{ {
AssignGLEntryPoint(loadProcAddress("glAttachShader"), &attachShader); AssignGLEntryPoint(loadProcAddress("glAttachShader"), &attachShader);
AssignGLEntryPoint(loadProcAddress("glBindAttribLocation"), &bindAttribLocation); AssignGLEntryPoint(loadProcAddress("glBindAttribLocation"), &bindAttribLocation);
...@@ -1054,7 +1050,7 @@ void FunctionsGL::initialize() ...@@ -1054,7 +1050,7 @@ void FunctionsGL::initialize()
} }
// 2.1 // 2.1
if (majorVersion > 2 || (majorVersion == 2 && minorVersion >= 1)) if (isAtLeastGL(gl::Version(2, 1)))
{ {
AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x3fv"), &uniformMatrix2x3fv); AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x3fv"), &uniformMatrix2x3fv);
AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x4fv"), &uniformMatrix2x4fv); AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x4fv"), &uniformMatrix2x4fv);
...@@ -1065,7 +1061,7 @@ void FunctionsGL::initialize() ...@@ -1065,7 +1061,7 @@ void FunctionsGL::initialize()
} }
// 3.0 // 3.0
if (majorVersion >= 3) if (isAtLeastGL(gl::Version(3, 0)))
{ {
AssignGLEntryPoint(loadProcAddress("glBeginConditionalRender"), &beginConditionalRender); AssignGLEntryPoint(loadProcAddress("glBeginConditionalRender"), &beginConditionalRender);
AssignGLEntryPoint(loadProcAddress("glBeginTransformFeedback"), &beginTransformFeedback); AssignGLEntryPoint(loadProcAddress("glBeginTransformFeedback"), &beginTransformFeedback);
...@@ -1157,7 +1153,7 @@ void FunctionsGL::initialize() ...@@ -1157,7 +1153,7 @@ void FunctionsGL::initialize()
} }
// 3.1 // 3.1
if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 1)) if (isAtLeastGL(gl::Version(3, 1)))
{ {
AssignGLEntryPoint(loadProcAddress("glCopyBufferSubData"), &copyBufferSubData); AssignGLEntryPoint(loadProcAddress("glCopyBufferSubData"), &copyBufferSubData);
AssignGLEntryPoint(loadProcAddress("glDrawArraysInstanced"), &drawArraysInstanced); AssignGLEntryPoint(loadProcAddress("glDrawArraysInstanced"), &drawArraysInstanced);
...@@ -1184,7 +1180,7 @@ void FunctionsGL::initialize() ...@@ -1184,7 +1180,7 @@ void FunctionsGL::initialize()
} }
// 3.2 // 3.2
if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 2)) if (isAtLeastGL(gl::Version(3, 2)))
{ {
AssignGLEntryPoint(loadProcAddress("glClientWaitSync"), &clientWaitSync); AssignGLEntryPoint(loadProcAddress("glClientWaitSync"), &clientWaitSync);
AssignGLEntryPoint(loadProcAddress("glDeleteSync"), &deleteSync); AssignGLEntryPoint(loadProcAddress("glDeleteSync"), &deleteSync);
...@@ -1208,7 +1204,7 @@ void FunctionsGL::initialize() ...@@ -1208,7 +1204,7 @@ void FunctionsGL::initialize()
} }
// 3.3 // 3.3
if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 3)) if (isAtLeastGL(gl::Version(3, 3)))
{ {
AssignGLEntryPoint(loadProcAddress("glBindFragDataLocationIndexed"), &bindFragDataLocationIndexed); AssignGLEntryPoint(loadProcAddress("glBindFragDataLocationIndexed"), &bindFragDataLocationIndexed);
AssignGLEntryPoint(loadProcAddress("glBindSampler"), &bindSampler); AssignGLEntryPoint(loadProcAddress("glBindSampler"), &bindSampler);
...@@ -1241,7 +1237,7 @@ void FunctionsGL::initialize() ...@@ -1241,7 +1237,7 @@ void FunctionsGL::initialize()
} }
// 4.0 // 4.0
if (majorVersion >= 4) if (isAtLeastGL(gl::Version(4, 0)))
{ {
AssignGLEntryPoint(loadProcAddress("glBeginQueryIndexed"), &beginQueryIndexed); AssignGLEntryPoint(loadProcAddress("glBeginQueryIndexed"), &beginQueryIndexed);
AssignGLEntryPoint(loadProcAddress("glBindTransformFeedback"), &bindTransformFeedback); AssignGLEntryPoint(loadProcAddress("glBindTransformFeedback"), &bindTransformFeedback);
...@@ -1292,7 +1288,7 @@ void FunctionsGL::initialize() ...@@ -1292,7 +1288,7 @@ void FunctionsGL::initialize()
} }
// 4.1 // 4.1
if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 1)) if (isAtLeastGL(gl::Version(4, 1)))
{ {
AssignGLEntryPoint(loadProcAddress("glActiveShaderProgram"), &activeShaderProgram); AssignGLEntryPoint(loadProcAddress("glActiveShaderProgram"), &activeShaderProgram);
AssignGLEntryPoint(loadProcAddress("glBindProgramPipeline"), &bindProgramPipeline); AssignGLEntryPoint(loadProcAddress("glBindProgramPipeline"), &bindProgramPipeline);
...@@ -1385,7 +1381,7 @@ void FunctionsGL::initialize() ...@@ -1385,7 +1381,7 @@ void FunctionsGL::initialize()
} }
// 4.2 // 4.2
if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 2)) if (isAtLeastGL(gl::Version(4, 2)))
{ {
AssignGLEntryPoint(loadProcAddress("glBindImageTexture"), &bindImageTexture); AssignGLEntryPoint(loadProcAddress("glBindImageTexture"), &bindImageTexture);
AssignGLEntryPoint(loadProcAddress("glDrawArraysInstancedBaseInstance"), &drawArraysInstancedBaseInstance); AssignGLEntryPoint(loadProcAddress("glDrawArraysInstancedBaseInstance"), &drawArraysInstancedBaseInstance);
...@@ -1402,7 +1398,7 @@ void FunctionsGL::initialize() ...@@ -1402,7 +1398,7 @@ void FunctionsGL::initialize()
} }
// 4.3 // 4.3
if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 3)) if (isAtLeastGL(gl::Version(4, 3)))
{ {
AssignGLEntryPoint(loadProcAddress("glBindVertexBuffer"), &bindVertexBuffer); AssignGLEntryPoint(loadProcAddress("glBindVertexBuffer"), &bindVertexBuffer);
AssignGLEntryPoint(loadProcAddress("glClearBufferData"), &clearBufferData); AssignGLEntryPoint(loadProcAddress("glClearBufferData"), &clearBufferData);
...@@ -1451,7 +1447,7 @@ void FunctionsGL::initialize() ...@@ -1451,7 +1447,7 @@ void FunctionsGL::initialize()
} }
// 4.4 // 4.4
if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 4)) if (isAtLeastGL(gl::Version(4, 4)))
{ {
AssignGLEntryPoint(loadProcAddress("glBindBuffersBase"), &bindBuffersBase); AssignGLEntryPoint(loadProcAddress("glBindBuffersBase"), &bindBuffersBase);
AssignGLEntryPoint(loadProcAddress("glBindBuffersRange"), &bindBuffersRange); AssignGLEntryPoint(loadProcAddress("glBindBuffersRange"), &bindBuffersRange);
...@@ -1465,7 +1461,7 @@ void FunctionsGL::initialize() ...@@ -1465,7 +1461,7 @@ void FunctionsGL::initialize()
} }
// 4.5 // 4.5
if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 5)) if (isAtLeastGL(gl::Version(4, 5)))
{ {
AssignGLEntryPoint(loadProcAddress("glBindTextureUnit"), &bindTextureUnit); AssignGLEntryPoint(loadProcAddress("glBindTextureUnit"), &bindTextureUnit);
AssignGLEntryPoint(loadProcAddress("glBlitNamedFramebuffer"), &blitNamedFramebuffer); AssignGLEntryPoint(loadProcAddress("glBlitNamedFramebuffer"), &blitNamedFramebuffer);
...@@ -1580,6 +1576,16 @@ void FunctionsGL::initialize() ...@@ -1580,6 +1576,16 @@ void FunctionsGL::initialize()
} }
} }
bool FunctionsGL::isAtLeastGL(const gl::Version &glVersion) const
{
return standard == STANDARD_GL_DESKTOP && version >= glVersion;
}
bool FunctionsGL::isAtLeastGLES(const gl::Version &glesVersion) const
{
return standard == STANDARD_GL_ES && version >= glesVersion;
}
bool FunctionsGL::hasExtension(const std::string &ext) const bool FunctionsGL::hasExtension(const std::string &ext) const
{ {
return std::find(extensions.begin(), extensions.end(), ext) != extensions.end(); return std::find(extensions.begin(), extensions.end(), ext) != extensions.end();
......
...@@ -10,12 +10,19 @@ ...@@ -10,12 +10,19 @@
#define LIBANGLE_RENDERER_GL_FUNCTIONSGL_H_ #define LIBANGLE_RENDERER_GL_FUNCTIONSGL_H_
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/Version.h"
#include "libANGLE/renderer/gl/functionsgl_enums.h" #include "libANGLE/renderer/gl/functionsgl_enums.h"
#include "libANGLE/renderer/gl/functionsgl_typedefs.h" #include "libANGLE/renderer/gl/functionsgl_typedefs.h"
namespace rx namespace rx
{ {
enum StandardGL
{
STANDARD_GL_DESKTOP,
STANDARD_GL_ES,
};
class FunctionsGL class FunctionsGL
{ {
public: public:
...@@ -25,9 +32,10 @@ class FunctionsGL ...@@ -25,9 +32,10 @@ class FunctionsGL
void initialize(); void initialize();
// Version information // Version information
GLuint majorVersion; gl::Version version;
GLuint minorVersion; StandardGL standard;
bool openGLES; bool isAtLeastGL(const gl::Version &glVersion) const;
bool isAtLeastGLES(const gl::Version &glesVersion) const;
// Extensions // Extensions
std::vector<std::string> extensions; std::vector<std::string> extensions;
......
...@@ -254,11 +254,11 @@ std::string RendererGL::getRendererDescription() const ...@@ -254,11 +254,11 @@ std::string RendererGL::getRendererDescription() const
std::ostringstream rendererString; std::ostringstream rendererString;
rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL"; rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
if (mFunctions->openGLES) if (mFunctions->standard == STANDARD_GL_ES)
{ {
rendererString << " ES"; rendererString << " ES";
} }
rendererString << " " << mFunctions->majorVersion << "." << mFunctions->minorVersion; rendererString << " " << mFunctions->version.major << "." << mFunctions->version.minor;
return rendererString.str(); return rendererString.str();
} }
......
...@@ -21,8 +21,7 @@ namespace nativegl ...@@ -21,8 +21,7 @@ namespace nativegl
{ {
SupportRequirement::SupportRequirement() SupportRequirement::SupportRequirement()
: majorVersion(std::numeric_limits<GLuint>::max()), : version(std::numeric_limits<GLuint>::max(), std::numeric_limits<GLuint>::max()),
minorVersion(std::numeric_limits<GLuint>::max()),
versionExtensions(), versionExtensions(),
requiredExtensions() requiredExtensions()
{ {
...@@ -39,8 +38,8 @@ InternalFormat::InternalFormat() ...@@ -39,8 +38,8 @@ InternalFormat::InternalFormat()
static inline SupportRequirement VersionOrExts(GLuint major, GLuint minor, const std::string &versionExt) static inline SupportRequirement VersionOrExts(GLuint major, GLuint minor, const std::string &versionExt)
{ {
SupportRequirement requirement; SupportRequirement requirement;
requirement.majorVersion = major; requirement.version.major = major;
requirement.minorVersion = minor; requirement.version.minor = minor;
angle::SplitStringAlongWhitespace(versionExt, &requirement.versionExtensions); angle::SplitStringAlongWhitespace(versionExt, &requirement.versionExtensions);
return requirement; return requirement;
} }
...@@ -48,8 +47,8 @@ static inline SupportRequirement VersionOrExts(GLuint major, GLuint minor, const ...@@ -48,8 +47,8 @@ static inline SupportRequirement VersionOrExts(GLuint major, GLuint minor, const
static inline SupportRequirement VersionAndExts(GLuint major, GLuint minor, const std::string &requiredExt) static inline SupportRequirement VersionAndExts(GLuint major, GLuint minor, const std::string &requiredExt)
{ {
SupportRequirement requirement; SupportRequirement requirement;
requirement.majorVersion = major; requirement.version.major = major;
requirement.minorVersion = minor; requirement.version.minor = minor;
angle::SplitStringAlongWhitespace(requiredExt, &requirement.requiredExtensions); angle::SplitStringAlongWhitespace(requiredExt, &requirement.requiredExtensions);
return requirement; return requirement;
} }
...@@ -57,8 +56,8 @@ static inline SupportRequirement VersionAndExts(GLuint major, GLuint minor, cons ...@@ -57,8 +56,8 @@ static inline SupportRequirement VersionAndExts(GLuint major, GLuint minor, cons
static inline SupportRequirement VersionOrExtsAndExts(GLuint major, GLuint minor, const std::string &versionExt, static inline SupportRequirement VersionOrExtsAndExts(GLuint major, GLuint minor, const std::string &versionExt,
const std::string &requiredExt) const std::string &requiredExt)
{ SupportRequirement requirement; { SupportRequirement requirement;
requirement.majorVersion = major; requirement.version.major = major;
requirement.minorVersion = minor; requirement.version.minor = minor;
angle::SplitStringAlongWhitespace(versionExt, &requirement.versionExtensions); angle::SplitStringAlongWhitespace(versionExt, &requirement.versionExtensions);
angle::SplitStringAlongWhitespace(requiredExt, &requirement.requiredExtensions); angle::SplitStringAlongWhitespace(requiredExt, &requirement.requiredExtensions);
return requirement; return requirement;
...@@ -67,8 +66,8 @@ static inline SupportRequirement VersionOrExtsAndExts(GLuint major, GLuint minor ...@@ -67,8 +66,8 @@ static inline SupportRequirement VersionOrExtsAndExts(GLuint major, GLuint minor
static inline SupportRequirement VersionOnly(GLuint major, GLuint minor) static inline SupportRequirement VersionOnly(GLuint major, GLuint minor)
{ {
SupportRequirement requirement; SupportRequirement requirement;
requirement.majorVersion = major; requirement.version.major = major;
requirement.minorVersion = minor; requirement.version.minor = minor;
return requirement; return requirement;
} }
...@@ -82,16 +81,16 @@ static inline SupportRequirement ExtsOnly(const std::string &ext) ...@@ -82,16 +81,16 @@ static inline SupportRequirement ExtsOnly(const std::string &ext)
static inline SupportRequirement Always() static inline SupportRequirement Always()
{ {
SupportRequirement requirement; SupportRequirement requirement;
requirement.majorVersion = 0; requirement.version.major = 0;
requirement.minorVersion = 0; requirement.version.minor = 0;
return requirement; return requirement;
} }
static inline SupportRequirement Never() static inline SupportRequirement Never()
{ {
SupportRequirement requirement; SupportRequirement requirement;
requirement.majorVersion = std::numeric_limits<GLuint>::max(); requirement.version.major = std::numeric_limits<GLuint>::max();
requirement.minorVersion = std::numeric_limits<GLuint>::max(); requirement.version.minor = std::numeric_limits<GLuint>::max();
return requirement; return requirement;
} }
...@@ -234,20 +233,23 @@ static const InternalFormatInfoMap &GetInternalFormatMap() ...@@ -234,20 +233,23 @@ static const InternalFormatInfoMap &GetInternalFormatMap()
return formatMap; return formatMap;
} }
const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, bool es) const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, StandardGL standard)
{ {
const InternalFormatInfoMap &formatMap = GetInternalFormatMap(); const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
InternalFormatInfoMap::const_iterator iter = formatMap.find(internalFormat); InternalFormatInfoMap::const_iterator iter = formatMap.find(internalFormat);
if (iter != formatMap.end()) if (iter != formatMap.end())
{ {
const InternalFormatInfo &info = iter->second; const InternalFormatInfo &info = iter->second;
return es ? info.glesInfo : info.glInfo; switch (standard)
} {
else case STANDARD_GL_ES: return info.glesInfo;
{ case STANDARD_GL_DESKTOP: return info.glInfo;
static const InternalFormat defaultInternalFormat; default: UNREACHABLE(); break;
return defaultInternalFormat; }
} }
static const InternalFormat defaultInternalFormat;
return defaultInternalFormat;
} }
} }
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include <vector> #include <vector>
#include "angle_gl.h" #include "angle_gl.h"
#include "libANGLE/Version.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
namespace rx namespace rx
{ {
...@@ -26,8 +28,7 @@ struct SupportRequirement ...@@ -26,8 +28,7 @@ struct SupportRequirement
SupportRequirement(); SupportRequirement();
// Version that this format became supported without extensions // Version that this format became supported without extensions
GLuint majorVersion; gl::Version version;
GLuint minorVersion;
// Extensions that are required if the minimum version is not met // Extensions that are required if the minimum version is not met
std::vector<std::string> versionExtensions; std::vector<std::string> versionExtensions;
...@@ -45,7 +46,7 @@ struct InternalFormat ...@@ -45,7 +46,7 @@ struct InternalFormat
SupportRequirement renderbuffer; SupportRequirement renderbuffer;
SupportRequirement framebufferAttachment; SupportRequirement framebufferAttachment;
}; };
const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, bool es); const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, StandardGL standard);
} }
......
...@@ -35,8 +35,7 @@ static bool MeetsRequirements(const FunctionsGL *functions, const nativegl::Supp ...@@ -35,8 +35,7 @@ static bool MeetsRequirements(const FunctionsGL *functions, const nativegl::Supp
} }
} }
if (functions->majorVersion > requirements.majorVersion || if (functions->version >= requirements.version)
(functions->majorVersion == requirements.majorVersion && functions->minorVersion >= requirements.minorVersion))
{ {
return true; return true;
} }
...@@ -61,7 +60,7 @@ static gl::TextureCaps GenerateTextureFormatCaps(const FunctionsGL *functions, G ...@@ -61,7 +60,7 @@ static gl::TextureCaps GenerateTextureFormatCaps(const FunctionsGL *functions, G
{ {
gl::TextureCaps textureCaps; gl::TextureCaps textureCaps;
const nativegl::InternalFormat &formatInfo = nativegl::GetInternalFormatInfo(internalFormat, functions->openGLES); const nativegl::InternalFormat &formatInfo = nativegl::GetInternalFormatInfo(internalFormat, functions->standard);
textureCaps.texturable = MeetsRequirements(functions, formatInfo.texture); textureCaps.texturable = MeetsRequirements(functions, formatInfo.texture);
textureCaps.filterable = textureCaps.texturable && MeetsRequirements(functions, formatInfo.filter); textureCaps.filterable = textureCaps.texturable && MeetsRequirements(functions, formatInfo.filter);
textureCaps.renderable = MeetsRequirements(functions, formatInfo.framebufferAttachment); textureCaps.renderable = MeetsRequirements(functions, formatInfo.framebufferAttachment);
......
...@@ -109,6 +109,8 @@ ...@@ -109,6 +109,8 @@
'libANGLE/TransformFeedback.h', 'libANGLE/TransformFeedback.h',
'libANGLE/Uniform.cpp', 'libANGLE/Uniform.cpp',
'libANGLE/Uniform.h', 'libANGLE/Uniform.h',
'libANGLE/Version.h',
'libANGLE/Version.inl',
'libANGLE/VertexArray.cpp', 'libANGLE/VertexArray.cpp',
'libANGLE/VertexArray.h', 'libANGLE/VertexArray.h',
'libANGLE/VertexAttribute.cpp', 'libANGLE/VertexAttribute.cpp',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment