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
{