From 70a95d9085ccc81277ab04e63a7cf53482d3bca4 Mon Sep 17 00:00:00 2001
From: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Date: Fri, 3 Jun 2022 17:43:54 +0200
Subject: [PATCH] [dxvk] Add DxvkBindingLayout to DxvkShader class

Supposed to replace the old descriptor model eventually.
---
 src/dxvk/dxvk_shader.cpp | 16 ++++++++++++++++
 src/dxvk/dxvk_shader.h   | 12 ++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/src/dxvk/dxvk_shader.cpp b/src/dxvk/dxvk_shader.cpp
index 2d9793f45..b543d201b 100644
--- a/src/dxvk/dxvk_shader.cpp
+++ b/src/dxvk/dxvk_shader.cpp
@@ -66,6 +66,7 @@ namespace dxvk {
   : m_info(info), m_code(spirv) {
     m_info.resourceSlots = nullptr;
     m_info.uniformData = nullptr;
+    m_info.bindings = nullptr;
 
     // Copy resource binding slot infos
     if (info.resourceSlotCount) {
@@ -75,6 +76,21 @@ namespace dxvk {
       m_info.resourceSlots = m_slots.data();
     }
 
+    for (uint32_t i = 0; i < info.bindingCount; i++) {
+      DxvkBindingInfo binding = info.bindings[i];
+      binding.stages = info.stage;
+      m_bindings.addBinding(binding);
+    }
+
+    if (info.pushConstSize) {
+      VkPushConstantRange pushConst;
+      pushConst.stageFlags = info.stage;
+      pushConst.offset = info.pushConstOffset;
+      pushConst.size = info.pushConstSize;
+
+      m_bindings.addPushConstantRange(pushConst);
+    }
+
     // Copy uniform buffer data
     if (info.uniformSize) {
       m_uniformData.resize(info.uniformSize);
diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h
index 0be8b496b..9f9c7d3e0 100644
--- a/src/dxvk/dxvk_shader.h
+++ b/src/dxvk/dxvk_shader.h
@@ -58,6 +58,8 @@ namespace dxvk {
     /// Descriptor info
     uint32_t resourceSlotCount = 0;
     const DxvkResourceSlot* resourceSlots = nullptr;
+    uint32_t bindingCount = 0;
+    const DxvkBindingInfo* bindings = nullptr;
     /// Input and output register mask
     uint32_t inputMask = 0;
     uint32_t outputMask = 0;
@@ -116,6 +118,14 @@ namespace dxvk {
     DxvkShaderFlags flags() const {
       return m_flags;
     }
+
+    /**
+     * \brief Retrieves binding layout
+     * \returns Binding layout
+     */
+    const DxvkBindingLayout& getBindings() const {
+      return m_bindings;
+    }
     
     /**
      * \brief Adds resource slots definitions to a mapping
@@ -214,6 +224,8 @@ namespace dxvk {
     std::vector<char>             m_uniformData;
     std::vector<size_t>           m_idOffsets;
 
+    DxvkBindingLayout             m_bindings;
+
     static void eliminateInput(SpirvCodeBuffer& code, uint32_t location);
 
   };