Skip to content

Commit 2ee569b

Browse files
committed
tr_shade: factorise GLSL header generation more
1 parent 25ed8a7 commit 2ee569b

File tree

1 file changed

+60
-69
lines changed

1 file changed

+60
-69
lines changed

src/engine/renderer/gl_shader.cpp

Lines changed: 60 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
393442
static 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

500491
static std::string GenCompatHeader() {
@@ -783,7 +774,7 @@ void GLShaderManager::InitDriverInfo()
783774
}
784775

785776
void 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

Comments
 (0)