blob: bd23c3a528c96fbbd21ba15513b63d151dd78a0e [file] [log] [blame]
/**************************************************************************
*
* Copyright 2014 VMware, Inc.
* Copyright 2011 Jose Fonseca
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
**************************************************************************/
/*
* Representation and manipulation of OpenGL context profiles.
*/
#pragma once
#include <ostream>
#include <set>
#include <string>
namespace glfeatures {
enum Api {
API_GL = 0,
API_GLES
};
struct Profile {
unsigned major:8;
unsigned minor:8;
unsigned api:1;
unsigned core:1;
unsigned forwardCompatible:1;
inline
Profile(
Api _api = API_GL,
unsigned _major = 1,
unsigned _minor = 0,
bool _core = false,
bool _forwardCompatible = false
) {
api = _api;
major = _major;
minor = _minor;
core = _core;
forwardCompatible = _forwardCompatible;
}
inline bool
desktop(void) const {
return api == API_GL;
}
inline bool
es(void) const {
return api == API_GLES;
}
inline bool
versionGreaterOrEqual(unsigned refMajor, unsigned refMinor) const {
return major > refMajor ||
(major == refMajor && minor >= refMinor);
}
inline bool
versionGreaterOrEqual(Api refApi, unsigned refMajor, unsigned refMinor) const {
return api == refApi && versionGreaterOrEqual(refMajor, refMinor);
}
bool
matches(const Profile expected) const;
// Comparison operator, mainly for use in std::map
inline bool
operator == (const Profile & other) const {
return major == other.major &&
minor == other.minor &&
api == other.api &&
core == other.core &&
forwardCompatible == other.forwardCompatible;
}
// Comparison operator, mainly for use in std::map
inline bool
operator < (const Profile & other) const {
return major < other.major ||
minor < other.minor ||
api < other.api ||
core < other.core ||
forwardCompatible < other.forwardCompatible;
}
std::string
str(void) const;
};
std::ostream &
operator << (std::ostream &os, const Profile & profile);
Profile
getCurrentContextProfile(void);
class Extensions
{
private:
std::set<std::string> strings;
public:
void
getCurrentContextExtensions(const Profile & profile);
bool
has(const char *string) const;
};
struct Features
{
unsigned ES:1;
unsigned core:1;
unsigned ARB_draw_buffers:1;
unsigned ARB_sampler_objects:1;
unsigned ARB_get_program_binary:1;
unsigned KHR_debug:1;
unsigned EXT_debug_label:1;
unsigned NV_read_depth_stencil:1; /* ES only */
unsigned ARB_shader_image_load_store:1;
unsigned ARB_direct_state_access:1;
unsigned ARB_shader_storage_buffer_object:1;
unsigned ARB_program_interface_query:1;
unsigned ARB_color_buffer_float:1;
unsigned texture_3d:1;
unsigned pixel_buffer_object:1;
unsigned read_buffer:1;
unsigned framebuffer_object:1;
unsigned read_framebuffer_object:1;
unsigned query_buffer_object:1;
unsigned primitive_restart:1;
unsigned unpack_subimage:1;
Features(void);
void
load(const Profile & profile, const Extensions & exts);
// Load from current context
void
load(void);
};
} /* namespace glfeatures */