v98: replace vkUpdateDescriptors() by vkUpdateDescriptorSets()

Only slightly tested.

Conflicts:
	include/vulkan.h
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index d90b1ee..c78488d 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -577,11 +577,8 @@
     char str[1024];
     switch (pUpdateStruct->sType)
     {
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
-        case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
-        case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
-        case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+        case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
             return 1;
         default:
             sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in vkUpdateDescriptors() struct tree", string_VkStructureType(pUpdateStruct->sType), pUpdateStruct->sType);
@@ -595,16 +592,10 @@
     char str[1024];
     switch (pUpdateStruct->sType)
     {
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-            return ((VkUpdateSamplers*)pUpdateStruct)->binding;
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
-            return ((VkUpdateSamplerTextures*)pUpdateStruct)->binding;
-        case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
-            return ((VkUpdateImages*)pUpdateStruct)->binding;
-        case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
-            return ((VkUpdateBuffers*)pUpdateStruct)->binding;
-        case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
-            return ((VkUpdateAsCopy*)pUpdateStruct)->binding;
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+            return ((VkWriteDescriptorSet*)pUpdateStruct)->destBinding;
+        case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
+            return ((VkCopyDescriptorSet*)pUpdateStruct)->destBinding;
         default:
             sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in vkUpdateDescriptors() struct tree", string_VkStructureType(pUpdateStruct->sType), pUpdateStruct->sType);
             layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_INVALID_UPDATE_STRUCT, "DS", str);
@@ -617,17 +608,11 @@
     char str[1024];
     switch (pUpdateStruct->sType)
     {
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-            return (((VkUpdateSamplers*)pUpdateStruct)->arrayIndex);
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
-            return (((VkUpdateSamplerTextures*)pUpdateStruct)->arrayIndex);
-        case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
-            return (((VkUpdateImages*)pUpdateStruct)->arrayIndex);
-        case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
-            return (((VkUpdateBuffers*)pUpdateStruct)->arrayIndex);
-        case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+            return ((VkWriteDescriptorSet*)pUpdateStruct)->destArrayElement;
+        case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
             // TODO : Need to understand this case better and make sure code is correct
-            return (((VkUpdateAsCopy*)pUpdateStruct)->arrayElement);
+            return ((VkCopyDescriptorSet*)pUpdateStruct)->destArrayElement;
         default:
             sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in vkUpdateDescriptors() struct tree", string_VkStructureType(pUpdateStruct->sType), pUpdateStruct->sType);
             layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_INVALID_UPDATE_STRUCT, "DS", str);
@@ -640,17 +625,11 @@
     char str[1024];
     switch (pUpdateStruct->sType)
     {
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-            return (((VkUpdateSamplers*)pUpdateStruct)->count);
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
-            return (((VkUpdateSamplerTextures*)pUpdateStruct)->count);
-        case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
-            return (((VkUpdateImages*)pUpdateStruct)->count);
-        case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
-            return (((VkUpdateBuffers*)pUpdateStruct)->count);
-        case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+            return ((VkWriteDescriptorSet*)pUpdateStruct)->count;
+        case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
             // TODO : Need to understand this case better and make sure code is correct
-            return (((VkUpdateAsCopy*)pUpdateStruct)->count);
+            return ((VkCopyDescriptorSet*)pUpdateStruct)->count;
         default:
             sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in vkUpdateDescriptors() struct tree", string_VkStructureType(pUpdateStruct->sType), pUpdateStruct->sType);
             layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_INVALID_UPDATE_STRUCT, "DS", str);
@@ -694,20 +673,12 @@
     char str[1024];
     switch (pUpdateStruct->sType)
     {
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-            actualType = VK_DESCRIPTOR_TYPE_SAMPLER;
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+            actualType = ((VkWriteDescriptorSet*)pUpdateStruct)->descriptorType;
             break;
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
-            actualType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
-            break;
-        case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
-            actualType = ((VkUpdateImages*)pUpdateStruct)->descriptorType;
-            break;
-        case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
-            actualType = ((VkUpdateBuffers*)pUpdateStruct)->descriptorType;
-            break;
-        case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
-            actualType = ((VkUpdateAsCopy*)pUpdateStruct)->descriptorType;
+        case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
+            /* no need to validate */
+            return 1;
             break;
         default:
             sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in vkUpdateDescriptors() struct tree", string_VkStructureType(pUpdateStruct->sType), pUpdateStruct->sType);
@@ -726,61 +697,27 @@
 static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate)
 {
     GENERIC_HEADER* pNewNode = NULL;
-    VkUpdateSamplers* pUS = NULL;
-    VkUpdateSamplerTextures* pUST = NULL;
-    VkUpdateBuffers* pUB = NULL;
-    VkUpdateImages* pUI = NULL;
-    VkUpdateAsCopy* pUAC = NULL;
+    VkWriteDescriptorSet* pWDS = NULL;
+    VkCopyDescriptorSet* pCDS = NULL;
     size_t array_size = 0;
     size_t base_array_size = 0;
     size_t total_array_size = 0;
     size_t baseBuffAddr = 0;
-    VkImageViewAttachInfo** ppLocalImageViews = NULL;
-    VkBufferViewAttachInfo** ppLocalBufferViews = NULL;
     char str[1024];
     switch (pUpdate->sType)
     {
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-            pUS = new VkUpdateSamplers;
-            pNewNode = (GENERIC_HEADER*)pUS;
-            memcpy(pUS, pUpdate, sizeof(VkUpdateSamplers));
-            pUS->pSamplers = new VkSampler[pUS->count];
-            array_size = sizeof(VkSampler) * pUS->count;
-            memcpy((void*)pUS->pSamplers, ((VkUpdateSamplers*)pUpdate)->pSamplers, array_size);
+        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+            pWDS = new VkWriteDescriptorSet;
+            pNewNode = (GENERIC_HEADER*)pWDS;
+            memcpy(pWDS, pUpdate, sizeof(VkWriteDescriptorSet));
+            pWDS->pDescriptors = new VkDescriptorInfo[pWDS->count];
+            array_size = sizeof(VkDescriptorInfo) * pWDS->count;
+            memcpy((void*)pWDS->pDescriptors, ((VkWriteDescriptorSet*)pUpdate)->pDescriptors, array_size);
             break;
-        case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
-            pUST = new VkUpdateSamplerTextures;
-            pNewNode = (GENERIC_HEADER*)pUST;
-            memcpy(pUST, pUpdate, sizeof(VkUpdateSamplerTextures));
-            pUST->pSamplerImageViews = new VkSamplerImageViewInfo[pUST->count];
-            array_size = sizeof(VkSamplerImageViewInfo) * pUST->count;
-            memcpy((void*)pUST->pSamplerImageViews, ((VkUpdateSamplerTextures*)pUpdate)->pSamplerImageViews, array_size);
-            for (uint32_t i = 0; i < pUST->count; i++) {
-                VkImageViewAttachInfo** ppIV = (VkImageViewAttachInfo**)&pUST->pSamplerImageViews[i].pImageView;
-                *ppIV = new VkImageViewAttachInfo;
-                memcpy((void*)*ppIV, ((VkUpdateSamplerTextures*)pUpdate)->pSamplerImageViews[i].pImageView, sizeof(VkImageViewAttachInfo));
-            }
-            break;
-        case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
-            pUI = new VkUpdateImages;
-            pNewNode = (GENERIC_HEADER*)pUI;
-            memcpy(pUI, pUpdate, sizeof(VkUpdateImages));
-            pUI->pImageViews = new VkImageViewAttachInfo[pUI->count];
-            array_size = (sizeof(VkImageViewAttachInfo) * pUI->count);
-            memcpy((void*)pUI->pImageViews, ((VkUpdateImages*)pUpdate)->pImageViews, array_size);
-            break;
-        case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
-            pUB = new VkUpdateBuffers;
-            pNewNode = (GENERIC_HEADER*)pUB;
-            memcpy(pUB, pUpdate, sizeof(VkUpdateBuffers));
-            pUB->pBufferViews = new VkBufferViewAttachInfo[pUB->count];
-            array_size = (sizeof(VkBufferViewAttachInfo) * pUB->count);
-            memcpy((void*)pUB->pBufferViews, ((VkUpdateBuffers*)pUpdate)->pBufferViews, array_size);
-            break;
-        case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
-            pUAC = new VkUpdateAsCopy;
-            pUpdate = (GENERIC_HEADER*)pUAC;
-            memcpy(pUAC, pUpdate, sizeof(VkUpdateAsCopy));
+        case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
+            pCDS = new VkCopyDescriptorSet;
+            pUpdate = (GENERIC_HEADER*)pCDS;
+            memcpy(pCDS, pUpdate, sizeof(VkCopyDescriptorSet));
             break;
         default:
             sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in vkUpdateDescriptors() struct tree", string_VkStructureType(pUpdate->sType), pUpdate->sType);
@@ -791,19 +728,28 @@
     pNewNode->pNext = NULL;
     return pNewNode;
 }
-// For given ds, update its mapping based on ppUpdateArray
-static bool32_t dsUpdate(VkDescriptorSet ds, uint32_t updateCount, const void** ppUpdateArray)
+// update DS mappings based on ppUpdateArray
+static bool32_t dsUpdate(VkStructureType type, uint32_t updateCount, const void* pUpdateArray)
 {
+    const VkWriteDescriptorSet *pWDS = NULL;
+    const VkCopyDescriptorSet *pCDS = NULL;
     bool32_t result = 1;
-    SET_NODE* pSet = getSetNode(ds);
+
+    if (type == VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
+        pWDS = (const VkWriteDescriptorSet *) pUpdateArray;
+    else
+        pCDS = (const VkCopyDescriptorSet *) pUpdateArray;
+
     loader_platform_thread_lock_mutex(&globalLock);
-    g_lastBoundDescriptorSet = pSet->set;
     LAYOUT_NODE* pLayout = NULL;
     VkDescriptorSetLayoutCreateInfo* pLayoutCI = NULL;
     // TODO : If pCIList is NULL, flag error
     // Perform all updates
     for (uint32_t i = 0; i < updateCount; i++) {
-        GENERIC_HEADER* pUpdate = (GENERIC_HEADER*)ppUpdateArray[i];
+        VkDescriptorSet ds = (pWDS) ? pWDS->destSet : pCDS->destSet;
+        SET_NODE* pSet = setMap[ds]; // getSetNode() without locking
+        g_lastBoundDescriptorSet = pSet->set;
+        GENERIC_HEADER* pUpdate = (pWDS) ? (GENERIC_HEADER*) &pWDS[i] : (GENERIC_HEADER*) &pCDS[i];
         pLayout = pSet->pLayout;
         // First verify valid update struct
         if (!validUpdateStruct(pUpdate)) {
@@ -876,40 +822,17 @@
         pFreeUpdate = pShadowUpdate;
         pShadowUpdate = (GENERIC_HEADER*)pShadowUpdate->pNext;
         uint32_t index = 0;
-        VkUpdateSamplers* pUS = NULL;
-        VkUpdateSamplerTextures* pUST = NULL;
-        VkUpdateImages* pUI = NULL;
-        VkUpdateBuffers* pUB = NULL;
+        VkWriteDescriptorSet * pWDS = NULL;
+        VkCopyDescriptorSet * pCDS = NULL;
         void** ppToFree = NULL;
         switch (pFreeUpdate->sType)
         {
-            case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
-                pUS = (VkUpdateSamplers*)pFreeUpdate;
-                if (pUS->pSamplers)
-                    delete[] pUS->pSamplers;
+            case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+                pWDS = (VkWriteDescriptorSet*)pFreeUpdate;
+                if (pWDS->pDescriptors)
+                    delete[] pWDS->pDescriptors;
                 break;
-            case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
-                pUST = (VkUpdateSamplerTextures*)pFreeUpdate;
-                if (pUST->pSamplerImageViews) {
-                    for (index = 0; index < pUST->count; index++) {
-                        if (pUST->pSamplerImageViews[index].pImageView) {
-                            delete pUST->pSamplerImageViews[index].pImageView;
-                        }
-                    }
-                    delete[] pUST->pSamplerImageViews;
-                }
-                break;
-            case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
-                pUI = (VkUpdateImages*)pFreeUpdate;
-                if (pUI->pImageViews)
-                    delete[] pUI->pImageViews;
-                break;
-            case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
-                pUB = (VkUpdateBuffers*)pFreeUpdate;
-                if (pUB->pBufferViews)
-                    delete[] pUB->pBufferViews;
-                break;
-            case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
+            case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
                 break;
             default:
                 assert(0);
@@ -1104,6 +1027,7 @@
 // Common Dot dumping code
 static void dsCoreDumpDot(const VkDescriptorSet ds, FILE* pOutFile)
 {
+#if 0
     SET_NODE* pSet = getSetNode(ds);
     if (pSet) {
         POOL_NODE* pPool = getPoolNode(pSet->pool);
@@ -1226,6 +1150,7 @@
         fprintf(pOutFile, "}\n");
         fprintf(pOutFile, "}\n");
     }
+#endif
 }
 // Dump subgraph w/ DS info
 static void dsDumpDot(const VkCmdBuffer cb, FILE* pOutFile)
@@ -1859,14 +1784,13 @@
     nextTable.ClearDescriptorSets(device, descriptorPool, count, pDescriptorSets);
 }
 
-VK_LAYER_EXPORT void VKAPI vkUpdateDescriptors(VkDevice device, VkDescriptorSet descriptorSet, uint32_t updateCount, const void** ppUpdateArray)
+VK_LAYER_EXPORT VkResult VKAPI vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies)
 {
-    SET_NODE* pSet = getSetNode(descriptorSet);
-
-    // pUpdateChain is an array of VK_UPDATE_* struct ptrs defining the mappings for the descriptors
-    if (dsUpdate(descriptorSet, updateCount, ppUpdateArray)) {
-        nextTable.UpdateDescriptors(device, descriptorSet, updateCount, ppUpdateArray);
-    }
+    if (dsUpdate(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, writeCount, pDescriptorWrites) &&
+        dsUpdate(VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET, copyCount, pDescriptorCopies))
+        return nextTable.UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
+    else
+        return VK_ERROR_UNKNOWN;
 }
 
 VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
@@ -2761,8 +2685,8 @@
         return (void*) vkAllocDescriptorSets;
     if (!strcmp(funcName, "vkClearDescriptorSets"))
         return (void*) vkClearDescriptorSets;
-    if (!strcmp(funcName, "vkUpdateDescriptors"))
-        return (void*) vkUpdateDescriptors;
+    if (!strcmp(funcName, "vkUpdateDescriptorSets"))
+        return (void*) vkUpdateDescriptorSets;
     if (!strcmp(funcName, "vkCreateDynamicViewportState"))
         return (void*) vkCreateDynamicViewportState;
     if (!strcmp(funcName, "vkCreateDynamicRasterState"))