layers: Workaround for AMD + Windows driver
Avoid setting queueFamilyIndexCount when sharing mode is
VK_SHARING_MODE_EXCLUSIVE to avoid crashing on Windows AMD drivers.
Closes #3466.
diff --git a/layers/generated/vk_safe_struct.cpp b/layers/generated/vk_safe_struct.cpp
index 1061078..3533b65 100644
--- a/layers/generated/vk_safe_struct.cpp
+++ b/layers/generated/vk_safe_struct.cpp
@@ -1950,13 +1950,16 @@
size(in_struct->size),
usage(in_struct->usage),
sharingMode(in_struct->sharingMode),
- queueFamilyIndexCount(in_struct->queueFamilyIndexCount),
+ queueFamilyIndexCount(0),
pQueueFamilyIndices(nullptr)
{
pNext = SafePnextCopy(in_struct->pNext);
if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -1973,12 +1976,14 @@
size = copy_src.size;
usage = copy_src.usage;
sharingMode = copy_src.sharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -1996,12 +2001,14 @@
size = copy_src.size;
usage = copy_src.usage;
sharingMode = copy_src.sharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
return *this;
@@ -2022,12 +2029,14 @@
size = in_struct->size;
usage = in_struct->usage;
sharingMode = in_struct->sharingMode;
- queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(in_struct->pNext);
if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -2038,12 +2047,14 @@
size = copy_src->size;
usage = copy_src->usage;
sharingMode = copy_src->sharingMode;
- queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src->pNext);
if ((copy_src->sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -2132,7 +2143,7 @@
tiling(in_struct->tiling),
usage(in_struct->usage),
sharingMode(in_struct->sharingMode),
- queueFamilyIndexCount(in_struct->queueFamilyIndexCount),
+ queueFamilyIndexCount(0),
pQueueFamilyIndices(nullptr),
initialLayout(in_struct->initialLayout)
{
@@ -2140,6 +2151,9 @@
if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -2162,13 +2176,15 @@
tiling = copy_src.tiling;
usage = copy_src.usage;
sharingMode = copy_src.sharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
initialLayout = copy_src.initialLayout;
pNext = SafePnextCopy(copy_src.pNext);
if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -2192,13 +2208,15 @@
tiling = copy_src.tiling;
usage = copy_src.usage;
sharingMode = copy_src.sharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
initialLayout = copy_src.initialLayout;
pNext = SafePnextCopy(copy_src.pNext);
if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
return *this;
@@ -2225,13 +2243,15 @@
tiling = in_struct->tiling;
usage = in_struct->usage;
sharingMode = in_struct->sharingMode;
- queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
initialLayout = in_struct->initialLayout;
pNext = SafePnextCopy(in_struct->pNext);
if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -2248,13 +2268,15 @@
tiling = copy_src->tiling;
usage = copy_src->usage;
sharingMode = copy_src->sharingMode;
- queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
initialLayout = copy_src->initialLayout;
pNext = SafePnextCopy(copy_src->pNext);
if ((copy_src->sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -14696,7 +14718,7 @@
imageArrayLayers(in_struct->imageArrayLayers),
imageUsage(in_struct->imageUsage),
imageSharingMode(in_struct->imageSharingMode),
- queueFamilyIndexCount(in_struct->queueFamilyIndexCount),
+ queueFamilyIndexCount(0),
pQueueFamilyIndices(nullptr),
preTransform(in_struct->preTransform),
compositeAlpha(in_struct->compositeAlpha),
@@ -14708,6 +14730,9 @@
if ((in_struct->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -14729,7 +14754,6 @@
imageArrayLayers = copy_src.imageArrayLayers;
imageUsage = copy_src.imageUsage;
imageSharingMode = copy_src.imageSharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
preTransform = copy_src.preTransform;
compositeAlpha = copy_src.compositeAlpha;
@@ -14740,6 +14764,9 @@
if ((copy_src.imageSharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -14762,7 +14789,6 @@
imageArrayLayers = copy_src.imageArrayLayers;
imageUsage = copy_src.imageUsage;
imageSharingMode = copy_src.imageSharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
preTransform = copy_src.preTransform;
compositeAlpha = copy_src.compositeAlpha;
@@ -14773,6 +14799,9 @@
if ((copy_src.imageSharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
return *this;
@@ -14798,7 +14827,6 @@
imageArrayLayers = in_struct->imageArrayLayers;
imageUsage = in_struct->imageUsage;
imageSharingMode = in_struct->imageSharingMode;
- queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
preTransform = in_struct->preTransform;
compositeAlpha = in_struct->compositeAlpha;
@@ -14809,6 +14837,9 @@
if ((in_struct->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -14824,7 +14855,6 @@
imageArrayLayers = copy_src->imageArrayLayers;
imageUsage = copy_src->imageUsage;
imageSharingMode = copy_src->imageSharingMode;
- queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
preTransform = copy_src->preTransform;
compositeAlpha = copy_src->compositeAlpha;
@@ -14835,6 +14865,9 @@
if ((copy_src->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -32409,13 +32442,16 @@
sType(in_struct->sType),
drmFormatModifier(in_struct->drmFormatModifier),
sharingMode(in_struct->sharingMode),
- queueFamilyIndexCount(in_struct->queueFamilyIndexCount),
+ queueFamilyIndexCount(0),
pQueueFamilyIndices(nullptr)
{
pNext = SafePnextCopy(in_struct->pNext);
if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -32430,12 +32466,14 @@
sType = copy_src.sType;
drmFormatModifier = copy_src.drmFormatModifier;
sharingMode = copy_src.sharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -32451,12 +32489,14 @@
sType = copy_src.sType;
drmFormatModifier = copy_src.drmFormatModifier;
sharingMode = copy_src.sharingMode;
- queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
return *this;
@@ -32475,12 +32515,14 @@
sType = in_struct->sType;
drmFormatModifier = in_struct->drmFormatModifier;
sharingMode = in_struct->sharingMode;
- queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(in_struct->pNext);
if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
+ queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
@@ -32489,12 +32531,14 @@
sType = copy_src->sType;
drmFormatModifier = copy_src->drmFormatModifier;
sharingMode = copy_src->sharingMode;
- queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src->pNext);
if ((copy_src->sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
+ queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
+ } else {
+ queueFamilyIndexCount = 0;
}
}
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index c1a313d..55cf3f5 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -1381,6 +1381,24 @@
'VkMetalSurfaceCreateInfoEXT'
]
+ member_init_transforms = {
+ 'queueFamilyIndexCount': lambda m: f'{m.name}(0)'
+ }
+
+ def qfi_construct(item, member):
+ true_index_setter = lambda i: f'{i}queueFamilyIndexCount = in_struct->queueFamilyIndexCount;\n'
+ false_index_setter = lambda i: f'{i}queueFamilyIndexCount = 0;\n'
+ if item.name == 'VkSwapchainCreateInfoKHR':
+ return (f'(in_struct->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->{member.name}', true_index_setter, false_index_setter)
+ else:
+ return (f'(in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->{member.name}', true_index_setter, false_index_setter)
+
+ # map of:
+ # <member name>: function(item, member) -> (condition, true statement, false statement)
+ member_construct_conditions = {
+ 'pQueueFamilyIndices': qfi_construct
+ }
+
# For abstract types just want to save the pointer away
# since we cannot make a copy.
abstract_types = ['AHardwareBuffer',
@@ -1730,15 +1748,17 @@
decorated_length = member.len
for other_member in item.members:
decorated_length = re.sub(r'\b({})\b'.format(other_member.name), r'in_struct->\1', decorated_length)
- concurrent_clause = ''
- sharing_mode_name = 's'
- if member.name == 'pQueueFamilyIndices':
- if item.name == 'VkSwapchainCreateInfoKHR':
- sharing_mode_name = 'imageS'
- concurrent_clause = '(in_struct->%sharingMode == VK_SHARING_MODE_CONCURRENT) && ' % sharing_mode_name
- construct_txt += ' if (%sin_struct->%s) {\n' % (concurrent_clause, member.name)
+ try:
+ concurrent_clause = member_construct_conditions[member.name](item, member)
+ except:
+ concurrent_clause = (f'in_struct->{member.name}', lambda x: '')
+ construct_txt += f' if ({concurrent_clause[0]}) {{' + '\n'
construct_txt += ' %s = new %s[%s];\n' % (member.name, m_type, decorated_length)
construct_txt += ' memcpy ((void *)%s, (void *)in_struct->%s, sizeof(%s)*%s);\n' % (member.name, member.name, m_type, decorated_length)
+ construct_txt += concurrent_clause[1](' ')
+ if len(concurrent_clause) > 2:
+ construct_txt += ' } else {\n'
+ construct_txt += concurrent_clause[2](' ')
construct_txt += ' }\n'
destruct_txt += ' if (%s)\n' % member.name
destruct_txt += ' delete[] %s;\n' % member.name
@@ -1782,8 +1802,11 @@
init_list += '\n %s(&in_struct->%s),' % (member.name, member.name)
init_func_txt += ' %s.initialize(&in_struct->%s);\n' % (member.name, member.name)
else:
- init_list += '\n %s(in_struct->%s),' % (member.name, member.name)
- init_func_txt += ' %s = in_struct->%s;\n' % (member.name, member.name)
+ try:
+ init_list += f'\n {member_init_transforms[member.name](member)},'
+ except:
+ init_list += '\n %s(in_struct->%s),' % (member.name, member.name)
+ init_func_txt += ' %s = in_struct->%s;\n' % (member.name, member.name)
if '' != init_list:
init_list = init_list[:-1] # hack off final comma