Add support for input attachment descriptors.

Bug: skia:10409
Change-Id: I45a04360fb2c13e0b03041e91857f13d8d7bee3f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/315642
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/vk/GrVkDescriptorSetManager.cpp b/src/gpu/vk/GrVkDescriptorSetManager.cpp
index ef52133..6926dbe 100644
--- a/src/gpu/vk/GrVkDescriptorSetManager.cpp
+++ b/src/gpu/vk/GrVkDescriptorSetManager.cpp
@@ -39,6 +39,13 @@
     return Create(gpu, type, visibilities, immutableSamplers);
 }
 
+GrVkDescriptorSetManager* GrVkDescriptorSetManager::CreateInputManager(GrVkGpu* gpu) {
+    SkSTArray<1, uint32_t> visibilities;
+    visibilities.push_back(kFragment_GrShaderFlag);
+    SkTArray<const GrVkSampler*> samplers;
+    return Create(gpu, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, visibilities, samplers);
+}
+
 VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) {
     VkShaderStageFlags flags = 0;
 
@@ -106,8 +113,7 @@
         }
 
         *descCountPerSet = visibilities.count();
-    } else {
-        SkASSERT(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == type);
+    } else if (type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) {
         static constexpr int kUniformDescPerSet = 1;
         SkASSERT(kUniformDescPerSet == visibilities.count());
         // Create Uniform Buffer Descriptor
@@ -141,6 +147,42 @@
         }
 
         *descCountPerSet = kUniformDescPerSet;
+    } else {
+        SkASSERT(type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT);
+        static constexpr int kInputDescPerSet = 1;
+        SkASSERT(kInputDescPerSet == visibilities.count());
+
+        // Create Input Buffer Descriptor
+        VkDescriptorSetLayoutBinding dsInpuBinding;
+        memset(&dsInpuBinding, 0, sizeof(dsInpuBinding));
+        dsInpuBinding.binding = 0;
+        dsInpuBinding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+        dsInpuBinding.descriptorCount = 1;
+        SkASSERT(visibilities[0] == kFragment_GrShaderFlag);
+        dsInpuBinding.stageFlags = visibility_to_vk_stage_flags(visibilities[0]);
+        dsInpuBinding.pImmutableSamplers = nullptr;
+
+        VkDescriptorSetLayoutCreateInfo uniformLayoutCreateInfo;
+        memset(&uniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo));
+        uniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+        uniformLayoutCreateInfo.pNext = nullptr;
+        uniformLayoutCreateInfo.flags = 0;
+        uniformLayoutCreateInfo.bindingCount = 1;
+        uniformLayoutCreateInfo.pBindings = &dsInpuBinding;
+
+#if defined(SK_ENABLE_SCOPED_LSAN_SUPPRESSIONS)
+        // skia:8713
+        __lsan::ScopedDisabler lsanDisabler;
+#endif
+        VkResult result;
+        GR_VK_CALL_RESULT(gpu, result,
+                          CreateDescriptorSetLayout(
+                                  gpu->device(), &uniformLayoutCreateInfo, nullptr, descSetLayout));
+        if (result != VK_SUCCESS) {
+            return false;
+        }
+
+        *descCountPerSet = kInputDescPerSet;
     }
     return true;
 }