bug-14827: Make DescriptorInfo a union of bufferInfo, imageInfo, and bufferView
diff --git a/include/vulkan.h b/include/vulkan.h
index c85d511..ebff03f 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -1813,17 +1813,25 @@
 } VkDescriptorPoolCreateInfo;
 
 typedef struct {
+    VkSampler                                   sampler;
+    VkImageView                                 imageView;
+    VkImageLayout                               imageLayout;
+} VkDescriptorImageInfo;
+
+typedef struct {
     VkBuffer                                    buffer;
     VkDeviceSize                                offset;
     VkDeviceSize                                range;
 } VkDescriptorBufferInfo;
 
+/* TODO: this should be union, except that causes a compiler error:
+ * error: member 'VkDescriptorImageInfo <anonymous union>::imageInfo' with constructor not allowed in union
+ * This issue should go away when the change to remove the constructor lands.
+ */
 typedef struct {
-    VkBufferView                                bufferView;
-    VkSampler                                   sampler;
-    VkImageView                                 imageView;
-    VkImageLayout                               imageLayout;
+    VkDescriptorImageInfo                       imageInfo;
     VkDescriptorBufferInfo                      bufferInfo;
+    VkBufferView                                texelBufferView;
 } VkDescriptorInfo;
 
 typedef struct {
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index c1395b3..7f51083 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -830,7 +830,9 @@
             pWDS = new VkWriteDescriptorSet;
             *pNewNode = (GENERIC_HEADER*)pWDS;
             memcpy(pWDS, pUpdate, sizeof(VkWriteDescriptorSet));
-            pWDS->pDescriptors = new VkDescriptorInfo[pWDS->count];
+            /* TODO: restore new once constructors have been removed from vulkan.h */
+//            pWDS->pDescriptors = new VkDescriptorInfo[pWDS->count];
+            pWDS->pDescriptors = (VkDescriptorInfo *) malloc(sizeof(VkDescriptorInfo) * pWDS->count);
             array_size = sizeof(VkDescriptorInfo) * pWDS->count;
             memcpy((void*)pWDS->pDescriptors, ((VkWriteDescriptorSet*)pUpdate)->pDescriptors, array_size);
             break;
@@ -858,12 +860,12 @@
     for (uint32_t i = 0; i < writeDsCount; i++) {
         for (uint32_t j = 0; j < pWDS[i].count; j++) {
             const VkDescriptorInfo *dInfo = &pWDS[i].pDescriptors[j];
-            auto imageViewItem = dev_data->imageViewMap.find(dInfo->imageView.handle);
+            auto imageViewItem = dev_data->imageViewMap.find(dInfo->imageInfo.imageView.handle);
             if (imageViewItem != dev_data->imageViewMap.end()) {
                 VkImageAspectFlags flags = ((*imageViewItem).second)->subresourceRange.aspectMask;
                 if ((flags & VK_IMAGE_ASPECT_DEPTH_BIT) &&
                     (flags & VK_IMAGE_ASPECT_STENCIL_BIT)) {
-                    skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, dInfo->imageView.handle, 0,
+                    skipCall |= log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, dInfo->imageInfo.imageView.handle, 0,
                         DRAWSTATE_INVALID_IMAGE_ASPECT, "DS", "vkUpdateDescriptorSets: DesriptorSet[%d] in WriteDesriptorSet[%d] "
                         "has ImageView with both STENCIL and DEPTH aspects set", j, i);
                 }
@@ -1015,8 +1017,10 @@
         {
             case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
                 pWDS = (VkWriteDescriptorSet*)pFreeUpdate;
-                if (pWDS->pDescriptors)
-                    delete[] pWDS->pDescriptors;
+                if (pWDS->pDescriptors) {
+//                    delete[] pWDS->pDescriptors;
+                    free((void *) pWDS->pDescriptors);
+                }
                 break;
             case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
                 break;
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 989a6bd..618e0fc 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -4806,8 +4806,8 @@
     }
     if(pDescriptorWrites->pDescriptors != nullptr)
     {
-    if(pDescriptorWrites->pDescriptors->imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE ||
-        pDescriptorWrites->pDescriptors->imageLayout > VK_IMAGE_LAYOUT_END_RANGE)
+    if(pDescriptorWrites->pDescriptors->imageInfo.imageLayout < VK_IMAGE_LAYOUT_BEGIN_RANGE ||
+        pDescriptorWrites->pDescriptors->imageInfo.imageLayout > VK_IMAGE_LAYOUT_END_RANGE)
     {
         log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, 1, "PARAMCHECK",
         "vkUpdateDescriptorSets parameter, VkImageLayout pDescriptorWrites->pDescriptors->imageLayout, is an unrecognized enumerator");
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index ad7700b..3863611 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -2796,7 +2796,7 @@
 
     VkDescriptorInfo descriptor_info;
     memset(&descriptor_info, 0, sizeof(descriptor_info));
-    descriptor_info.sampler = sampler;
+    descriptor_info.imageInfo.sampler = sampler;
 
     VkWriteDescriptorSet descriptor_write;
     memset(&descriptor_write, 0, sizeof(descriptor_write));
@@ -2890,7 +2890,7 @@
 
     VkDescriptorInfo descriptor_info;
     memset(&descriptor_info, 0, sizeof(descriptor_info));
-    descriptor_info.sampler = sampler;
+    descriptor_info.imageInfo.sampler = sampler;
 
     VkWriteDescriptorSet descriptor_write;
     memset(&descriptor_write, 0, sizeof(descriptor_write));
@@ -2984,7 +2984,7 @@
 
     VkDescriptorInfo descriptor_info;
     memset(&descriptor_info, 0, sizeof(descriptor_info));
-    descriptor_info.sampler = sampler;
+    descriptor_info.imageInfo.sampler = sampler;
 
     VkWriteDescriptorSet descriptor_write;
     memset(&descriptor_write, 0, sizeof(descriptor_write));
@@ -3079,7 +3079,7 @@
 
     VkDescriptorInfo descriptor_info;
     memset(&descriptor_info, 0, sizeof(descriptor_info));
-    descriptor_info.sampler = sampler;
+    descriptor_info.imageInfo.sampler = sampler;
 
     VkWriteDescriptorSet descriptor_write;
     memset(&descriptor_write, 0, sizeof(descriptor_write));
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 2876d45..aa29ab1 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -475,7 +475,7 @@
     m_type_counts.push_back(tc);
 
     VkDescriptorInfo tmp = texture->m_descriptorInfo;
-    tmp.sampler = sampler->handle();
+    tmp.imageInfo.sampler = sampler->handle();
     m_imageSamplerDescriptors.push_back(tmp);
 
     m_writes.push_back(vk_testing::Device::write_descriptor_set(vk_testing::DescriptorSet(),
@@ -552,8 +552,8 @@
 VkImageObj::VkImageObj(VkDeviceObj *dev)
 {
     m_device = dev;
-    m_descriptorInfo.imageView = VK_NULL_HANDLE;
-    m_descriptorInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+    m_descriptorInfo.imageInfo.imageView = VK_NULL_HANDLE;
+    m_descriptorInfo.imageInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
 }
 
 void VkImageObj::ImageMemoryBarrier(
@@ -613,7 +613,7 @@
             VK_MEMORY_INPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
             VK_MEMORY_INPUT_TRANSFER_BIT;
 
-    if (image_layout == m_descriptorInfo.imageLayout) {
+    if (image_layout == m_descriptorInfo.imageInfo.imageLayout) {
         return;
     }
 
@@ -640,7 +640,7 @@
     }
 
     ImageMemoryBarrier(cmd_buf, aspect, output_mask, input_mask, image_layout);
-    m_descriptorInfo.imageLayout = image_layout;
+    m_descriptorInfo.imageInfo.imageLayout = image_layout;
 }
 
 void VkImageObj::SetLayout(VkImageAspectFlagBits aspect,
@@ -648,7 +648,7 @@
 {
     VkResult U_ASSERT_ONLY err;
 
-    if (image_layout == m_descriptorInfo.imageLayout) {
+    if (image_layout == m_descriptorInfo.imageInfo.imageLayout) {
         return;
     }
 
@@ -835,7 +835,7 @@
     /* create image view */
     view.image = handle();
     m_textureView.init(*m_device, view);
-    m_descriptorInfo.imageView = m_textureView.handle();
+    m_descriptorInfo.imageInfo.imageView = m_textureView.handle();
 
     data = stagingImage.MapMemory();
 
@@ -1011,23 +1011,18 @@
 
 void VkIndexBufferObj::CreateAndInitBuffer(int numIndexes, VkIndexType indexType, const void* data)
 {
-    VkFormat viewFormat;
-
     m_numVertices = numIndexes;
     m_indexType = indexType;
     switch (indexType) {
     case VK_INDEX_TYPE_UINT16:
         m_stride = 2;
-        viewFormat = VK_FORMAT_R16_UINT;
         break;
     case VK_INDEX_TYPE_UINT32:
         m_stride = 4;
-        viewFormat = VK_FORMAT_R32_UINT;
         break;
     default:
         assert(!"unknown index type");
         m_stride = 2;
-        viewFormat = VK_FORMAT_R16_UINT;
         break;
     }
 
@@ -1039,16 +1034,10 @@
     memcpy(pData, data, allocationSize);
     memory().unmap();
 
-    // set up the buffer view for the constant buffer
-    VkBufferViewCreateInfo view_info = {};
-    view_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
-    view_info.buffer = handle();
-    view_info.format = viewFormat;
-    view_info.offset = 0;
-    view_info.range  = allocationSize;
-    m_bufferView.init(*m_device, view_info);
-
-    this->m_descriptorInfo.bufferView = m_bufferView.handle();
+    // set up the descriptor for the constant buffer
+    this->m_descriptorInfo.bufferInfo.buffer = handle();
+    this->m_descriptorInfo.bufferInfo.offset = 0;
+    this->m_descriptorInfo.bufferInfo.range = allocationSize;
 }
 
 void VkIndexBufferObj::Bind(VkCmdBuffer cmdBuffer, VkDeviceSize offset)
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index c6914a2..24f4071 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -273,7 +273,7 @@
 
     void layout( VkImageLayout layout )
     {
-        m_descriptorInfo.imageLayout = layout;
+        m_descriptorInfo.imageInfo.imageLayout = layout;
     }
 
     VkDeviceMemory memory() const
@@ -329,7 +329,7 @@
 
     VkImageLayout layout() const
     {
-        return m_descriptorInfo.imageLayout;
+        return m_descriptorInfo.imageInfo.imageLayout;
     }
     uint32_t width() const
     {