From 2ed9636cd66fc5a6718ac6acbd022ceacd6d788c Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Thu, 24 Jun 2021 01:42:05 +0200
Subject: [PATCH] [#82] GPUs are expensive at the moment - lets save some
 performance by culling

---
 include/vkcv/PipelineConfig.hpp    |  2 ++
 projects/voxelization/src/main.cpp |  4 ++--
 src/vkcv/PipelineManager.cpp       | 10 +++++++++-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/include/vkcv/PipelineConfig.hpp b/include/vkcv/PipelineConfig.hpp
index 70ef1633..c17f04ee 100644
--- a/include/vkcv/PipelineConfig.hpp
+++ b/include/vkcv/PipelineConfig.hpp
@@ -15,6 +15,7 @@
 namespace vkcv {
 
     enum class PrimitiveTopology{PointList, LineList, TriangleList };
+	enum class CullMode{ None, Front, Back };
 
     struct PipelineConfig {
         ShaderProgram                           m_ShaderProgram;
@@ -28,6 +29,7 @@ namespace vkcv {
         PrimitiveTopology                       m_PrimitiveTopology = PrimitiveTopology::TriangleList;
         bool                                    m_EnableDepthClamping = false;
         Multisampling                           m_multisampling = Multisampling::None;
+        CullMode                                m_culling = CullMode::None;
     };
 
 }
\ No newline at end of file
diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index a9c899f3..59b2d9fb 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -232,8 +232,8 @@ int main(int argc, const char** argv) {
 			core.getDescriptorSet(perMeshDescriptorSets[0]).layout },
 		true
 	};
-
-	forwardPipelineConfig.m_multisampling = msaa;
+    forwardPipelineConfig.m_culling         = vkcv::CullMode::Back;
+	forwardPipelineConfig.m_multisampling   = msaa;
 	
 	vkcv::PipelineHandle forwardPipeline = core.createGraphicsPipeline(forwardPipelineConfig);
 	
diff --git a/src/vkcv/PipelineManager.cpp b/src/vkcv/PipelineManager.cpp
index b1b08272..621abb0a 100644
--- a/src/vkcv/PipelineManager.cpp
+++ b/src/vkcv/PipelineManager.cpp
@@ -143,13 +143,21 @@ namespace vkcv
         vk::Rect2D scissor({ 0,0 }, { config.m_Width, config.m_Height });
         vk::PipelineViewportStateCreateInfo pipelineViewportStateCreateInfo({}, 1, &viewport, 1, &scissor);
 
+        vk::CullModeFlags cullMode;
+        switch (config.m_culling) {
+            case CullMode::None:    cullMode = vk::CullModeFlagBits::eNone;     break;
+            case CullMode::Front:   cullMode = vk::CullModeFlagBits::eFront;    break;
+            case CullMode::Back:    cullMode = vk::CullModeFlagBits::eBack;     break;
+            default: throw("Lets tilt Tobi LOLOLOL");   // I hope you review the code well
+        }
+
         // rasterization state
         vk::PipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo(
                 {},
                 config.m_EnableDepthClamping,
                 false,
                 vk::PolygonMode::eFill,
-                vk::CullModeFlagBits::eNone,
+                cullMode,
                 vk::FrontFace::eCounterClockwise,
                 false,
                 0.f,
-- 
GitLab