From 28a0a425b819a6f08a652069e300f65c294ffb1f Mon Sep 17 00:00:00 2001
From: Artur Wasmut <awasmut@uni-koblenz.de>
Date: Tue, 10 Aug 2021 00:25:04 +0200
Subject: [PATCH] [#105] WIP: add descriptor indexing feature to glsl

---
 .../bindless_textures/resources/shaders/shader.frag |  5 +++--
 projects/bindless_textures/src/main.cpp             |  5 ++---
 src/vkcv/Context.cpp                                | 13 ++++++++++++-
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/projects/bindless_textures/resources/shaders/shader.frag b/projects/bindless_textures/resources/shaders/shader.frag
index 71a1de69..ba9ee901 100644
--- a/projects/bindless_textures/resources/shaders/shader.frag
+++ b/projects/bindless_textures/resources/shaders/shader.frag
@@ -1,14 +1,15 @@
 #version 450
 #extension GL_ARB_separate_shader_objects : enable
+#extension GL_EXT_nonuniform_qualifier : enable
 
 layout(location = 0) in vec3 passNormal;
 layout(location = 1) in vec2 passUV;
 
 layout(location = 0) out vec3 outColor;
 
-layout(set=0, binding=0) uniform texture2D  meshTexture;
+layout(set=0, binding=0) uniform texture2D  materialTextures[];
 layout(set=0, binding=1) uniform sampler    textureSampler;
 
 void main()	{
-	outColor = texture(sampler2D(meshTexture, textureSampler), passUV).rgb;
+	outColor = texture(sampler2D(materialTextures[1], textureSampler), passUV).rgb;
 }
\ No newline at end of file
diff --git a/projects/bindless_textures/src/main.cpp b/projects/bindless_textures/src/main.cpp
index 731d3e56..496c6405 100644
--- a/projects/bindless_textures/src/main.cpp
+++ b/projects/bindless_textures/src/main.cpp
@@ -25,7 +25,7 @@ int main(int argc, const char** argv) {
 		VK_MAKE_VERSION(0, 0, 1),
 		{ vk::QueueFlagBits::eGraphics ,vk::QueueFlagBits::eCompute , vk::QueueFlagBits::eTransfer },
 		{},
-		{ "VK_KHR_swapchain" }
+		{ "VK_KHR_swapchain", VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME }
 	);
 
 	vkcv::asset::Scene mesh;
@@ -106,8 +106,7 @@ int main(int argc, const char** argv) {
 	
 	const vkcv::VertexLayout firstMeshLayout (bindings);
 
-	uint32_t setID = 0;
-	std::vector<vkcv::DescriptorBinding> descriptorBindings = { firstMeshProgram.getReflectedDescriptors()[setID] };
+	std::vector<vkcv::DescriptorBinding> descriptorBindings = { firstMeshProgram.getReflectedDescriptors()[0] };
 	vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorBindings);
 
 	const vkcv::PipelineConfig firstMeshPipelineConfig {
diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp
index d55c1026..c143635f 100644
--- a/src/vkcv/Context.cpp
+++ b/src/vkcv/Context.cpp
@@ -294,6 +294,7 @@ namespace vkcv
 		deviceFeatures2.features.shaderInt16 = true;
 
 		// TODO: proper feature management
+		// TODO: check whether these features are ACTUALLY SUPPORTED
 		// -------------- HARD CODED LIST OF DEVICE FEATURES THAT ARE CHECKED AGAINST AND IF USED, ENABLED ------------
 
 		const bool usingMeshShaders = checkSupport(deviceExtensions, { VK_NV_MESH_SHADER_EXTENSION_NAME });
@@ -317,7 +318,17 @@ namespace vkcv
 		    device16BitStorageFeatures.storageBuffer16BitAccess = true;
 			deviceShaderFloat16Int8Features.setPNext(&device16BitStorageFeatures);
 		}
-		
+
+		const bool descriptorIndexing = checkSupport(deviceExtensions, { VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME });
+        vk::PhysicalDeviceDescriptorIndexingFeatures descriptorIndexingFeatures;
+        if (descriptorIndexing) {
+            // NOTE: what about
+            // shaderSampledImageArrayNonUniformIndexing ?
+            descriptorIndexingFeatures.descriptorBindingPartiallyBound = true;
+            descriptorIndexingFeatures.runtimeDescriptorArray = true;
+            deviceFeatures2.setPNext(&descriptorIndexingFeatures);
+        }
+
 		deviceCreateInfo.setPNext(&deviceFeatures2);
 
 		// Ablauf
-- 
GitLab