1#include "CapabilitiesGL20.h"
4#include "Foundation/Logging/Logger.h"
14 void toUpper(std::string &
string)
16 std::transform(
string.begin(),
string.end(),
string.begin(), [](
const char & c) {
return (
char)::toupper(c); });
20Cogs::CapabilitiesGL20::CapabilitiesGL20() :
23 vendor(Vendors::Unknown),
24 series(Series::Unknown),
29void Cogs::CapabilitiesGL20::initialize(
bool useClipControl)
31 const char* vendorString =
reinterpret_cast<const char*
>(glGetString(GL_VENDOR));
32 const char* rendererString =
reinterpret_cast<const char*
>(glGetString(GL_RENDERER));
33 std::string vendor(vendorString ? vendorString :
"");
34 std::string renderer(rendererString ? rendererString :
"");
37 LOG_DEBUG(logger,
"Version: %s", glGetString(GL_VERSION));
38 LOG_DEBUG(logger,
"Vendor: %s", vendor.c_str());
39 LOG_DEBUG(logger,
"Renderer: %s", renderer.c_str());
43 glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
45 for (GLint i = 0; i < numExtensions; i++) {
46 LOG_DEBUG(logger,
"%s", (
const char *)glGetStringi(GL_EXTENSIONS, i));
54 GLint num_extensions = 0;
55 glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
56 for(GLint i=0; i<num_extensions; i++){
57 const char *ext = (
const char*)glGetStringi(GL_EXTENSIONS, i);
58 extensions.insert(std::string(ext));
61 ARB_base_instance = isSupported(
"GL_ARB_base_instance");
62 ARB_instanced_arrays = isSupported(
"GL_ARB_instanced_arrays");
63 ARB_sampler_objects = isSupported(
"GL_ARB_sampler_objects");
64 ARB_shader_image_load_store = isSupported(
"GL_ARB_shader_image_load_store");
65 ARB_pixel_buffer_object = isSupported(
"GL_ARB_pixel_buffer_object");
66 ARB_texture_storage = isSupported(
"GL_ARB_texture_storage");
67 ARB_texture_storage_multisample = isSupported(
"GL_ARB_texture_storage_multisample");
68 ARB_compute_shader = isSupported(
"GL_ARB_compute_shader");
69 KHR_debug = isSupported(
"GL_KHR_debug");
70 ARB_debug_output = isSupported(
"GL_ARB_debug_output");
71 EXT_texture_filter_anisotropic = isSupported(
"GL_EXT_texture_filter_anisotropic");
73 if (vendor.find(
"NVIDIA") != vendor.npos) {
76 if (renderer.find(
"QUADRO FX") != std::string::npos) series =
Series::QuadroFX;
77 else if (renderer.find(
"QUADRO") != std::string::npos) series =
Series::Quadro;
78 else if (renderer.find(
"GEFORCE") != std::string::npos) series =
Series::geForce;
80 auto modelString = renderer.substr(0, renderer.find_first_of(
'/'));
82 if (modelString.size()) {
83 std::regex numbers(
"\\d.*");
86 if (std::regex_search(modelString, results, numbers)) {
87 model = std::stoi(results[0].str());
91 else if (vendor.find(
"AMD") != vendor.npos || vendor.find(
"ATI") != vendor.npos) {
94 if (renderer.find(
"FIREGL") != std::string::npos) series =
Series::FireGL;
96 else if (vendor.find(
"INTEL") != vendor.npos) {
99 else if (vendor.find(
"APPLE") != vendor.npos) {
106 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &deviceCapabilities.MaxTextureSlots);
107 glGetIntegerv(GL_MAJOR_VERSION, &deviceCapabilities.featureLevelMajor);
108 glGetIntegerv(GL_MINOR_VERSION, &deviceCapabilities.featureLevelMinor);
110 GLint uniformBufferOffsetAlignment = 0;
111 glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &uniformBufferOffsetAlignment);
112 if (uniformBufferOffsetAlignment) {
116 GLint maxTextureSize = 0;
117 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
120 GLint max3DTextureSize = 0;
121 glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &max3DTextureSize);
124 GLint maxCubeTextureSize = 0;
125 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTextureSize);
128 GLint maxArrayTextureLayers = 0;
129 glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTextureLayers);
132 LOG_DEBUG(logger,
"Texture limits: 2D=%u 3D=%u Cube=%u Array=%u",
139#ifdef COGS_ENABLE_GLSLANG
140 deviceCapabilities.SupportsHlsl =
true;
142 deviceCapabilities.GeometryShaders =
true;
143 deviceCapabilities.TessellationShaders =
true;
144 deviceCapabilities.ComputeShaders =
true;
145 deviceCapabilities.SupportsMultipleThreads =
false;
149 if (isSupported(
"GL_EXT_texture_compression_s3tc")) {
150 deviceCapabilities.TextureCompressionS3TC =
true;
152 if (isSupported(
"GL_EXT_texture_compression_rgtc")) {
153 deviceCapabilities.TextureCompressionRGTC =
true;
155 if (isSupported(
"GL_ARB_texture_compression_bptc")) {
156 deviceCapabilities.TextureCompressionBPTC =
true;
158 if (isSupported(
"GL_KHR_texture_compression_astc_hdr")) {
159 deviceCapabilities.TextureCompressionASTC =
true;
164bool Cogs::CapabilitiesGL20::isSupported(
const StringView & extension)
const
166 return extensions.find(std::string(extension)) != extensions.end();
Log implementation class.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
bool DepthNegativeOneToOne
If true, min z depth=-1 otherwise it is min z depth = 0 (max z depth = 1).
uint32_t MaxTexture3DSize
Using D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION as default.
bool OriginOnTop
If true, y=0 refers to top of screen, otherwise it refers to bottom.
uint32_t MaxTexture2DSize
Using D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION as default.
bool SyncObjects
Support for syncronization objects.
uint32_t MaxTextureCubeSize
Using D3D11_REQ_TEXTURECUBE_DIMENSION as default.
uint32_t MaxTextureArrayLayers
Using D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION as default.
unsigned ConstantBufferOffsetAlignment
Minimum offset alignment when binding constant buffers.
@ QuadroFX
nVidia Quadro FX professional graphics adapters.
@ FireGL
AMD FireGL series.
@ geForce
nVidia geForce consumer adapters.
@ Quadro
nVidia Quadro professional graphics adapters.
@ nVidia
nVidia Corporation.
@ Unknown
Unknown device vendor.