Reduce complexity of some random cases
This change adds a complexity heuristics to some random cases and
reduces the final nested array size to avoid complexity explosion.
In practice only 18 test cases out of 1576 are affected.
Affects:
dEQP-VK.ubo.random.*
Components: Vulkan
VK-GL-CTS issue: 3389
Change-Id: If108ce2f04272b7bae9799daffa3682d1fb3aa52
diff --git a/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.cpp b/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.cpp
index d4b080b..f93ba6c 100644
--- a/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.cpp
+++ b/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.cpp
@@ -158,19 +158,19 @@
block.setFlags(layoutFlags);
for (int ndx = 0; ndx < numUniforms; ndx++)
- generateUniform(rnd, block);
+ generateUniform(rnd, block, numInstances ? numInstances : 1);
m_blockNdx += 1;
}
-void RandomUniformBlockCase::generateUniform (de::Random& rnd, UniformBlock& block)
+void RandomUniformBlockCase::generateUniform (de::Random& rnd, UniformBlock& block, deUint32 complexity)
{
const float unusedVtxWeight = 0.15f;
const float unusedFragWeight = 0.15f;
bool unusedOk = (m_features & FEATURE_UNUSED_UNIFORMS) != 0;
deUint32 flags = 0;
std::string name = genName('a', 'z', m_uniformNdx);
- VarType type = generateType(rnd, 0, true);
+ VarType type = generateType(rnd, 0, true, complexity);
flags |= (unusedOk && rnd.getFloat() < unusedVtxWeight) ? UNUSED_VERTEX : 0;
flags |= (unusedOk && rnd.getFloat() < unusedFragWeight) ? UNUSED_FRAGMENT : 0;
@@ -180,7 +180,7 @@
m_uniformNdx += 1;
}
-VarType RandomUniformBlockCase::generateType (de::Random& rnd, int typeDepth, bool arrayOk)
+VarType RandomUniformBlockCase::generateType (de::Random& rnd, int typeDepth, bool arrayOk, deUint32 complexity)
{
const float structWeight = 0.1f;
const float arrayWeight = 0.1f;
@@ -195,7 +195,7 @@
// Generate members first so nested struct declarations are in correct order.
for (int ndx = 0; ndx < numMembers; ndx++)
- memberTypes.push_back(generateType(rnd, typeDepth+1, true));
+ memberTypes.push_back(generateType(rnd, typeDepth+1, true, complexity));
StructType& structType = m_interface.allocStruct(std::string("s") + genName('A', 'Z', m_structNdx));
m_structNdx += 1;
@@ -216,8 +216,15 @@
else if (m_maxArrayLength > 0 && arrayOk && rnd.getFloat() < arrayWeight)
{
const bool arraysOfArraysOk = (m_features & FEATURE_ARRAYS_OF_ARRAYS) != 0;
- const int arrayLength = rnd.getInt(1, m_maxArrayLength);
- VarType elementType = generateType(rnd, typeDepth, arraysOfArraysOk);
+ int arrayLength = rnd.getInt(1, m_maxArrayLength);
+
+ if (complexity * arrayLength >= 70)
+ {
+ // Trim overly complicated cases (affects 18 cases out of 1576)
+ arrayLength = 1;
+ }
+
+ VarType elementType = generateType(rnd, typeDepth, arraysOfArraysOk, complexity * arrayLength);
return VarType(elementType, arrayLength);
}
else
diff --git a/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.hpp b/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.hpp
index 6ecc730..c4a2705 100644
--- a/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.hpp
+++ b/external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.hpp
@@ -74,8 +74,8 @@
private:
void generateBlock (de::Random& rnd, deUint32 layoutFlags);
- void generateUniform (de::Random& rnd, UniformBlock& block);
- VarType generateType (de::Random& rnd, int typeDepth, bool arrayOk);
+ void generateUniform (de::Random& rnd, UniformBlock& block, deUint32 complexity);
+ VarType generateType (de::Random& rnd, int typeDepth, bool arrayOk, deUint32 complexity);
const deUint32 m_features;
const int m_maxVertexBlocks;