]> git.tdb.fi Git - libs/gl.git/commitdiff
Make backend idenfication more generic
authorMikko Rasa <tdb@tdb.fi>
Thu, 30 Sep 2021 21:11:46 +0000 (00:11 +0300)
committerMikko Rasa <tdb@tdb.fi>
Thu, 30 Sep 2021 21:38:52 +0000 (00:38 +0300)
The API and version queries are now in their own file and extension.h is
reserved for the OpenGL extension mechanism.

source/core/backend.cpp [new file with mode: 0644]
source/core/backend.h [new file with mode: 0644]
source/core/deviceinfo.cpp
source/core/extension.cpp
source/core/extension.h
source/core/texture.cpp
source/glsl/compiler.cpp
source/glsl/features.cpp
source/glsl/features.h
source/glsl/finalize.cpp
source/glsl/output.cpp

diff --git a/source/core/backend.cpp b/source/core/backend.cpp
new file mode 100644 (file)
index 0000000..c3e159f
--- /dev/null
@@ -0,0 +1,76 @@
+#include <stdexcept>
+#include <cstdlib>
+#include <msp/strings/lexicalcast.h>
+#include <msp/strings/utils.h>
+#include "backend.h"
+#include "gl.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+Version::Version()
+{
+       major = 0;
+       minor = 0;
+}
+
+Version::Version(unsigned short a, unsigned short i)
+{
+       major = a;
+       minor = i;
+}
+
+Version::Version(const string &s)
+{
+       vector<string> parts = split(s, '.');
+       major = lexical_cast<unsigned>(parts[0]);
+       minor = lexical_cast<unsigned>(parts[1]);
+}
+
+bool Version::operator>=(const Version &other) const
+{
+       return major>other.major || (major==other.major && minor>=other.minor);
+}
+
+
+GraphicsApi get_backend_api()
+{
+#ifdef GL_ES_VERSION_2_0
+       return OPENGL_ES;
+#else
+       return OPENGL;
+#endif
+}
+
+inline Version get_gl_version()
+{
+       const char *gl_ver_ptr = reinterpret_cast<const char *>(glGetString(GL_VERSION));
+       if(!gl_ver_ptr)
+               throw runtime_error("OpenGL version not available");
+
+       string gl_ver = gl_ver_ptr;
+       if(!gl_ver.compare(0, 10, "OpenGL ES "))
+               gl_ver.erase(0, 10);
+
+       Version ver(gl_ver.substr(0, gl_ver.find(' ')));
+
+       if(const char *force_ver_ptr = getenv("MSPGL_FORCE_VERSION"))
+       {
+               Version force_ver(force_ver_ptr);
+               if(force_ver<ver)
+                       ver = force_ver;
+       }
+
+       return ver;
+}
+
+const Version &get_backend_version()
+{
+       static Version version = get_gl_version();
+       return version;
+}
+
+} // namespace GL
+} // namespace Msp
diff --git a/source/core/backend.h b/source/core/backend.h
new file mode 100644 (file)
index 0000000..0dd0172
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef MSP_GL_BACKEND_H_
+#define MSP_GL_BACKEND_H_
+
+#include <string>
+
+namespace Msp {
+namespace GL {
+
+enum GraphicsApi
+{
+       OPENGL,
+       OPENGL_ES
+};
+
+struct Version
+{
+       unsigned short major;
+       unsigned short minor;
+
+       Version();
+       Version(unsigned short, unsigned short);
+       Version(const std::string &);
+
+       bool operator>=(const Version &) const;
+       bool operator<(const Version &o) const { return !(*this>=o); }
+       operator bool() const { return major || minor; }
+};
+
+/** Returns the backend for which the library was compiled. */
+GraphicsApi get_backend_api();
+
+/** Returns the backend version number, as reported by the implementation. */
+const Version &get_backend_version();
+
+} // namespace GL
+} // namespace Msp
+
+#endif
index 1526af36744d195690511737b7dc4fdfed1e02eb..37a04f8a86a4fe058611cb886f1d32954bc2acd9 100644 (file)
@@ -30,7 +30,7 @@ Limits::Limits()
 
 DeviceInfo::DeviceInfo()
 {
-       glsl_features.gl_api = get_gl_api();
+       glsl_features.target_api = get_backend_api();
        glsl_features.glsl_version = get_glsl_version();
        glsl_features.arb_enhanced_layouts = ARB_enhanced_layouts;
        glsl_features.arb_explicit_attrib_location = ARB_explicit_attrib_location;
index 8618cc3eeef599e7c7a1dc36fe2ef724f234e91f..a55da9bac1c7b30ab965b6ce70e20390eafda6d1 100644 (file)
@@ -28,31 +28,6 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-Version::Version()
-{
-       major = 0;
-       minor = 0;
-}
-
-Version::Version(unsigned short a, unsigned short i)
-{
-       major = a;
-       minor = i;
-}
-
-Version::Version(const string &s)
-{
-       vector<string> parts = split(s, '.');
-       major = lexical_cast<unsigned>(parts[0]);
-       minor = lexical_cast<unsigned>(parts[1]);
-}
-
-bool Version::operator>=(const Version &other) const
-{
-       return major>other.major || (major==other.major && minor>=other.minor);
-}
-
-
 Extension::Extension(const char *n, InitFunc f):
        name(n),
        init_func(f),
@@ -89,7 +64,7 @@ bool is_supported(const string &ext)
 
        if(!init_done)
        {
-               if(get_gl_api()==OPENGL && get_gl_version()>=Version(3, 0))
+               if(get_backend_api()==OPENGL && get_backend_version()>=Version(3, 0))
                {
                        typedef GLubyte *(APIENTRY *FPtr_glGetStringi)(GLenum, GLuint);
                        FPtr_glGetStringi glGetStringi = reinterpret_cast<FPtr_glGetStringi>(get_proc_address("glGetStringi"));
@@ -115,7 +90,7 @@ bool is_supported(const string &ext)
 
 bool is_supported(const Version &core_version, const Version &deprecated_version)
 {
-       const Version &version = get_gl_version();
+       const Version &version = get_backend_version();
        if(deprecated_version && version>=deprecated_version && get_gl_profile()==CORE_PROFILE)
                return false;
        return (version>=core_version);
@@ -144,7 +119,7 @@ bool is_disabled(const string &ext)
 
                                /* AMD's uniform buffer objects only work with the core version of
                                shaders. */
-                               if(get_gl_version()<Version(2, 0))
+                               if(get_backend_version()<Version(2, 0))
                                        disabled_exts.insert("GL_ARB_uniform_buffer_object");
                        }
                }
@@ -155,18 +130,9 @@ bool is_disabled(const string &ext)
        return disabled_exts.count(ext);
 }
 
-GLApi get_gl_api()
-{
-#ifdef GL_ES_VERSION_2_0
-       return OPENGL_ES2;
-#else
-       return OPENGL;
-#endif
-}
-
 inline GLProfile _get_gl_profile()
 {
-       if(get_gl_api()==OPENGL && get_gl_version()>=Version(3, 0))
+       if(get_backend_api()==OPENGL && get_backend_version()>=Version(3, 0))
        {
                int mask;
                glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
@@ -183,34 +149,6 @@ GLProfile get_gl_profile()
        return profile;
 }
 
-inline Version _get_gl_version()
-{
-       const char *gl_ver_ptr = reinterpret_cast<const char *>(glGetString(GL_VERSION));
-       if(!gl_ver_ptr)
-               throw runtime_error("OpenGL version not available");
-
-       string gl_ver = gl_ver_ptr;
-       if(!gl_ver.compare(0, 10, "OpenGL ES "))
-               gl_ver.erase(0, 10);
-
-       Version ver(gl_ver.substr(0, gl_ver.find(' ')));
-
-       if(const char *force_ver_ptr = getenv("MSPGL_FORCE_VERSION"))
-       {
-               Version force_ver(force_ver_ptr);
-               if(force_ver<ver)
-                       ver = force_ver;
-       }
-
-       return ver;
-}
-
-const Version &get_gl_version()
-{
-       static Version version = _get_gl_version();
-       return version;
-}
-
 inline Version _get_glsl_version()
 {
        const char *glsl_ver_ptr = reinterpret_cast<const char *>(glGetString(GL_SHADING_LANGUAGE_VERSION));
index cf824e24b0a189b65fc88de30adc6dc862fb5e09..779963578899bbeb2dea2e6de24e08d1a8b549bd 100644 (file)
@@ -2,16 +2,11 @@
 #define MSP_GL_EXTENSION_H_
 
 #include <string>
+#include "backend.h"
 
 namespace Msp {
 namespace GL {
 
-enum GLApi
-{
-       OPENGL,
-       OPENGL_ES2
-};
-
 enum GLProfile
 {
        CORE_PROFILE,
@@ -19,21 +14,6 @@ enum GLProfile
 };
 
 
-struct Version
-{
-       unsigned short major;
-       unsigned short minor;
-
-       Version();
-       Version(unsigned short, unsigned short);
-       Version(const std::string &);
-
-       bool operator>=(const Version &) const;
-       bool operator<(const Version &o) const { return !(*this>=o); }
-       operator bool() const { return major || minor; }
-};
-
-
 /**
 Holds metadata about an extension.  Evaluates to true if the extension is
 supported.
@@ -83,15 +63,9 @@ the MSPGL_DISABLE_EXTENSIONS environment variable or implicitly as a workaround
 for a driver bug.  Only intended for internal use. */
 bool is_disabled(const std::string &);
 
-/** Returns the API for which the library was compiled. */
-GLApi get_gl_api();
-
 /** Returns the OpenGL profile for the active context. */
 GLProfile get_gl_profile();
 
-/** Returns the OpenGL version number, as reported by the implementation. */
-const Version &get_gl_version();
-
 /** Returns the GLSL version number, as reported by the implementation. */
 const Version &get_glsl_version();
 
index 33a7b21ba8b429c63311cffdb4635f947e0f3201..c27e850676b83153de81ef09b4d76282e481e091 100644 (file)
@@ -108,7 +108,7 @@ void Texture::apply_swizzle()
        if(swizzle==NO_SWIZZLE)
                return;
 
-       if(get_gl_api()==OPENGL_ES2)
+       if(get_backend_api()==OPENGL_ES)
        {
                set_parameter_i(GL_TEXTURE_SWIZZLE_R, swizzle_orders[swizzle*4]);
                set_parameter_i(GL_TEXTURE_SWIZZLE_G, swizzle_orders[swizzle*4+1]);
index 233e37ea33727814042069dd7df2b068abed7670..41734fe85fdb6d170765353653038a6df9183f43 100644 (file)
@@ -279,7 +279,7 @@ void Compiler::import(ModuleCache &mod_cache, const string &name)
 
 void Compiler::generate(Stage &stage)
 {
-       stage.required_features.gl_api = features.gl_api;
+       stage.required_features.target_api = features.target_api;
        if(module->shared.required_features.glsl_version>stage.required_features.glsl_version)
                stage.required_features.glsl_version = module->shared.required_features.glsl_version;
 
index 78233bfcf48a3ff884bac0344b464c3e7ca17a33..a66eefc5ad18bb6271a9086b245697bb8b6632d0 100644 (file)
@@ -5,7 +5,7 @@ namespace GL {
 namespace SL {
 
 Features::Features():
-       gl_api(OPENGL),
+       target_api(OPENGL),
        arb_enhanced_layouts(false),
        arb_explicit_attrib_location(false),
        arb_explicit_uniform_location(false),
@@ -22,7 +22,7 @@ Features::Features():
 Features Features::from_version(const Version &ver)
 {
        Features features;
-       features.gl_api = OPENGL;
+       features.target_api = OPENGL;
        features.glsl_version = ver;
        features.arb_enhanced_layouts = (ver>=Version(4, 40));
        features.arb_explicit_attrib_location = (ver>=Version(1, 30));
index 8aee02caa64daf63bef8aa926bcb74c33fb50569..ca74d38abd3d2a2927420589f21af83ac21ea5b6 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef MSP_GL_SL_FEATURES_H_
 #define MSP_GL_SL_FEATURES_H_
 
-#include <msp/gl/extension.h>
+#include <msp/gl/backend.h>
 
 namespace Msp {
 namespace GL {
@@ -9,7 +9,7 @@ namespace SL {
 
 struct Features
 {
-       GLApi gl_api;
+       GraphicsApi target_api;
        Version glsl_version;
        bool arb_enhanced_layouts;
        bool arb_explicit_attrib_location;
index eee8a5198efa8b2037848bcc7a34bd8cd0d333ff..e444974ae9fbe26cc4e0168e063cd4b8177f8416 100644 (file)
@@ -261,7 +261,7 @@ void PrecisionConverter::visit(Block &block)
 
 void PrecisionConverter::visit(Precision &prec)
 {
-       if(stage->required_features.gl_api==OPENGL_ES2)
+       if(stage->required_features.target_api==OPENGL_ES)
                have_default.insert(prec.type);
        else
                nodes_to_remove.insert(&prec);
@@ -269,7 +269,7 @@ void PrecisionConverter::visit(Precision &prec)
 
 void PrecisionConverter::visit(VariableDeclaration &var)
 {
-       if(stage->required_features.gl_api!=OPENGL_ES2)
+       if(stage->required_features.target_api!=OPENGL_ES)
        {
                var.precision.clear();
                return;
@@ -322,7 +322,7 @@ void LegacyConverter::apply(Stage &s, const Features &feat)
                NodeRemover().apply(s, nodes_to_remove);
 
                if(!stage->required_features.glsl_version)
-                       stage->required_features.glsl_version = Version(1, (stage->required_features.gl_api==OPENGL_ES2 ? 0 : 10));
+                       stage->required_features.glsl_version = Version(1, (stage->required_features.target_api==OPENGL_ES ? 0 : 10));
        }
        else
                unsupported(format("Stage %s is not supported", Stage::get_stage_name(s.type)));
@@ -372,7 +372,7 @@ bool LegacyConverter::supports_stage(Stage::Type st) const
 {
        if(st==Stage::GEOMETRY)
        {
-               if(features.gl_api==OPENGL_ES2)
+               if(features.target_api==OPENGL_ES)
                        return check_version(Version(3, 20));
                else
                        return check_version(Version(1, 50));
@@ -383,7 +383,7 @@ bool LegacyConverter::supports_stage(Stage::Type st) const
 
 bool LegacyConverter::supports_unified_interface_syntax() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else
                return check_version(Version(1, 30));
@@ -407,7 +407,7 @@ void LegacyConverter::visit(Assignment &assign)
 
 bool LegacyConverter::supports_unified_sampling_functions() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else
                return check_version(Version(1, 30));
@@ -452,7 +452,7 @@ void LegacyConverter::visit(FunctionCall &call)
 
 bool LegacyConverter::supports_interface_layouts() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else if(check_version(Version(3, 30)))
                return true;
@@ -464,7 +464,7 @@ bool LegacyConverter::supports_interface_layouts() const
 
 bool LegacyConverter::supports_stage_interface_layouts() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
        else if(check_version(Version(4, 10)))
                return true;
@@ -474,7 +474,7 @@ bool LegacyConverter::supports_stage_interface_layouts() const
 
 bool LegacyConverter::supports_centroid_sampling() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else if(check_version(Version(1, 20)))
                return true;
@@ -484,7 +484,7 @@ bool LegacyConverter::supports_centroid_sampling() const
 
 bool LegacyConverter::supports_sample_sampling() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 20));
        else if(check_version(Version(4, 0)))
                return true;
@@ -494,7 +494,7 @@ bool LegacyConverter::supports_sample_sampling() const
 
 bool LegacyConverter::supports_uniform_location() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
        else if(check_version(Version(4, 30)))
                return true;
@@ -504,7 +504,7 @@ bool LegacyConverter::supports_uniform_location() const
 
 bool LegacyConverter::supports_binding() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
        else
                return check_version(Version(4, 20));
@@ -591,7 +591,7 @@ void LegacyConverter::visit(VariableDeclaration &var)
 
 bool LegacyConverter::supports_interface_blocks(const string &iface) const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
        {
                if(iface=="uniform")
                        return check_version(Version(3, 0));
@@ -608,7 +608,7 @@ bool LegacyConverter::supports_interface_blocks(const string &iface) const
 
 bool LegacyConverter::supports_interface_block_location() const
 {
-       if(features.gl_api==OPENGL_ES2)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 20));
        else if(check_version(Version(4, 40)))
                return true;
index 6ba06447a3b02e6254b128884c72a206813ee22b..0a4af2d42b0997f6d72f89542e1b6c038c3357d5 100644 (file)
@@ -28,7 +28,7 @@ string Formatter::apply(Stage &s)
        if(ver)
        {
                append(format("#version %d%02d", ver.major, ver.minor));
-               if(s.required_features.gl_api==OPENGL_ES2 && ver>=Version(3, 0))
+               if(s.required_features.target_api==OPENGL_ES && ver>=Version(3, 0))
                        append(" es");
                formatted += '\n';
        }