From f1f8797d3cfe90580fe6c2bcd6360d58597ffe68 Mon Sep 17 00:00:00 2001
From: Magnus Norddahl <dpjudas@users.noreply.github.com>
Date: Fri, 1 Mar 2019 01:30:10 +0100
Subject: [PATCH] - bind the layer textures

---
 .../vulkan/renderer/vk_renderpass.cpp         |  3 -
 src/rendering/vulkan/shaders/vk_shader.cpp    | 12 ++--
 .../vulkan/textures/vk_hwtexture.cpp          | 61 ++++++++++++-------
 src/rendering/vulkan/textures/vk_hwtexture.h  |  2 +
 4 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/src/rendering/vulkan/renderer/vk_renderpass.cpp b/src/rendering/vulkan/renderer/vk_renderpass.cpp
index dc8ebfe40..f0497cd32 100644
--- a/src/rendering/vulkan/renderer/vk_renderpass.cpp
+++ b/src/rendering/vulkan/renderer/vk_renderpass.cpp
@@ -74,14 +74,11 @@ void VkRenderPassManager::CreateDynamicSetLayout()
 void VkRenderPassManager::CreateTextureSetLayout()
 {
 	DescriptorSetLayoutBuilder builder;
-	builder.addBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
-	/*
 	for (int i = 0; i < 6; i++)
 	{
 		builder.addBinding(i, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
 	}
 	builder.addBinding(16, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
-	*/
 	TextureSetLayout = builder.create(GetVulkanFrameBuffer()->device);
 }
 
diff --git a/src/rendering/vulkan/shaders/vk_shader.cpp b/src/rendering/vulkan/shaders/vk_shader.cpp
index 76aea3c7e..253465ce9 100644
--- a/src/rendering/vulkan/shaders/vk_shader.cpp
+++ b/src/rendering/vulkan/shaders/vk_shader.cpp
@@ -78,12 +78,12 @@ static const char *shaderBindings = R"(
 
 	// textures
 	layout(set = 1, binding = 0) uniform sampler2D tex;
-	// layout(set = 1, binding = 1) uniform sampler2D texture2;
-	// layout(set = 1, binding = 2) uniform sampler2D texture3;
-	// layout(set = 1, binding = 3) uniform sampler2D texture4;
-	// layout(set = 1, binding = 4) uniform sampler2D texture5;
-	// layout(set = 1, binding = 5) uniform sampler2D texture6;
-	// layout(set = 1, binding = 16) uniform sampler2D ShadowMap;
+	layout(set = 1, binding = 1) uniform sampler2D texture2;
+	layout(set = 1, binding = 2) uniform sampler2D texture3;
+	layout(set = 1, binding = 3) uniform sampler2D texture4;
+	layout(set = 1, binding = 4) uniform sampler2D texture5;
+	layout(set = 1, binding = 5) uniform sampler2D texture6;
+	layout(set = 1, binding = 16) uniform sampler2D ShadowMap;
 
 	// This must match the PushConstants struct
 	layout(push_constant) uniform PushConstants
diff --git a/src/rendering/vulkan/textures/vk_hwtexture.cpp b/src/rendering/vulkan/textures/vk_hwtexture.cpp
index d77676c5f..e4127aebd 100644
--- a/src/rendering/vulkan/textures/vk_hwtexture.cpp
+++ b/src/rendering/vulkan/textures/vk_hwtexture.cpp
@@ -54,19 +54,48 @@ void VkHardwareTexture::Reset()
 }
 
 VulkanDescriptorSet *VkHardwareTexture::GetDescriptorSet(const FMaterialState &state)
+{
+	if (!mDescriptorSet)
+	{
+		auto fb = GetVulkanFrameBuffer();
+
+		FMaterial *mat = state.mMaterial;
+		FTexture *tex = state.mMaterial->tex;
+		int clampmode = state.mClampMode;
+		int translation = state.mTranslation;
+
+		//if (tex->UseType == ETextureType::SWCanvas) clampmode = CLAMP_NOFILTER;
+		//if (tex->isHardwareCanvas()) clampmode = CLAMP_CAMTEX;
+		//else if ((tex->isWarped() || tex->shaderindex >= FIRST_USER_SHADER) && clampmode <= CLAMP_XY) clampmode = CLAMP_NONE;
+
+		// Textures that are already scaled in the texture lump will not get replaced by hires textures.
+		int flags = state.mMaterial->isExpanded() ? CTF_Expand : (gl_texture_usehires && !tex->isScaled() && clampmode <= CLAMP_XY) ? CTF_CheckHires : 0;
+
+		mDescriptorSet = fb->GetRenderPassManager()->DescriptorPool->allocate(fb->GetRenderPassManager()->TextureSetLayout.get());
+
+		VulkanSampler *sampler = fb->GetSamplerManager()->Get(clampmode);
+		int numLayers = mat->GetLayers();
+
+		WriteDescriptors update;
+		update.addCombinedImageSampler(mDescriptorSet.get(), 0, GetImageView(tex, clampmode, translation, flags), sampler, mImageLayout);
+		for (int i = 1; i < numLayers; i++)
+		{
+			FTexture *layer;
+			auto systex = static_cast<VkHardwareTexture*>(mat->GetLayer(i, 0, &layer));
+			update.addCombinedImageSampler(mDescriptorSet.get(), i, systex->GetImageView(layer, clampmode, 0, mat->isExpanded() ? CTF_Expand : 0), sampler, mImageLayout);
+		}
+		update.updateSets(fb->device);
+	}
+
+	return mDescriptorSet.get();
+}
+
+VulkanImageView *VkHardwareTexture::GetImageView(FTexture *tex, int clampmode, int translation, int flags)
 {
 	if (!mImage)
 	{
-		FTexture *tex = state.mMaterial->tex;
-
 		if (!tex->isHardwareCanvas())
 		{
-			int clampmode = state.mClampMode;
-			//if (tex->UseType == ETextureType::SWCanvas) clampmode = CLAMP_NOFILTER;
-			//if (tex->isHardwareCanvas()) clampmode = CLAMP_CAMTEX;
-			//else if ((tex->isWarped() || tex->shaderindex >= FIRST_USER_SHADER) && clampmode <= CLAMP_XY) clampmode = CLAMP_NONE;
-
-			int translation = state.mTranslation;
 			if (translation <= 0)
 			{
 				translation = -translation;
@@ -79,9 +108,6 @@ VulkanDescriptorSet *VkHardwareTexture::GetDescriptorSet(const FMaterialState &s
 
 			bool needmipmap = (clampmode <= CLAMP_XY);
 
-			// Textures that are already scaled in the texture lump will not get replaced by hires textures.
-			int flags = state.mMaterial->isExpanded() ? CTF_Expand : (gl_texture_usehires && !tex->isScaled() && clampmode <= CLAMP_XY) ? CTF_CheckHires : 0;
-
 			FTextureBuffer texbuffer = tex->CreateTexBuffer(translation, flags | CTF_ProcessData);
 			CreateTexture(texbuffer.mWidth, texbuffer.mHeight, 4, VK_FORMAT_B8G8R8A8_UNORM, texbuffer.mBuffer);
 		}
@@ -97,18 +123,7 @@ VulkanDescriptorSet *VkHardwareTexture::GetDescriptorSet(const FMaterialState &s
 			CreateTexture(4, 4, 4, VK_FORMAT_R8G8B8A8_UNORM, testpixels);
 		}
 	}
-
-	if (!mDescriptorSet)
-	{
-		auto fb = GetVulkanFrameBuffer();
-		mDescriptorSet = fb->GetRenderPassManager()->DescriptorPool->allocate(fb->GetRenderPassManager()->TextureSetLayout.get());
-
-		WriteDescriptors update;
-		update.addCombinedImageSampler(mDescriptorSet.get(), 0, mImageView.get(), fb->GetSamplerManager()->Get(0), mImageLayout);
-		update.updateSets(fb->device);
-	}
-
-	return mDescriptorSet.get();
+	return mImageView.get();
 }
 
 void VkHardwareTexture::CreateTexture(int w, int h, int pixelsize, VkFormat format, const void *pixels)
diff --git a/src/rendering/vulkan/textures/vk_hwtexture.h b/src/rendering/vulkan/textures/vk_hwtexture.h
index 3cecd427e..105bb2a0b 100644
--- a/src/rendering/vulkan/textures/vk_hwtexture.h
+++ b/src/rendering/vulkan/textures/vk_hwtexture.h
@@ -33,6 +33,8 @@ public:
 	unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name) override;
 
 private:
+	VulkanImageView *GetImageView(FTexture *tex, int clampmode, int translation, int flags);
+
 	void CreateTexture(int w, int h, int pixelsize, VkFormat format, const void *pixels);
 	void GenerateMipmaps(VulkanImage *image, VulkanCommandBuffer *cmdbuffer);
 	static int GetMipLevels(int w, int h);