Skip to content

Commit 3484f20

Browse files
committed
Added support for conservative rasterization for upscaler motion vectors.
1 parent abb5040 commit 3484f20

7 files changed

Lines changed: 406 additions & 11 deletions

File tree

src/Main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ int main(int argc, char *argv[]) {
170170
optionalDeviceExtensions.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
171171
optionalDeviceExtensions.push_back(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);
172172
optionalDeviceExtensions.push_back(VK_KHR_8BIT_STORAGE_EXTENSION_NAME);
173+
optionalDeviceExtensions.push_back(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME);
173174
//optionalDeviceExtensions.push_back(VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME);
174175
optionalDeviceExtensions.push_back(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME);
175176
optionalDeviceExtensions.push_back(VK_NV_MESH_SHADER_EXTENSION_NAME);

src/Renderers/Deferred/DeferredRenderer.cpp

Lines changed: 367 additions & 7 deletions
Large diffs are not rendered by default.

src/Renderers/Deferred/DeferredRenderer.hpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ class DeferredRenderer : public LineRenderer {
115115

116116
/// Called when the used supersampling mode has changed.
117117
void onSupersamplingModeChanged();
118+
void onConservativeRasterOptionChanged();
118119

119120
// Renders the object to the scene framebuffer.
120121
void render() override;
@@ -204,7 +205,10 @@ class DeferredRenderer : public LineRenderer {
204205
// DeferredRenderingMode::TASK_MESH_SHADER
205206
VISIBILITY_BUFFER_TASK_MESH_SHADER_PASS,
206207
// Resolve/further passes.
207-
DEFERRED_RESOLVE_PASS, MOTION_VECTOR_RESOLVE_PASS, HULL_RASTER_PASS, NODE_AABB_PASS
208+
DEFERRED_RESOLVE_PASS, MOTION_VECTOR_RESOLVE_PASS, HULL_RASTER_PASS, NODE_AABB_PASS,
209+
210+
// Conservative rasterization + DeferredRenderingMode::DRAW_INDEXED
211+
VISIBILITY_BUFFER_DRAW_INDEXED_PASS_CONSERVATIVE,
208212
};
209213
int framebufferModeIndex = 0;
210214
FramebufferMode framebufferMode = FramebufferMode::VISIBILITY_BUFFER_DRAW_INDEXED_PASS;
@@ -331,10 +335,30 @@ class DeferredRenderer : public LineRenderer {
331335
uint32_t finalWidth = 0, finalHeight = 0;
332336

333337
// Multiple frames can be accumulated with the temporal upscalers to achieve a multisampling effect.
338+
int numSamplesBase = 8;
334339
uint32_t jitteredSamplesOffset = 0;
335340
uint32_t accumulatedFramesCounter = 0;
336341
std::vector<glm::vec2> jitteredSamples;
337342

343+
// For conservative rasterization of the motion vectors (currently only supported for DeferredRenderingMode::DRAW_INDEXED).
344+
bool useConservativeRasterizationMV = false;
345+
bool useConservativeRasterizationDepth = false;
346+
bool useConservativeRasterizationPass = false;
347+
sgl::vk::ImageViewPtr primitiveIndexConservativeImage;
348+
sgl::vk::TexturePtr primitiveIndexConservativeTexture;
349+
sgl::vk::ImageViewPtr depthConservativeRenderTargetImage;
350+
sgl::vk::TexturePtr depthBufferConservativeTexture;
351+
// DeferredRenderingMode::DRAW_INDEXED
352+
std::shared_ptr<VisibilityBufferDrawIndexedPass> visibilityBufferDrawIndexedPassConservative;
353+
// DeferredRenderingMode::DRAW_INDIRECT
354+
std::shared_ptr<VisibilityBufferDrawIndexedIndirectPass> visibilityBufferDrawIndexedIndirectPassesConservative[2];
355+
// DeferredRenderingMode::TASK_MESH_SHADER
356+
std::shared_ptr<MeshletTaskMeshPass> meshletTaskMeshPassesConservative[2];
357+
// DeferredRenderingMode::BVH_DRAW_INDIRECT
358+
std::shared_ptr<VisibilityBufferBVHDrawIndexedIndirectPass> visibilityBufferBVHDrawIndexedIndirectPassesConservative[2];
359+
// DeferredRenderingMode::BVH_MESH_SHADER
360+
std::shared_ptr<MeshletMeshBVHPass> meshletMeshBVHPassesConservative[2];
361+
338362
// Data for performance measurements.
339363
int frameCounter = 0;
340364
std::string currentStateName;

src/Renderers/Deferred/VisibilityBufferDrawIndexedPass.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ void VisibilityBufferDrawIndexedPass::setDrawIndexedGeometryMode(DrawIndexedGeom
4141
}
4242
}
4343

44+
void VisibilityBufferDrawIndexedPass::setUseConservativeRasterization() {
45+
useConservativeRasterization = true;
46+
}
47+
4448
void VisibilityBufferDrawIndexedPass::loadShader() {
4549
sgl::vk::ShaderManager->invalidateShaderCache();
4650
std::map<std::string, std::string> preprocessorDefines;
@@ -81,6 +85,10 @@ void VisibilityBufferDrawIndexedPass::setGraphicsPipelineInfo(sgl::vk::GraphicsP
8185
pipelineInfo.setDepthTestEnabled(true);
8286
pipelineInfo.setDepthWriteEnabled(true);
8387
pipelineInfo.setBlendMode(sgl::vk::BlendMode::OVERWRITE);
88+
89+
if (useConservativeRasterization) {
90+
pipelineInfo.setUseConservativeRasterization();
91+
}
8492
}
8593

8694
void VisibilityBufferDrawIndexedPass::createRasterData(

src/Renderers/Deferred/VisibilityBufferDrawIndexedPass.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class VisibilityBufferDrawIndexedPass : public LineRasterPass {
4141
public:
4242
explicit VisibilityBufferDrawIndexedPass(LineRenderer* lineRenderer);
4343
void setDrawIndexedGeometryMode(DrawIndexedGeometryMode geometryModeNew);
44+
void setUseConservativeRasterization();
4445

4546
protected:
4647
void loadShader() override;
@@ -49,6 +50,7 @@ class VisibilityBufferDrawIndexedPass : public LineRasterPass {
4950

5051
private:
5152
DrawIndexedGeometryMode geometryMode = DrawIndexedGeometryMode::TRIANGLES;
53+
bool useConservativeRasterization = false;
5254
};
5355

5456
#endif //LINEVIS_VISIBILITYBUFFERDRAWINDEXEDPASS_HPP

src/Renderers/Upscaler/Upscaler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ void evaluateHaltonSequence(float* sequencePointer, int numSamples, int base) {
7373
}
7474

7575
void computeJitteredSamples(
76-
std::vector<glm::vec2>& jitteredSamples,
76+
std::vector<glm::vec2>& jitteredSamples, int numSamplesBase,
7777
uint32_t renderWidth, uint32_t renderHeight,
7878
uint32_t displayWidth, uint32_t displayHeight) {
7979
const float scaleFraction = float(displayWidth * displayHeight) / float(renderWidth * renderHeight);
80-
const int numSamples = std::max(8 * int(std::ceil(scaleFraction * scaleFraction)), 1);
80+
const int numSamples = std::max(numSamplesBase * int(std::ceil(scaleFraction * scaleFraction)), 1);
8181
jitteredSamples.resize(numSamples);
8282
auto* samplesPtr = &jitteredSamples.front().x;
8383
constexpr int baseX = 2, baseY = 3;

src/Renderers/Upscaler/Upscaler.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class Upscaler {
9494

9595
Upscaler* createNewUpscaler(UpscalerType upscalerType);
9696
void computeJitteredSamples(
97-
std::vector<glm::vec2>& jitteredSamples,
97+
std::vector<glm::vec2>& jitteredSamples, int numSamplesBase,
9898
uint32_t renderWidth, uint32_t renderHeight,
9999
uint32_t displayWidth, uint32_t displayHeight);
100100
void adaptProjectionMatrixJitterSample(

0 commit comments

Comments
 (0)