From e1a19e9d07a9f299b45fc05c6d85330702146e02 Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Fri, 4 Jun 2021 17:19:10 +0200
Subject: [PATCH] [#66] Remove unnecessary width/height from mesh drawcall

---
 include/vkcv/Core.hpp               |  2 --
 projects/cmd_sync_test/src/main.cpp |  2 --
 src/vkcv/Core.cpp                   | 21 +++++++++++++++++++--
 src/vkcv/ImageManager.cpp           |  9 +++++++++
 4 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index f3048748..f7f725ea 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -230,8 +230,6 @@ namespace vkcv
 		void renderMesh(
 			const PassHandle						renderpassHandle, 
 			const PipelineHandle					pipelineHandle,
-			const uint32_t							width,
-			const uint32_t							height,
 			const size_t							pushConstantSize, 
 			const void*								pushConstantData, 
 			const std::vector<VertexBufferBinding>	&vertexBufferBindings, 
diff --git a/projects/cmd_sync_test/src/main.cpp b/projects/cmd_sync_test/src/main.cpp
index 3f6e2c3f..b70394d9 100644
--- a/projects/cmd_sync_test/src/main.cpp
+++ b/projects/cmd_sync_test/src/main.cpp
@@ -162,8 +162,6 @@ int main(int argc, const char** argv) {
 		core.renderMesh(
 			trianglePass,
 			trianglePipeline,
-			windowWidth,
-			windowHeight,
 			sizeof(mvp),
 			&mvp,
 			vertexBufferBindings,
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index c9a43edb..b320f5db 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -176,8 +176,6 @@ namespace vkcv
 	void Core::renderMesh(
 		const PassHandle						renderpassHandle, 
 		const PipelineHandle					pipelineHandle, 
-		const uint32_t 							width,
-		const uint32_t							height,
 		const size_t							pushConstantSize, 
 		const void								*pushConstantData,
 		const std::vector<VertexBufferBinding>& vertexBufferBindings, 
@@ -191,6 +189,25 @@ namespace vkcv
 			return;
 		}
 
+		uint32_t width;
+		uint32_t height;
+		if (renderTargets.size() > 0) {
+			const vkcv::ImageHandle firstImage = renderTargets[0];
+			if (firstImage.isSwapchainImage()) {
+				width = m_window.getWidth();
+				height = m_window.getHeight();
+			}
+			else {
+				width = m_ImageManager->getImageWidth(firstImage);
+				height = m_ImageManager->getImageHeight(firstImage);
+			}
+		}
+		else {
+			width = 1;
+			height = 1;
+		}
+		// TODO: validate that width/height match for all attachments
+
 		const vk::RenderPass renderpass = m_PassManager->getVkPass(renderpassHandle);
 		const PassConfig passConfig = m_PassManager->getPassConfig(renderpassHandle);
 
diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp
index 4b46b5fc..a3ca22b1 100644
--- a/src/vkcv/ImageManager.cpp
+++ b/src/vkcv/ImageManager.cpp
@@ -178,6 +178,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::getVulkanImage invalid handle" << std::endl;
 			return nullptr;
 		}
 		
@@ -190,6 +191,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::getVulkanDeviceMemory invalid handle" << std::endl;
 			return nullptr;
 		}
 		
@@ -202,6 +204,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::getVulkanImageView invalid handle" << std::endl;
 			return nullptr;
 		}
 		
@@ -214,6 +217,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::switchImageLayout invalid handle" << std::endl;
 			return;
 		}
 		
@@ -295,6 +299,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::fillImage invalid handle" << std::endl;
 			return;
 		}
 		
@@ -371,6 +376,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::getImageWidth invalid handle" << std::endl;
 			return 0;
 		}
 		
@@ -383,6 +389,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::getImageHeight invalid handle" << std::endl;
 			return 0;
 		}
 		
@@ -395,6 +402,7 @@ namespace vkcv {
 		const uint64_t id = handle.getId();
 		
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::getImageDepth invalid handle" << std::endl;
 			return 0;
 		}
 		
@@ -406,6 +414,7 @@ namespace vkcv {
 	void ImageManager::destroyImageById(uint64_t id)
 	{
 		if (id >= m_images.size()) {
+			std::cerr << "Error: ImageManager::destroyImageById invalid handle" << std::endl;
 			return;
 		}
 		
-- 
GitLab