Skip to content

Commit 8b7d2f6

Browse files
committed
Change bloom shader handling from uniform conditional to a shader variant, since Vulkan doesn't support writing to an empty attachment.
1 parent 651ac2e commit 8b7d2f6

17 files changed

+53850
-24071
lines changed

code/renderer_bgfx/Main.h

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ struct DepthShaderProgramVariant
8282
};
8383
};
8484

85+
struct FogShaderProgramVariant
86+
{
87+
enum
88+
{
89+
None = 0,
90+
Bloom = 1 << 0,
91+
Num = 1 << 1
92+
};
93+
};
94+
8595
/// @remarks Sync with generated GenericFragmentShaderVariant and GenericVertexShaderVariant. Order matters - fragment first.
8696
struct GenericShaderProgramVariant
8797
{
@@ -91,11 +101,12 @@ struct GenericShaderProgramVariant
91101

92102
// Fragment
93103
AlphaTest = 1 << 0,
94-
DynamicLights = 1 << 1,
95-
SoftSprite = 1 << 2,
96-
SunLight = 1 << 3,
104+
Bloom = 1 << 1,
105+
DynamicLights = 1 << 2,
106+
SoftSprite = 1 << 3,
107+
SunLight = 1 << 4,
97108

98-
Num = 1 << 4
109+
Num = 1 << 5
99110
};
100111
};
101112

@@ -104,8 +115,9 @@ struct TextureVariationShaderProgramVariant
104115
enum
105116
{
106117
None = 0,
107-
SunLight = 1 << 0,
108-
Num = 1 << 1
118+
Bloom = 1 << 0,
119+
SunLight = 1 << 1,
120+
Num = 1 << 2
109121
};
110122
};
111123

@@ -117,7 +129,7 @@ struct ShaderProgramId
117129
Color,
118130
Depth,
119131
Fog = Depth + DepthShaderProgramVariant::Num,
120-
GaussianBlur,
132+
GaussianBlur = Fog + FogShaderProgramVariant::Num,
121133
Generic,
122134
SMAABlendingWeightCalculation = Generic + GenericShaderProgramVariant::Num,
123135
SMAAEdgeDetection,

code/renderer_bgfx/Main_frame.cpp

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ static void FlushStretchPics()
9797
memcpy(tib.data, &s_main->stretchPicIndices[0], sizeof(uint16_t) * s_main->stretchPicIndices.size());
9898
s_main->time = interface::GetTime();
9999
s_main->floatTime = s_main->time * 0.001f;
100-
s_main->uniforms->renderMode.set(vec4::empty);
101100
s_main->uniforms->dynamicLight_Num_Intensity.set(vec4::empty);
101+
s_main->uniforms->renderMode.set(vec4::empty);
102102
s_main->matUniforms->nDeforms.set(vec4(0, 0, 0, 0));
103103
s_main->matUniforms->time.set(vec4(s_main->stretchPicMaterial->setTime(s_main->floatTime), 0, 0, 0));
104104

@@ -1166,13 +1166,11 @@ static void RenderCamera(const RenderCameraArgs &args)
11661166
// Special case for skybox.
11671167
if (dc.flags & DrawCallFlags::Skybox)
11681168
{
1169+
int shaderVariant = GenericShaderProgramVariant::None;
1170+
11691171
if (s_main->bloomEnabled)
11701172
{
1171-
s_main->uniforms->bloom_Enabled_Write_Scale.set(vec4(1, 0, 0, 0));
1172-
}
1173-
else
1174-
{
1175-
s_main->uniforms->bloom_Enabled_Write_Scale.set(vec4::empty);
1173+
shaderVariant |= GenericShaderProgramVariant::Bloom;
11761174
}
11771175

11781176
s_main->uniforms->depthRangeEnabled.set(vec4(1, 0, 0, 0));
@@ -1204,7 +1202,7 @@ static void RenderCamera(const RenderCameraArgs &args)
12041202
bgfx::setStencil(stencilTest);
12051203
}
12061204

1207-
bgfx::submit(mainViewId, s_main->shaderPrograms[ShaderProgramId::Generic].handle);
1205+
bgfx::submit(mainViewId, s_main->shaderPrograms[ShaderProgramId::Generic + shaderVariant].handle);
12081206
continue;
12091207
}
12101208

@@ -1265,13 +1263,12 @@ static void RenderCamera(const RenderCameraArgs &args)
12651263
if (!stage.active)
12661264
continue;
12671265

1268-
if (s_main->bloomEnabled)
1269-
{
1270-
s_main->uniforms->bloom_Enabled_Write_Scale.set(vec4(1, stage.bloom ? 1.0f : 0.0f, 0, 0));
1271-
}
1272-
else
1266+
int shaderVariant = GenericShaderProgramVariant::None;
1267+
1268+
if (s_main->isWorldCamera && s_main->bloomEnabled)
12731269
{
1274-
s_main->uniforms->bloom_Enabled_Write_Scale.set(vec4::empty);
1270+
shaderVariant |= GenericShaderProgramVariant::Bloom;
1271+
s_main->uniforms->bloom_Write_Scale.set(vec4(stage.bloom ? 1.0f : 0.0f, 0, 0, 0));
12751272
}
12761273

12771274
if (mat->polygonOffset || dc.zOffset > 0 || dc.zScale > 0)
@@ -1302,8 +1299,6 @@ static void RenderCamera(const RenderCameraArgs &args)
13021299
if (IsMsaa(s_main->aa))
13031300
state |= BGFX_STATE_MSAA;
13041301

1305-
int shaderVariant = GenericShaderProgramVariant::None;
1306-
13071302
if (stage.alphaTest != MaterialAlphaTest::None)
13081303
{
13091304
shaderVariant |= GenericShaderProgramVariant::AlphaTest;
@@ -1353,13 +1348,17 @@ static void RenderCamera(const RenderCameraArgs &args)
13531348

13541349
if (!s_main->fastPathEnabled && g_cvars.textureVariation.getBool() && stage.textureVariation)
13551350
{
1356-
if (shaderVariant & GenericShaderProgramVariant::SunLight)
1351+
int genericShaderVariant = shaderVariant;
1352+
shaderVariant = 0;
1353+
1354+
if (genericShaderVariant & GenericShaderProgramVariant::Bloom)
13571355
{
1358-
shaderVariant = TextureVariationShaderProgramVariant::SunLight;
1356+
shaderVariant |= TextureVariationShaderProgramVariant::Bloom;
13591357
}
1360-
else
1358+
1359+
if (genericShaderVariant & GenericShaderProgramVariant::SunLight)
13611360
{
1362-
shaderVariant = 0;
1361+
shaderVariant |= TextureVariationShaderProgramVariant::SunLight;
13631362
}
13641363

13651364
//bgfx::setTexture(TextureUnit::Noise, s_main->uniforms->noiseSampler.handle, g_textureCache->getNoise()->getHandle());
@@ -1385,13 +1384,11 @@ static void RenderCamera(const RenderCameraArgs &args)
13851384
// Do fog pass.
13861385
if (doFogPass)
13871386
{
1387+
int shaderVariant = FogShaderProgramVariant::None;
1388+
13881389
if (s_main->bloomEnabled)
13891390
{
1390-
s_main->uniforms->bloom_Enabled_Write_Scale.set(vec4(1, 0, 0, 0));
1391-
}
1392-
else
1393-
{
1394-
s_main->uniforms->bloom_Enabled_Write_Scale.set(vec4::empty);
1391+
shaderVariant |= FogShaderProgramVariant::Bloom;
13951392
}
13961393

13971394
if (dc.zOffset > 0 || dc.zScale > 0)
@@ -1427,7 +1424,7 @@ static void RenderCamera(const RenderCameraArgs &args)
14271424
bgfx::setStencil(stencilTest);
14281425
}
14291426

1430-
bgfx::submit(mainViewId, s_main->shaderPrograms[ShaderProgramId::Fog].handle);
1427+
bgfx::submit(mainViewId, s_main->shaderPrograms[ShaderProgramId::Fog + shaderVariant].handle);
14311428
}
14321429

14331430
s_main->currentEntity = nullptr;
@@ -1621,7 +1618,7 @@ void RenderScene(const SceneDefinition &scene)
16211618
}
16221619

16231620
// Apply bloom. If using SMAA, we need to read color, so blit into the original bloom texture which is no longer used.
1624-
s_main->uniforms->bloom_Enabled_Write_Scale.set(vec4(1, 0, g_cvars.bloomScale.getFloat(), 0));
1621+
s_main->uniforms->bloom_Write_Scale.set(vec4(0, g_cvars.bloomScale.getFloat(), 0, 0));
16251622
bgfx::setTexture(0, s_main->uniforms->textureSampler.handle, bgfx::getTexture(s_main->sceneFb.handle));
16261623
bgfx::setTexture(1, s_main->uniforms->bloomSampler.handle, bgfx::getTexture(s_main->bloomFb[0].handle));
16271624
RenderScreenSpaceQuad("BloomApply", s_main->aa == AntiAliasing::SMAA ? s_main->sceneTempFb : s_main->defaultFb, ShaderProgramId::Bloom, BGFX_STATE_WRITE_RGB, BGFX_CLEAR_NONE);

code/renderer_bgfx/Main_init.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,8 @@ void Initialize()
463463
};
464464

465465
programMap[ShaderProgramId::Fog] = { FragmentShaderId::Fog, VertexShaderId::Fog };
466+
programMap[ShaderProgramId::Fog + FogShaderProgramVariant::Bloom] = { FragmentShaderId::Fog_Bloom, VertexShaderId::Fog };
467+
466468
programMap[ShaderProgramId::GaussianBlur] = { FragmentShaderId::GaussianBlur, VertexShaderId::Texture };
467469

468470
// Sync with GenericShaderProgramVariant.
@@ -483,12 +485,17 @@ void Initialize()
483485
programMap[ShaderProgramId::Texture] = { FragmentShaderId::Texture, VertexShaderId::Texture };
484486
programMap[ShaderProgramId::TextureColor] = { FragmentShaderId::TextureColor, VertexShaderId::Texture };
485487
programMap[ShaderProgramId::TextureDebug] = { FragmentShaderId::TextureDebug, VertexShaderId::Texture };
486-
programMap[ShaderProgramId::TextureVariation] = { FragmentShaderId::TextureVariation, VertexShaderId::Generic };
487-
programMap[ShaderProgramId::TextureVariation + TextureVariationShaderProgramVariant::SunLight] =
488+
489+
for (int i = 0; i < TextureVariationShaderProgramVariant::Num; i++)
488490
{
489-
FragmentShaderId::TextureVariation_SunLight,
490-
VertexShaderId::Generic_SunLight
491-
};
491+
ShaderProgramIdMap &pm = programMap[ShaderProgramId::TextureVariation + i];
492+
pm.frag = FragmentShaderId::Enum(FragmentShaderId::TextureVariation + i);
493+
494+
if (i & TextureVariationFragmentShaderVariant::SunLight)
495+
pm.vert = VertexShaderId::Generic_SunLight;
496+
else
497+
pm.vert = VertexShaderId::Generic;
498+
}
492499

493500
// Create shader programs.
494501
for (int i = 0; i < ShaderProgramId::Num; i++)
@@ -499,13 +506,27 @@ void Initialize()
499506
if (s_main->aa != AntiAliasing::SMAA && (i == ShaderProgramId::SMAABlendingWeightCalculation || i == ShaderProgramId::SMAAEdgeDetection || i == ShaderProgramId::SMAANeighborhoodBlending))
500507
continue;
501508

502-
if (!s_main->bloomEnabled && (i == ShaderProgramId::Bloom || i == ShaderProgramId::GaussianBlur))
503-
continue;
509+
if (!s_main->bloomEnabled)
510+
{
511+
if (i == ShaderProgramId::Bloom || i == ShaderProgramId::GaussianBlur)
512+
continue;
513+
if (i == ShaderProgramId::Fog + FogShaderProgramVariant::Bloom)
514+
continue;
515+
if (i == ShaderProgramId::TextureVariation)
516+
{
517+
const int variant = i - (int)ShaderProgramId::TextureVariation;
518+
if (variant & TextureVariationShaderProgramVariant::Bloom)
519+
continue;
520+
}
521+
}
504522

505523
if (i >= (int)ShaderProgramId::Generic && i <= int(ShaderProgramId::Generic + GenericShaderProgramVariant::Num))
506524
{
507525
const int variant = i - (int)ShaderProgramId::Generic;
508526

527+
if (!s_main->bloomEnabled && (variant & GenericShaderProgramVariant::Bloom))
528+
continue;
529+
509530
if (!s_main->sunLightEnabled && (variant & GenericShaderProgramVariant::SunLight))
510531
continue;
511532

code/renderer_bgfx/Precompiled.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,8 +1495,8 @@ struct Uniforms
14951495
/// @{
14961496
Uniform_vec4 guassianBlurDirection = "u_GuassianBlurDirection";
14971497

1498-
/// @remarks w not used.
1499-
Uniform_vec4 bloom_Enabled_Write_Scale = "u_Bloom_Enabled_Write_Scale";
1498+
/// @remarks z and w not used.
1499+
Uniform_vec4 bloom_Write_Scale = "u_Bloom_Write_Scale";
15001500
/// @}
15011501

15021502
/// @name Sun light

premake5.lua

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,15 @@ newaction
165165
{ "AlphaTest", "USE_ALPHA_TEST" }
166166
}
167167

168+
local fogFragmentVariants =
169+
{
170+
{ "Bloom", "USE_BLOOM" }
171+
}
172+
168173
local genericFragmentVariants =
169174
{
170175
{ "AlphaTest", "USE_ALPHA_TEST" },
176+
{ "Bloom", "USE_BLOOM" },
171177
{ "DynamicLights", "USE_DYNAMIC_LIGHTS" },
172178
{ "SoftSprite", "USE_SOFT_SPRITE" },
173179
{ "SunLight", "USE_SUN_LIGHT" }
@@ -180,6 +186,7 @@ newaction
180186

181187
local textureVariationFragmentVariants =
182188
{
189+
{ "Bloom", "USE_BLOOM" },
183190
{ "SunLight", "USE_SUN_LIGHT" }
184191
}
185192

@@ -188,7 +195,7 @@ newaction
188195
{ "Bloom" },
189196
{ "Color" },
190197
{ "Depth", depthFragmentVariants },
191-
{ "Fog" },
198+
{ "Fog", fogFragmentVariants },
192199
{ "GaussianBlur" },
193200
{ "Generic", genericFragmentVariants },
194201
{ "SMAABlendingWeightCalculation" },
@@ -309,6 +316,7 @@ newaction
309316
writeShaderVariantEnum(outputHeaderFile, genericFragmentVariants, "GenericFragment")
310317
writeShaderVariantEnum(outputHeaderFile, depthFragmentVariants, "DepthFragment")
311318
writeShaderVariantEnum(outputHeaderFile, depthVertexVariants, "DepthVertex")
319+
writeShaderVariantEnum(outputHeaderFile, fogFragmentVariants, "FogFragment")
312320
writeShaderVariantEnum(outputHeaderFile, textureVariationFragmentVariants, "TextureVariationFragment")
313321
outputHeaderFile:close()
314322

shaders/Bloom_fragment.sc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ $input v_texcoord0
66
SAMPLER2D(u_TextureSampler, 0);
77
SAMPLER2D(u_BloomSampler, 1);
88

9-
uniform vec4 u_Bloom_Enabled_Write_Scale;
10-
#define u_BloomScale u_Bloom_Enabled_Write_Scale.z
9+
uniform vec4 u_Bloom_Write_Scale;
10+
#define u_BloomScale u_Bloom_Write_Scale.y
1111

1212
void main()
1313
{

shaders/Depth_fragment.sc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ void main()
2020
discard;
2121
#endif
2222

23-
gl_FragColor = vec4_splat(0.0);
23+
//gl_FragColor = vec4_splat(0.0);
2424
}

shaders/Fog_fragment.sc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ $input v_position, v_texcoord0
33
#include <bgfx_shader.sh>
44
#include "PortalClip.sh"
55

6-
uniform vec4 u_Bloom_Enabled_Write_Scale;
7-
#define u_BloomEnabled int(u_Bloom_Enabled_Write_Scale.x)
86
#define v_scale v_texcoord0.x
97
uniform vec4 u_Color;
108

@@ -13,7 +11,10 @@ void main()
1311
if (PortalClipped(v_position))
1412
discard;
1513
vec4 fragColor = vec4(u_Color.rgb, sqrt(saturate(v_scale)));
14+
#if defined(USE_BLOOM)
1615
gl_FragData[0] = fragColor;
17-
if (u_BloomEnabled != 0)
18-
gl_FragData[1] = vec4(0.0, 0.0, 0.0, fragColor.a);
16+
gl_FragData[1] = vec4(0.0, 0.0, 0.0, fragColor.a);
17+
#else
18+
gl_FragColor = fragColor;
19+
#endif
1920
}

shaders/Generic_fragment.sc

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ uniform vec4 u_DepthRange;
1919
uniform vec4 u_SoftSprite_Depth_UseAlpha; // only x and y used
2020
#endif
2121

22-
uniform vec4 u_Bloom_Enabled_Write_Scale;
23-
#define u_BloomEnabled int(u_Bloom_Enabled_Write_Scale.x)
24-
#define u_BloomWrite int(u_Bloom_Enabled_Write_Scale.y)
22+
uniform vec4 u_Bloom_Write_Scale;
23+
#define u_BloomWrite int(u_Bloom_Write_Scale.x)
2524

2625
uniform vec4 u_Animation_Enabled_Fraction; // only x and y used
2726
uniform vec4 u_RenderMode; // only x used
@@ -147,17 +146,18 @@ void main()
147146
fragColor = vec4(texture2D(u_LightSampler, v_texcoord1).rgb, alpha);
148147
}
149148

149+
#if defined(USE_BLOOM)
150150
gl_FragData[0] = fragColor;
151151

152-
if (u_BloomEnabled != 0)
152+
if (u_BloomWrite != 0)
153153
{
154-
if (u_BloomWrite != 0)
155-
{
156-
gl_FragData[1] = fragColor;
157-
}
158-
else
159-
{
160-
gl_FragData[1] = vec4(0.0, 0.0, 0.0, fragColor.a);
161-
}
154+
gl_FragData[1] = fragColor;
162155
}
156+
else
157+
{
158+
gl_FragData[1] = vec4(0.0, 0.0, 0.0, fragColor.a);
159+
}
160+
#else
161+
gl_FragColor = fragColor;
162+
#endif
163163
}

0 commit comments

Comments
 (0)