@@ -390,6 +390,55 @@ static std::string BuildDeformSteps( deformStage_t *deforms, int numDeforms )
390390 return steps;
391391}
392392
393+ struct addedExtension_t {
394+ bool &available;
395+ int minGlslVersion;
396+ std::string name;
397+ };
398+
399+ // Fragment and vertex version declaration.
400+ static const std::vector<addedExtension_t> fragmentVertexAddedExtensions = {
401+ { glConfig2.gpuShader4Available , 130 , " EXT_gpu_shader4" },
402+ { glConfig2.gpuShader5Available , 400 , " ARB_gpu_shader5" },
403+ { glConfig2.textureGatherAvailable , 400 , " ARB_texture_gather" },
404+ { glConfig2.textureIntegerAvailable , 0 , " EXT_texture_integer" },
405+ { glConfig2.textureRGAvailable , 0 , " ARB_texture_rg" },
406+ { glConfig2.uniformBufferObjectAvailable , 140 , " ARB_uniform_buffer_object" },
407+ { glConfig2.bindlessTexturesAvailable , -1 , " ARB_bindless_texture" },
408+ /* ARB_shader_draw_parameters set to -1, because we might get a 4.6 GL context,
409+ where the core variables have different names. */
410+ { glConfig2.shaderDrawParametersAvailable , -1 , " ARB_shader_draw_parameters" },
411+ { glConfig2.SSBOAvailable , 430 , " ARB_shader_storage_buffer_object" },
412+ };
413+
414+ // Compute version declaration, this has to be separate from other shader stages,
415+ // because some things are unique to vertex/fragment or compute shaders.
416+ static const std::vector<addedExtension_t> computeAddedExtensions = {
417+ { glConfig2.computeShaderAvailable , 430 , " ARB_compute_shader" },
418+ { glConfig2.gpuShader4Available , 130 , " EXT_gpu_shader4" },
419+ { glConfig2.gpuShader5Available , 400 , " ARB_gpu_shader5" },
420+ { glConfig2.uniformBufferObjectAvailable , 140 , " ARB_uniform_buffer_object" },
421+ { glConfig2.SSBOAvailable , 430 , " ARB_shader_storage_buffer_object" },
422+ { glConfig2.shadingLanguage420PackAvailable , 420 , " ARB_shading_language_420pack" },
423+ { glConfig2.explicitUniformLocationAvailable , 430 , " ARB_explicit_uniform_location" },
424+ { glConfig2.shaderImageLoadStoreAvailable , 420 , " ARB_shader_image_load_store" },
425+ { glConfig2.shaderAtomicCountersAvailable , 420 , " ARB_shader_atomic_counters" },
426+ /* ARB_shader_atomic_counter_ops set to -1,
427+ because we might get a 4.6 GL context, where the core functions have different names. */
428+ { glConfig2.shaderAtomicCounterOpsAvailable , -1 , " ARB_shader_atomic_counter_ops" },
429+ { glConfig2.bindlessTexturesAvailable , -1 , " ARB_bindless_texture" },
430+ /* Even though these are part of the GL_KHR_shader_subgroup extension, we need to enable
431+ the individual extensions for each feature.
432+ GL_KHR_shader_subgroup itself can't be used in the shader. */
433+ { glConfig2.shaderSubgroupBasicAvailable , -1 , " KHR_shader_subgroup_basic" },
434+ { glConfig2.shaderSubgroupVoteAvailable , -1 , " KHR_shader_subgroup_vote" },
435+ { glConfig2.shaderSubgroupArithmeticAvailable , -1 , " KHR_shader_subgroup_arithmetic" },
436+ { glConfig2.shaderSubgroupBallotAvailable , -1 , " KHR_shader_subgroup_ballot" },
437+ { glConfig2.shaderSubgroupShuffleAvailable , -1 , " KHR_shader_subgroup_shuffle" },
438+ { glConfig2.shaderSubgroupShuffleRelativeAvailable , -1 , " KHR_shader_subgroup_shuffle_relative" },
439+ { glConfig2.shaderSubgroupQuadAvailable , -1 , " KHR_shader_subgroup_quad" },
440+ };
441+
393442static void addExtension ( std::string& str, bool available, int minGlslVersion, const std::string& name ) {
394443 if ( !available ) {
395444 return ;
@@ -417,84 +466,26 @@ static void AddConst( std::string& str, const std::string& name, float v1, float
417466 str += Str::Format (" const vec2 %s = vec2(%.8e, %.8e);\n " , name, v1, v2);
418467}
419468
420- static std::string GenVersionDeclaration () {
421- // Basic version declaration
469+ static std::string GenVersionDeclaration ( const std::vector<addedExtension_t> &addedExtensions ) {
470+ // Declare version.
422471 std::string str = Str::Format ( " #version %d %s\n " ,
423472 glConfig2.shadingLanguageVersion ,
424473 glConfig2.shadingLanguageVersion >= 150 ? ( glConfig2.glCoreProfile ? " core" : " compatibility" ) : " " );
425474
426- // add supported GLSL extensions
427- struct extension_t {
428- bool available;
429- int minGlslVersion;
430- std::string name;
431- };
432-
433- const std::vector<extension_t > extensions = {
434- { glConfig2.gpuShader4Available , 130 , " EXT_gpu_shader4" },
435- { glConfig2.gpuShader5Available , 400 , " ARB_gpu_shader5" },
436- { glConfig2.textureGatherAvailable , 400 , " ARB_texture_gather" },
437- { glConfig2.textureIntegerAvailable , 0 , " EXT_texture_integer" },
438- { glConfig2.textureRGAvailable , 0 , " ARB_texture_rg" },
439- { glConfig2.uniformBufferObjectAvailable , 140 , " ARB_uniform_buffer_object" },
440- { glConfig2.bindlessTexturesAvailable , -1 , " ARB_bindless_texture" },
441- // ARB_shader_draw_parameters set to -1, because we might get a 4.6 GL context, where the core variables have different names
442- { glConfig2.shaderDrawParametersAvailable , -1 , " ARB_shader_draw_parameters" },
443- { glConfig2.SSBOAvailable , 430 , " ARB_shader_storage_buffer_object" },
444- };
445-
446- for ( const auto & extension : extensions ) {
447- addExtension ( str, extension.available , extension.minGlslVersion , extension.name );
475+ // Add supported GLSL extensions.
476+ for ( const auto & addedExtension : addedExtensions ) {
477+ addExtension ( str, addedExtension.available , addedExtension.minGlslVersion , addedExtension.name );
448478 }
449479
450480 return str;
451481}
452482
453- static std::string GenComputeVersionDeclaration () {
454- // Compute version declaration, this has to be separate from other shader stages,
455- // because some things are unique to vertex/fragment or compute shaders
456- std::string str = Str::Format ( " #version %d %s\n " ,
457- glConfig2.shadingLanguageVersion ,
458- glConfig2.shadingLanguageVersion >= 150 ? ( glConfig2.glCoreProfile ? " core" : " compatibility" ) : " " );
459-
460- // add supported GLSL extensions
461- struct extension_t {
462- bool available;
463- int minGlslVersion;
464- std::string name;
465- };
466-
467- const std::vector<extension_t > extensions = {
468- { glConfig2.computeShaderAvailable , 430 , " ARB_compute_shader" },
469- { glConfig2.gpuShader4Available , 130 , " EXT_gpu_shader4" },
470- { glConfig2.gpuShader5Available , 400 , " ARB_gpu_shader5" },
471- { glConfig2.uniformBufferObjectAvailable , 140 , " ARB_uniform_buffer_object" },
472- { glConfig2.SSBOAvailable , 430 , " ARB_shader_storage_buffer_object" },
473- { glConfig2.shadingLanguage420PackAvailable , 420 , " ARB_shading_language_420pack" },
474- { glConfig2.explicitUniformLocationAvailable , 430 , " ARB_explicit_uniform_location" },
475- { glConfig2.shaderImageLoadStoreAvailable , 420 , " ARB_shader_image_load_store" },
476- { glConfig2.shaderAtomicCountersAvailable , 420 , " ARB_shader_atomic_counters" },
477- /* ARB_shader_atomic_counter_ops set to -1,
478- because we might get a 4.6 GL context, where the core functions have different names */
479- { glConfig2.shaderAtomicCounterOpsAvailable , -1 , " ARB_shader_atomic_counter_ops" },
480- { glConfig2.bindlessTexturesAvailable , -1 , " ARB_bindless_texture" },
481- /* Even though these are part of the GL_KHR_shader_subgroup extension, we need to enable the individual extensions
482- for each feature
483- GL_KHR_shader_subgroup itself can't be used in the shader */
484- { glConfig2.shaderSubgroupBasicAvailable , -1 , " KHR_shader_subgroup_basic" },
485- { glConfig2.shaderSubgroupVoteAvailable , -1 , " KHR_shader_subgroup_vote" },
486- { glConfig2.shaderSubgroupArithmeticAvailable , -1 , " KHR_shader_subgroup_arithmetic" },
487- { glConfig2.shaderSubgroupBallotAvailable , -1 , " KHR_shader_subgroup_ballot" },
488- { glConfig2.shaderSubgroupShuffleAvailable , -1 , " KHR_shader_subgroup_shuffle" },
489- { glConfig2.shaderSubgroupShuffleRelativeAvailable , -1 , " KHR_shader_subgroup_shuffle_relative" },
490- { glConfig2.shaderSubgroupQuadAvailable , -1 , " KHR_shader_subgroup_quad" },
491- };
492-
493- for ( const auto & extension : extensions ) {
494- addExtension ( str, extension.available , extension.minGlslVersion , extension.name );
495- }
483+ static std::string GenFragmentVertexVersionDeclaration () {
484+ return GenVersionDeclaration ( fragmentVertexAddedExtensions );
485+ }
496486
497- return str;
487+ static std::string GenComputeVersionDeclaration () {
488+ return GenVersionDeclaration ( computeAddedExtensions );
498489}
499490
500491static std::string GenCompatHeader () {
@@ -783,7 +774,7 @@ void GLShaderManager::InitDriverInfo()
783774}
784775
785776void GLShaderManager::GenerateBuiltinHeaders () {
786- GLVersionDeclaration = GLHeader (" GLVersionDeclaration" , GenVersionDeclaration (), this );
777+ GLVersionDeclaration = GLHeader (" GLVersionDeclaration" , GenFragmentVertexVersionDeclaration (), this );
787778 GLComputeVersionDeclaration = GLHeader ( " GLComputeVersionDeclaration" , GenComputeVersionDeclaration (), this );
788779 GLCompatHeader = GLHeader (" GLCompatHeader" , GenCompatHeader (), this );
789780 GLVertexHeader = GLHeader (" GLVertexHeader" , GenVertexHeader (), this );
0 commit comments