Merge vk-gl-cts/vulkan-cts-1.1.3 into vk-gl-cts/vulkan-cts-1.1.4

Change-Id: Iea26f0e9f9c0d8b69d99fa4b0763269f420858df
diff --git a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
index 2cc3840..f766a59 100644
--- a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
+++ b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
@@ -84,6 +84,12 @@
 	STAGE_FRAGMENT,
 } Stage;
 
+typedef enum
+{
+	UPDATE_AFTER_BIND_DISABLED = 0,
+	UPDATE_AFTER_BIND_ENABLED,
+} UpdateAfterBind;
+
 const VkFlags allShaderStages = VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
 const VkFlags allPipelineStages = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
 
@@ -100,6 +106,7 @@
 	deUint32 maxInlineUniformBlocks;
 	deUint32 maxInlineUniformBlockSize;
 	Stage stage;
+	UpdateAfterBind uab;
 	deUint32 seed;
 };
 
@@ -333,6 +340,9 @@
 		arraySizes = vector<deUint32>(numBindings);
 	}
 
+	// BUFFER_DYNAMIC descriptor types cannot be used with VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT bindings in one set
+	bool allowDynamicBuffers = caseDef.uab != UPDATE_AFTER_BIND_ENABLED;
+
 	// Iterate over bindings first, then over sets. This prevents the low-limit bindings
 	// from getting clustered in low-numbered sets.
 	for (deUint32 b = 0; b <= maxBindings; ++b)
@@ -365,7 +375,7 @@
 			binding.descriptorCount = 0;
 
 			// Select a random type of descriptor.
-			int r = randRange(&rnd, 0, 6);
+			int r = randRange(&rnd, 0, (allowDynamicBuffers ? 6 : 4));
 			switch (r)
 			{
 			default: DE_ASSERT(0); // Fallthrough
@@ -379,18 +389,6 @@
 				}
 				break;
 			case 1:
-				binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
-				if (numUBODyn < caseDef.maxUniformBuffersDynamic &&
-					numUBO < caseDef.maxPerStageUniformBuffers)
-				{
-					arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, de::min(caseDef.maxUniformBuffersDynamic - numUBODyn,
-																				 caseDef.maxPerStageUniformBuffers - numUBO)));
-					binding.descriptorCount = arraySizes[b] ? arraySizes[b] : 1;
-					numUBO += binding.descriptorCount;
-					numUBODyn += binding.descriptorCount;
-				}
-				break;
-			case 2:
 				binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
 				if (numSSBO < caseDef.maxPerStageStorageBuffers)
 				{
@@ -399,19 +397,7 @@
 					numSSBO += binding.descriptorCount;
 				}
 				break;
-			case 3:
-				binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
-				if (numSSBODyn < caseDef.maxStorageBuffersDynamic &&
-					numSSBO < caseDef.maxPerStageStorageBuffers)
-				{
-					arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, de::min(caseDef.maxStorageBuffersDynamic - numSSBODyn,
-																				 caseDef.maxPerStageStorageBuffers - numSSBO)));
-					binding.descriptorCount = arraySizes[b] ? arraySizes[b] : 1;
-					numSSBO += binding.descriptorCount;
-					numSSBODyn += binding.descriptorCount;
-				}
-				break;
-			case 4:
+			case 2:
 				binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
 				if (numImage < caseDef.maxPerStageStorageImages)
 				{
@@ -420,7 +406,7 @@
 					numImage += binding.descriptorCount;
 				}
 				break;
-			case 5:
+			case 3:
 				binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
 				if (numTexBuffer < caseDef.maxPerStageSampledImages)
 				{
@@ -429,7 +415,7 @@
 					numTexBuffer += binding.descriptorCount;
 				}
 				break;
-			case 6:
+			case 4:
 				if (caseDef.maxInlineUniformBlocks > 0)
 				{
 					binding.descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
@@ -448,6 +434,30 @@
 					binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
 				}
 				break;
+			case 5:
+				binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+				if (numUBODyn < caseDef.maxUniformBuffersDynamic &&
+					numUBO < caseDef.maxPerStageUniformBuffers)
+				{
+					arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, de::min(caseDef.maxUniformBuffersDynamic - numUBODyn,
+																				 caseDef.maxPerStageUniformBuffers - numUBO)));
+					binding.descriptorCount = arraySizes[b] ? arraySizes[b] : 1;
+					numUBO += binding.descriptorCount;
+					numUBODyn += binding.descriptorCount;
+				}
+				break;
+			case 6:
+				binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
+				if (numSSBODyn < caseDef.maxStorageBuffersDynamic &&
+					numSSBO < caseDef.maxPerStageStorageBuffers)
+				{
+					arraySizes[b] = randRange(&rnd, 0, de::min(maxArray, de::min(caseDef.maxStorageBuffersDynamic - numSSBODyn,
+																				 caseDef.maxPerStageStorageBuffers - numSSBO)));
+					binding.descriptorCount = arraySizes[b] ? arraySizes[b] : 1;
+					numSSBO += binding.descriptorCount;
+					numSSBODyn += binding.descriptorCount;
+				}
+				break;
 			}
 		}
 	}
@@ -547,10 +557,20 @@
 					// Don't access descriptors past the end of the allocated range for
 					// variable descriptor count
 					if (b == bindings.size() - 1 &&
-						(bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT) &&
-						ai >= variableDescriptorSizes[s])
+						(bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT))
 					{
-						continue;
+						if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
+						{
+							// Convert to bytes and add 16 for "ivec4 dummy" in case of inline uniform block
+							const deUint32 uboRange = ai*16 + 16;
+							if (uboRange >= variableDescriptorSizes[s])
+								continue;
+						}
+						else
+						{
+							if (ai >= variableDescriptorSizes[s])
+								continue;
+						}
 					}
 
 					if (s == 0 && b == 0)
@@ -865,7 +885,8 @@
 			numDescriptors += binding.descriptorCount;
 
 			// Randomly choose some bindings to use update-after-bind, if it is supported
-			if (randRange(&rnd, 1, 8) == 1 && // 1 in 8 chance
+			if (m_data.uab == UPDATE_AFTER_BIND_ENABLED &&
+				randRange(&rnd, 1, 8) == 1 && // 1 in 8 chance
 				(binding.descriptorType != VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER			|| indexingFeatures.descriptorBindingUniformBufferUpdateAfterBind) &&
 				(binding.descriptorType != VK_DESCRIPTOR_TYPE_STORAGE_IMAGE				|| indexingFeatures.descriptorBindingStorageImageUpdateAfterBind) &&
 				(binding.descriptorType != VK_DESCRIPTOR_TYPE_STORAGE_BUFFER			|| indexingFeatures.descriptorBindingStorageBufferUpdateAfterBind) &&
@@ -1160,10 +1181,20 @@
 					// Don't access descriptors past the end of the allocated range for
 					// variable descriptor count
 					if (b == bindings.size() - 1 &&
-						(bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT) &&
-						ai >= variableDescriptorSizes[s])
+						(bindingsFlags[b] & VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT))
 					{
-						continue;
+						if (binding.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT)
+						{
+							// Convert to bytes and add 16 for "ivec4 dummy" in case of inline uniform block
+							const deUint32 uboRange = ai*16 + 16;
+							if (uboRange >= variableDescriptorSizes[s])
+								continue;
+						}
+						else
+						{
+							if (ai >= variableDescriptorSizes[s])
+								continue;
+						}
 					}
 
 					// output image
@@ -1723,6 +1754,11 @@
 		{ STAGE_VERTEX,		"vert",		"vertex"	},
 	};
 
+	TestGroupCase uabCases[] =
+	{
+		{ UPDATE_AFTER_BIND_DISABLED,	"nouab",	"no update after bind"		},
+	};
+
 	for (int setsNdx = 0; setsNdx < DE_LENGTH_OF_ARRAY(setsCases); setsNdx++)
 	{
 		de::MovePtr<tcu::TestCaseGroup> setsGroup(new tcu::TestCaseGroup(testCtx, setsCases[setsNdx].name, setsCases[setsNdx].description));
@@ -1741,32 +1777,42 @@
 						for (int iubNdx = 0; iubNdx < DE_LENGTH_OF_ARRAY(iubCases); iubNdx++)
 						{
 							de::MovePtr<tcu::TestCaseGroup> iubGroup(new tcu::TestCaseGroup(testCtx, iubCases[iubNdx].name, iubCases[iubNdx].description));
-							for (int stageNdx = 0; stageNdx < DE_LENGTH_OF_ARRAY(stageCases); stageNdx++)
+							for (int uabNdx = 0; uabNdx < DE_LENGTH_OF_ARRAY(uabCases); uabNdx++)
 							{
-								de::MovePtr<tcu::TestCaseGroup> stageGroup(new tcu::TestCaseGroup(testCtx, stageCases[stageNdx].name, stageCases[stageNdx].description));
-								deUint32 numSeeds = (setsCases[setsNdx].count == 4 && uboNdx == 0 && sboNdx == 0 && imgNdx == 0 && iubNdx == 0) ? 10 : 1;
-								for (deUint32 rnd = 0; rnd < numSeeds; ++rnd)
+								de::MovePtr<tcu::TestCaseGroup> uabGroup(new tcu::TestCaseGroup(testCtx, uabCases[uabNdx].name, uabCases[uabNdx].description));
+								bool updateAfterBind = (UpdateAfterBind)uabCases[uabNdx].count == UPDATE_AFTER_BIND_ENABLED;
+								for (int stageNdx = 0; stageNdx < DE_LENGTH_OF_ARRAY(stageCases); stageNdx++)
 								{
-									CaseDef c =
+									de::MovePtr<tcu::TestCaseGroup> stageGroup(new tcu::TestCaseGroup(testCtx, stageCases[stageNdx].name, stageCases[stageNdx].description));
+									deUint32 numSeeds = (setsCases[setsNdx].count == 4 && uboNdx == 0 && sboNdx == 0 && imgNdx == 0 && iubNdx == 0) ? 10 : 1;
+									for (deUint32 rnd = 0; rnd < numSeeds; ++rnd)
 									{
-										(IndexType)indexCases[indexNdx].count,		// IndexType indexType;
-										setsCases[setsNdx].count,					// deUint32 numDescriptorSets;
-										uboCases[uboNdx].count,						// deUint32 maxPerStageUniformBuffers;
-										8,											// deUint32 maxUniformBuffersDynamic;
-										sboCases[sboNdx].count,						// deUint32 maxPerStageStorageBuffers;
-										4,											// deUint32 maxStorageBuffersDynamic;
-										imgCases[imgNdx].texCount,					// deUint32 maxPerStageSampledImages;
-										imgCases[imgNdx].imgCount,					// deUint32 maxPerStageStorageImages;
-										iubCases[iubNdx].iubCount,					// deUint32 maxInlineUniformBlocks;
-										iubCases[iubNdx].iubSize,					// deUint32 maxInlineUniformBlockSize;
-										(Stage)stageCases[stageNdx].count,			// Stage stage;
-										seed++,										// deUint32 seed;
-									};
+										CaseDef c =
+										{
+											(IndexType)indexCases[indexNdx].count,							// IndexType indexType;
+											setsCases[setsNdx].count,										// deUint32 numDescriptorSets;
+											uboCases[uboNdx].count,											// deUint32 maxPerStageUniformBuffers;
+											8,																// deUint32 maxUniformBuffersDynamic;
+											sboCases[sboNdx].count,											// deUint32 maxPerStageStorageBuffers;
+											4,																// deUint32 maxStorageBuffersDynamic;
+											imgCases[imgNdx].texCount,										// deUint32 maxPerStageSampledImages;
+											imgCases[imgNdx].imgCount,										// deUint32 maxPerStageStorageImages;
+											iubCases[iubNdx].iubCount,										// deUint32 maxInlineUniformBlocks;
+											iubCases[iubNdx].iubSize,										// deUint32 maxInlineUniformBlockSize;
+											(Stage)stageCases[stageNdx].count,								// Stage stage;
+											(UpdateAfterBind)uabCases[uabNdx].count,						// UpdateAfterBind uab;
+											seed++,															// deUint32 seed;
+										};
 
-									string name = de::toString(rnd);
-									stageGroup->addChild(new DescriptorSetRandomTestCase(testCtx, name.c_str(), "test", c));
+										string name = de::toString(rnd);
+										stageGroup->addChild(new DescriptorSetRandomTestCase(testCtx, name.c_str(), "test", c));
+									}
+									(updateAfterBind ? uabGroup : iubGroup)->addChild(stageGroup.release());
 								}
-								iubGroup->addChild(stageGroup.release());
+								if (updateAfterBind)
+								{
+									iubGroup->addChild(uabGroup.release());
+								}
 							}
 							imgGroup->addChild(iubGroup.release());
 						}