mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
	
	
		
			497 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			497 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | //
 | ||
|  | // Copyright (C) 2016 Google, Inc.
 | ||
|  | //
 | ||
|  | // All rights reserved.
 | ||
|  | //
 | ||
|  | // Redistribution and use in source and binary forms, with or without
 | ||
|  | // modification, are permitted provided that the following conditions
 | ||
|  | // are met:
 | ||
|  | //
 | ||
|  | //    Redistributions of source code must retain the above copyright
 | ||
|  | //    notice, this list of conditions and the following disclaimer.
 | ||
|  | //
 | ||
|  | //    Redistributions in binary form must reproduce the above
 | ||
|  | //    copyright notice, this list of conditions and the following
 | ||
|  | //    disclaimer in the documentation and/or other materials provided
 | ||
|  | //    with the distribution.
 | ||
|  | //
 | ||
|  | //    Neither the name of Google Inc. nor the names of its
 | ||
|  | //    contributors may be used to endorse or promote products derived
 | ||
|  | //    from this software without specific prior written permission.
 | ||
|  | //
 | ||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | ||
|  | // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | ||
|  | // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | ||
|  | // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | ||
|  | // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | ||
|  | // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | ||
|  | // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | ||
|  | // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 | ||
|  | // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | ||
|  | // POSSIBILITY OF SUCH DAMAGE.
 | ||
|  | 
 | ||
|  | #include <cstdlib>
 | ||
|  | #include <cstring>
 | ||
|  | #include <sstream>
 | ||
|  | #include <cctype>
 | ||
|  | 
 | ||
|  | #include "ResourceLimits.h"
 | ||
|  | 
 | ||
|  | namespace glslang { | ||
|  | 
 | ||
|  | const TBuiltInResource DefaultTBuiltInResource = { | ||
|  |     /* .MaxLights = */ 32, | ||
|  |     /* .MaxClipPlanes = */ 6, | ||
|  |     /* .MaxTextureUnits = */ 32, | ||
|  |     /* .MaxTextureCoords = */ 32, | ||
|  |     /* .MaxVertexAttribs = */ 64, | ||
|  |     /* .MaxVertexUniformComponents = */ 4096, | ||
|  |     /* .MaxVaryingFloats = */ 64, | ||
|  |     /* .MaxVertexTextureImageUnits = */ 32, | ||
|  |     /* .MaxCombinedTextureImageUnits = */ 80, | ||
|  |     /* .MaxTextureImageUnits = */ 32, | ||
|  |     /* .MaxFragmentUniformComponents = */ 4096, | ||
|  |     /* .MaxDrawBuffers = */ 32, | ||
|  |     /* .MaxVertexUniformVectors = */ 128, | ||
|  |     /* .MaxVaryingVectors = */ 8, | ||
|  |     /* .MaxFragmentUniformVectors = */ 16, | ||
|  |     /* .MaxVertexOutputVectors = */ 16, | ||
|  |     /* .MaxFragmentInputVectors = */ 15, | ||
|  |     /* .MinProgramTexelOffset = */ -8, | ||
|  |     /* .MaxProgramTexelOffset = */ 7, | ||
|  |     /* .MaxClipDistances = */ 8, | ||
|  |     /* .MaxComputeWorkGroupCountX = */ 65535, | ||
|  |     /* .MaxComputeWorkGroupCountY = */ 65535, | ||
|  |     /* .MaxComputeWorkGroupCountZ = */ 65535, | ||
|  |     /* .MaxComputeWorkGroupSizeX = */ 1024, | ||
|  |     /* .MaxComputeWorkGroupSizeY = */ 1024, | ||
|  |     /* .MaxComputeWorkGroupSizeZ = */ 64, | ||
|  |     /* .MaxComputeUniformComponents = */ 1024, | ||
|  |     /* .MaxComputeTextureImageUnits = */ 16, | ||
|  |     /* .MaxComputeImageUniforms = */ 8, | ||
|  |     /* .MaxComputeAtomicCounters = */ 8, | ||
|  |     /* .MaxComputeAtomicCounterBuffers = */ 1, | ||
|  |     /* .MaxVaryingComponents = */ 60, | ||
|  |     /* .MaxVertexOutputComponents = */ 64, | ||
|  |     /* .MaxGeometryInputComponents = */ 64, | ||
|  |     /* .MaxGeometryOutputComponents = */ 128, | ||
|  |     /* .MaxFragmentInputComponents = */ 128, | ||
|  |     /* .MaxImageUnits = */ 8, | ||
|  |     /* .MaxCombinedImageUnitsAndFragmentOutputs = */ 8, | ||
|  |     /* .MaxCombinedShaderOutputResources = */ 8, | ||
|  |     /* .MaxImageSamples = */ 0, | ||
|  |     /* .MaxVertexImageUniforms = */ 0, | ||
|  |     /* .MaxTessControlImageUniforms = */ 0, | ||
|  |     /* .MaxTessEvaluationImageUniforms = */ 0, | ||
|  |     /* .MaxGeometryImageUniforms = */ 0, | ||
|  |     /* .MaxFragmentImageUniforms = */ 8, | ||
|  |     /* .MaxCombinedImageUniforms = */ 8, | ||
|  |     /* .MaxGeometryTextureImageUnits = */ 16, | ||
|  |     /* .MaxGeometryOutputVertices = */ 256, | ||
|  |     /* .MaxGeometryTotalOutputComponents = */ 1024, | ||
|  |     /* .MaxGeometryUniformComponents = */ 1024, | ||
|  |     /* .MaxGeometryVaryingComponents = */ 64, | ||
|  |     /* .MaxTessControlInputComponents = */ 128, | ||
|  |     /* .MaxTessControlOutputComponents = */ 128, | ||
|  |     /* .MaxTessControlTextureImageUnits = */ 16, | ||
|  |     /* .MaxTessControlUniformComponents = */ 1024, | ||
|  |     /* .MaxTessControlTotalOutputComponents = */ 4096, | ||
|  |     /* .MaxTessEvaluationInputComponents = */ 128, | ||
|  |     /* .MaxTessEvaluationOutputComponents = */ 128, | ||
|  |     /* .MaxTessEvaluationTextureImageUnits = */ 16, | ||
|  |     /* .MaxTessEvaluationUniformComponents = */ 1024, | ||
|  |     /* .MaxTessPatchComponents = */ 120, | ||
|  |     /* .MaxPatchVertices = */ 32, | ||
|  |     /* .MaxTessGenLevel = */ 64, | ||
|  |     /* .MaxViewports = */ 16, | ||
|  |     /* .MaxVertexAtomicCounters = */ 0, | ||
|  |     /* .MaxTessControlAtomicCounters = */ 0, | ||
|  |     /* .MaxTessEvaluationAtomicCounters = */ 0, | ||
|  |     /* .MaxGeometryAtomicCounters = */ 0, | ||
|  |     /* .MaxFragmentAtomicCounters = */ 8, | ||
|  |     /* .MaxCombinedAtomicCounters = */ 8, | ||
|  |     /* .MaxAtomicCounterBindings = */ 1, | ||
|  |     /* .MaxVertexAtomicCounterBuffers = */ 0, | ||
|  |     /* .MaxTessControlAtomicCounterBuffers = */ 0, | ||
|  |     /* .MaxTessEvaluationAtomicCounterBuffers = */ 0, | ||
|  |     /* .MaxGeometryAtomicCounterBuffers = */ 0, | ||
|  |     /* .MaxFragmentAtomicCounterBuffers = */ 1, | ||
|  |     /* .MaxCombinedAtomicCounterBuffers = */ 1, | ||
|  |     /* .MaxAtomicCounterBufferSize = */ 16384, | ||
|  |     /* .MaxTransformFeedbackBuffers = */ 4, | ||
|  |     /* .MaxTransformFeedbackInterleavedComponents = */ 64, | ||
|  |     /* .MaxCullDistances = */ 8, | ||
|  |     /* .MaxCombinedClipAndCullDistances = */ 8, | ||
|  |     /* .MaxSamples = */ 4, | ||
|  |     /* .maxMeshOutputVerticesNV = */ 256, | ||
|  |     /* .maxMeshOutputPrimitivesNV = */ 512, | ||
|  |     /* .maxMeshWorkGroupSizeX_NV = */ 32, | ||
|  |     /* .maxMeshWorkGroupSizeY_NV = */ 1, | ||
|  |     /* .maxMeshWorkGroupSizeZ_NV = */ 1, | ||
|  |     /* .maxTaskWorkGroupSizeX_NV = */ 32, | ||
|  |     /* .maxTaskWorkGroupSizeY_NV = */ 1, | ||
|  |     /* .maxTaskWorkGroupSizeZ_NV = */ 1, | ||
|  |     /* .maxMeshViewCountNV = */ 4, | ||
|  |     /* .maxDualSourceDrawBuffersEXT = */ 1, | ||
|  | 
 | ||
|  |     /* .limits = */ { | ||
|  |         /* .nonInductiveForLoops = */ 1, | ||
|  |         /* .whileLoops = */ 1, | ||
|  |         /* .doWhileLoops = */ 1, | ||
|  |         /* .generalUniformIndexing = */ 1, | ||
|  |         /* .generalAttributeMatrixVectorIndexing = */ 1, | ||
|  |         /* .generalVaryingIndexing = */ 1, | ||
|  |         /* .generalSamplerIndexing = */ 1, | ||
|  |         /* .generalVariableIndexing = */ 1, | ||
|  |         /* .generalConstantMatrixVectorIndexing = */ 1, | ||
|  |     }}; | ||
|  | 
 | ||
|  | std::string GetDefaultTBuiltInResourceString() | ||
|  | { | ||
|  |     std::ostringstream ostream; | ||
|  | 
 | ||
|  |     ostream << "MaxLights "                                 << DefaultTBuiltInResource.maxLights << "\n" | ||
|  |             << "MaxClipPlanes "                             << DefaultTBuiltInResource.maxClipPlanes << "\n" | ||
|  |             << "MaxTextureUnits "                           << DefaultTBuiltInResource.maxTextureUnits << "\n" | ||
|  |             << "MaxTextureCoords "                          << DefaultTBuiltInResource.maxTextureCoords << "\n" | ||
|  |             << "MaxVertexAttribs "                          << DefaultTBuiltInResource.maxVertexAttribs << "\n" | ||
|  |             << "MaxVertexUniformComponents "                << DefaultTBuiltInResource.maxVertexUniformComponents << "\n" | ||
|  |             << "MaxVaryingFloats "                          << DefaultTBuiltInResource.maxVaryingFloats << "\n" | ||
|  |             << "MaxVertexTextureImageUnits "                << DefaultTBuiltInResource.maxVertexTextureImageUnits << "\n" | ||
|  |             << "MaxCombinedTextureImageUnits "              << DefaultTBuiltInResource.maxCombinedTextureImageUnits << "\n" | ||
|  |             << "MaxTextureImageUnits "                      << DefaultTBuiltInResource.maxTextureImageUnits << "\n" | ||
|  |             << "MaxFragmentUniformComponents "              << DefaultTBuiltInResource.maxFragmentUniformComponents << "\n" | ||
|  |             << "MaxDrawBuffers "                            << DefaultTBuiltInResource.maxDrawBuffers << "\n" | ||
|  |             << "MaxVertexUniformVectors "                   << DefaultTBuiltInResource.maxVertexUniformVectors << "\n" | ||
|  |             << "MaxVaryingVectors "                         << DefaultTBuiltInResource.maxVaryingVectors << "\n" | ||
|  |             << "MaxFragmentUniformVectors "                 << DefaultTBuiltInResource.maxFragmentUniformVectors << "\n" | ||
|  |             << "MaxVertexOutputVectors "                    << DefaultTBuiltInResource.maxVertexOutputVectors << "\n" | ||
|  |             << "MaxFragmentInputVectors "                   << DefaultTBuiltInResource.maxFragmentInputVectors << "\n" | ||
|  |             << "MinProgramTexelOffset "                     << DefaultTBuiltInResource.minProgramTexelOffset << "\n" | ||
|  |             << "MaxProgramTexelOffset "                     << DefaultTBuiltInResource.maxProgramTexelOffset << "\n" | ||
|  |             << "MaxClipDistances "                          << DefaultTBuiltInResource.maxClipDistances << "\n" | ||
|  |             << "MaxComputeWorkGroupCountX "                 << DefaultTBuiltInResource.maxComputeWorkGroupCountX << "\n" | ||
|  |             << "MaxComputeWorkGroupCountY "                 << DefaultTBuiltInResource.maxComputeWorkGroupCountY << "\n" | ||
|  |             << "MaxComputeWorkGroupCountZ "                 << DefaultTBuiltInResource.maxComputeWorkGroupCountZ << "\n" | ||
|  |             << "MaxComputeWorkGroupSizeX "                  << DefaultTBuiltInResource.maxComputeWorkGroupSizeX << "\n" | ||
|  |             << "MaxComputeWorkGroupSizeY "                  << DefaultTBuiltInResource.maxComputeWorkGroupSizeY << "\n" | ||
|  |             << "MaxComputeWorkGroupSizeZ "                  << DefaultTBuiltInResource.maxComputeWorkGroupSizeZ << "\n" | ||
|  |             << "MaxComputeUniformComponents "               << DefaultTBuiltInResource.maxComputeUniformComponents << "\n" | ||
|  |             << "MaxComputeTextureImageUnits "               << DefaultTBuiltInResource.maxComputeTextureImageUnits << "\n" | ||
|  |             << "MaxComputeImageUniforms "                   << DefaultTBuiltInResource.maxComputeImageUniforms << "\n" | ||
|  |             << "MaxComputeAtomicCounters "                  << DefaultTBuiltInResource.maxComputeAtomicCounters << "\n" | ||
|  |             << "MaxComputeAtomicCounterBuffers "            << DefaultTBuiltInResource.maxComputeAtomicCounterBuffers << "\n" | ||
|  |             << "MaxVaryingComponents "                      << DefaultTBuiltInResource.maxVaryingComponents << "\n" | ||
|  |             << "MaxVertexOutputComponents "                 << DefaultTBuiltInResource.maxVertexOutputComponents << "\n" | ||
|  |             << "MaxGeometryInputComponents "                << DefaultTBuiltInResource.maxGeometryInputComponents << "\n" | ||
|  |             << "MaxGeometryOutputComponents "               << DefaultTBuiltInResource.maxGeometryOutputComponents << "\n" | ||
|  |             << "MaxFragmentInputComponents "                << DefaultTBuiltInResource.maxFragmentInputComponents << "\n" | ||
|  |             << "MaxImageUnits "                             << DefaultTBuiltInResource.maxImageUnits << "\n" | ||
|  |             << "MaxCombinedImageUnitsAndFragmentOutputs "   << DefaultTBuiltInResource.maxCombinedImageUnitsAndFragmentOutputs << "\n" | ||
|  |             << "MaxCombinedShaderOutputResources "          << DefaultTBuiltInResource.maxCombinedShaderOutputResources << "\n" | ||
|  |             << "MaxImageSamples "                           << DefaultTBuiltInResource.maxImageSamples << "\n" | ||
|  |             << "MaxVertexImageUniforms "                    << DefaultTBuiltInResource.maxVertexImageUniforms << "\n" | ||
|  |             << "MaxTessControlImageUniforms "               << DefaultTBuiltInResource.maxTessControlImageUniforms << "\n" | ||
|  |             << "MaxTessEvaluationImageUniforms "            << DefaultTBuiltInResource.maxTessEvaluationImageUniforms << "\n" | ||
|  |             << "MaxGeometryImageUniforms "                  << DefaultTBuiltInResource.maxGeometryImageUniforms << "\n" | ||
|  |             << "MaxFragmentImageUniforms "                  << DefaultTBuiltInResource.maxFragmentImageUniforms << "\n" | ||
|  |             << "MaxCombinedImageUniforms "                  << DefaultTBuiltInResource.maxCombinedImageUniforms << "\n" | ||
|  |             << "MaxGeometryTextureImageUnits "              << DefaultTBuiltInResource.maxGeometryTextureImageUnits << "\n" | ||
|  |             << "MaxGeometryOutputVertices "                 << DefaultTBuiltInResource.maxGeometryOutputVertices << "\n" | ||
|  |             << "MaxGeometryTotalOutputComponents "          << DefaultTBuiltInResource.maxGeometryTotalOutputComponents << "\n" | ||
|  |             << "MaxGeometryUniformComponents "              << DefaultTBuiltInResource.maxGeometryUniformComponents << "\n" | ||
|  |             << "MaxGeometryVaryingComponents "              << DefaultTBuiltInResource.maxGeometryVaryingComponents << "\n" | ||
|  |             << "MaxTessControlInputComponents "             << DefaultTBuiltInResource.maxTessControlInputComponents << "\n" | ||
|  |             << "MaxTessControlOutputComponents "            << DefaultTBuiltInResource.maxTessControlOutputComponents << "\n" | ||
|  |             << "MaxTessControlTextureImageUnits "           << DefaultTBuiltInResource.maxTessControlTextureImageUnits << "\n" | ||
|  |             << "MaxTessControlUniformComponents "           << DefaultTBuiltInResource.maxTessControlUniformComponents << "\n" | ||
|  |             << "MaxTessControlTotalOutputComponents "       << DefaultTBuiltInResource.maxTessControlTotalOutputComponents << "\n" | ||
|  |             << "MaxTessEvaluationInputComponents "          << DefaultTBuiltInResource.maxTessEvaluationInputComponents << "\n" | ||
|  |             << "MaxTessEvaluationOutputComponents "         << DefaultTBuiltInResource.maxTessEvaluationOutputComponents << "\n" | ||
|  |             << "MaxTessEvaluationTextureImageUnits "        << DefaultTBuiltInResource.maxTessEvaluationTextureImageUnits << "\n" | ||
|  |             << "MaxTessEvaluationUniformComponents "        << DefaultTBuiltInResource.maxTessEvaluationUniformComponents << "\n" | ||
|  |             << "MaxTessPatchComponents "                    << DefaultTBuiltInResource.maxTessPatchComponents << "\n" | ||
|  |             << "MaxPatchVertices "                          << DefaultTBuiltInResource.maxPatchVertices << "\n" | ||
|  |             << "MaxTessGenLevel "                           << DefaultTBuiltInResource.maxTessGenLevel << "\n" | ||
|  |             << "MaxViewports "                              << DefaultTBuiltInResource.maxViewports << "\n" | ||
|  |             << "MaxVertexAtomicCounters "                   << DefaultTBuiltInResource.maxVertexAtomicCounters << "\n" | ||
|  |             << "MaxTessControlAtomicCounters "              << DefaultTBuiltInResource.maxTessControlAtomicCounters << "\n" | ||
|  |             << "MaxTessEvaluationAtomicCounters "           << DefaultTBuiltInResource.maxTessEvaluationAtomicCounters << "\n" | ||
|  |             << "MaxGeometryAtomicCounters "                 << DefaultTBuiltInResource.maxGeometryAtomicCounters << "\n" | ||
|  |             << "MaxFragmentAtomicCounters "                 << DefaultTBuiltInResource.maxFragmentAtomicCounters << "\n" | ||
|  |             << "MaxCombinedAtomicCounters "                 << DefaultTBuiltInResource.maxCombinedAtomicCounters << "\n" | ||
|  |             << "MaxAtomicCounterBindings "                  << DefaultTBuiltInResource.maxAtomicCounterBindings << "\n" | ||
|  |             << "MaxVertexAtomicCounterBuffers "             << DefaultTBuiltInResource.maxVertexAtomicCounterBuffers << "\n" | ||
|  |             << "MaxTessControlAtomicCounterBuffers "        << DefaultTBuiltInResource.maxTessControlAtomicCounterBuffers << "\n" | ||
|  |             << "MaxTessEvaluationAtomicCounterBuffers "     << DefaultTBuiltInResource.maxTessEvaluationAtomicCounterBuffers << "\n" | ||
|  |             << "MaxGeometryAtomicCounterBuffers "           << DefaultTBuiltInResource.maxGeometryAtomicCounterBuffers << "\n" | ||
|  |             << "MaxFragmentAtomicCounterBuffers "           << DefaultTBuiltInResource.maxFragmentAtomicCounterBuffers << "\n" | ||
|  |             << "MaxCombinedAtomicCounterBuffers "           << DefaultTBuiltInResource.maxCombinedAtomicCounterBuffers << "\n" | ||
|  |             << "MaxAtomicCounterBufferSize "                << DefaultTBuiltInResource.maxAtomicCounterBufferSize << "\n" | ||
|  |             << "MaxTransformFeedbackBuffers "               << DefaultTBuiltInResource.maxTransformFeedbackBuffers << "\n" | ||
|  |             << "MaxTransformFeedbackInterleavedComponents " << DefaultTBuiltInResource.maxTransformFeedbackInterleavedComponents << "\n" | ||
|  |             << "MaxCullDistances "                          << DefaultTBuiltInResource.maxCullDistances << "\n" | ||
|  |             << "MaxCombinedClipAndCullDistances "           << DefaultTBuiltInResource.maxCombinedClipAndCullDistances << "\n" | ||
|  |             << "MaxSamples "                                << DefaultTBuiltInResource.maxSamples << "\n" | ||
|  |             << "MaxMeshOutputVerticesNV "                   << DefaultTBuiltInResource.maxMeshOutputVerticesNV << "\n" | ||
|  |             << "MaxMeshOutputPrimitivesNV "                 << DefaultTBuiltInResource.maxMeshOutputPrimitivesNV << "\n" | ||
|  |             << "MaxMeshWorkGroupSizeX_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeX_NV << "\n" | ||
|  |             << "MaxMeshWorkGroupSizeY_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeY_NV << "\n" | ||
|  |             << "MaxMeshWorkGroupSizeZ_NV "                  << DefaultTBuiltInResource.maxMeshWorkGroupSizeZ_NV << "\n" | ||
|  |             << "MaxTaskWorkGroupSizeX_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeX_NV << "\n" | ||
|  |             << "MaxTaskWorkGroupSizeY_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeY_NV << "\n" | ||
|  |             << "MaxTaskWorkGroupSizeZ_NV "                  << DefaultTBuiltInResource.maxTaskWorkGroupSizeZ_NV << "\n" | ||
|  |             << "MaxMeshViewCountNV "                        << DefaultTBuiltInResource.maxMeshViewCountNV << "\n" | ||
|  |             << "MaxDualSourceDrawBuffersEXT "               << DefaultTBuiltInResource.maxDualSourceDrawBuffersEXT << "\n" | ||
|  |             << "nonInductiveForLoops "                      << DefaultTBuiltInResource.limits.nonInductiveForLoops << "\n" | ||
|  |             << "whileLoops "                                << DefaultTBuiltInResource.limits.whileLoops << "\n" | ||
|  |             << "doWhileLoops "                              << DefaultTBuiltInResource.limits.doWhileLoops << "\n" | ||
|  |             << "generalUniformIndexing "                    << DefaultTBuiltInResource.limits.generalUniformIndexing << "\n" | ||
|  |             << "generalAttributeMatrixVectorIndexing "      << DefaultTBuiltInResource.limits.generalAttributeMatrixVectorIndexing << "\n" | ||
|  |             << "generalVaryingIndexing "                    << DefaultTBuiltInResource.limits.generalVaryingIndexing << "\n" | ||
|  |             << "generalSamplerIndexing "                    << DefaultTBuiltInResource.limits.generalSamplerIndexing << "\n" | ||
|  |             << "generalVariableIndexing "                   << DefaultTBuiltInResource.limits.generalVariableIndexing << "\n" | ||
|  |             << "generalConstantMatrixVectorIndexing "       << DefaultTBuiltInResource.limits.generalConstantMatrixVectorIndexing << "\n" | ||
|  |       ; | ||
|  | 
 | ||
|  |     return ostream.str(); | ||
|  | } | ||
|  | 
 | ||
|  | void DecodeResourceLimits(TBuiltInResource* resources, char* config) | ||
|  | { | ||
|  |     static const char* delims = " \t\n\r"; | ||
|  | 
 | ||
|  |     size_t pos     = 0; | ||
|  |     std::string configStr(config); | ||
|  | 
 | ||
|  |     while ((pos = configStr.find_first_not_of(delims, pos)) != std::string::npos) { | ||
|  |         const size_t token_s = pos; | ||
|  |         const size_t token_e = configStr.find_first_of(delims, token_s); | ||
|  |         const size_t value_s = configStr.find_first_not_of(delims, token_e); | ||
|  |         const size_t value_e = configStr.find_first_of(delims, value_s); | ||
|  |         pos = value_e; | ||
|  | 
 | ||
|  |         // Faster to use compare(), but prefering readability.
 | ||
|  |         const std::string tokenStr = configStr.substr(token_s, token_e-token_s); | ||
|  |         const std::string valueStr = configStr.substr(value_s, value_e-value_s); | ||
|  | 
 | ||
|  |         if (value_s == std::string::npos || ! (valueStr[0] == '-' || isdigit(valueStr[0]))) { | ||
|  |             printf("Error: '%s' bad .conf file.  Each name must be followed by one number.\n", | ||
|  |                    valueStr.c_str()); | ||
|  |             return; | ||
|  |         } | ||
|  | 
 | ||
|  |         const int value = std::atoi(valueStr.c_str()); | ||
|  | 
 | ||
|  |         if (tokenStr == "MaxLights") | ||
|  |             resources->maxLights = value; | ||
|  |         else if (tokenStr == "MaxClipPlanes") | ||
|  |             resources->maxClipPlanes = value; | ||
|  |         else if (tokenStr == "MaxTextureUnits") | ||
|  |             resources->maxTextureUnits = value; | ||
|  |         else if (tokenStr == "MaxTextureCoords") | ||
|  |             resources->maxTextureCoords = value; | ||
|  |         else if (tokenStr == "MaxVertexAttribs") | ||
|  |             resources->maxVertexAttribs = value; | ||
|  |         else if (tokenStr == "MaxVertexUniformComponents") | ||
|  |             resources->maxVertexUniformComponents = value; | ||
|  |         else if (tokenStr == "MaxVaryingFloats") | ||
|  |             resources->maxVaryingFloats = value; | ||
|  |         else if (tokenStr == "MaxVertexTextureImageUnits") | ||
|  |             resources->maxVertexTextureImageUnits = value; | ||
|  |         else if (tokenStr == "MaxCombinedTextureImageUnits") | ||
|  |             resources->maxCombinedTextureImageUnits = value; | ||
|  |         else if (tokenStr == "MaxTextureImageUnits") | ||
|  |             resources->maxTextureImageUnits = value; | ||
|  |         else if (tokenStr == "MaxFragmentUniformComponents") | ||
|  |             resources->maxFragmentUniformComponents = value; | ||
|  |         else if (tokenStr == "MaxDrawBuffers") | ||
|  |             resources->maxDrawBuffers = value; | ||
|  |         else if (tokenStr == "MaxVertexUniformVectors") | ||
|  |             resources->maxVertexUniformVectors = value; | ||
|  |         else if (tokenStr == "MaxVaryingVectors") | ||
|  |             resources->maxVaryingVectors = value; | ||
|  |         else if (tokenStr == "MaxFragmentUniformVectors") | ||
|  |             resources->maxFragmentUniformVectors = value; | ||
|  |         else if (tokenStr == "MaxVertexOutputVectors") | ||
|  |             resources->maxVertexOutputVectors = value; | ||
|  |         else if (tokenStr == "MaxFragmentInputVectors") | ||
|  |             resources->maxFragmentInputVectors = value; | ||
|  |         else if (tokenStr == "MinProgramTexelOffset") | ||
|  |             resources->minProgramTexelOffset = value; | ||
|  |         else if (tokenStr == "MaxProgramTexelOffset") | ||
|  |             resources->maxProgramTexelOffset = value; | ||
|  |         else if (tokenStr == "MaxClipDistances") | ||
|  |             resources->maxClipDistances = value; | ||
|  |         else if (tokenStr == "MaxComputeWorkGroupCountX") | ||
|  |             resources->maxComputeWorkGroupCountX = value; | ||
|  |         else if (tokenStr == "MaxComputeWorkGroupCountY") | ||
|  |             resources->maxComputeWorkGroupCountY = value; | ||
|  |         else if (tokenStr == "MaxComputeWorkGroupCountZ") | ||
|  |             resources->maxComputeWorkGroupCountZ = value; | ||
|  |         else if (tokenStr == "MaxComputeWorkGroupSizeX") | ||
|  |             resources->maxComputeWorkGroupSizeX = value; | ||
|  |         else if (tokenStr == "MaxComputeWorkGroupSizeY") | ||
|  |             resources->maxComputeWorkGroupSizeY = value; | ||
|  |         else if (tokenStr == "MaxComputeWorkGroupSizeZ") | ||
|  |             resources->maxComputeWorkGroupSizeZ = value; | ||
|  |         else if (tokenStr == "MaxComputeUniformComponents") | ||
|  |             resources->maxComputeUniformComponents = value; | ||
|  |         else if (tokenStr == "MaxComputeTextureImageUnits") | ||
|  |             resources->maxComputeTextureImageUnits = value; | ||
|  |         else if (tokenStr == "MaxComputeImageUniforms") | ||
|  |             resources->maxComputeImageUniforms = value; | ||
|  |         else if (tokenStr == "MaxComputeAtomicCounters") | ||
|  |             resources->maxComputeAtomicCounters = value; | ||
|  |         else if (tokenStr == "MaxComputeAtomicCounterBuffers") | ||
|  |             resources->maxComputeAtomicCounterBuffers = value; | ||
|  |         else if (tokenStr == "MaxVaryingComponents") | ||
|  |             resources->maxVaryingComponents = value; | ||
|  |         else if (tokenStr == "MaxVertexOutputComponents") | ||
|  |             resources->maxVertexOutputComponents = value; | ||
|  |         else if (tokenStr == "MaxGeometryInputComponents") | ||
|  |             resources->maxGeometryInputComponents = value; | ||
|  |         else if (tokenStr == "MaxGeometryOutputComponents") | ||
|  |             resources->maxGeometryOutputComponents = value; | ||
|  |         else if (tokenStr == "MaxFragmentInputComponents") | ||
|  |             resources->maxFragmentInputComponents = value; | ||
|  |         else if (tokenStr == "MaxImageUnits") | ||
|  |             resources->maxImageUnits = value; | ||
|  |         else if (tokenStr == "MaxCombinedImageUnitsAndFragmentOutputs") | ||
|  |             resources->maxCombinedImageUnitsAndFragmentOutputs = value; | ||
|  |         else if (tokenStr == "MaxCombinedShaderOutputResources") | ||
|  |             resources->maxCombinedShaderOutputResources = value; | ||
|  |         else if (tokenStr == "MaxImageSamples") | ||
|  |             resources->maxImageSamples = value; | ||
|  |         else if (tokenStr == "MaxVertexImageUniforms") | ||
|  |             resources->maxVertexImageUniforms = value; | ||
|  |         else if (tokenStr == "MaxTessControlImageUniforms") | ||
|  |             resources->maxTessControlImageUniforms = value; | ||
|  |         else if (tokenStr == "MaxTessEvaluationImageUniforms") | ||
|  |             resources->maxTessEvaluationImageUniforms = value; | ||
|  |         else if (tokenStr == "MaxGeometryImageUniforms") | ||
|  |             resources->maxGeometryImageUniforms = value; | ||
|  |         else if (tokenStr == "MaxFragmentImageUniforms") | ||
|  |             resources->maxFragmentImageUniforms = value; | ||
|  |         else if (tokenStr == "MaxCombinedImageUniforms") | ||
|  |             resources->maxCombinedImageUniforms = value; | ||
|  |         else if (tokenStr == "MaxGeometryTextureImageUnits") | ||
|  |             resources->maxGeometryTextureImageUnits = value; | ||
|  |         else if (tokenStr == "MaxGeometryOutputVertices") | ||
|  |             resources->maxGeometryOutputVertices = value; | ||
|  |         else if (tokenStr == "MaxGeometryTotalOutputComponents") | ||
|  |             resources->maxGeometryTotalOutputComponents = value; | ||
|  |         else if (tokenStr == "MaxGeometryUniformComponents") | ||
|  |             resources->maxGeometryUniformComponents = value; | ||
|  |         else if (tokenStr == "MaxGeometryVaryingComponents") | ||
|  |             resources->maxGeometryVaryingComponents = value; | ||
|  |         else if (tokenStr == "MaxTessControlInputComponents") | ||
|  |             resources->maxTessControlInputComponents = value; | ||
|  |         else if (tokenStr == "MaxTessControlOutputComponents") | ||
|  |             resources->maxTessControlOutputComponents = value; | ||
|  |         else if (tokenStr == "MaxTessControlTextureImageUnits") | ||
|  |             resources->maxTessControlTextureImageUnits = value; | ||
|  |         else if (tokenStr == "MaxTessControlUniformComponents") | ||
|  |             resources->maxTessControlUniformComponents = value; | ||
|  |         else if (tokenStr == "MaxTessControlTotalOutputComponents") | ||
|  |             resources->maxTessControlTotalOutputComponents = value; | ||
|  |         else if (tokenStr == "MaxTessEvaluationInputComponents") | ||
|  |             resources->maxTessEvaluationInputComponents = value; | ||
|  |         else if (tokenStr == "MaxTessEvaluationOutputComponents") | ||
|  |             resources->maxTessEvaluationOutputComponents = value; | ||
|  |         else if (tokenStr == "MaxTessEvaluationTextureImageUnits") | ||
|  |             resources->maxTessEvaluationTextureImageUnits = value; | ||
|  |         else if (tokenStr == "MaxTessEvaluationUniformComponents") | ||
|  |             resources->maxTessEvaluationUniformComponents = value; | ||
|  |         else if (tokenStr == "MaxTessPatchComponents") | ||
|  |             resources->maxTessPatchComponents = value; | ||
|  |         else if (tokenStr == "MaxPatchVertices") | ||
|  |             resources->maxPatchVertices = value; | ||
|  |         else if (tokenStr == "MaxTessGenLevel") | ||
|  |             resources->maxTessGenLevel = value; | ||
|  |         else if (tokenStr == "MaxViewports") | ||
|  |             resources->maxViewports = value; | ||
|  |         else if (tokenStr == "MaxVertexAtomicCounters") | ||
|  |             resources->maxVertexAtomicCounters = value; | ||
|  |         else if (tokenStr == "MaxTessControlAtomicCounters") | ||
|  |             resources->maxTessControlAtomicCounters = value; | ||
|  |         else if (tokenStr == "MaxTessEvaluationAtomicCounters") | ||
|  |             resources->maxTessEvaluationAtomicCounters = value; | ||
|  |         else if (tokenStr == "MaxGeometryAtomicCounters") | ||
|  |             resources->maxGeometryAtomicCounters = value; | ||
|  |         else if (tokenStr == "MaxFragmentAtomicCounters") | ||
|  |             resources->maxFragmentAtomicCounters = value; | ||
|  |         else if (tokenStr == "MaxCombinedAtomicCounters") | ||
|  |             resources->maxCombinedAtomicCounters = value; | ||
|  |         else if (tokenStr == "MaxAtomicCounterBindings") | ||
|  |             resources->maxAtomicCounterBindings = value; | ||
|  |         else if (tokenStr == "MaxVertexAtomicCounterBuffers") | ||
|  |             resources->maxVertexAtomicCounterBuffers = value; | ||
|  |         else if (tokenStr == "MaxTessControlAtomicCounterBuffers") | ||
|  |             resources->maxTessControlAtomicCounterBuffers = value; | ||
|  |         else if (tokenStr == "MaxTessEvaluationAtomicCounterBuffers") | ||
|  |             resources->maxTessEvaluationAtomicCounterBuffers = value; | ||
|  |         else if (tokenStr == "MaxGeometryAtomicCounterBuffers") | ||
|  |             resources->maxGeometryAtomicCounterBuffers = value; | ||
|  |         else if (tokenStr == "MaxFragmentAtomicCounterBuffers") | ||
|  |             resources->maxFragmentAtomicCounterBuffers = value; | ||
|  |         else if (tokenStr == "MaxCombinedAtomicCounterBuffers") | ||
|  |             resources->maxCombinedAtomicCounterBuffers = value; | ||
|  |         else if (tokenStr == "MaxAtomicCounterBufferSize") | ||
|  |             resources->maxAtomicCounterBufferSize = value; | ||
|  |         else if (tokenStr == "MaxTransformFeedbackBuffers") | ||
|  |             resources->maxTransformFeedbackBuffers = value; | ||
|  |         else if (tokenStr == "MaxTransformFeedbackInterleavedComponents") | ||
|  |             resources->maxTransformFeedbackInterleavedComponents = value; | ||
|  |         else if (tokenStr == "MaxCullDistances") | ||
|  |             resources->maxCullDistances = value; | ||
|  |         else if (tokenStr == "MaxCombinedClipAndCullDistances") | ||
|  |             resources->maxCombinedClipAndCullDistances = value; | ||
|  |         else if (tokenStr == "MaxSamples") | ||
|  |             resources->maxSamples = value; | ||
|  |         else if (tokenStr == "MaxMeshOutputVerticesNV") | ||
|  |             resources->maxMeshOutputVerticesNV = value; | ||
|  |         else if (tokenStr == "MaxMeshOutputPrimitivesNV") | ||
|  |             resources->maxMeshOutputPrimitivesNV = value; | ||
|  |         else if (tokenStr == "MaxMeshWorkGroupSizeX_NV") | ||
|  |             resources->maxMeshWorkGroupSizeX_NV = value; | ||
|  |         else if (tokenStr == "MaxMeshWorkGroupSizeY_NV") | ||
|  |             resources->maxMeshWorkGroupSizeY_NV = value; | ||
|  |         else if (tokenStr == "MaxMeshWorkGroupSizeZ_NV") | ||
|  |             resources->maxMeshWorkGroupSizeZ_NV = value; | ||
|  |         else if (tokenStr == "MaxTaskWorkGroupSizeX_NV") | ||
|  |             resources->maxTaskWorkGroupSizeX_NV = value; | ||
|  |         else if (tokenStr == "MaxTaskWorkGroupSizeY_NV") | ||
|  |             resources->maxTaskWorkGroupSizeY_NV = value; | ||
|  |         else if (tokenStr == "MaxTaskWorkGroupSizeZ_NV") | ||
|  |             resources->maxTaskWorkGroupSizeZ_NV = value; | ||
|  |         else if (tokenStr == "MaxMeshViewCountNV") | ||
|  |             resources->maxMeshViewCountNV = value; | ||
|  |         else if (tokenStr == "nonInductiveForLoops") | ||
|  |             resources->limits.nonInductiveForLoops = (value != 0); | ||
|  |         else if (tokenStr == "whileLoops") | ||
|  |             resources->limits.whileLoops = (value != 0); | ||
|  |         else if (tokenStr == "doWhileLoops") | ||
|  |             resources->limits.doWhileLoops = (value != 0); | ||
|  |         else if (tokenStr == "generalUniformIndexing") | ||
|  |             resources->limits.generalUniformIndexing = (value != 0); | ||
|  |         else if (tokenStr == "generalAttributeMatrixVectorIndexing") | ||
|  |             resources->limits.generalAttributeMatrixVectorIndexing = (value != 0); | ||
|  |         else if (tokenStr == "generalVaryingIndexing") | ||
|  |             resources->limits.generalVaryingIndexing = (value != 0); | ||
|  |         else if (tokenStr == "generalSamplerIndexing") | ||
|  |             resources->limits.generalSamplerIndexing = (value != 0); | ||
|  |         else if (tokenStr == "generalVariableIndexing") | ||
|  |             resources->limits.generalVariableIndexing = (value != 0); | ||
|  |         else if (tokenStr == "generalConstantMatrixVectorIndexing") | ||
|  |             resources->limits.generalConstantMatrixVectorIndexing = (value != 0); | ||
|  |         else | ||
|  |             printf("Warning: unrecognized limit (%s) in configuration file.\n", tokenStr.c_str()); | ||
|  | 
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | }  // end namespace glslang
 |