Cogs.Core
CapabilitiesGL20.cpp
1#include "CapabilitiesGL20.h"
2#include "CommonGL20.h"
3
4#include "Foundation/Logging/Logger.h"
5
6#include <algorithm>
7#include <cctype>
8#include <regex>
9
10namespace
11{
12 static Cogs::Logging::Log logger = Cogs::Logging::getLogger("CapabilitiesGL20");
13
14 void toUpper(std::string & string)
15 {
16 std::transform(string.begin(), string.end(), string.begin(), [](const char & c) { return (char)::toupper(c); });
17 }
18}
19
20Cogs::CapabilitiesGL20::CapabilitiesGL20() :
21 logStrings(true),
22 logExtensions(false),
23 vendor(Vendors::Unknown),
24 series(Series::Unknown),
25 model(UnknownModel)
26{
27}
28
29void Cogs::CapabilitiesGL20::initialize(bool useClipControl)
30{
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 : "");
35
36 if (logStrings) {
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());
40
41 if (logExtensions) {
42 GLint numExtensions;
43 glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
44
45 for (GLint i = 0; i < numExtensions; i++) {
46 LOG_DEBUG(logger, "%s", (const char *)glGetStringi(GL_EXTENSIONS, i));
47 }
48 }
49 }
50
51 toUpper(vendor);
52 toUpper(renderer);
53
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));
59 }
60
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");
72
73 if (vendor.find("NVIDIA") != vendor.npos) {
74 this->vendor = Vendors::nVidia;
75
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;
79
80 auto modelString = renderer.substr(0, renderer.find_first_of('/'));
81
82 if (modelString.size()) {
83 std::regex numbers("\\d.*");
84 std::smatch results;
85
86 if (std::regex_search(modelString, results, numbers)) {
87 model = std::stoi(results[0].str());
88 }
89 }
90 }
91 else if (vendor.find("AMD") != vendor.npos || vendor.find("ATI") != vendor.npos) {
92 this->vendor = Vendors::AMD;
93
94 if (renderer.find("FIREGL") != std::string::npos) series = Series::FireGL;
95 }
96 else if (vendor.find("INTEL") != vendor.npos) {
97 this->vendor = Vendors::Intel;
98 }
99 else if (vendor.find("APPLE") != vendor.npos) {
100 this->vendor = Vendors::Apple;
101 }
102 else {
103 this->vendor = Vendors::Unknown;
104 }
105
106 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &deviceCapabilities.MaxTextureSlots);
107 glGetIntegerv(GL_MAJOR_VERSION, &deviceCapabilities.featureLevelMajor);
108 glGetIntegerv(GL_MINOR_VERSION, &deviceCapabilities.featureLevelMinor);
109
110 GLint uniformBufferOffsetAlignment = 0;
111 glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &uniformBufferOffsetAlignment);
112 if (uniformBufferOffsetAlignment) {
113 deviceCapabilities.ConstantBufferOffsetAlignment = uniformBufferOffsetAlignment;
114 }
115
116 GLint maxTextureSize = 0;
117 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
118 deviceCapabilities.MaxTexture2DSize = std::max(1, maxTextureSize);
119
120 GLint max3DTextureSize = 0;
121 glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &max3DTextureSize);
122 deviceCapabilities.MaxTexture3DSize = std::max(1, max3DTextureSize);
123
124 GLint maxCubeTextureSize = 0;
125 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTextureSize);
126 deviceCapabilities.MaxTextureCubeSize = std::max(1, maxCubeTextureSize);
127
128 GLint maxArrayTextureLayers = 0;
129 glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTextureLayers);
130 deviceCapabilities.MaxTextureArrayLayers = std::max(1, maxArrayTextureLayers);
131
132 LOG_DEBUG(logger, "Texture limits: 2D=%u 3D=%u Cube=%u Array=%u",
133 deviceCapabilities.MaxTexture2DSize,
134 deviceCapabilities.MaxTexture3DSize,
135 deviceCapabilities.MaxTextureCubeSize,
136 deviceCapabilities.MaxTextureArrayLayers);
137
138 deviceCapabilities.SyncObjects = true;
139#ifdef COGS_ENABLE_GLSLANG
140 deviceCapabilities.SupportsHlsl = true;
141#endif
142 deviceCapabilities.GeometryShaders = true;
143 deviceCapabilities.TessellationShaders = true;
144 deviceCapabilities.ComputeShaders = true;
145 deviceCapabilities.SupportsMultipleThreads = false;
146 deviceCapabilities.OriginOnTop = false;
147 deviceCapabilities.DepthNegativeOneToOne = !useClipControl;
148
149 if (isSupported("GL_EXT_texture_compression_s3tc")) {
150 deviceCapabilities.TextureCompressionS3TC = true;
151 }
152 if (isSupported("GL_EXT_texture_compression_rgtc")) {
153 deviceCapabilities.TextureCompressionRGTC = true;
154 }
155 if (isSupported("GL_ARB_texture_compression_bptc")) {
156 deviceCapabilities.TextureCompressionBPTC = true;
157 }
158 if (isSupported("GL_KHR_texture_compression_astc_hdr")) {
159 deviceCapabilities.TextureCompressionASTC = true;
160 }
161
162}
163
164bool Cogs::CapabilitiesGL20::isSupported(const StringView & extension) const
165{
166 return extensions.find(std::string(extension)) != extensions.end();
167}
Log implementation class.
Definition: LogManager.h:139
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180
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.
Definition: ICapabilities.h:81
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.
Definition: ICapabilities.h:80
bool SyncObjects
Support for syncronization objects.
Definition: ICapabilities.h:86
uint32_t MaxTextureCubeSize
Using D3D11_REQ_TEXTURECUBE_DIMENSION as default.
Definition: ICapabilities.h:82
uint32_t MaxTextureArrayLayers
Using D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION as default.
Definition: ICapabilities.h:83
unsigned ConstantBufferOffsetAlignment
Minimum offset alignment when binding constant buffers.
Definition: ICapabilities.h:78
@ QuadroFX
nVidia Quadro FX professional graphics adapters.
Definition: ICapabilities.h:50
@ FireGL
AMD FireGL series.
Definition: ICapabilities.h:43
@ geForce
nVidia geForce consumer adapters.
Definition: ICapabilities.h:46
@ Quadro
nVidia Quadro professional graphics adapters.
Definition: ICapabilities.h:48
@ Apple
Apple silicon.
Definition: ICapabilities.h:24
@ nVidia
nVidia Corporation.
Definition: ICapabilities.h:20
@ Unknown
Unknown device vendor.
Definition: ICapabilities.h:16