layers: Initial Descriptor Set output in DrawState Dot file

Also includes various code clean-up in DrawState layer to remove non-functional code.
diff --git a/layers/draw_state.c b/layers/draw_state.c
index db92eda..a10d949 100644
--- a/layers/draw_state.c
+++ b/layers/draw_state.c
@@ -343,6 +343,9 @@
 }
 
 // For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found
+// TODO : Use this function to display sampler info
+//   commenting out for now to avoid warning about not being used
+/*
 static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler)
 {
     loader_platform_thread_lock_mutex(&globalLock);
@@ -357,6 +360,7 @@
     loader_platform_thread_unlock_mutex(&globalLock);
     return NULL;
 }
+*/
 
 // Init the pipeline mapping info based on pipeline create info LL tree
 //  Threading note : Calls to this function should wrapped in mutex
@@ -564,6 +568,9 @@
 {
     GENERIC_HEADER* pNewNode = NULL;
     size_t array_size = 0;
+    size_t base_array_size = 0;
+    size_t total_array_size = 0;
+    XGL_UPDATE_BUFFERS* pUBCI;
     switch (pUpdate->sType)
     {
         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
@@ -587,24 +594,28 @@
         case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES));
             memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES));
-            size_t base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
-            size_t total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size;
-            // TODO : Need to validate if this data structure is being copied correctly
+            base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count;
+            total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size;
             XGL_IMAGE_VIEW_ATTACH_INFO*** pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO***)&((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews;
             *pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size);
             for (uint32_t i = 0; i < ((XGL_UPDATE_IMAGES*)pNewNode)->count; i++) {
-                //((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size);
-                *pppLocalImageViews[i] = *pppLocalImageViews + base_array_size + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
+                *pppLocalImageViews[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(*pppLocalImageViews + base_array_size + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)));
                 memcpy(*pppLocalImageViews[i], ((XGL_UPDATE_IMAGES*)pUpdate)->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));
             }
             break;
         case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
+            pUBCI = (XGL_UPDATE_BUFFERS*)pUpdate;
             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS));
             memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS));
-            array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) + sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*)) * ((XGL_UPDATE_BUFFERS*)pNewNode)->count;
-            // TODO : Dual-level copy required here. This is an array of pointers.
-            ((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO*)malloc(array_size);
-            memcpy((XGL_BUFFER_VIEW_ATTACH_INFO*)((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews, ((XGL_UPDATE_BUFFERS*)pUpdate)->pBufferViews, array_size);
+            base_array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) * pUBCI->count;
+            total_array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * pUBCI->count) + base_array_size;
+            XGL_BUFFER_VIEW_ATTACH_INFO*** pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO***)&((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews;
+            *pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)malloc(total_array_size);
+            for (uint32_t i = 0; i < pUBCI->count; i++) {
+                // Set ptr and then copy data into that ptr
+                *pppLocalBufferViews[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(*pppLocalBufferViews + base_array_size + (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * i));
+                memcpy(*pppLocalBufferViews[i], pUBCI->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO));
+            }
             break;
         case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY));
@@ -769,53 +780,42 @@
     }
 }
 // Dump subgraph w/ DS info
-/*
 static void dsDumpDot(FILE* pOutFile)
 {
-    const int i = 0; // hard-coding to just the first DS index for now
-    uint32_t skipUnusedCount = 0; // track consecutive unused slots for minimal reporting
-    DS_LL_HEAD *pDS = getDS(lastBoundDS);
-    if (pDS) {
-        fprintf(pOutFile, "subgraph DS_SLOTS\n{\nlabel=\"DS0 Slots\"\n");
-        // First create simple array node as central DS reference point
-        fprintf(pOutFile, "\"DS0_MEMORY\" [\nlabel = <<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD PORT=\"ds2\">DS0 Memory</TD></TR>");
-        uint32_t j;
-        char label[1024];
-        for (j = 0; j < pDS->numSlots; j++) {
-            // Don't draw unused slots
-            if (0 != pDS->dsSlot[j].activeMapping)
-                fprintf(pOutFile, "<TR><TD PORT=\"slot%u\">slot%u</TD></TR>", j, j);
-        }
-        fprintf(pOutFile, "</TABLE>>\n];\n");
-        // Now tie each slot to its info
-        for (j = 0; j < pDS->numSlots; j++) {
-            switch (pDS->dsSlot[j].activeMapping)
-            {
-                case MAPPING_MEMORY:
-                    sprintf(label, "MemAttachInfo Slot%u", j);
-                    fprintf(pOutFile, "%s", xgl_gv_print_xgl_memory_view_attach_info(&pDS->dsSlot[j].buffView, label));
-                    fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
-                    break;
-                case MAPPING_IMAGE:
-                    sprintf(label, "ImageAttachInfo Slot%u", j);
-                    fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_attach_info(&pDS->dsSlot[j].imageView, label));
-                    fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
-                    break;
-                case MAPPING_SAMPLER:
-                    sprintf(label, "SamplerAttachInfo Slot%u", j);
-                    fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(getSamplerCreateInfo(pDS->dsSlot[j].sampler), label));
-                    fprintf(pOutFile, "\"DS0_MEMORY\":slot%u -> \"%s\" [];\n", j, label);
-                    break;
-                default:
-                    skipUnusedCount++;
-                    break;
+    REGION_NODE* pRegion = g_pRegionHead;
+    char tmp_str[1024];
+    while (pRegion) {
+        fprintf(pOutFile, "subgraph cluster_DescriptorRegion\n{\nlabel=\"Descriptor Region\"\n");
+        sprintf(tmp_str, "Region (%p)", pRegion->region);
+        fprintf(pOutFile, "%s", xgl_gv_print_xgl_descriptor_region_create_info(&pRegion->createInfo, tmp_str));
+        SET_NODE* pSet = pRegion->pSets;
+        uint32_t set_index = 0;
+        while (pSet) {
+            ++set_index;
+            fprintf(pOutFile, "subgraph cluster_DescriptorSet%u\n{\nlabel=\"Descriptor Set #%u (%p)\"\n", set_index, set_index, pSet->set);
+            sprintf(tmp_str, "Descriptor Set #%u (%p)", set_index, pSet->set);
+            LAYOUT_NODE* pLayout = pSet->pLayouts;
+            uint32_t layout_index = 0;
+            while (pLayout) {
+                ++layout_index;
+                sprintf(tmp_str, "SET%u_LAYOUT%u", set_index, layout_index);
+                fprintf(pOutFile, "%s", xgl_gv_print_xgl_descriptor_set_layout_create_info(pLayout->pCreateInfoList, tmp_str));
+                pLayout = pLayout->pNext;
+                if (pLayout) {
+                    fprintf(pOutFile, "\"%s\" -> \"SET%u_LAYOUT%u\" [];\n", tmp_str, set_index, layout_index+1);
+                }
             }
-
+            if (pSet->pUpdateStructs) {
+                fprintf(pOutFile, "%s", dynamic_gv_display(pSet->pUpdateStructs, "Descriptor Updates"));
+            }
+            fprintf(pOutFile, "}\n");
+            pSet = pSet->pNext;
         }
         fprintf(pOutFile, "}\n");
+        pRegion = pRegion->pNext;
     }
 }
-*/
+
 // Dump a GraphViz dot file showing the pipeline
 static void dumpDotFile(char *outFileName)
 {
@@ -824,17 +824,17 @@
         FILE* pOutFile;
         pOutFile = fopen(outFileName, "w");
         fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n");
-        fprintf(pOutFile, "subgraph PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
-        fprintf(pOutFile, "%s", xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD"));
-        fprintf(pOutFile, "}\n");
-        fprintf(pOutFile, "subgraph dynamicState\n{\nlabel=\"Non-Orthogonal XGL State\"\n");
+        fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n");
         for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) {
             if (g_pLastBoundDynamicState[i]) {
                 fprintf(pOutFile, "%s", dynamic_gv_display(g_pLastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i)));
             }
         }
         fprintf(pOutFile, "}\n"); // close dynamicState subgraph
-        //dsDumpDot(pOutFile);
+        fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n");
+        fprintf(pOutFile, "%s", xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD"));
+        fprintf(pOutFile, "}\n");
+        dsDumpDot(pOutFile);
         fprintf(pOutFile, "}\n"); // close main graph "g"
         fclose(pOutFile);
     }
@@ -899,8 +899,6 @@
             }
             index = 0;
             GENERIC_HEADER* pUpdate = pSet->pUpdateStructs;
-            //while (pUpdate) {
-            // Print update details
             sprintf(tmp_str, "Update Chain [UC] for descriptor set %p:", (void*)pSet->set);
             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str);
             sprintf(prefix, "  [UC] ");
@@ -909,7 +907,6 @@
             // TODO : If there is a "view" associated with this update, print CI for that view
             pUpdate = (GENERIC_HEADER*)pUpdate->pNext;
             index++;
-            //}
             pSet = pSet->pNext;
         }
         pRegion = pRegion->pNext;
@@ -1582,7 +1579,7 @@
                     pNewNode->set = pDescriptorSets[i];
                     pNewNode->setUsage = setUsage;
                     // TODO : Make sure to set this correctly
-                    pNewNode->descriptorCount = 0;
+                    pNewNode->descriptorCount = pLayout->endIndex + 1;
                 }
             }
         }