Skip to content

Commit 3d8b25e

Browse files
committed
Update bgfx
1 parent 78c06db commit 3d8b25e

35 files changed

+169
-199
lines changed

3rdparty/CMakeLists.txt

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
11
# bigg (bgfx + imgui + glfw + glm)
22

3-
# BGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION and
4-
# BGFX_CONFIG_RENDERER_OPENGLES_MIN_VERSION
5-
# set the minimum OpenGL version without
6-
# forcing the renderer to always be OpenGL
7-
# as BGFX_CONFIG_RENDERER_OPENGL does
8-
9-
# bgfx.cmake only has an option BGFX_OPENGL_VERSION
10-
# for setting BGFX_CONFIG_RENDERER_OPENGL
11-
# need a newer version of bgfx/bigg to take effect
12-
133
add_definitions(-DBGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION=43)
14-
#add_definitions(-DBGFX_CONFIG_RENDERER_OPENGLES_MIN_VERSION=43)
15-
#add_definitions(-DBGFX_CONFIG_RENDERER_OPENGL=43)
164
set(BIGG_EXAMPLES OFF CACHE INTERNAL "")
175
set(BGFX_BUILD_EXAMPLES OFF CACHE INTERNAL "")
186
add_subdirectory(bigg)

src/CMakeLists.txt

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ set(SHADERS
6464
Renderer/Shaders/clusters.sh
6565
Renderer/Shaders/colormap.sh
6666
Renderer/Shaders/util.sh
67+
Renderer/Shaders/common.sh
6768
)
6869

6970
if(MSVC)
@@ -115,27 +116,39 @@ foreach(SHADER ${SHADERS})
115116
get_filename_component(SHADER_NAME "${SHADER}" NAME)
116117
get_filename_component(SHADER_FILE "${SHADER}" ABSOLUTE)
117118
# add_shader defaults to GLSL 120, 430 for compute
118-
# 130 is needed for switch statements but requires OpenGL 3.0 or higher
119-
# need a newer bgfx version that uses BGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION to set
120-
# OpenGL version without forcing the OpenGL renderer
121-
# (https://github.com/bkaradzic/bgfx/commit/3f6d8a516d5e61db795c0c1881e9b333fedc5d43)
119+
# GLSL 1.30 is needed for switch statements but shaderc produces
120+
# shader binaries without any #version directive unless 4.30 is used
121+
# this makes shader compilation fail with no error message
122+
# just use 4.30 for all shaders
122123
# default DX11 model is 5_0
123-
set(GLSL_VERSION 130)
124+
set(GLSL_VERSION 430)
124125
set(GLSL_COMPUTE_VERSION 430)
125126
set(DX_MODEL 5_0)
126127

127128
# DX9/11 shaders can only be compiled on Windows
128-
set(SHADER_PLATFORMS glsl)
129+
set(SHADER_PLATFORMS glsl spirv)
129130
if(WIN32)
130131
set(SHADER_PLATFORMS ${SHADER_PLATFORMS} dx11)
131132
endif()
132133

133134
if(SHADER_NAME MATCHES "^vs_")
134-
add_shader("${SHADER_FILE}" VERTEX OUTPUT "${SHADER_DIR}" GLSL_VERSION ${GLSL_VERSION} DX11_MODEL ${DX_MODEL} PLATFORMS ${SHADER_PLATFORMS})
135+
add_shader("${SHADER_FILE}" VERTEX
136+
OUTPUT "${SHADER_DIR}"
137+
GLSL_VERSION ${GLSL_VERSION}
138+
DX11_MODEL ${DX_MODEL}
139+
PLATFORMS ${SHADER_PLATFORMS})
135140
elseif(SHADER_NAME MATCHES "^fs_")
136-
add_shader("${SHADER_FILE}" FRAGMENT OUTPUT "${SHADER_DIR}" GLSL_VERSION ${GLSL_VERSION} DX11_MODEL ${DX_MODEL} PLATFORMS ${SHADER_PLATFORMS})
141+
add_shader("${SHADER_FILE}" FRAGMENT
142+
OUTPUT "${SHADER_DIR}"
143+
GLSL_VERSION ${GLSL_VERSION}
144+
DX11_MODEL ${DX_MODEL}
145+
PLATFORMS ${SHADER_PLATFORMS})
137146
elseif(SHADER_NAME MATCHES "^cs_")
138-
add_shader("${SHADER_FILE}" COMPUTE OUTPUT "${SHADER_DIR}" GLSL_VERSION ${GLSL_COMPUTE_VERSION} DX11_MODEL ${DX_MODEL} PLATFORMS ${SHADER_PLATFORMS})
147+
add_shader("${SHADER_FILE}" COMPUTE
148+
OUTPUT "${SHADER_DIR}"
149+
GLSL_VERSION ${GLSL_COMPUTE_VERSION}
150+
DX11_MODEL ${DX_MODEL}
151+
PLATFORMS ${SHADER_PLATFORMS})
139152
endif()
140153
add_custom_command(TARGET invalidate_shaders PRE_BUILD
141154
COMMAND "${CMAKE_COMMAND}" -E touch "${SHADER_FILE}")

src/Config.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,20 @@ void Config::readArgv(int argc, char* argv[])
3535
bx::CommandLine cmdLine(argc, argv);
3636

3737
// D3D 9.0c (shader model 3.0) doesn't allow indexing into the light buffer
38-
// so shaders for D3D9 aren't even compiled anymore
39-
4038
// D3D11, D3D12, OpenGL work
41-
// Vulkan? need to update bgfx/bigg
42-
43-
//cmdLine.hasArg("gl");
39+
// Vulkan has issues:
40+
// - no sRGB backbuffer support
41+
// - clustered shading doesn't work, some descriptors are not getting bound correctly
42+
// it works in RenderDoc for a few seconds (with similar errors but different bindings), then crashes
4443

4544
renderer = bgfx::RendererType::OpenGL;
45+
//renderer = bgfx::RendererType::Direct3D11;
4646
//renderer = bgfx::RendererType::Direct3D12;
47+
renderer = bgfx::RendererType::Vulkan;
4748

4849
profile = true;
4950

5051
showStatsOverlay = false;
5152
showLog = false;
5253
showBuffers = false;
53-
54-
msaa = true;
5554
}

src/Renderer/ClusterShader.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <glm/gtc/type_ptr.hpp>
77
#include <cmath>
88

9-
bgfx::VertexDecl ClusterShader::ClusterVertex::decl;
9+
bgfx::VertexLayout ClusterShader::ClusterVertex::layout;
1010

1111
ClusterShader::ClusterShader() :
1212
clusterSizesVecUniform(BGFX_INVALID_HANDLE),
@@ -29,7 +29,7 @@ void ClusterShader::initialize()
2929
zNearFarVecUniform = bgfx::createUniform("u_zNearFarVec", bgfx::UniformType::Vec4);
3030

3131
clustersBuffer =
32-
bgfx::createDynamicVertexBuffer(CLUSTER_COUNT, ClusterVertex::decl, BGFX_BUFFER_COMPUTE_READ_WRITE);
32+
bgfx::createDynamicVertexBuffer(CLUSTER_COUNT, ClusterVertex::layout, BGFX_BUFFER_COMPUTE_READ_WRITE);
3333
lightIndicesBuffer = bgfx::createDynamicIndexBuffer(CLUSTER_COUNT * MAX_LIGHTS_PER_CLUSTER,
3434
BGFX_BUFFER_COMPUTE_READ_WRITE | BGFX_BUFFER_INDEX32);
3535
lightGridBuffer =
@@ -66,7 +66,7 @@ void ClusterShader::setUniforms(const Scene* scene, uint16_t screenWidth, uint16
6666

6767
void ClusterShader::bindBuffers(bool lightingPass) const
6868
{
69-
// binding ReadWrite in the fragment shader doesn't work
69+
// binding ReadWrite in the fragment shader doesn't work with D3D11/12
7070
bgfx::Access::Enum access = lightingPass ? bgfx::Access::Read : bgfx::Access::ReadWrite;
7171
if(!lightingPass)
7272
{

src/Renderer/ClusterShader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ class ClusterShader
3636

3737
static void init()
3838
{
39-
decl.begin()
39+
layout.begin()
4040
.add(bgfx::Attrib::TexCoord0, 4, bgfx::AttribType::Float)
4141
.add(bgfx::Attrib::TexCoord1, 4, bgfx::AttribType::Float)
4242
.end();
4343
}
44-
static bgfx::VertexDecl decl;
44+
static bgfx::VertexLayout layout;
4545
};
4646

4747
bgfx::UniformHandle clusterSizesVecUniform;

src/Renderer/ClusteredRenderer.cpp

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ bool ClusteredRenderer::supported()
2222
// compute shader
2323
(caps->supported & BGFX_CAPS_COMPUTE) != 0 &&
2424
// 32-bit index buffers, used for light grid structure
25-
// D3D12 doesn't report this but it works fine...
26-
// TODO try again with updated bgfx
27-
((caps->supported & BGFX_CAPS_INDEX32) != 0 || caps->rendererType == bgfx::RendererType::Direct3D12) &&
25+
((caps->supported & BGFX_CAPS_INDEX32) != 0) &&
2826
// fragment depth available in fragment shader
2927
(caps->supported & BGFX_CAPS_FRAGMENT_DEPTH) != 0;
3028
}
@@ -58,7 +56,22 @@ void ClusteredRenderer::onRender(float dt)
5856
vLightCulling,
5957
vLighting
6058
};
59+
60+
bgfx::setViewName(vClusterBuilding, "Cluster building pass (compute)");
61+
bgfx::setViewClear(vClusterBuilding, BGFX_CLEAR_NONE);
62+
// set u_viewRect for screen2Eye to work correctly
63+
bgfx::setViewRect(vClusterBuilding, 0, 0, width, height);
64+
// this could be set by a different renderer, reset it (D3D12 cares and crashes)
65+
bgfx::setViewFrameBuffer(vClusterBuilding, BGFX_INVALID_HANDLE);
66+
//bgfx::touch(vClusterBuilding);
67+
68+
bgfx::setViewName(vLightCulling, "Clustered light culling pass (compute)");
69+
bgfx::setViewClear(vLightCulling, BGFX_CLEAR_NONE);
70+
bgfx::setViewRect(vLightCulling, 0, 0, width, height);
71+
bgfx::setViewFrameBuffer(vLightCulling, BGFX_INVALID_HANDLE);
72+
//bgfx::touch(vLightCulling);
6173

74+
bgfx::setViewName(vLighting, "Clustered lighting pass");
6275
bgfx::setViewClear(vLighting, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, clearColor, 1.0f, 0);
6376
bgfx::setViewRect(vLighting, 0, 0, width, height);
6477
bgfx::setViewFrameBuffer(vLighting, frameBuffer);
@@ -67,50 +80,36 @@ void ClusteredRenderer::onRender(float dt)
6780
if(!scene->loaded)
6881
return;
6982

70-
// D3D12 crashes if this is not set, even for compute only views
71-
// TODO try again with updated bgfx
72-
bgfx::setViewFrameBuffer(vClusterBuilding, BGFX_INVALID_HANDLE);
73-
bgfx::setViewFrameBuffer(vLightCulling, BGFX_INVALID_HANDLE);
74-
7583
clusters.setUniforms(scene, width, height);
7684

77-
// set u_viewRect for screen2Eye to work correctly
78-
bgfx::setViewRect(vClusterBuilding, 0, 0, width, height);
79-
bgfx::setViewRect(vLightCulling, 0, 0, width, height);
80-
8185
// cluster building needs u_invProj to transform screen coordinates to eye space
8286
setViewProjection(vClusterBuilding);
8387
// light culling needs u_view to transform lights to eye space
8488
setViewProjection(vLightCulling);
89+
setViewProjection(vLighting);
8590

86-
{
87-
bgfx::setViewName(vClusterBuilding, "Cluster building pass (compute)");
91+
// cluster building
8892

89-
clusters.bindBuffers(false); // write access, all buffers
93+
clusters.bindBuffers(false); // write access, all buffers
9094

91-
bgfx::dispatch(vClusterBuilding,
92-
clusterBuildingComputeProgram,
93-
ClusterShader::CLUSTERS_X,
94-
ClusterShader::CLUSTERS_Y,
95-
ClusterShader::CLUSTERS_Z);
96-
}
95+
bgfx::dispatch(vClusterBuilding,
96+
clusterBuildingComputeProgram,
97+
ClusterShader::CLUSTERS_X,
98+
ClusterShader::CLUSTERS_Y,
99+
ClusterShader::CLUSTERS_Z);
97100

98-
{
99-
bgfx::setViewName(vLightCulling, "Clustered light culling pass (compute)");
101+
// light culling
100102

101-
lights.bindLights(scene);
102-
clusters.bindBuffers(false); // write access, all buffers
103+
lights.bindLights(scene);
104+
clusters.bindBuffers(false); // write access, all buffers
103105

104-
bgfx::dispatch(vLightCulling,
105-
lightCullingComputeProgram,
106-
1,
107-
1,
108-
ClusterShader::CLUSTERS_Z / ClusterShader::CLUSTERS_Z_THREADS);
109-
}
106+
bgfx::dispatch(vLightCulling,
107+
lightCullingComputeProgram,
108+
1,
109+
1,
110+
ClusterShader::CLUSTERS_Z / ClusterShader::CLUSTERS_Z_THREADS);
110111

111-
bgfx::setViewName(vLighting, "Clustered lighting pass");
112-
113-
setViewProjection(vLighting);
112+
// lighting
114113

115114
uint64_t state = BGFX_STATE_DEFAULT & ~BGFX_STATE_CULL_MASK;
116115

src/Renderer/DeferredRenderer.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void DeferredRenderer::onInitialize()
8686
4, 5, 1, 1, 0, 4 // bottom
8787
};
8888

89-
pointLightVertexBuffer = bgfx::createVertexBuffer(bgfx::copy(&vertices, sizeof(vertices)), PosVertex::decl);
89+
pointLightVertexBuffer = bgfx::createVertexBuffer(bgfx::copy(&vertices, sizeof(vertices)), PosVertex::layout);
9090
pointLightIndexBuffer = bgfx::createIndexBuffer(bgfx::copy(&indices, sizeof(indices)));
9191

9292
char vsName[128], fsName[128];
@@ -152,21 +152,25 @@ void DeferredRenderer::onRender(float dt)
152152

153153
const uint32_t BLACK = 0x000000FF;
154154

155+
bgfx::setViewName(vGeometry, "Deferred geometry pass");
155156
bgfx::setViewClear(vGeometry, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, BLACK, 1.0f);
156157
bgfx::setViewRect(vGeometry, 0, 0, width, height);
157158
bgfx::setViewFrameBuffer(vGeometry, gBuffer);
158159
bgfx::touch(vGeometry);
159160

161+
bgfx::setViewName(vFullscreenLight, "Deferred light pass (ambient + emissive)");
160162
bgfx::setViewClear(vFullscreenLight, BGFX_CLEAR_COLOR, clearColor);
161163
bgfx::setViewRect(vFullscreenLight, 0, 0, width, height);
162164
bgfx::setViewFrameBuffer(vFullscreenLight, accumFrameBuffer);
163165
bgfx::touch(vFullscreenLight);
164166

167+
bgfx::setViewName(vLight, "Deferred light pass (point lights)");
165168
bgfx::setViewClear(vLight, BGFX_CLEAR_NONE);
166169
bgfx::setViewRect(vLight, 0, 0, width, height);
167170
bgfx::setViewFrameBuffer(vLight, accumFrameBuffer);
168171
bgfx::touch(vLight);
169172

173+
bgfx::setViewName(vTransparent, "Transparent forward pass");
170174
bgfx::setViewClear(vTransparent, BGFX_CLEAR_NONE);
171175
bgfx::setViewRect(vTransparent, 0, 0, width, height);
172176
bgfx::setViewFrameBuffer(vTransparent, accumFrameBuffer);
@@ -184,8 +188,6 @@ void DeferredRenderer::onRender(float dt)
184188
setViewProjection(vLight);
185189
setViewProjection(vTransparent);
186190

187-
bgfx::setViewName(vGeometry, "Deferred geometry pass");
188-
189191
// render geometry, write to G-Buffer
190192

191193
const uint64_t state = BGFX_STATE_DEFAULT & ~BGFX_STATE_CULL_MASK;
@@ -207,8 +209,6 @@ void DeferredRenderer::onRender(float dt)
207209
}
208210
}
209211

210-
bgfx::setViewName(vFullscreenLight, "Deferred light pass (ambient + emissive)");
211-
212212
// render lights to framebuffer
213213
// cull with light geometry
214214
// - axis-aligned bounding box (TODO? sphere for point lights)
@@ -242,8 +242,6 @@ void DeferredRenderer::onRender(float dt)
242242
bgfx::setState(BGFX_STATE_WRITE_RGB | BGFX_STATE_DEPTH_TEST_GREATER | BGFX_STATE_CULL_CW);
243243
bgfx::submit(vFullscreenLight, fullscreenProgram);
244244

245-
bgfx::setViewName(vLight, "Deferred light pass (point lights)");
246-
247245
// point lights
248246

249247
for(size_t i = 0; i < scene->pointLights.lights.size(); i++)
@@ -270,7 +268,7 @@ void DeferredRenderer::onRender(float dt)
270268
bgfx::submit(vLight, pointLightProgram);
271269
}
272270

273-
bgfx::setViewName(vTransparent, "Transparent forward pass");
271+
// transparent
274272

275273
for(const Mesh& mesh : scene->meshes)
276274
{

src/Renderer/ForwardRenderer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ void ForwardRenderer::onRender(float dt)
3030
bgfx::setViewRect(vDefault, 0, 0, width, height);
3131
bgfx::setViewFrameBuffer(vDefault, frameBuffer);
3232

33-
bgfx::touch(vDefault); // empty primitive in case nothing follows
33+
// empty primitive in case nothing follows
34+
// this makes sure the clear happens
35+
bgfx::touch(vDefault);
3436

3537
if(!scene->loaded)
3638
return;

0 commit comments

Comments
 (0)