From 4c4f21542e507f47c34f20cb987deba97d0cb43a Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Fri, 15 Jul 2022 02:55:57 +0200
Subject: [PATCH] Added logging to invalid dispatch sizes

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 include/vkcv/DispatchSize.hpp |  2 ++
 src/vkcv/DispatchSize.cpp     | 29 +++++++++++++++++++++++++----
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/include/vkcv/DispatchSize.hpp b/include/vkcv/DispatchSize.hpp
index 10d0d602..66878260 100644
--- a/include/vkcv/DispatchSize.hpp
+++ b/include/vkcv/DispatchSize.hpp
@@ -42,6 +42,8 @@ namespace vkcv {
 		[[nodiscard]]
 		uint32_t z() const;
 		
+		bool check() const;
+		
 	};
 	
 	[[nodiscard]]
diff --git a/src/vkcv/DispatchSize.cpp b/src/vkcv/DispatchSize.cpp
index 4f758672..bf34d2de 100644
--- a/src/vkcv/DispatchSize.cpp
+++ b/src/vkcv/DispatchSize.cpp
@@ -1,17 +1,18 @@
 
 #include "vkcv/DispatchSize.hpp"
+#include "vkcv/Logger.hpp"
 
 #include <cmath>
 
 namespace vkcv {
 	
 	DispatchSize::DispatchSize(uint32_t count)
-	: DispatchSize(count, 1, 1)
-	{}
+	: DispatchSize(count, 1, 1) {}
 	
 	DispatchSize::DispatchSize(uint32_t dimensionX, uint32_t dimentionY, uint32_t dimensionZ)
-	: m_Dispatch({ dimensionX, dimentionY, dimensionZ })
-	{}
+	: m_Dispatch({ dimensionX, dimentionY, dimensionZ }) {
+		check();
+	}
 	
 	const uint32_t *DispatchSize::data() const {
 		return m_Dispatch.data();
@@ -33,6 +34,26 @@ namespace vkcv {
 		return m_Dispatch[2];
 	}
 	
+	bool DispatchSize::check() const {
+		const uint32_t dimensionX = x();
+		const uint32_t dimensionY = y();
+		const uint32_t dimensionZ = z();
+		
+		if ((dimensionX <= 0) || (dimensionY <= 0) || (dimensionZ <= 0)) {
+			vkcv_log(
+					LogLevel::WARNING,
+					"Dispatch size invalid: x = %u, y = %u, z = %u",
+					dimensionX,
+					dimensionY,
+					dimensionZ
+			);
+			
+			return false;
+		} else {
+			return true;
+		}
+	}
+	
 	DispatchSize dispatchInvocations(DispatchSize globalInvocations, DispatchSize groupSize) {
 		const uint32_t dimensionX = std::ceil(1.0f * globalInvocations.x() / groupSize.x());
 		const uint32_t dimensionY = std::ceil(1.0f * globalInvocations.y() / groupSize.y());
-- 
GitLab