/src/ogre/OgreMain/src/OgreRenderSystemCapabilities.cpp
Line | Count | Source |
1 | | /* |
2 | | ----------------------------------------------------------------------------- |
3 | | This source file is part of OGRE |
4 | | (Object-oriented Graphics Rendering Engine) |
5 | | For the latest info, see http://www.ogre3d.org/ |
6 | | |
7 | | Copyright (c) 2000-2014 Torus Knot Software Ltd |
8 | | |
9 | | Permission is hereby granted, free of charge, to any person obtaining a copy |
10 | | of this software and associated documentation files (the "Software"), to deal |
11 | | in the Software without restriction, including without limitation the rights |
12 | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
13 | | copies of the Software, and to permit persons to whom the Software is |
14 | | furnished to do so, subject to the following conditions: |
15 | | |
16 | | The above copyright notice and this permission notice shall be included in |
17 | | all copies or substantial portions of the Software. |
18 | | |
19 | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
20 | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
21 | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
22 | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
23 | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
24 | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
25 | | THE SOFTWARE. |
26 | | ----------------------------------------------------------------------------- |
27 | | */ |
28 | | #include "OgreStableHeaders.h" |
29 | | |
30 | | #include "OgreRenderSystemCapabilities.h" |
31 | | |
32 | | namespace Ogre { |
33 | | |
34 | | String DriverVersion::toString() const |
35 | 0 | { |
36 | 0 | StringStream str; |
37 | 0 | str << major << "." << minor << "." << release << "." << build; |
38 | 0 | return str.str(); |
39 | 0 | } |
40 | | |
41 | | void DriverVersion::fromString(const String& versionString) |
42 | 0 | { |
43 | 0 | StringVector tokens = StringUtil::split(versionString, "."); |
44 | 0 | if(!tokens.empty()) |
45 | 0 | { |
46 | 0 | major = StringConverter::parseInt(tokens[0]); |
47 | 0 | if (tokens.size() > 1) |
48 | 0 | minor = StringConverter::parseInt(tokens[1]); |
49 | 0 | if (tokens.size() > 2) |
50 | 0 | release = StringConverter::parseInt(tokens[2]); |
51 | 0 | if (tokens.size() > 3) |
52 | 0 | build = StringConverter::parseInt(tokens[3]); |
53 | 0 | } |
54 | 0 | } |
55 | | |
56 | | //----------------------------------------------------------------------- |
57 | | RenderSystemCapabilities::RenderSystemCapabilities() |
58 | 0 | : mVendor(GPU_UNKNOWN) |
59 | 0 | , mNumTextureUnits(0) |
60 | 0 | , mStencilBufferBitDepth(8) |
61 | 0 | , mConstantFloatCount{} |
62 | 0 | , mNumMultiRenderTargets(1) |
63 | 0 | , mMaxPointSize(1) |
64 | 0 | , mNonPOW2TexturesLimited(false) |
65 | 0 | , mMaxSupportedAnisotropy(0) |
66 | 0 | , mNumVertexTextureUnits(0) |
67 | 0 | , mGeometryProgramNumOutputVertices(0) |
68 | 0 | , mNumVertexAttributes(1) |
69 | 0 | { |
70 | 0 | for(int i = 0; i < CAPS_CATEGORY_COUNT; i++) |
71 | 0 | { |
72 | 0 | mCapabilities[i] = 0; |
73 | 0 | } |
74 | 0 | mCategoryRelevant[CAPS_CATEGORY_COMMON] = true; |
75 | 0 | mCategoryRelevant[CAPS_CATEGORY_COMMON_2] = true; |
76 | | // each rendersystem should enable these |
77 | 0 | mCategoryRelevant[CAPS_CATEGORY_D3D9] = false; |
78 | 0 | mCategoryRelevant[CAPS_CATEGORY_GL] = false; |
79 | 0 | } |
80 | | |
81 | 0 | void RenderSystemCapabilities::addShaderProfile(const String& profile) { mSupportedShaderProfiles.insert(profile); } |
82 | | |
83 | | void RenderSystemCapabilities::removeShaderProfile(const String& profile) |
84 | 0 | { |
85 | 0 | mSupportedShaderProfiles.erase(profile); |
86 | 0 | } |
87 | | |
88 | | bool RenderSystemCapabilities::isShaderProfileSupported(const String& profile) const |
89 | 0 | { |
90 | 0 | return (mSupportedShaderProfiles.end() != mSupportedShaderProfiles.find(profile)); |
91 | 0 | } |
92 | | |
93 | | //----------------------------------------------------------------------- |
94 | | void RenderSystemCapabilities::log(Log* pLog) const |
95 | 0 | { |
96 | 0 | pLog->logMessage("RenderSystem capabilities"); |
97 | 0 | pLog->logMessage("-------------------------"); |
98 | 0 | pLog->logMessage("RenderSystem Name: " + getRenderSystemName()); |
99 | 0 | pLog->logMessage("GPU Vendor: " + vendorToString(getVendor())); |
100 | 0 | pLog->logMessage("Device Name: " + getDeviceName()); |
101 | 0 | pLog->logMessage("Driver Version: " + getDriverVersion().toString()); |
102 | 0 | pLog->logMessage(" * Fixed function pipeline: " + |
103 | 0 | StringConverter::toString(hasCapability(RSC_FIXED_FUNCTION), true)); |
104 | 0 | pLog->logMessage(" * 32-bit index buffers: " + StringConverter::toString(hasCapability(RSC_32BIT_INDEX), true)); |
105 | 0 | pLog->logMessage(" * Hardware stencil buffer: " + |
106 | 0 | StringConverter::toString(hasCapability(RSC_HWSTENCIL), true)); |
107 | 0 | if (hasCapability(RSC_HWSTENCIL)) |
108 | 0 | { |
109 | 0 | pLog->logMessage(" - Two sided stencil support: " + |
110 | 0 | StringConverter::toString(hasCapability(RSC_TWO_SIDED_STENCIL), true)); |
111 | 0 | pLog->logMessage(" - Wrap stencil values: " + |
112 | 0 | StringConverter::toString(hasCapability(RSC_STENCIL_WRAP), true)); |
113 | 0 | } |
114 | 0 | pLog->logMessage(" * Gpu programs: " + StringConverter::toString(hasCapability(RSC_VERTEX_PROGRAM), true)); |
115 | 0 | if (hasCapability(RSC_VERTEX_PROGRAM)) |
116 | 0 | { |
117 | 0 | pLog->logMessage(" - Vertex constant 4-vectors: " + |
118 | 0 | StringConverter::toString(mConstantFloatCount[GPT_VERTEX_PROGRAM])); |
119 | 0 | pLog->logMessage(" - Fragment constant 4-vectors: " + |
120 | 0 | StringConverter::toString(mConstantFloatCount[GPT_FRAGMENT_PROGRAM])); |
121 | 0 | } |
122 | 0 | pLog->logMessage(" * Geometry programs: " + |
123 | 0 | StringConverter::toString(hasCapability(RSC_GEOMETRY_PROGRAM), true)); |
124 | 0 | if (hasCapability(RSC_GEOMETRY_PROGRAM)) |
125 | 0 | { |
126 | 0 | pLog->logMessage(" - Number of constant 4-vectors: " + |
127 | 0 | StringConverter::toString(mConstantFloatCount[GPT_GEOMETRY_PROGRAM])); |
128 | 0 | } |
129 | 0 | pLog->logMessage(" * Tessellation programs: " + |
130 | 0 | StringConverter::toString(hasCapability(RSC_TESSELLATION_PROGRAM), true)); |
131 | 0 | if (hasCapability(RSC_TESSELLATION_PROGRAM)) |
132 | 0 | { |
133 | 0 | pLog->logMessage(" - Hull program constant 4-vectors: " + |
134 | 0 | StringConverter::toString(mConstantFloatCount[GPT_HULL_PROGRAM])); |
135 | 0 | pLog->logMessage(" - Domain program constant 4-vectors: " + |
136 | 0 | StringConverter::toString(mConstantFloatCount[GPT_DOMAIN_PROGRAM])); |
137 | 0 | } |
138 | 0 | pLog->logMessage(" * Mesh programs: " + StringConverter::toString(hasCapability(RSC_MESH_PROGRAM), true)); |
139 | 0 | pLog->logMessage(" * Compute programs: " + StringConverter::toString(hasCapability(RSC_COMPUTE_PROGRAM), true)); |
140 | 0 | if (hasCapability(RSC_COMPUTE_PROGRAM)) |
141 | 0 | { |
142 | 0 | pLog->logMessage(" - Number of constant 4-vectors: " + |
143 | 0 | StringConverter::toString(mConstantFloatCount[GPT_COMPUTE_PROGRAM])); |
144 | 0 | } |
145 | 0 | pLog->logMessage(" * VP/RT index from any shader: " + |
146 | 0 | StringConverter::toString(hasCapability(RSC_VP_RT_INDEX_ANY_SHADER), true)); |
147 | 0 | pLog->logMessage( |
148 | 0 | " * Supported Shader Profiles: " + |
149 | 0 | StringConverter::toString(StringVector(mSupportedShaderProfiles.begin(), mSupportedShaderProfiles.end()))); |
150 | 0 | pLog->logMessage(" * Read-back compiled shader: " + |
151 | 0 | StringConverter::toString(hasCapability(RSC_CAN_GET_COMPILED_SHADER_BUFFER), true)); |
152 | 0 | pLog->logMessage(" * Number of vertex attributes: " + StringConverter::toString(mNumVertexAttributes)); |
153 | 0 | pLog->logMessage(" * Textures"); |
154 | 0 | pLog->logMessage(" - Number of texture units: " + StringConverter::toString(mNumTextureUnits)); |
155 | 0 | pLog->logMessage(" - Number of vertex textures: " + StringConverter::toString(mNumVertexTextureUnits)); |
156 | 0 | pLog->logMessage(" - Floating point: " + StringConverter::toString(hasCapability(RSC_TEXTURE_FLOAT), true)); |
157 | 0 | pLog->logMessage( |
158 | 0 | " - Non-power-of-two: " + StringConverter::toString(hasCapability(RSC_NON_POWER_OF_2_TEXTURES), true) + |
159 | 0 | (mNonPOW2TexturesLimited ? " (limited)" : "")); |
160 | 0 | pLog->logMessage(" - 1D textures: " + StringConverter::toString(hasCapability(RSC_TEXTURE_1D), true)); |
161 | 0 | pLog->logMessage(" - 2D array textures: " + StringConverter::toString(hasCapability(RSC_TEXTURE_2D_ARRAY), true)); |
162 | 0 | pLog->logMessage(" - 3D textures: " + StringConverter::toString(hasCapability(RSC_TEXTURE_3D), true)); |
163 | 0 | pLog->logMessage(" - Anisotropic filtering: " + StringConverter::toString(hasCapability(RSC_ANISOTROPY), true)); |
164 | |
|
165 | 0 | pLog->logMessage( |
166 | 0 | " * Texture Compression: " |
167 | 0 | + StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION), true)); |
168 | 0 | if (hasCapability(RSC_TEXTURE_COMPRESSION)) |
169 | 0 | { |
170 | 0 | pLog->logMessage(" - DXT: " + |
171 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_DXT), true)); |
172 | 0 | pLog->logMessage(" - VTC: " + |
173 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_VTC), true)); |
174 | 0 | pLog->logMessage(" - PVRTC: " + |
175 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_PVRTC), true)); |
176 | 0 | pLog->logMessage(" - ATC: " + |
177 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_ATC), true)); |
178 | 0 | pLog->logMessage(" - ETC1: " + |
179 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_ETC1), true)); |
180 | 0 | pLog->logMessage(" - ETC2: " + |
181 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_ETC2), true)); |
182 | 0 | pLog->logMessage(" - BC4/BC5: " + |
183 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_BC4_BC5), true)); |
184 | 0 | pLog->logMessage(" - BC6H/BC7: " + |
185 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_BC6H_BC7), true)); |
186 | 0 | pLog->logMessage(" - ASTC: " + |
187 | 0 | StringConverter::toString(hasCapability(RSC_TEXTURE_COMPRESSION_ASTC), true)); |
188 | 0 | pLog->logMessage(" - Automatic mipmap generation: " + |
189 | 0 | StringConverter::toString(hasCapability(RSC_AUTOMIPMAP_COMPRESSED), true)); |
190 | 0 | } |
191 | |
|
192 | 0 | pLog->logMessage(" * Vertex Buffers"); |
193 | 0 | pLog->logMessage(" - Render to Vertex Buffer: " + |
194 | 0 | StringConverter::toString(hasCapability(RSC_HWRENDER_TO_VERTEX_BUFFER), true)); |
195 | 0 | pLog->logMessage(" - Instance Data: " + |
196 | 0 | StringConverter::toString(hasCapability(RSC_VERTEX_BUFFER_INSTANCE_DATA), true)); |
197 | 0 | pLog->logMessage(" - Primitive Restart: " + |
198 | 0 | StringConverter::toString(hasCapability(RSC_PRIMITIVE_RESTART), true)); |
199 | 0 | pLog->logMessage(" - INT_10_10_10_2_NORM element type: " + |
200 | 0 | StringConverter::toString(hasCapability(RSC_VERTEX_FORMAT_INT_10_10_10_2), true)); |
201 | 0 | pLog->logMessage(" - 16x3 element types: " + |
202 | 0 | StringConverter::toString(hasCapability(RSC_VERTEX_FORMAT_16X3), true)); |
203 | 0 | pLog->logMessage(" * Read/Write Buffers: " + |
204 | 0 | StringConverter::toString(hasCapability(RSC_READ_WRITE_BUFFERS), true)); |
205 | 0 | pLog->logMessage( |
206 | 0 | " * Hardware Occlusion Query: " |
207 | 0 | + StringConverter::toString(hasCapability(RSC_HWOCCLUSION), true)); |
208 | 0 | pLog->logMessage( |
209 | 0 | " * User clip planes: " |
210 | 0 | + StringConverter::toString(hasCapability(RSC_USER_CLIP_PLANES), true)); |
211 | 0 | pLog->logMessage( |
212 | 0 | " * Depth clamping: " |
213 | 0 | + StringConverter::toString(hasCapability(RSC_DEPTH_CLAMP), true)); |
214 | 0 | pLog->logMessage( |
215 | 0 | " * Hardware render-to-texture: " |
216 | 0 | + StringConverter::toString(hasCapability(RSC_HWRENDER_TO_TEXTURE), true)); |
217 | 0 | pLog->logMessage(" - Multiple Render Targets: " + StringConverter::toString(mNumMultiRenderTargets)); |
218 | 0 | pLog->logMessage(" * Point Sprites: " + StringConverter::toString(hasCapability(RSC_POINT_SPRITES), true)); |
219 | 0 | if (hasCapability(RSC_POINT_SPRITES)) |
220 | 0 | { |
221 | 0 | pLog->logMessage(" - Max Size: " + StringConverter::toString(mMaxPointSize)); |
222 | 0 | } |
223 | 0 | pLog->logMessage( |
224 | 0 | " * Wide Lines: " |
225 | 0 | + StringConverter::toString(hasCapability(RSC_WIDE_LINES), true)); |
226 | 0 | pLog->logMessage( |
227 | 0 | " * Hardware Gamma: " |
228 | 0 | + StringConverter::toString(hasCapability(RSC_HW_GAMMA), true)); |
229 | 0 | if (mCategoryRelevant[CAPS_CATEGORY_GL]) |
230 | 0 | { |
231 | 0 | pLog->logMessage( |
232 | 0 | " * PBuffer support: " |
233 | 0 | + StringConverter::toString(hasCapability(RSC_PBUFFER), true)); |
234 | 0 | pLog->logMessage( |
235 | 0 | " * Vertex Array Objects: " |
236 | 0 | + StringConverter::toString(hasCapability(RSC_VAO), true)); |
237 | 0 | pLog->logMessage(" * Separate shader objects: " + |
238 | 0 | StringConverter::toString(hasCapability(RSC_SEPARATE_SHADER_OBJECTS), true)); |
239 | 0 | pLog->logMessage(" - redeclare GLSL interface block: " + |
240 | 0 | StringConverter::toString(hasCapability(RSC_GLSL_SSO_REDECLARE), true)); |
241 | 0 | pLog->logMessage( |
242 | 0 | " * Debugging/ profiling events: " |
243 | 0 | + StringConverter::toString(hasCapability(RSC_DEBUG), true)); |
244 | 0 | pLog->logMessage( |
245 | 0 | " * Map buffer storage: " |
246 | 0 | + StringConverter::toString(hasCapability(RSC_MAPBUFFER), true)); |
247 | 0 | } |
248 | |
|
249 | 0 | if (mCategoryRelevant[CAPS_CATEGORY_D3D9]) |
250 | 0 | { |
251 | 0 | pLog->logMessage( |
252 | 0 | " * DirectX per stage constants: " |
253 | 0 | + StringConverter::toString(hasCapability(RSC_PERSTAGECONSTANT), true)); |
254 | 0 | pLog->logMessage( |
255 | 0 | " * W-Buffer supported: " |
256 | 0 | + StringConverter::toString(hasCapability(RSC_WBUFFER), true)); |
257 | 0 | pLog->logMessage(" * Multiple Render Targets must have same bit depth: " + |
258 | 0 | StringConverter::toString(hasCapability(RSC_MRT_SAME_BIT_DEPTHS), true)); |
259 | 0 | } |
260 | 0 | } |
261 | | //--------------------------------------------------------------------- |
262 | | String RenderSystemCapabilities::msGPUVendorStrings[GPU_VENDOR_COUNT]; |
263 | | //--------------------------------------------------------------------- |
264 | | GPUVendor RenderSystemCapabilities::vendorFromString(const String& vendorString) |
265 | 0 | { |
266 | 0 | initVendorStrings(); |
267 | 0 | GPUVendor ret = GPU_UNKNOWN; |
268 | 0 | String cmpString = vendorString; |
269 | 0 | StringUtil::toLowerCase(cmpString); |
270 | 0 | for (int i = 0; i < GPU_VENDOR_COUNT; ++i) |
271 | 0 | { |
272 | | // case insensitive (lower case) |
273 | 0 | if (msGPUVendorStrings[i] == cmpString) |
274 | 0 | { |
275 | 0 | ret = static_cast<GPUVendor>(i); |
276 | 0 | break; |
277 | 0 | } |
278 | 0 | } |
279 | |
|
280 | 0 | return ret; |
281 | | |
282 | 0 | } |
283 | | //--------------------------------------------------------------------- |
284 | | const String& RenderSystemCapabilities::vendorToString(GPUVendor v) |
285 | 0 | { |
286 | 0 | initVendorStrings(); |
287 | 0 | return msGPUVendorStrings[v]; |
288 | 0 | } |
289 | | //--------------------------------------------------------------------- |
290 | | void RenderSystemCapabilities::initVendorStrings() |
291 | 0 | { |
292 | 0 | if (msGPUVendorStrings[0].empty()) |
293 | 0 | { |
294 | | // Always lower case! |
295 | 0 | msGPUVendorStrings[GPU_UNKNOWN] = "unknown"; |
296 | 0 | msGPUVendorStrings[GPU_NVIDIA] = "nvidia"; |
297 | 0 | msGPUVendorStrings[GPU_AMD] = "amd"; |
298 | 0 | msGPUVendorStrings[GPU_INTEL] = "intel"; |
299 | 0 | msGPUVendorStrings[GPU_IMAGINATION_TECHNOLOGIES] = "imagination technologies"; |
300 | 0 | msGPUVendorStrings[GPU_APPLE] = "apple"; // iOS Simulator |
301 | 0 | msGPUVendorStrings[GPU_NOKIA] = "nokia"; |
302 | 0 | msGPUVendorStrings[GPU_MS_SOFTWARE] = "microsoft"; // Microsoft software device |
303 | 0 | msGPUVendorStrings[GPU_MS_WARP] = "ms warp"; |
304 | 0 | msGPUVendorStrings[GPU_ARM] = "arm"; |
305 | 0 | msGPUVendorStrings[GPU_QUALCOMM] = "qualcomm"; |
306 | 0 | msGPUVendorStrings[GPU_MOZILLA] = "mozilla"; |
307 | 0 | msGPUVendorStrings[GPU_WEBKIT] = "webkit"; |
308 | 0 | } |
309 | 0 | } |
310 | | |
311 | | } |