1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 Google Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Object management tests
22 *//*--------------------------------------------------------------------*/
24 #include "vktApiObjectManagementTests.hpp"
25 #include "vktTestCaseUtil.hpp"
29 #include "vkRefUtil.hpp"
30 #include "vkQueryUtil.hpp"
31 #include "vkMemUtil.hpp"
32 #include "vkPrograms.hpp"
33 #include "vkTypeUtil.hpp"
34 #include "vkPlatform.hpp"
35 #include "vkStrUtil.hpp"
36 #include "vkAllocationCallbackUtil.hpp"
38 #include "tcuVector.hpp"
39 #include "tcuResultCollector.hpp"
40 #include "tcuCommandLine.hpp"
41 #include "tcuTestLog.hpp"
42 #include "tcuPlatform.hpp"
44 #include "deUniquePtr.hpp"
45 #include "deSharedPtr.hpp"
46 #include "deArrayUtil.hpp"
47 #include "deSpinBarrier.hpp"
48 #include "deThread.hpp"
69 using tcu::ResultCollector;
70 using tcu::TestStatus;
76 typedef SharedPtr<Move<VkPipeline> > VkPipelineSp; // Move so it's possible to disown the handle
77 typedef SharedPtr<Move<VkDescriptorSet> > VkDescriptorSetSp;
78 typedef SharedPtr<Move<VkCommandBuffer> > VkCommandBufferSp;
80 class ThreadGroupThread;
82 /*--------------------------------------------------------------------*//*!
85 * Thread group manages collection of threads that are expected to be
86 * launched simultaneously as a group.
88 * Shared barrier is provided for synchronizing execution. Terminating thread
89 * early either by returning from ThreadGroupThread::runThread() or throwing
90 * an exception is safe, and other threads will continue execution. The
91 * thread that has been terminated is simply removed from the synchronization
94 * TestException-based exceptions are collected and translated into a
95 * tcu::TestStatus by using tcu::ResultCollector.
97 * Use cases for ThreadGroup include for example testing thread-safety of
98 * certain API operations by poking API simultaneously from multiple
100 *//*--------------------------------------------------------------------*/
107 void add (de::MovePtr<ThreadGroupThread> thread);
108 TestStatus run (void);
111 typedef std::vector<de::SharedPtr<ThreadGroupThread> > ThreadVector;
113 ThreadVector m_threads;
114 de::SpinBarrier m_barrier;
115 } DE_WARN_UNUSED_TYPE;
117 class ThreadGroupThread : private de::Thread
120 ThreadGroupThread (void);
121 virtual ~ThreadGroupThread (void);
123 void start (de::SpinBarrier* groupBarrier);
125 ResultCollector& getResultCollector (void) { return m_resultCollector; }
127 using de::Thread::join;
130 virtual void runThread (void) = 0;
135 ThreadGroupThread (const ThreadGroupThread&);
136 ThreadGroupThread& operator= (const ThreadGroupThread&);
140 ResultCollector m_resultCollector;
141 de::SpinBarrier* m_barrier;
146 ThreadGroup::ThreadGroup (void)
151 ThreadGroup::~ThreadGroup (void)
155 void ThreadGroup::add (de::MovePtr<ThreadGroupThread> thread)
157 m_threads.push_back(de::SharedPtr<ThreadGroupThread>(thread.release()));
160 tcu::TestStatus ThreadGroup::run (void)
162 tcu::ResultCollector resultCollector;
164 m_barrier.reset((int)m_threads.size());
166 for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter)
167 (*threadIter)->start(&m_barrier);
169 for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter)
171 tcu::ResultCollector& threadResult = (*threadIter)->getResultCollector();
172 (*threadIter)->join();
173 resultCollector.addResult(threadResult.getResult(), threadResult.getMessage());
176 return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
181 ThreadGroupThread::ThreadGroupThread (void)
186 ThreadGroupThread::~ThreadGroupThread (void)
190 void ThreadGroupThread::start (de::SpinBarrier* groupBarrier)
192 m_barrier = groupBarrier;
196 void ThreadGroupThread::run (void)
202 catch (const tcu::TestException& e)
204 getResultCollector().addResult(e.getTestResult(), e.getMessage());
206 catch (const std::exception& e)
208 getResultCollector().addResult(QP_TEST_RESULT_FAIL, e.what());
212 getResultCollector().addResult(QP_TEST_RESULT_FAIL, "Exception");
215 m_barrier->removeThread(de::SpinBarrier::WAIT_MODE_AUTO);
218 inline void ThreadGroupThread::barrier (void)
220 m_barrier->sync(de::SpinBarrier::WAIT_MODE_AUTO);
223 deUint32 getDefaultTestThreadCount (void)
225 return de::clamp(deGetNumAvailableLogicalCores(), 2u, 8u);
232 const PlatformInterface& vkp;
233 const DeviceInterface& vkd;
235 deUint32 queueFamilyIndex;
236 const BinaryCollection& programBinaries;
237 const VkAllocationCallbacks* allocationCallbacks;
238 deUint32 maxResourceConsumers; // Maximum number of objects using same Object::Resources concurrently
240 Environment (Context& context, deUint32 maxResourceConsumers_)
241 : vkp (context.getPlatformInterface())
242 , vkd (context.getDeviceInterface())
243 , device (context.getDevice())
244 , queueFamilyIndex (context.getUniversalQueueFamilyIndex())
245 , programBinaries (context.getBinaryCollection())
246 , allocationCallbacks (DE_NULL)
247 , maxResourceConsumers (maxResourceConsumers_)
251 Environment (const PlatformInterface& vkp_,
252 const DeviceInterface& vkd_,
254 deUint32 queueFamilyIndex_,
255 const BinaryCollection& programBinaries_,
256 const VkAllocationCallbacks* allocationCallbacks_,
257 deUint32 maxResourceConsumers_)
261 , queueFamilyIndex (queueFamilyIndex_)
262 , programBinaries (programBinaries_)
263 , allocationCallbacks (allocationCallbacks_)
264 , maxResourceConsumers (maxResourceConsumers_)
269 template<typename Case>
272 typename Case::Resources resources;
273 Unique<typename Case::Type> object;
275 Dependency (const Environment& env, const typename Case::Parameters& params)
276 : resources (env, params)
277 , object (Case::create(env, resources, params))
282 T roundUpToNextMultiple (T value, T multiple)
284 if (value % multiple == 0)
287 return value + multiple - (value % multiple);
290 #if defined(DE_DEBUG)
292 bool isPowerOfTwo (T value)
294 return ((value & (value - T(1))) == 0);
299 T alignToPowerOfTwo (T value, T align)
301 DE_ASSERT(isPowerOfTwo(align));
302 return (value + align - T(1)) & ~(align - T(1));
305 inline bool hasDeviceExtension (Context& context, const string& name)
307 return de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), name);
310 VkDeviceSize getPageTableSize (const PlatformMemoryLimits& limits, VkDeviceSize allocationSize)
312 VkDeviceSize totalSize = 0;
314 for (size_t levelNdx = 0; levelNdx < limits.devicePageTableHierarchyLevels; ++levelNdx)
316 const VkDeviceSize coveredAddressSpaceSize = limits.devicePageSize<<levelNdx;
317 const VkDeviceSize numPagesNeeded = alignToPowerOfTwo(allocationSize, coveredAddressSpaceSize) / coveredAddressSpaceSize;
319 totalSize += numPagesNeeded*limits.devicePageTableEntrySize;
325 size_t getCurrentSystemMemoryUsage (const AllocationCallbackRecorder& allocRecoder)
327 const size_t systemAllocationOverhead = sizeof(void*)*2;
328 AllocationCallbackValidationResults validationResults;
330 validateAllocationCallbacks(allocRecoder, &validationResults);
331 TCU_CHECK(validationResults.violations.empty());
333 return getLiveSystemAllocationTotal(validationResults) + systemAllocationOverhead*validationResults.liveAllocations.size();
336 template<typename Object>
337 size_t computeSystemMemoryUsage (Context& context, const typename Object::Parameters& params)
339 AllocationCallbackRecorder allocRecorder (getSystemAllocator());
340 const Environment env (context.getPlatformInterface(),
341 context.getDeviceInterface(),
343 context.getUniversalQueueFamilyIndex(),
344 context.getBinaryCollection(),
345 allocRecorder.getCallbacks(),
347 const typename Object::Resources res (env, params);
348 const size_t resourceMemoryUsage = getCurrentSystemMemoryUsage(allocRecorder);
351 Unique<typename Object::Type> obj (Object::create(env, res, params));
352 const size_t totalMemoryUsage = getCurrentSystemMemoryUsage(allocRecorder);
354 return totalMemoryUsage - resourceMemoryUsage;
358 size_t getSafeObjectCount (const PlatformMemoryLimits& memoryLimits,
359 size_t objectSystemMemoryUsage,
360 VkDeviceSize objectDeviceMemoryUsage = 0)
362 const VkDeviceSize roundedUpDeviceMemory = roundUpToNextMultiple(objectDeviceMemoryUsage, memoryLimits.deviceMemoryAllocationGranularity);
364 if (memoryLimits.totalDeviceLocalMemory > 0 && roundedUpDeviceMemory > 0)
366 if (objectSystemMemoryUsage > 0)
367 return de::min(memoryLimits.totalSystemMemory / objectSystemMemoryUsage,
368 (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory));
370 return (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory);
372 else if (objectSystemMemoryUsage + roundedUpDeviceMemory > 0)
374 DE_ASSERT(roundedUpDeviceMemory <= std::numeric_limits<size_t>::max() - objectSystemMemoryUsage);
375 return memoryLimits.totalSystemMemory / (objectSystemMemoryUsage + (size_t)roundedUpDeviceMemory);
379 // Warning: at this point driver has probably not implemented allocation callbacks correctly
380 return std::numeric_limits<size_t>::max();
384 PlatformMemoryLimits getPlatformMemoryLimits (Context& context)
386 PlatformMemoryLimits memoryLimits;
388 context.getTestContext().getPlatform().getVulkanPlatform().getMemoryLimits(memoryLimits);
393 size_t getSafeObjectCount (Context& context, size_t objectSystemMemoryUsage, VkDeviceSize objectDeviceMemorySize = 0)
395 return getSafeObjectCount(getPlatformMemoryLimits(context), objectSystemMemoryUsage, objectDeviceMemorySize);
398 VkDeviceSize getPageTableSize (Context& context, VkDeviceSize allocationSize)
400 return getPageTableSize(getPlatformMemoryLimits(context), allocationSize);
403 template<typename Object>
404 deUint32 getSafeObjectCount (Context& context,
405 const typename Object::Parameters& params,
406 deUint32 hardCountLimit,
407 VkDeviceSize deviceMemoryUsage = 0)
409 return (deUint32)de::min((size_t)hardCountLimit,
410 getSafeObjectCount(context,
411 computeSystemMemoryUsage<Object>(context, params),
415 // Object definitions
419 MAX_CONCURRENT_INSTANCES = 32,
420 MAX_CONCURRENT_DEVICES = 32,
421 MAX_CONCURRENT_SYNC_PRIMITIVES = 100,
422 DEFAULT_MAX_CONCURRENT_OBJECTS = 16*1024,
427 typedef VkInstance Type;
436 Resources (const Environment&, const Parameters&) {}
439 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
441 return getSafeObjectCount<Instance>(context, params, MAX_CONCURRENT_INSTANCES);
444 static Move<VkInstance> create (const Environment& env, const Resources&, const Parameters&)
446 const VkApplicationInfo appInfo =
448 VK_STRUCTURE_TYPE_APPLICATION_INFO,
450 DE_NULL, // pApplicationName
451 0u, // applicationVersion
452 DE_NULL, // pEngineName
454 VK_MAKE_VERSION(1,0,0)
456 const VkInstanceCreateInfo instanceInfo =
458 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
460 (VkInstanceCreateFlags)0,
462 0u, // enabledLayerNameCount
463 DE_NULL, // ppEnabledLayerNames
464 0u, // enabledExtensionNameCount
465 DE_NULL, // ppEnabledExtensionNames
468 return createInstance(env.vkp, &instanceInfo, env.allocationCallbacks);
474 typedef VkDevice Type;
478 deUint32 deviceIndex;
479 VkQueueFlags queueFlags;
481 Parameters (deUint32 deviceIndex_, VkQueueFlags queueFlags_)
482 : deviceIndex (deviceIndex_)
483 , queueFlags (queueFlags_)
489 Dependency<Instance> instance;
491 VkPhysicalDevice physicalDevice;
492 deUint32 queueFamilyIndex;
494 Resources (const Environment& env, const Parameters& params)
495 : instance (env, Instance::Parameters())
496 , vki (env.vkp, *instance.object)
498 , queueFamilyIndex (~0u)
501 const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(vki, *instance.object);
503 if (physicalDevices.size() <= (size_t)params.deviceIndex)
504 TCU_THROW(NotSupportedError, "Device not found");
506 physicalDevice = physicalDevices[params.deviceIndex];
510 const vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
511 bool foundMatching = false;
513 for (size_t curQueueNdx = 0; curQueueNdx < queueProps.size(); curQueueNdx++)
515 if ((queueProps[curQueueNdx].queueFlags & params.queueFlags) == params.queueFlags)
517 queueFamilyIndex = (deUint32)curQueueNdx;
518 foundMatching = true;
523 TCU_THROW(NotSupportedError, "Matching queue not found");
528 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
530 return getSafeObjectCount<Device>(context, params, MAX_CONCURRENT_DEVICES);
533 static Move<VkDevice> create (const Environment& env, const Resources& res, const Parameters&)
535 const float queuePriority = 1.0;
537 const VkDeviceQueueCreateInfo queues[] =
540 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
542 (VkDeviceQueueCreateFlags)0,
543 res.queueFamilyIndex,
545 &queuePriority, // pQueuePriorities
548 const VkDeviceCreateInfo deviceInfo =
550 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
552 (VkDeviceCreateFlags)0,
553 DE_LENGTH_OF_ARRAY(queues),
555 0u, // enabledLayerNameCount
556 DE_NULL, // ppEnabledLayerNames
557 0u, // enabledExtensionNameCount
558 DE_NULL, // ppEnabledExtensionNames
559 DE_NULL, // pEnabledFeatures
562 return createDevice(res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks);
568 typedef VkDeviceMemory Type;
573 deUint32 memoryTypeIndex;
575 Parameters (VkDeviceSize size_, deUint32 memoryTypeIndex_)
577 , memoryTypeIndex (memoryTypeIndex_)
579 DE_ASSERT(memoryTypeIndex < VK_MAX_MEMORY_TYPES);
585 Resources (const Environment&, const Parameters&) {}
588 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
590 const VkDeviceSize deviceMemoryUsage = params.size + getPageTableSize(context, params.size);
592 return getSafeObjectCount<DeviceMemory>(context,
594 de::min(context.getDeviceProperties().limits.maxMemoryAllocationCount,
595 (deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS),
599 static Move<VkDeviceMemory> create (const Environment& env, const Resources&, const Parameters& params)
601 const VkMemoryAllocateInfo allocInfo =
603 VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
606 params.memoryTypeIndex
609 return allocateMemory(env.vkd, env.device, &allocInfo, env.allocationCallbacks);
613 DeviceMemory::Parameters getDeviceMemoryParameters (const VkMemoryRequirements& memReqs)
615 return DeviceMemory::Parameters(memReqs.size, deCtz32(memReqs.memoryTypeBits));
618 DeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkImage image)
620 return getDeviceMemoryParameters(getImageMemoryRequirements(env.vkd, env.device, image));
623 DeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkBuffer image)
625 return getDeviceMemoryParameters(getBufferMemoryRequirements(env.vkd, env.device, image));
630 typedef VkBuffer Type;
635 VkBufferUsageFlags usage;
637 Parameters (VkDeviceSize size_,
638 VkBufferUsageFlags usage_)
646 Resources (const Environment&, const Parameters&) {}
649 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
651 const Environment env (context, 1u);
652 const Resources res (env, params);
653 const Unique<VkBuffer> buffer (create(env, res, params));
654 const VkMemoryRequirements memReqs = getBufferMemoryRequirements(env.vkd, env.device, *buffer);
656 return getSafeObjectCount<Buffer>(context,
658 DEFAULT_MAX_CONCURRENT_OBJECTS,
659 getPageTableSize(context, memReqs.size));
662 static Move<VkBuffer> create (const Environment& env, const Resources&, const Parameters& params)
664 const VkBufferCreateInfo bufferInfo =
666 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
668 (VkBufferCreateFlags)0,
671 VK_SHARING_MODE_EXCLUSIVE,
673 &env.queueFamilyIndex
676 return createBuffer(env.vkd, env.device, &bufferInfo, env.allocationCallbacks);
682 typedef VkBufferView Type;
686 Buffer::Parameters buffer;
691 Parameters (const Buffer::Parameters& buffer_,
693 VkDeviceSize offset_,
704 Dependency<Buffer> buffer;
705 Dependency<DeviceMemory> memory;
707 Resources (const Environment& env, const Parameters& params)
708 : buffer(env, params.buffer)
709 , memory(env, getDeviceMemoryParameters(env, *buffer.object))
711 VK_CHECK(env.vkd.bindBufferMemory(env.device, *buffer.object, *memory.object, 0));
715 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
717 return getSafeObjectCount<BufferView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
720 static Move<VkBufferView> create (const Environment& env, const Resources& res, const Parameters& params)
722 const VkBufferViewCreateInfo bufferViewInfo =
724 VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,
726 (VkBufferViewCreateFlags)0,
733 return createBufferView(env.vkd, env.device, &bufferViewInfo, env.allocationCallbacks);
739 typedef VkImage Type;
743 VkImageCreateFlags flags;
744 VkImageType imageType;
749 VkSampleCountFlagBits samples;
750 VkImageTiling tiling;
751 VkImageUsageFlags usage;
752 VkImageLayout initialLayout;
754 Parameters (VkImageCreateFlags flags_,
755 VkImageType imageType_,
760 VkSampleCountFlagBits samples_,
761 VkImageTiling tiling_,
762 VkImageUsageFlags usage_,
763 VkImageLayout initialLayout_)
765 , imageType (imageType_)
768 , mipLevels (mipLevels_)
769 , arraySize (arraySize_)
773 , initialLayout (initialLayout_)
779 Resources (const Environment&, const Parameters&) {}
782 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
784 const Environment env (context, 1u);
785 const Resources res (env, params);
786 const Unique<VkImage> image (create(env, res, params));
787 const VkMemoryRequirements memReqs = getImageMemoryRequirements(env.vkd, env.device, *image);
789 return getSafeObjectCount<Image>(context,
791 DEFAULT_MAX_CONCURRENT_OBJECTS,
792 getPageTableSize(context, memReqs.size));
795 static Move<VkImage> create (const Environment& env, const Resources&, const Parameters& params)
797 const VkImageCreateInfo imageInfo =
799 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
810 VK_SHARING_MODE_EXCLUSIVE, // sharingMode
811 1u, // queueFamilyIndexCount
812 &env.queueFamilyIndex, // pQueueFamilyIndices
816 return createImage(env.vkd, env.device, &imageInfo, env.allocationCallbacks);
822 typedef VkImageView Type;
826 Image::Parameters image;
827 VkImageViewType viewType;
829 VkComponentMapping components;
830 VkImageSubresourceRange subresourceRange;
832 Parameters (const Image::Parameters& image_,
833 VkImageViewType viewType_,
835 VkComponentMapping components_,
836 VkImageSubresourceRange subresourceRange_)
838 , viewType (viewType_)
840 , components (components_)
841 , subresourceRange (subresourceRange_)
847 Dependency<Image> image;
848 Dependency<DeviceMemory> memory;
850 Resources (const Environment& env, const Parameters& params)
851 : image (env, params.image)
852 , memory(env, getDeviceMemoryParameters(env, *image.object))
854 VK_CHECK(env.vkd.bindImageMemory(env.device, *image.object, *memory.object, 0));
858 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
860 return getSafeObjectCount<ImageView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
863 static Move<VkImageView> create (const Environment& env, const Resources& res, const Parameters& params)
865 const VkImageViewCreateInfo imageViewInfo =
867 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
869 (VkImageViewCreateFlags)0,
874 params.subresourceRange,
877 return createImageView(env.vkd, env.device, &imageViewInfo, env.allocationCallbacks);
883 typedef VkSemaphore Type;
887 VkSemaphoreCreateFlags flags;
889 Parameters (VkSemaphoreCreateFlags flags_)
896 Resources (const Environment&, const Parameters&) {}
899 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
901 return getSafeObjectCount<Semaphore>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
904 static Move<VkSemaphore> create (const Environment& env, const Resources&, const Parameters& params)
906 const VkSemaphoreCreateInfo semaphoreInfo =
908 VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
913 return createSemaphore(env.vkd, env.device, &semaphoreInfo, env.allocationCallbacks);
919 typedef VkFence Type;
923 VkFenceCreateFlags flags;
925 Parameters (VkFenceCreateFlags flags_)
932 Resources (const Environment&, const Parameters&) {}
935 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
937 return getSafeObjectCount<Fence>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
940 static Move<VkFence> create (const Environment& env, const Resources&, const Parameters& params)
942 const VkFenceCreateInfo fenceInfo =
944 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
949 return createFence(env.vkd, env.device, &fenceInfo, env.allocationCallbacks);
955 typedef VkEvent Type;
959 VkEventCreateFlags flags;
961 Parameters (VkEventCreateFlags flags_)
968 Resources (const Environment&, const Parameters&) {}
971 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
973 return getSafeObjectCount<Event>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
976 static Move<VkEvent> create (const Environment& env, const Resources&, const Parameters& params)
978 const VkEventCreateInfo eventInfo =
980 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
985 return createEvent(env.vkd, env.device, &eventInfo, env.allocationCallbacks);
991 typedef VkQueryPool Type;
995 VkQueryType queryType;
997 VkQueryPipelineStatisticFlags pipelineStatistics;
999 Parameters (VkQueryType queryType_,
1000 deUint32 entryCount_,
1001 VkQueryPipelineStatisticFlags pipelineStatistics_)
1002 : queryType (queryType_)
1003 , entryCount (entryCount_)
1004 , pipelineStatistics (pipelineStatistics_)
1010 Resources (const Environment&, const Parameters&) {}
1013 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1015 return getSafeObjectCount<QueryPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1018 static Move<VkQueryPool> create (const Environment& env, const Resources&, const Parameters& params)
1020 const VkQueryPoolCreateInfo queryPoolInfo =
1022 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
1024 (VkQueryPoolCreateFlags)0,
1027 params.pipelineStatistics
1030 return createQueryPool(env.vkd, env.device, &queryPoolInfo, env.allocationCallbacks);
1036 typedef VkShaderModule Type;
1040 VkShaderStageFlagBits shaderStage;
1043 Parameters (VkShaderStageFlagBits shaderStage_,
1044 const std::string& binaryName_)
1045 : shaderStage (shaderStage_)
1046 , binaryName (binaryName_)
1052 const ProgramBinary& binary;
1054 Resources (const Environment& env, const Parameters& params)
1055 : binary(env.programBinaries.get(params.binaryName))
1059 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1061 return getSafeObjectCount<ShaderModule>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1064 static const char* getSource (VkShaderStageFlagBits stage)
1068 case VK_SHADER_STAGE_VERTEX_BIT:
1069 return "#version 310 es\n"
1070 "layout(location = 0) in highp vec4 a_position;\n"
1071 "void main () { gl_Position = a_position; }\n";
1073 case VK_SHADER_STAGE_FRAGMENT_BIT:
1074 return "#version 310 es\n"
1075 "layout(location = 0) out mediump vec4 o_color;\n"
1076 "void main () { o_color = vec4(1.0, 0.5, 0.25, 1.0); }";
1078 case VK_SHADER_STAGE_COMPUTE_BIT:
1079 return "#version 310 es\n"
1080 "layout(binding = 0) buffer Input { highp uint dataIn[]; };\n"
1081 "layout(binding = 1) buffer Output { highp uint dataOut[]; };\n"
1082 "void main (void)\n"
1084 " dataOut[gl_GlobalInvocationID.x] = ~dataIn[gl_GlobalInvocationID.x];\n"
1088 DE_FATAL("Not implemented");
1093 static void initPrograms (SourceCollections& dst, Parameters params)
1095 const char* const source = getSource(params.shaderStage);
1099 dst.glslSources.add(params.binaryName)
1100 << glu::ShaderSource(getGluShaderType(params.shaderStage), source);
1103 static Move<VkShaderModule> create (const Environment& env, const Resources& res, const Parameters&)
1105 const VkShaderModuleCreateInfo shaderModuleInfo =
1107 VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
1109 (VkShaderModuleCreateFlags)0,
1110 res.binary.getSize(),
1111 (const deUint32*)res.binary.getBinary(),
1114 return createShaderModule(env.vkd, env.device, &shaderModuleInfo, env.allocationCallbacks);
1118 struct PipelineCache
1120 typedef VkPipelineCache Type;
1124 Parameters (void) {}
1129 Resources (const Environment&, const Parameters&) {}
1132 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1134 return getSafeObjectCount<PipelineCache>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1137 static Move<VkPipelineCache> create (const Environment& env, const Resources&, const Parameters&)
1139 const VkPipelineCacheCreateInfo pipelineCacheInfo =
1141 VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1143 (VkPipelineCacheCreateFlags)0u,
1144 0u, // initialDataSize
1145 DE_NULL, // pInitialData
1148 return createPipelineCache(env.vkd, env.device, &pipelineCacheInfo, env.allocationCallbacks);
1154 typedef VkSampler Type;
1160 VkSamplerMipmapMode mipmapMode;
1161 VkSamplerAddressMode addressModeU;
1162 VkSamplerAddressMode addressModeV;
1163 VkSamplerAddressMode addressModeW;
1165 VkBool32 anisotropyEnable;
1166 float maxAnisotropy;
1167 VkBool32 compareEnable;
1168 VkCompareOp compareOp;
1171 VkBorderColor borderColor;
1172 VkBool32 unnormalizedCoordinates;
1174 // \todo [2015-09-17 pyry] Other configurations
1176 : magFilter (VK_FILTER_NEAREST)
1177 , minFilter (VK_FILTER_NEAREST)
1178 , mipmapMode (VK_SAMPLER_MIPMAP_MODE_NEAREST)
1179 , addressModeU (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1180 , addressModeV (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1181 , addressModeW (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1183 , anisotropyEnable (VK_FALSE)
1184 , maxAnisotropy (1.0f)
1185 , compareEnable (VK_FALSE)
1186 , compareOp (VK_COMPARE_OP_ALWAYS)
1189 , borderColor (VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK)
1190 , unnormalizedCoordinates (VK_FALSE)
1196 Resources (const Environment&, const Parameters&) {}
1199 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1201 return getSafeObjectCount<Sampler>(context,
1203 de::min(context.getDeviceProperties().limits.maxSamplerAllocationCount,
1204 (deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS));
1207 static Move<VkSampler> create (const Environment& env, const Resources&, const Parameters& params)
1209 const VkSamplerCreateInfo samplerInfo =
1211 VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1213 (VkSamplerCreateFlags)0,
1217 params.addressModeU,
1218 params.addressModeV,
1219 params.addressModeW,
1221 params.anisotropyEnable,
1222 params.maxAnisotropy,
1223 params.compareEnable,
1228 params.unnormalizedCoordinates
1231 return createSampler(env.vkd, env.device, &samplerInfo, env.allocationCallbacks);
1235 struct DescriptorSetLayout
1237 typedef VkDescriptorSetLayout Type;
1244 VkDescriptorType descriptorType;
1245 deUint32 descriptorCount;
1246 VkShaderStageFlags stageFlags;
1247 bool useImmutableSampler;
1249 Binding (deUint32 binding_,
1250 VkDescriptorType descriptorType_,
1251 deUint32 descriptorCount_,
1252 VkShaderStageFlags stageFlags_,
1253 bool useImmutableSampler_)
1254 : binding (binding_)
1255 , descriptorType (descriptorType_)
1256 , descriptorCount (descriptorCount_)
1257 , stageFlags (stageFlags_)
1258 , useImmutableSampler (useImmutableSampler_)
1264 vector<Binding> bindings;
1266 Parameters (const vector<Binding>& bindings_)
1267 : bindings(bindings_)
1270 static Parameters empty (void)
1272 return Parameters(vector<Binding>());
1275 static Parameters single (deUint32 binding,
1276 VkDescriptorType descriptorType,
1277 deUint32 descriptorCount,
1278 VkShaderStageFlags stageFlags,
1279 bool useImmutableSampler = false)
1281 vector<Binding> bindings;
1282 bindings.push_back(Binding(binding, descriptorType, descriptorCount, stageFlags, useImmutableSampler));
1283 return Parameters(bindings);
1289 vector<VkDescriptorSetLayoutBinding> bindings;
1290 MovePtr<Dependency<Sampler> > immutableSampler;
1291 vector<VkSampler> immutableSamplersPtr;
1293 Resources (const Environment& env, const Parameters& params)
1295 // Create immutable sampler if needed
1296 for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++)
1298 if (cur->useImmutableSampler && !immutableSampler)
1300 immutableSampler = de::newMovePtr<Dependency<Sampler> >(env, Sampler::Parameters());
1302 if (cur->useImmutableSampler && immutableSamplersPtr.size() < (size_t)cur->descriptorCount)
1303 immutableSamplersPtr.resize(cur->descriptorCount, *immutableSampler->object);
1307 for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++)
1309 const VkDescriptorSetLayoutBinding binding =
1312 cur->descriptorType,
1313 cur->descriptorCount,
1315 (cur->useImmutableSampler ? &immutableSamplersPtr[0] : DE_NULL)
1318 bindings.push_back(binding);
1323 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1325 return getSafeObjectCount<DescriptorSetLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1328 static Move<VkDescriptorSetLayout> create (const Environment& env, const Resources& res, const Parameters&)
1330 const VkDescriptorSetLayoutCreateInfo descriptorSetLayoutInfo =
1332 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1334 (VkDescriptorSetLayoutCreateFlags)0,
1335 (deUint32)res.bindings.size(),
1336 (res.bindings.empty() ? DE_NULL : &res.bindings[0])
1339 return createDescriptorSetLayout(env.vkd, env.device, &descriptorSetLayoutInfo, env.allocationCallbacks);
1343 struct PipelineLayout
1345 typedef VkPipelineLayout Type;
1349 vector<DescriptorSetLayout::Parameters> descriptorSetLayouts;
1350 vector<VkPushConstantRange> pushConstantRanges;
1352 Parameters (void) {}
1354 static Parameters empty (void)
1356 return Parameters();
1359 static Parameters singleDescriptorSet (const DescriptorSetLayout::Parameters& descriptorSetLayout)
1362 params.descriptorSetLayouts.push_back(descriptorSetLayout);
1369 typedef SharedPtr<Dependency<DescriptorSetLayout> > DescriptorSetLayoutDepSp;
1370 typedef vector<DescriptorSetLayoutDepSp> DescriptorSetLayouts;
1372 DescriptorSetLayouts descriptorSetLayouts;
1373 vector<VkDescriptorSetLayout> pSetLayouts;
1375 Resources (const Environment& env, const Parameters& params)
1377 for (vector<DescriptorSetLayout::Parameters>::const_iterator dsParams = params.descriptorSetLayouts.begin();
1378 dsParams != params.descriptorSetLayouts.end();
1381 descriptorSetLayouts.push_back(DescriptorSetLayoutDepSp(new Dependency<DescriptorSetLayout>(env, *dsParams)));
1382 pSetLayouts.push_back(*descriptorSetLayouts.back()->object);
1387 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1389 return getSafeObjectCount<PipelineLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1392 static Move<VkPipelineLayout> create (const Environment& env, const Resources& res, const Parameters& params)
1394 const VkPipelineLayoutCreateInfo pipelineLayoutInfo =
1396 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1398 (VkPipelineLayoutCreateFlags)0,
1399 (deUint32)res.pSetLayouts.size(),
1400 (res.pSetLayouts.empty() ? DE_NULL : &res.pSetLayouts[0]),
1401 (deUint32)params.pushConstantRanges.size(),
1402 (params.pushConstantRanges.empty() ? DE_NULL : ¶ms.pushConstantRanges[0]),
1405 return createPipelineLayout(env.vkd, env.device, &pipelineLayoutInfo, env.allocationCallbacks);
1411 typedef VkRenderPass Type;
1413 // \todo [2015-09-17 pyry] More interesting configurations
1416 Parameters (void) {}
1421 Resources (const Environment&, const Parameters&) {}
1424 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1426 return getSafeObjectCount<RenderPass>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1429 static Move<VkRenderPass> create (const Environment& env, const Resources&, const Parameters&)
1431 const VkAttachmentDescription attachments[] =
1434 (VkAttachmentDescriptionFlags)0,
1435 VK_FORMAT_R8G8B8A8_UNORM,
1436 VK_SAMPLE_COUNT_1_BIT,
1437 VK_ATTACHMENT_LOAD_OP_CLEAR,
1438 VK_ATTACHMENT_STORE_OP_STORE,
1439 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
1440 VK_ATTACHMENT_STORE_OP_DONT_CARE,
1441 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1442 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1445 (VkAttachmentDescriptionFlags)0,
1446 VK_FORMAT_D16_UNORM,
1447 VK_SAMPLE_COUNT_1_BIT,
1448 VK_ATTACHMENT_LOAD_OP_CLEAR,
1449 VK_ATTACHMENT_STORE_OP_DONT_CARE,
1450 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
1451 VK_ATTACHMENT_STORE_OP_DONT_CARE,
1452 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1453 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1456 const VkAttachmentReference colorAttachments[] =
1460 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1463 const VkAttachmentReference dsAttachment =
1466 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
1468 const VkSubpassDescription subpasses[] =
1471 (VkSubpassDescriptionFlags)0,
1472 VK_PIPELINE_BIND_POINT_GRAPHICS,
1473 0u, // inputAttachmentCount
1474 DE_NULL, // pInputAttachments
1475 DE_LENGTH_OF_ARRAY(colorAttachments),
1477 DE_NULL, // pResolveAttachments
1479 0u, // preserveAttachmentCount
1480 DE_NULL, // pPreserveAttachments
1483 const VkRenderPassCreateInfo renderPassInfo =
1485 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
1487 (VkRenderPassCreateFlags)0,
1488 DE_LENGTH_OF_ARRAY(attachments),
1490 DE_LENGTH_OF_ARRAY(subpasses),
1492 0u, // dependencyCount
1493 DE_NULL // pDependencies
1496 return createRenderPass(env.vkd, env.device, &renderPassInfo, env.allocationCallbacks);
1500 struct GraphicsPipeline
1502 typedef VkPipeline Type;
1504 // \todo [2015-09-17 pyry] More interesting configurations
1507 Parameters (void) {}
1512 Dependency<ShaderModule> vertexShader;
1513 Dependency<ShaderModule> fragmentShader;
1514 Dependency<PipelineLayout> layout;
1515 Dependency<RenderPass> renderPass;
1516 Dependency<PipelineCache> pipelineCache;
1518 Resources (const Environment& env, const Parameters&)
1519 : vertexShader (env, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert"))
1520 , fragmentShader (env, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag"))
1521 , layout (env, PipelineLayout::Parameters::singleDescriptorSet(
1522 DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u, VK_SHADER_STAGE_FRAGMENT_BIT, true)))
1523 , renderPass (env, RenderPass::Parameters())
1524 , pipelineCache (env, PipelineCache::Parameters())
1528 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1530 return getSafeObjectCount<GraphicsPipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1533 static void initPrograms (SourceCollections& dst, Parameters)
1535 ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert"));
1536 ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag"));
1539 static vector<VkPipelineSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkPipeline>* const pOutHandles, VkResult* const pOutResult)
1541 DE_ASSERT(pOutResult);
1542 DE_ASSERT(pOutHandles);
1543 DE_ASSERT(pOutHandles->size() != 0);
1545 const VkPipelineShaderStageCreateInfo stages[] =
1548 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1550 (VkPipelineShaderStageCreateFlags)0,
1551 VK_SHADER_STAGE_VERTEX_BIT,
1552 *res.vertexShader.object,
1554 DE_NULL, // pSpecializationInfo
1557 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1559 (VkPipelineShaderStageCreateFlags)0,
1560 VK_SHADER_STAGE_FRAGMENT_BIT,
1561 *res.fragmentShader.object,
1563 DE_NULL, // pSpecializationInfo
1566 const VkVertexInputBindingDescription vertexBindings[] =
1571 VK_VERTEX_INPUT_RATE_VERTEX
1574 const VkVertexInputAttributeDescription vertexAttribs[] =
1579 VK_FORMAT_R32G32B32A32_SFLOAT,
1583 const VkPipelineVertexInputStateCreateInfo vertexInputState =
1585 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
1587 (VkPipelineVertexInputStateCreateFlags)0,
1588 DE_LENGTH_OF_ARRAY(vertexBindings),
1590 DE_LENGTH_OF_ARRAY(vertexAttribs),
1593 const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState =
1595 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
1597 (VkPipelineInputAssemblyStateCreateFlags)0,
1598 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
1599 VK_FALSE // primitiveRestartEnable
1601 const VkViewport viewports[] =
1603 { 0.0f, 0.0f, 64.f, 64.f, 0.0f, 1.0f }
1605 const VkRect2D scissors[] =
1607 { { 0, 0 }, { 64, 64 } }
1609 const VkPipelineViewportStateCreateInfo viewportState =
1611 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
1613 (VkPipelineViewportStateCreateFlags)0,
1614 DE_LENGTH_OF_ARRAY(viewports),
1616 DE_LENGTH_OF_ARRAY(scissors),
1619 const VkPipelineRasterizationStateCreateInfo rasterState =
1621 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
1623 (VkPipelineRasterizationStateCreateFlags)0,
1624 VK_TRUE, // depthClampEnable
1625 VK_FALSE, // rasterizerDiscardEnable
1626 VK_POLYGON_MODE_FILL,
1627 VK_CULL_MODE_BACK_BIT,
1628 VK_FRONT_FACE_COUNTER_CLOCKWISE,
1629 VK_FALSE, // depthBiasEnable
1630 0.0f, // depthBiasConstantFactor
1631 0.0f, // depthBiasClamp
1632 0.0f, // depthBiasSlopeFactor
1635 const VkPipelineMultisampleStateCreateInfo multisampleState =
1637 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
1639 (VkPipelineMultisampleStateCreateFlags)0,
1640 VK_SAMPLE_COUNT_1_BIT,
1641 VK_FALSE, // sampleShadingEnable
1642 1.0f, // minSampleShading
1643 DE_NULL, // pSampleMask
1644 VK_FALSE, // alphaToCoverageEnable
1645 VK_FALSE, // alphaToOneEnable
1647 const VkPipelineDepthStencilStateCreateInfo depthStencilState =
1649 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
1651 (VkPipelineDepthStencilStateCreateFlags)0,
1652 VK_TRUE, // depthTestEnable
1653 VK_TRUE, // depthWriteEnable
1654 VK_COMPARE_OP_LESS, // depthCompareOp
1655 VK_FALSE, // depthBoundsTestEnable
1656 VK_FALSE, // stencilTestEnable
1657 { VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u },
1658 { VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u },
1659 0.0f, // minDepthBounds
1660 1.0f, // maxDepthBounds
1662 const VkPipelineColorBlendAttachmentState colorBlendAttState[]=
1665 VK_FALSE, // blendEnable
1666 VK_BLEND_FACTOR_ONE,
1667 VK_BLEND_FACTOR_ZERO,
1669 VK_BLEND_FACTOR_ONE,
1670 VK_BLEND_FACTOR_ZERO,
1672 VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT
1675 const VkPipelineColorBlendStateCreateInfo colorBlendState =
1677 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
1679 (VkPipelineColorBlendStateCreateFlags)0,
1680 VK_FALSE, // logicOpEnable
1682 DE_LENGTH_OF_ARRAY(colorBlendAttState),
1684 { 0.0f, 0.0f, 0.0f, 0.0f } // blendConstants
1686 const VkGraphicsPipelineCreateInfo pipelineInfo =
1688 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1690 (VkPipelineCreateFlags)0,
1691 DE_LENGTH_OF_ARRAY(stages),
1694 &inputAssemblyState,
1695 DE_NULL, // pTessellationState
1701 (const VkPipelineDynamicStateCreateInfo*)DE_NULL,
1703 *res.renderPass.object,
1705 (VkPipeline)0, // basePipelineHandle
1706 0, // basePipelineIndex
1709 const deUint32 numPipelines = static_cast<deUint32>(pOutHandles->size());
1710 VkPipeline* const pHandles = &(*pOutHandles)[0];
1711 vector<VkGraphicsPipelineCreateInfo> pipelineInfos (numPipelines, pipelineInfo);
1713 *pOutResult = env.vkd.createGraphicsPipelines(env.device, *res.pipelineCache.object, numPipelines, &pipelineInfos[0], env.allocationCallbacks, pHandles);
1715 vector<VkPipelineSp> pipelines;
1717 // Even if an error is returned, some pipelines may have been created successfully
1718 for (deUint32 i = 0; i < numPipelines; ++i)
1720 if (pHandles[i] != DE_NULL)
1721 pipelines.push_back(VkPipelineSp(new Move<VkPipeline>(check<VkPipeline>(pHandles[i]), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks))));
1727 static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&)
1729 vector<VkPipeline> handles (1, DE_NULL);
1730 VkResult result = VK_NOT_READY;
1731 vector<VkPipelineSp> scopedHandles = createMultiple(env, res, Parameters(), &handles, &result);
1734 return Move<VkPipeline>(check<VkPipeline>(scopedHandles.front()->disown()), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks));
1738 struct ComputePipeline
1740 typedef VkPipeline Type;
1742 // \todo [2015-09-17 pyry] More interesting configurations
1745 Parameters (void) {}
1750 Dependency<ShaderModule> shaderModule;
1751 Dependency<PipelineLayout> layout;
1752 Dependency<PipelineCache> pipelineCache;
1754 static DescriptorSetLayout::Parameters getDescriptorSetLayout (void)
1756 typedef DescriptorSetLayout::Parameters::Binding Binding;
1758 vector<Binding> bindings;
1760 bindings.push_back(Binding(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false));
1761 bindings.push_back(Binding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false));
1763 return DescriptorSetLayout::Parameters(bindings);
1766 Resources (const Environment& env, const Parameters&)
1767 : shaderModule (env, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"))
1768 , layout (env, PipelineLayout::Parameters::singleDescriptorSet(getDescriptorSetLayout()))
1769 , pipelineCache (env, PipelineCache::Parameters())
1773 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1775 return getSafeObjectCount<ComputePipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1778 static void initPrograms (SourceCollections& dst, Parameters)
1780 ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"));
1783 static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&)
1785 const VkComputePipelineCreateInfo pipelineInfo =
1787 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
1789 (VkPipelineCreateFlags)0,
1791 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1793 (VkPipelineShaderStageCreateFlags)0,
1794 VK_SHADER_STAGE_COMPUTE_BIT,
1795 *res.shaderModule.object,
1797 DE_NULL // pSpecializationInfo
1800 (VkPipeline)0, // basePipelineHandle
1801 0u, // basePipelineIndex
1804 return createComputePipeline(env.vkd, env.device, *res.pipelineCache.object, &pipelineInfo, env.allocationCallbacks);
1807 static vector<VkPipelineSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkPipeline>* const pOutHandles, VkResult* const pOutResult)
1809 DE_ASSERT(pOutResult);
1810 DE_ASSERT(pOutHandles);
1811 DE_ASSERT(pOutHandles->size() != 0);
1813 const VkComputePipelineCreateInfo commonPipelineInfo =
1815 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
1817 (VkPipelineCreateFlags)0,
1819 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1821 (VkPipelineShaderStageCreateFlags)0,
1822 VK_SHADER_STAGE_COMPUTE_BIT,
1823 *res.shaderModule.object,
1825 DE_NULL // pSpecializationInfo
1828 (VkPipeline)0, // basePipelineHandle
1829 0u, // basePipelineIndex
1832 const deUint32 numPipelines = static_cast<deUint32>(pOutHandles->size());
1833 VkPipeline* const pHandles = &(*pOutHandles)[0];
1834 vector<VkComputePipelineCreateInfo> pipelineInfos (numPipelines, commonPipelineInfo);
1836 *pOutResult = env.vkd.createComputePipelines(env.device, *res.pipelineCache.object, numPipelines, &pipelineInfos[0], env.allocationCallbacks, pHandles);
1838 vector<VkPipelineSp> pipelines;
1840 // Even if an error is returned, some pipelines may have been created successfully
1841 for (deUint32 i = 0; i < numPipelines; ++i)
1843 if (pHandles[i] != DE_NULL)
1844 pipelines.push_back(VkPipelineSp(new Move<VkPipeline>(check<VkPipeline>(pHandles[i]), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks))));
1851 struct DescriptorPool
1853 typedef VkDescriptorPool Type;
1857 VkDescriptorPoolCreateFlags flags;
1859 vector<VkDescriptorPoolSize> poolSizes;
1861 Parameters (VkDescriptorPoolCreateFlags flags_,
1863 const vector<VkDescriptorPoolSize>& poolSizes_)
1865 , maxSets (maxSets_)
1866 , poolSizes (poolSizes_)
1869 static Parameters singleType (VkDescriptorPoolCreateFlags flags,
1871 VkDescriptorType type,
1874 vector<VkDescriptorPoolSize> poolSizes;
1875 poolSizes.push_back(makeDescriptorPoolSize(type, count));
1876 return Parameters(flags, maxSets, poolSizes);
1882 Resources (const Environment&, const Parameters&) {}
1885 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1887 return getSafeObjectCount<DescriptorPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1890 static Move<VkDescriptorPool> create (const Environment& env, const Resources&, const Parameters& params)
1892 const VkDescriptorPoolCreateInfo descriptorPoolInfo =
1894 VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1898 (deUint32)params.poolSizes.size(),
1899 (params.poolSizes.empty() ? DE_NULL : ¶ms.poolSizes[0])
1902 return createDescriptorPool(env.vkd, env.device, &descriptorPoolInfo, env.allocationCallbacks);
1906 struct DescriptorSet
1908 typedef VkDescriptorSet Type;
1912 DescriptorSetLayout::Parameters descriptorSetLayout;
1914 Parameters (const DescriptorSetLayout::Parameters& descriptorSetLayout_)
1915 : descriptorSetLayout(descriptorSetLayout_)
1921 Dependency<DescriptorPool> descriptorPool;
1922 Dependency<DescriptorSetLayout> descriptorSetLayout;
1924 static vector<VkDescriptorPoolSize> computePoolSizes (const DescriptorSetLayout::Parameters& layout, int maxSets)
1926 deUint32 countByType[VK_DESCRIPTOR_TYPE_LAST];
1927 vector<VkDescriptorPoolSize> typeCounts;
1929 std::fill(DE_ARRAY_BEGIN(countByType), DE_ARRAY_END(countByType), 0u);
1931 for (vector<DescriptorSetLayout::Parameters::Binding>::const_iterator cur = layout.bindings.begin();
1932 cur != layout.bindings.end();
1935 DE_ASSERT((deUint32)cur->descriptorType < VK_DESCRIPTOR_TYPE_LAST);
1936 countByType[cur->descriptorType] += cur->descriptorCount * maxSets;
1939 for (deUint32 type = 0; type < VK_DESCRIPTOR_TYPE_LAST; ++type)
1941 if (countByType[type] > 0)
1942 typeCounts.push_back(makeDescriptorPoolSize((VkDescriptorType)type, countByType[type]));
1948 Resources (const Environment& env, const Parameters& params)
1949 : descriptorPool (env, DescriptorPool::Parameters(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, env.maxResourceConsumers, computePoolSizes(params.descriptorSetLayout, env.maxResourceConsumers)))
1950 , descriptorSetLayout (env, params.descriptorSetLayout)
1955 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1957 return getSafeObjectCount<DescriptorSet>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1960 static Move<VkDescriptorSet> create (const Environment& env, const Resources& res, const Parameters&)
1962 const VkDescriptorSetAllocateInfo allocateInfo =
1964 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
1966 *res.descriptorPool.object,
1968 &res.descriptorSetLayout.object.get(),
1971 return allocateDescriptorSet(env.vkd, env.device, &allocateInfo);
1974 static vector<VkDescriptorSetSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkDescriptorSet>* const pOutHandles, VkResult* const pOutResult)
1976 DE_ASSERT(pOutResult);
1977 DE_ASSERT(pOutHandles);
1978 DE_ASSERT(pOutHandles->size() != 0);
1980 const deUint32 numDescriptorSets = static_cast<deUint32>(pOutHandles->size());
1981 VkDescriptorSet* const pHandles = &(*pOutHandles)[0];
1982 const vector<VkDescriptorSetLayout> descriptorSetLayouts (numDescriptorSets, res.descriptorSetLayout.object.get());
1984 const VkDescriptorSetAllocateInfo allocateInfo =
1986 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
1988 *res.descriptorPool.object,
1990 &descriptorSetLayouts[0],
1993 *pOutResult = env.vkd.allocateDescriptorSets(env.device, &allocateInfo, pHandles);
1995 vector<VkDescriptorSetSp> descriptorSets;
1997 if (*pOutResult == VK_SUCCESS)
1999 for (deUint32 i = 0; i < numDescriptorSets; ++i)
2000 descriptorSets.push_back(VkDescriptorSetSp(new Move<VkDescriptorSet>(check<VkDescriptorSet>(pHandles[i]), Deleter<VkDescriptorSet>(env.vkd, env.device, *res.descriptorPool.object))));
2003 return descriptorSets;
2009 typedef VkFramebuffer Type;
2019 Dependency<ImageView> colorAttachment;
2020 Dependency<ImageView> depthStencilAttachment;
2021 Dependency<RenderPass> renderPass;
2023 Resources (const Environment& env, const Parameters&)
2024 : colorAttachment (env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
2025 makeExtent3D(256, 256, 1),
2027 VK_SAMPLE_COUNT_1_BIT,
2028 VK_IMAGE_TILING_OPTIMAL,
2029 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
2030 VK_IMAGE_LAYOUT_UNDEFINED),
2031 VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
2032 makeComponentMappingRGBA(),
2033 makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u)))
2034 , depthStencilAttachment (env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM,
2035 makeExtent3D(256, 256, 1),
2037 VK_SAMPLE_COUNT_1_BIT,
2038 VK_IMAGE_TILING_OPTIMAL,
2039 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
2040 VK_IMAGE_LAYOUT_UNDEFINED),
2041 VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_D16_UNORM,
2042 makeComponentMappingRGBA(),
2043 makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u)))
2044 , renderPass (env, RenderPass::Parameters())
2048 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2050 // \todo [2016-03-23 pyry] Take into account attachment sizes
2051 return getSafeObjectCount<Framebuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2054 static Move<VkFramebuffer> create (const Environment& env, const Resources& res, const Parameters&)
2056 const VkImageView attachments[] =
2058 *res.colorAttachment.object,
2059 *res.depthStencilAttachment.object,
2061 const VkFramebufferCreateInfo framebufferInfo =
2063 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
2065 (VkFramebufferCreateFlags)0,
2066 *res.renderPass.object,
2067 (deUint32)DE_LENGTH_OF_ARRAY(attachments),
2074 return createFramebuffer(env.vkd, env.device, &framebufferInfo, env.allocationCallbacks);
2080 typedef VkCommandPool Type;
2084 VkCommandPoolCreateFlags flags;
2086 Parameters (VkCommandPoolCreateFlags flags_)
2093 Resources (const Environment&, const Parameters&) {}
2096 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2098 return getSafeObjectCount<CommandPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2101 static Move<VkCommandPool> create (const Environment& env, const Resources&, const Parameters& params)
2103 const VkCommandPoolCreateInfo cmdPoolInfo =
2105 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
2108 env.queueFamilyIndex,
2111 return createCommandPool(env.vkd, env.device, &cmdPoolInfo, env.allocationCallbacks);
2115 struct CommandBuffer
2117 typedef VkCommandBuffer Type;
2121 CommandPool::Parameters commandPool;
2122 VkCommandBufferLevel level;
2124 Parameters (const CommandPool::Parameters& commandPool_,
2125 VkCommandBufferLevel level_)
2126 : commandPool (commandPool_)
2133 Dependency<CommandPool> commandPool;
2135 Resources (const Environment& env, const Parameters& params)
2136 : commandPool(env, params.commandPool)
2140 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2142 return getSafeObjectCount<CommandBuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2145 static Move<VkCommandBuffer> create (const Environment& env, const Resources& res, const Parameters& params)
2147 const VkCommandBufferAllocateInfo cmdBufferInfo =
2149 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
2151 *res.commandPool.object,
2156 return allocateCommandBuffer(env.vkd, env.device, &cmdBufferInfo);
2159 static vector<VkCommandBufferSp> createMultiple (const Environment& env, const Resources& res, const Parameters& params, vector<VkCommandBuffer>* const pOutHandles, VkResult* const pOutResult)
2161 DE_ASSERT(pOutResult);
2162 DE_ASSERT(pOutHandles);
2163 DE_ASSERT(pOutHandles->size() != 0);
2165 const deUint32 numCommandBuffers = static_cast<deUint32>(pOutHandles->size());
2166 VkCommandBuffer* const pHandles = &(*pOutHandles)[0];
2168 const VkCommandBufferAllocateInfo cmdBufferInfo =
2170 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
2172 *res.commandPool.object,
2177 *pOutResult = env.vkd.allocateCommandBuffers(env.device, &cmdBufferInfo, pHandles);
2179 vector<VkCommandBufferSp> commandBuffers;
2181 if (*pOutResult == VK_SUCCESS)
2183 for (deUint32 i = 0; i < numCommandBuffers; ++i)
2184 commandBuffers.push_back(VkCommandBufferSp(new Move<VkCommandBuffer>(check<VkCommandBuffer>(pHandles[i]), Deleter<VkCommandBuffer>(env.vkd, env.device, *res.commandPool.object))));
2187 return commandBuffers;
2193 template<typename Object>
2194 tcu::TestStatus createSingleTest (Context& context, typename Object::Parameters params)
2196 const Environment env (context, 1u);
2197 const typename Object::Resources res (env, params);
2200 Unique<typename Object::Type> obj (Object::create(env, res, params));
2203 return tcu::TestStatus::pass("Ok");
2206 template<typename Object>
2207 tcu::TestStatus createMultipleUniqueResourcesTest (Context& context, typename Object::Parameters params)
2209 const Environment env (context, 1u);
2210 const typename Object::Resources res0 (env, params);
2211 const typename Object::Resources res1 (env, params);
2212 const typename Object::Resources res2 (env, params);
2213 const typename Object::Resources res3 (env, params);
2216 Unique<typename Object::Type> obj0 (Object::create(env, res0, params));
2217 Unique<typename Object::Type> obj1 (Object::create(env, res1, params));
2218 Unique<typename Object::Type> obj2 (Object::create(env, res2, params));
2219 Unique<typename Object::Type> obj3 (Object::create(env, res3, params));
2222 return tcu::TestStatus::pass("Ok");
2225 template<typename Object>
2226 tcu::TestStatus createMultipleSharedResourcesTest (Context& context, typename Object::Parameters params)
2228 const Environment env (context, 4u);
2229 const typename Object::Resources res (env, params);
2232 Unique<typename Object::Type> obj0 (Object::create(env, res, params));
2233 Unique<typename Object::Type> obj1 (Object::create(env, res, params));
2234 Unique<typename Object::Type> obj2 (Object::create(env, res, params));
2235 Unique<typename Object::Type> obj3 (Object::create(env, res, params));
2238 return tcu::TestStatus::pass("Ok");
2241 template<typename Object>
2242 tcu::TestStatus createMaxConcurrentTest (Context& context, typename Object::Parameters params)
2244 typedef Unique<typename Object::Type> UniqueObject;
2245 typedef SharedPtr<UniqueObject> ObjectPtr;
2247 const deUint32 numObjects = Object::getMaxConcurrent(context, params);
2248 const Environment env (context, numObjects);
2249 const typename Object::Resources res (env, params);
2250 vector<ObjectPtr> objects (numObjects);
2251 const deUint32 watchdogInterval = 1024;
2253 context.getTestContext().getLog()
2254 << TestLog::Message << "Creating " << numObjects << " " << getTypeName<typename Object::Type>() << " objects" << TestLog::EndMessage;
2256 for (deUint32 ndx = 0; ndx < numObjects; ndx++)
2258 objects[ndx] = ObjectPtr(new UniqueObject(Object::create(env, res, params)));
2260 if ((ndx > 0) && ((ndx % watchdogInterval) == 0))
2261 context.getTestContext().touchWatchdog();
2264 context.getTestContext().touchWatchdog();
2267 return tcu::TestStatus::pass("Ok");
2270 // How many objects to create per thread
2271 template<typename Object> int getCreateCount (void) { return 100; }
2273 // Creating VkDevice and VkInstance can take significantly longer than other object types
2274 template<> int getCreateCount<Instance> (void) { return 20; }
2275 template<> int getCreateCount<Device> (void) { return 20; }
2277 template<typename Object>
2278 class CreateThread : public ThreadGroupThread
2281 CreateThread (const Environment& env, const typename Object::Resources& resources, const typename Object::Parameters& params)
2283 , m_resources (resources)
2287 void runThread (void)
2289 const int numIters = getCreateCount<Object>();
2290 const int itersBetweenSyncs = numIters / 5;
2292 DE_ASSERT(itersBetweenSyncs > 0);
2294 for (int iterNdx = 0; iterNdx < numIters; iterNdx++)
2296 // Sync every Nth iteration to make entering driver at the same time more likely
2297 if ((iterNdx % itersBetweenSyncs) == 0)
2301 Unique<typename Object::Type> obj (Object::create(m_env, m_resources, m_params));
2307 const Environment& m_env;
2308 const typename Object::Resources& m_resources;
2309 const typename Object::Parameters& m_params;
2312 template<typename Object>
2313 tcu::TestStatus multithreadedCreateSharedResourcesTest (Context& context, typename Object::Parameters params)
2315 const deUint32 numThreads = getDefaultTestThreadCount();
2316 const Environment env (context, numThreads);
2317 const typename Object::Resources res (env, params);
2318 ThreadGroup threads;
2320 for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2321 threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, res, params)));
2323 return threads.run();
2326 template<typename Object>
2327 tcu::TestStatus multithreadedCreatePerThreadResourcesTest (Context& context, typename Object::Parameters params)
2329 typedef SharedPtr<typename Object::Resources> ResPtr;
2331 const deUint32 numThreads = getDefaultTestThreadCount();
2332 const Environment env (context, 1u);
2333 vector<ResPtr> resources (numThreads);
2334 ThreadGroup threads;
2336 for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2338 resources[ndx] = ResPtr(new typename Object::Resources(env, params));
2339 threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, *resources[ndx], params)));
2342 return threads.run();
2347 Device::Resources deviceRes;
2348 Unique<VkDevice> device;
2352 EnvClone (const Environment& parent, const Device::Parameters& deviceParams, deUint32 maxResourceConsumers)
2353 : deviceRes (parent, deviceParams)
2354 , device (Device::create(parent, deviceRes, deviceParams))
2355 , vkd (deviceRes.vki, *device)
2356 , env (parent.vkp, vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers)
2361 Device::Parameters getDefaulDeviceParameters (Context& context)
2363 return Device::Parameters(context.getTestContext().getCommandLine().getVKDeviceId()-1u,
2364 VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT);
2367 template<typename Object>
2368 tcu::TestStatus multithreadedCreatePerThreadDeviceTest (Context& context, typename Object::Parameters params)
2370 typedef SharedPtr<EnvClone> EnvPtr;
2371 typedef SharedPtr<typename Object::Resources> ResPtr;
2373 const deUint32 numThreads = getDefaultTestThreadCount();
2374 const Device::Parameters deviceParams = getDefaulDeviceParameters(context);
2375 const Environment sharedEnv (context, numThreads); // For creating Device's
2376 vector<EnvPtr> perThreadEnv (numThreads);
2377 vector<ResPtr> resources (numThreads);
2378 ThreadGroup threads;
2380 for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2382 perThreadEnv[ndx] = EnvPtr(new EnvClone(sharedEnv, deviceParams, 1u));
2383 resources[ndx] = ResPtr(new typename Object::Resources(perThreadEnv[ndx]->env, params));
2385 threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(perThreadEnv[ndx]->env, *resources[ndx], params)));
2388 return threads.run();
2391 template<typename Object>
2392 tcu::TestStatus createSingleAllocCallbacksTest (Context& context, typename Object::Parameters params)
2394 const deUint32 noCmdScope = (1u << VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE)
2395 | (1u << VK_SYSTEM_ALLOCATION_SCOPE_DEVICE)
2396 | (1u << VK_SYSTEM_ALLOCATION_SCOPE_CACHE)
2397 | (1u << VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
2399 // Callbacks used by resources
2400 AllocationCallbackRecorder resCallbacks (getSystemAllocator(), 128);
2402 // Root environment still uses default instance and device, created without callbacks
2403 const Environment rootEnv (context.getPlatformInterface(),
2404 context.getDeviceInterface(),
2405 context.getDevice(),
2406 context.getUniversalQueueFamilyIndex(),
2407 context.getBinaryCollection(),
2408 resCallbacks.getCallbacks(),
2412 // Test env has instance & device created with callbacks
2413 const EnvClone resEnv (rootEnv, getDefaulDeviceParameters(context), 1u);
2414 const typename Object::Resources res (resEnv.env, params);
2416 // Supply a separate callback recorder just for object construction
2417 AllocationCallbackRecorder objCallbacks(getSystemAllocator(), 128);
2418 const Environment objEnv (resEnv.env.vkp,
2421 resEnv.env.queueFamilyIndex,
2422 resEnv.env.programBinaries,
2423 objCallbacks.getCallbacks(),
2424 resEnv.env.maxResourceConsumers);
2427 Unique<typename Object::Type> obj (Object::create(objEnv, res, params));
2429 // Validate that no command-level allocations are live
2430 if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, noCmdScope))
2431 return tcu::TestStatus::fail("Invalid allocation callback");
2434 // At this point all allocations made against object callbacks must have been freed
2435 if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, 0u))
2436 return tcu::TestStatus::fail("Invalid allocation callback");
2439 if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u))
2440 return tcu::TestStatus::fail("Invalid allocation callback");
2442 return tcu::TestStatus::pass("Ok");
2445 template<typename Object> deUint32 getOomIterLimit (void) { return 1024; }
2446 template<> deUint32 getOomIterLimit<Device> (void) { return 20; }
2448 template<typename Object>
2449 tcu::TestStatus allocCallbackFailTest (Context& context, typename Object::Parameters params)
2451 AllocationCallbackRecorder resCallbacks (getSystemAllocator(), 128);
2452 const Environment rootEnv (context.getPlatformInterface(),
2453 context.getDeviceInterface(),
2454 context.getDevice(),
2455 context.getUniversalQueueFamilyIndex(),
2456 context.getBinaryCollection(),
2457 resCallbacks.getCallbacks(),
2459 deUint32 numPassingAllocs = 0;
2460 const deUint32 cmdLineIterCount = (deUint32)context.getTestContext().getCommandLine().getTestIterationCount();
2461 const deUint32 maxTries = cmdLineIterCount != 0 ? cmdLineIterCount : getOomIterLimit<Object>();
2464 const EnvClone resEnv (rootEnv, getDefaulDeviceParameters(context), 1u);
2465 const typename Object::Resources res (resEnv.env, params);
2467 // Iterate over test until object allocation succeeds
2468 for (; numPassingAllocs < maxTries; ++numPassingAllocs)
2470 DeterministicFailAllocator objAllocator(getSystemAllocator(),
2471 DeterministicFailAllocator::MODE_COUNT_AND_FAIL,
2473 AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128);
2474 const Environment objEnv (resEnv.env.vkp,
2477 resEnv.env.queueFamilyIndex,
2478 resEnv.env.programBinaries,
2479 recorder.getCallbacks(),
2480 resEnv.env.maxResourceConsumers);
2481 bool createOk = false;
2483 context.getTestContext().getLog()
2485 << "Trying to create object with " << numPassingAllocs << " allocation" << (numPassingAllocs != 1 ? "s" : "") << " passing"
2486 << TestLog::EndMessage;
2490 Unique<typename Object::Type> obj (Object::create(objEnv, res, params));
2493 catch (const vk::OutOfMemoryError& e)
2495 if (e.getError() != VK_ERROR_OUT_OF_HOST_MEMORY)
2497 context.getTestContext().getLog() << e;
2498 return tcu::TestStatus::fail("Got invalid error code");
2502 if (!validateAndLog(context.getTestContext().getLog(), recorder, 0u))
2503 return tcu::TestStatus::fail("Invalid allocation callback");
2507 context.getTestContext().getLog()
2508 << TestLog::Message << "Object construction succeeded! " << TestLog::EndMessage;
2514 if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u))
2515 return tcu::TestStatus::fail("Invalid allocation callback");
2517 if (numPassingAllocs == 0)
2518 return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks not called");
2519 else if (numPassingAllocs == maxTries)
2521 context.getTestContext().getLog()
2522 << TestLog::Message << "WARNING: Maximum iteration count (" << maxTries << ") reached without object construction passing. "
2523 << "OOM testing incomplete, use --deqp-test-iteration-count= to test with higher limit." << TestLog::EndMessage;
2524 return tcu::TestStatus(QP_TEST_RESULT_PASS, "Max iter count reached");
2527 return tcu::TestStatus::pass("Ok");
2530 // Determine whether an API call sets the invalid handles to NULL (true) or leaves them undefined or not modified (false)
2531 template<typename T> inline bool isNullHandleOnAllocationFailure (Context&) { return false; }
2532 template<> inline bool isNullHandleOnAllocationFailure<VkCommandBuffer> (Context& context) { return hasDeviceExtension(context, "VK_KHR_maintenance1"); }
2533 template<> inline bool isNullHandleOnAllocationFailure<VkDescriptorSet> (Context& context) { return hasDeviceExtension(context, "VK_KHR_maintenance1"); }
2534 template<> inline bool isNullHandleOnAllocationFailure<VkPipeline> (Context&) { return true; }
2536 template<typename T> inline bool isPooledObject (void) { return false; };
2537 template<> inline bool isPooledObject<VkCommandBuffer> (void) { return true; };
2538 template<> inline bool isPooledObject<VkDescriptorSet> (void) { return true; };
2540 template<typename Object>
2541 tcu::TestStatus allocCallbackFailMultipleObjectsTest (Context& context, typename Object::Parameters params)
2543 typedef SharedPtr<Move<typename Object::Type> > ObjectTypeSp;
2545 static const deUint32 numObjects = 4;
2546 const bool expectNullHandles = isNullHandleOnAllocationFailure<typename Object::Type>(context);
2547 deUint32 numPassingAllocs = 0;
2550 vector<typename Object::Type> handles (numObjects);
2551 VkResult result = VK_NOT_READY;
2553 for (; numPassingAllocs <= numObjects; ++numPassingAllocs)
2555 ValidateQueryBits::fillBits(handles.begin(), handles.end()); // fill with garbage
2557 // \note We have to use the same allocator for both resource dependencies and the object under test,
2558 // because pooled objects take memory from the pool.
2559 DeterministicFailAllocator objAllocator(getSystemAllocator(), DeterministicFailAllocator::MODE_DO_NOT_COUNT, 0);
2560 AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128);
2561 const Environment objEnv (context.getPlatformInterface(),
2562 context.getDeviceInterface(),
2563 context.getDevice(),
2564 context.getUniversalQueueFamilyIndex(),
2565 context.getBinaryCollection(),
2566 recorder.getCallbacks(),
2569 context.getTestContext().getLog()
2571 << "Trying to create " << numObjects << " objects with " << numPassingAllocs << " allocation" << (numPassingAllocs != 1 ? "s" : "") << " passing"
2572 << TestLog::EndMessage;
2575 const typename Object::Resources res (objEnv, params);
2577 objAllocator.reset(DeterministicFailAllocator::MODE_COUNT_AND_FAIL, numPassingAllocs);
2578 const vector<ObjectTypeSp> scopedHandles = Object::createMultiple(objEnv, res, params, &handles, &result);
2581 if (result == VK_SUCCESS)
2583 context.getTestContext().getLog() << TestLog::Message << "Construction of all objects succeeded! " << TestLog::EndMessage;
2588 if (expectNullHandles)
2590 for (deUint32 nullNdx = numPassingAllocs; nullNdx < numObjects; ++nullNdx)
2592 if (handles[nullNdx] != DE_NULL)
2593 return tcu::TestStatus::fail("Some object handles weren't set to NULL");
2597 if (result != VK_ERROR_OUT_OF_HOST_MEMORY)
2598 return tcu::TestStatus::fail("Got invalid error code: " + de::toString(getResultName(result)));
2600 if (!validateAndLog(context.getTestContext().getLog(), recorder, 0u))
2601 return tcu::TestStatus::fail("Invalid allocation callback");
2606 if (numPassingAllocs == 0)
2608 if (isPooledObject<typename Object::Type>())
2609 return tcu::TestStatus::pass("Not validated: pooled objects didn't seem to use host memory");
2611 return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks not called");
2614 return tcu::TestStatus::pass("Ok");
2617 // Utilities for creating groups
2619 template<typename Object>
2620 struct NamedParameters
2623 typename Object::Parameters parameters;
2626 template<typename Object>
2627 struct CaseDescription
2629 typename FunctionInstance1<typename Object::Parameters>::Function function;
2630 const NamedParameters<Object>* paramsBegin;
2631 const NamedParameters<Object>* paramsEnd;
2634 #define EMPTY_CASE_DESC(OBJECT) \
2635 { (FunctionInstance1<OBJECT::Parameters>::Function)DE_NULL, DE_NULL, DE_NULL }
2637 #define CASE_DESC(FUNCTION, CASES) \
2638 { FUNCTION, DE_ARRAY_BEGIN(CASES), DE_ARRAY_END(CASES) }
2640 struct CaseDescriptions
2642 CaseDescription<Instance> instance;
2643 CaseDescription<Device> device;
2644 CaseDescription<DeviceMemory> deviceMemory;
2645 CaseDescription<Buffer> buffer;
2646 CaseDescription<BufferView> bufferView;
2647 CaseDescription<Image> image;
2648 CaseDescription<ImageView> imageView;
2649 CaseDescription<Semaphore> semaphore;
2650 CaseDescription<Event> event;
2651 CaseDescription<Fence> fence;
2652 CaseDescription<QueryPool> queryPool;
2653 CaseDescription<ShaderModule> shaderModule;
2654 CaseDescription<PipelineCache> pipelineCache;
2655 CaseDescription<PipelineLayout> pipelineLayout;
2656 CaseDescription<RenderPass> renderPass;
2657 CaseDescription<GraphicsPipeline> graphicsPipeline;
2658 CaseDescription<ComputePipeline> computePipeline;
2659 CaseDescription<DescriptorSetLayout> descriptorSetLayout;
2660 CaseDescription<Sampler> sampler;
2661 CaseDescription<DescriptorPool> descriptorPool;
2662 CaseDescription<DescriptorSet> descriptorSet;
2663 CaseDescription<Framebuffer> framebuffer;
2664 CaseDescription<CommandPool> commandPool;
2665 CaseDescription<CommandBuffer> commandBuffer;
2668 template<typename Object>
2669 void addCases (const MovePtr<tcu::TestCaseGroup>& group, const CaseDescription<Object>& cases)
2671 for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur)
2672 addFunctionCase(group.get(), cur->name, "", cases.function, cur->parameters);
2675 template<typename Object>
2676 void addCasesWithProgs (const MovePtr<tcu::TestCaseGroup>& group, const CaseDescription<Object>& cases)
2678 for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur)
2679 addFunctionCaseWithPrograms(group.get(), cur->name, "", Object::initPrograms, cases.function, cur->parameters);
2682 tcu::TestCaseGroup* createGroup (tcu::TestContext& testCtx, const char* name, const char* desc, const CaseDescriptions& cases)
2684 MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, name, desc));
2686 addCases (group, cases.instance);
2687 addCases (group, cases.device);
2688 addCases (group, cases.deviceMemory);
2689 addCases (group, cases.buffer);
2690 addCases (group, cases.bufferView);
2691 addCases (group, cases.image);
2692 addCases (group, cases.imageView);
2693 addCases (group, cases.semaphore);
2694 addCases (group, cases.event);
2695 addCases (group, cases.fence);
2696 addCases (group, cases.queryPool);
2697 addCases (group, cases.sampler);
2698 addCasesWithProgs (group, cases.shaderModule);
2699 addCases (group, cases.pipelineCache);
2700 addCases (group, cases.pipelineLayout);
2701 addCases (group, cases.renderPass);
2702 addCasesWithProgs (group, cases.graphicsPipeline);
2703 addCasesWithProgs (group, cases.computePipeline);
2704 addCases (group, cases.descriptorSetLayout);
2705 addCases (group, cases.descriptorPool);
2706 addCases (group, cases.descriptorSet);
2707 addCases (group, cases.framebuffer);
2708 addCases (group, cases.commandPool);
2709 addCases (group, cases.commandBuffer);
2711 return group.release();
2716 tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
2718 MovePtr<tcu::TestCaseGroup> objectMgmtTests (new tcu::TestCaseGroup(testCtx, "object_management", "Object management tests"));
2720 const Image::Parameters img1D (0u, VK_IMAGE_TYPE_1D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D(256, 1, 1), 1u, 4u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
2721 const Image::Parameters img2D (0u, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D( 64, 64, 1), 1u, 12u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
2722 const Image::Parameters imgCube (VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D( 64, 64, 1), 1u, 12u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
2723 const Image::Parameters img3D (0u, VK_IMAGE_TYPE_3D, VK_FORMAT_R8G8B8A8_UNORM, makeExtent3D( 64, 64, 4), 1u, 1u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_LAYOUT_UNDEFINED);
2724 const ImageView::Parameters imgView1D (img1D, VK_IMAGE_VIEW_TYPE_1D, img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
2725 const ImageView::Parameters imgView1DArr (img1D, VK_IMAGE_VIEW_TYPE_1D_ARRAY, img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 4u));
2726 const ImageView::Parameters imgView2D (img2D, VK_IMAGE_VIEW_TYPE_2D, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
2727 const ImageView::Parameters imgView2DArr (img2D, VK_IMAGE_VIEW_TYPE_2D_ARRAY, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 8u));
2728 const ImageView::Parameters imgViewCube (imgCube, VK_IMAGE_VIEW_TYPE_CUBE, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 6u));
2729 const ImageView::Parameters imgViewCubeArr (imgCube, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 12u));
2730 const ImageView::Parameters imgView3D (img3D, VK_IMAGE_VIEW_TYPE_3D, img3D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
2732 const DescriptorSetLayout::Parameters singleUboDescLayout = DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u, VK_SHADER_STAGE_VERTEX_BIT);
2734 static NamedParameters<Instance> s_instanceCases[] =
2736 { "instance", Instance::Parameters() },
2738 // \note Device index may change - must not be static
2739 const NamedParameters<Device> s_deviceCases[] =
2741 { "device", Device::Parameters(testCtx.getCommandLine().getVKDeviceId()-1u, VK_QUEUE_GRAPHICS_BIT) },
2743 static const NamedParameters<DeviceMemory> s_deviceMemCases[] =
2745 { "device_memory_small", DeviceMemory::Parameters(1024, 0u) },
2747 static const NamedParameters<Buffer> s_bufferCases[] =
2749 { "buffer_uniform_small", Buffer::Parameters(1024u, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT), },
2750 { "buffer_uniform_large", Buffer::Parameters(1024u*1024u*16u, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT), },
2751 { "buffer_storage_small", Buffer::Parameters(1024u, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), },
2752 { "buffer_storage_large", Buffer::Parameters(1024u*1024u*16u, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), },
2754 static const NamedParameters<BufferView> s_bufferViewCases[] =
2756 { "buffer_view_uniform_r8g8b8a8_unorm", BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u) },
2757 { "buffer_view_storage_r8g8b8a8_unorm", BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u) },
2759 static const NamedParameters<Image> s_imageCases[] =
2761 { "image_1d", img1D },
2762 { "image_2d", img2D },
2763 { "image_3d", img3D },
2765 static const NamedParameters<ImageView> s_imageViewCases[] =
2767 { "image_view_1d", imgView1D },
2768 { "image_view_1d_arr", imgView1DArr },
2769 { "image_view_2d", imgView2D },
2770 { "image_view_2d_arr", imgView2DArr },
2771 { "image_view_cube", imgViewCube },
2772 { "image_view_cube_arr", imgViewCubeArr },
2773 { "image_view_3d", imgView3D },
2775 static const NamedParameters<Semaphore> s_semaphoreCases[] =
2777 { "semaphore", Semaphore::Parameters(0u), }
2779 static const NamedParameters<Event> s_eventCases[] =
2781 { "event", Event::Parameters(0u) }
2783 static const NamedParameters<Fence> s_fenceCases[] =
2785 { "fence", Fence::Parameters(0u) },
2786 { "fence_signaled", Fence::Parameters(VK_FENCE_CREATE_SIGNALED_BIT) }
2788 static const NamedParameters<QueryPool> s_queryPoolCases[] =
2790 { "query_pool", QueryPool::Parameters(VK_QUERY_TYPE_OCCLUSION, 1u, 0u) }
2792 static const NamedParameters<ShaderModule> s_shaderModuleCases[] =
2794 { "shader_module", ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "test") }
2796 static const NamedParameters<PipelineCache> s_pipelineCacheCases[] =
2798 { "pipeline_cache", PipelineCache::Parameters() }
2800 static const NamedParameters<PipelineLayout> s_pipelineLayoutCases[] =
2802 { "pipeline_layout_empty", PipelineLayout::Parameters::empty() },
2803 { "pipeline_layout_single", PipelineLayout::Parameters::singleDescriptorSet(singleUboDescLayout) }
2805 static const NamedParameters<RenderPass> s_renderPassCases[] =
2807 { "render_pass", RenderPass::Parameters() }
2809 static const NamedParameters<GraphicsPipeline> s_graphicsPipelineCases[] =
2811 { "graphics_pipeline", GraphicsPipeline::Parameters() }
2813 static const NamedParameters<ComputePipeline> s_computePipelineCases[] =
2815 { "compute_pipeline", ComputePipeline::Parameters() }
2817 static const NamedParameters<DescriptorSetLayout> s_descriptorSetLayoutCases[] =
2819 { "descriptor_set_layout_empty", DescriptorSetLayout::Parameters::empty() },
2820 { "descriptor_set_layout_single", singleUboDescLayout }
2822 static const NamedParameters<Sampler> s_samplerCases[] =
2824 { "sampler", Sampler::Parameters() }
2826 static const NamedParameters<DescriptorPool> s_descriptorPoolCases[] =
2828 { "descriptor_pool", DescriptorPool::Parameters::singleType((VkDescriptorPoolCreateFlags)0, 4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u) },
2829 { "descriptor_pool_free_descriptor_set", DescriptorPool::Parameters::singleType(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u) }
2831 static const NamedParameters<DescriptorSet> s_descriptorSetCases[] =
2833 { "descriptor_set", DescriptorSet::Parameters(singleUboDescLayout) }
2835 static const NamedParameters<Framebuffer> s_framebufferCases[] =
2837 { "framebuffer", Framebuffer::Parameters() }
2839 static const NamedParameters<CommandPool> s_commandPoolCases[] =
2841 { "command_pool", CommandPool::Parameters((VkCommandPoolCreateFlags)0) },
2842 { "command_pool_transient", CommandPool::Parameters(VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) }
2844 static const NamedParameters<CommandBuffer> s_commandBufferCases[] =
2846 { "command_buffer_primary", CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_PRIMARY) },
2847 { "command_buffer_secondary", CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_SECONDARY) }
2850 static const CaseDescriptions s_createSingleGroup =
2852 CASE_DESC(createSingleTest <Instance>, s_instanceCases),
2853 CASE_DESC(createSingleTest <Device>, s_deviceCases),
2854 CASE_DESC(createSingleTest <DeviceMemory>, s_deviceMemCases),
2855 CASE_DESC(createSingleTest <Buffer>, s_bufferCases),
2856 CASE_DESC(createSingleTest <BufferView>, s_bufferViewCases),
2857 CASE_DESC(createSingleTest <Image>, s_imageCases),
2858 CASE_DESC(createSingleTest <ImageView>, s_imageViewCases),
2859 CASE_DESC(createSingleTest <Semaphore>, s_semaphoreCases),
2860 CASE_DESC(createSingleTest <Event>, s_eventCases),
2861 CASE_DESC(createSingleTest <Fence>, s_fenceCases),
2862 CASE_DESC(createSingleTest <QueryPool>, s_queryPoolCases),
2863 CASE_DESC(createSingleTest <ShaderModule>, s_shaderModuleCases),
2864 CASE_DESC(createSingleTest <PipelineCache>, s_pipelineCacheCases),
2865 CASE_DESC(createSingleTest <PipelineLayout>, s_pipelineLayoutCases),
2866 CASE_DESC(createSingleTest <RenderPass>, s_renderPassCases),
2867 CASE_DESC(createSingleTest <GraphicsPipeline>, s_graphicsPipelineCases),
2868 CASE_DESC(createSingleTest <ComputePipeline>, s_computePipelineCases),
2869 CASE_DESC(createSingleTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2870 CASE_DESC(createSingleTest <Sampler>, s_samplerCases),
2871 CASE_DESC(createSingleTest <DescriptorPool>, s_descriptorPoolCases),
2872 CASE_DESC(createSingleTest <DescriptorSet>, s_descriptorSetCases),
2873 CASE_DESC(createSingleTest <Framebuffer>, s_framebufferCases),
2874 CASE_DESC(createSingleTest <CommandPool>, s_commandPoolCases),
2875 CASE_DESC(createSingleTest <CommandBuffer>, s_commandBufferCases),
2877 objectMgmtTests->addChild(createGroup(testCtx, "single", "Create single object", s_createSingleGroup));
2879 static const CaseDescriptions s_createMultipleUniqueResourcesGroup =
2881 CASE_DESC(createMultipleUniqueResourcesTest <Instance>, s_instanceCases),
2882 CASE_DESC(createMultipleUniqueResourcesTest <Device>, s_deviceCases),
2883 CASE_DESC(createMultipleUniqueResourcesTest <DeviceMemory>, s_deviceMemCases),
2884 CASE_DESC(createMultipleUniqueResourcesTest <Buffer>, s_bufferCases),
2885 CASE_DESC(createMultipleUniqueResourcesTest <BufferView>, s_bufferViewCases),
2886 CASE_DESC(createMultipleUniqueResourcesTest <Image>, s_imageCases),
2887 CASE_DESC(createMultipleUniqueResourcesTest <ImageView>, s_imageViewCases),
2888 CASE_DESC(createMultipleUniqueResourcesTest <Semaphore>, s_semaphoreCases),
2889 CASE_DESC(createMultipleUniqueResourcesTest <Event>, s_eventCases),
2890 CASE_DESC(createMultipleUniqueResourcesTest <Fence>, s_fenceCases),
2891 CASE_DESC(createMultipleUniqueResourcesTest <QueryPool>, s_queryPoolCases),
2892 CASE_DESC(createMultipleUniqueResourcesTest <ShaderModule>, s_shaderModuleCases),
2893 CASE_DESC(createMultipleUniqueResourcesTest <PipelineCache>, s_pipelineCacheCases),
2894 CASE_DESC(createMultipleUniqueResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
2895 CASE_DESC(createMultipleUniqueResourcesTest <RenderPass>, s_renderPassCases),
2896 CASE_DESC(createMultipleUniqueResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
2897 CASE_DESC(createMultipleUniqueResourcesTest <ComputePipeline>, s_computePipelineCases),
2898 CASE_DESC(createMultipleUniqueResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2899 CASE_DESC(createMultipleUniqueResourcesTest <Sampler>, s_samplerCases),
2900 CASE_DESC(createMultipleUniqueResourcesTest <DescriptorPool>, s_descriptorPoolCases),
2901 CASE_DESC(createMultipleUniqueResourcesTest <DescriptorSet>, s_descriptorSetCases),
2902 CASE_DESC(createMultipleUniqueResourcesTest <Framebuffer>, s_framebufferCases),
2903 CASE_DESC(createMultipleUniqueResourcesTest <CommandPool>, s_commandPoolCases),
2904 CASE_DESC(createMultipleUniqueResourcesTest <CommandBuffer>, s_commandBufferCases),
2906 objectMgmtTests->addChild(createGroup(testCtx, "multiple_unique_resources", "Multiple objects with per-object unique resources", s_createMultipleUniqueResourcesGroup));
2908 static const CaseDescriptions s_createMultipleSharedResourcesGroup =
2910 EMPTY_CASE_DESC(Instance), // No resources used
2911 CASE_DESC(createMultipleSharedResourcesTest <Device>, s_deviceCases),
2912 CASE_DESC(createMultipleSharedResourcesTest <DeviceMemory>, s_deviceMemCases),
2913 CASE_DESC(createMultipleSharedResourcesTest <Buffer>, s_bufferCases),
2914 CASE_DESC(createMultipleSharedResourcesTest <BufferView>, s_bufferViewCases),
2915 CASE_DESC(createMultipleSharedResourcesTest <Image>, s_imageCases),
2916 CASE_DESC(createMultipleSharedResourcesTest <ImageView>, s_imageViewCases),
2917 CASE_DESC(createMultipleSharedResourcesTest <Semaphore>, s_semaphoreCases),
2918 CASE_DESC(createMultipleSharedResourcesTest <Event>, s_eventCases),
2919 CASE_DESC(createMultipleSharedResourcesTest <Fence>, s_fenceCases),
2920 CASE_DESC(createMultipleSharedResourcesTest <QueryPool>, s_queryPoolCases),
2921 CASE_DESC(createMultipleSharedResourcesTest <ShaderModule>, s_shaderModuleCases),
2922 CASE_DESC(createMultipleSharedResourcesTest <PipelineCache>, s_pipelineCacheCases),
2923 CASE_DESC(createMultipleSharedResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
2924 CASE_DESC(createMultipleSharedResourcesTest <RenderPass>, s_renderPassCases),
2925 CASE_DESC(createMultipleSharedResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
2926 CASE_DESC(createMultipleSharedResourcesTest <ComputePipeline>, s_computePipelineCases),
2927 CASE_DESC(createMultipleSharedResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2928 CASE_DESC(createMultipleSharedResourcesTest <Sampler>, s_samplerCases),
2929 CASE_DESC(createMultipleSharedResourcesTest <DescriptorPool>, s_descriptorPoolCases),
2930 CASE_DESC(createMultipleSharedResourcesTest <DescriptorSet>, s_descriptorSetCases),
2931 CASE_DESC(createMultipleSharedResourcesTest <Framebuffer>, s_framebufferCases),
2932 CASE_DESC(createMultipleSharedResourcesTest <CommandPool>, s_commandPoolCases),
2933 CASE_DESC(createMultipleSharedResourcesTest <CommandBuffer>, s_commandBufferCases),
2935 objectMgmtTests->addChild(createGroup(testCtx, "multiple_shared_resources", "Multiple objects with shared resources", s_createMultipleSharedResourcesGroup));
2937 static const CaseDescriptions s_createMaxConcurrentGroup =
2939 CASE_DESC(createMaxConcurrentTest <Instance>, s_instanceCases),
2940 CASE_DESC(createMaxConcurrentTest <Device>, s_deviceCases),
2941 CASE_DESC(createMaxConcurrentTest <DeviceMemory>, s_deviceMemCases),
2942 CASE_DESC(createMaxConcurrentTest <Buffer>, s_bufferCases),
2943 CASE_DESC(createMaxConcurrentTest <BufferView>, s_bufferViewCases),
2944 CASE_DESC(createMaxConcurrentTest <Image>, s_imageCases),
2945 CASE_DESC(createMaxConcurrentTest <ImageView>, s_imageViewCases),
2946 CASE_DESC(createMaxConcurrentTest <Semaphore>, s_semaphoreCases),
2947 CASE_DESC(createMaxConcurrentTest <Event>, s_eventCases),
2948 CASE_DESC(createMaxConcurrentTest <Fence>, s_fenceCases),
2949 CASE_DESC(createMaxConcurrentTest <QueryPool>, s_queryPoolCases),
2950 CASE_DESC(createMaxConcurrentTest <ShaderModule>, s_shaderModuleCases),
2951 CASE_DESC(createMaxConcurrentTest <PipelineCache>, s_pipelineCacheCases),
2952 CASE_DESC(createMaxConcurrentTest <PipelineLayout>, s_pipelineLayoutCases),
2953 CASE_DESC(createMaxConcurrentTest <RenderPass>, s_renderPassCases),
2954 CASE_DESC(createMaxConcurrentTest <GraphicsPipeline>, s_graphicsPipelineCases),
2955 CASE_DESC(createMaxConcurrentTest <ComputePipeline>, s_computePipelineCases),
2956 CASE_DESC(createMaxConcurrentTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2957 CASE_DESC(createMaxConcurrentTest <Sampler>, s_samplerCases),
2958 CASE_DESC(createMaxConcurrentTest <DescriptorPool>, s_descriptorPoolCases),
2959 CASE_DESC(createMaxConcurrentTest <DescriptorSet>, s_descriptorSetCases),
2960 CASE_DESC(createMaxConcurrentTest <Framebuffer>, s_framebufferCases),
2961 CASE_DESC(createMaxConcurrentTest <CommandPool>, s_commandPoolCases),
2962 CASE_DESC(createMaxConcurrentTest <CommandBuffer>, s_commandBufferCases),
2964 objectMgmtTests->addChild(createGroup(testCtx, "max_concurrent", "Maximum number of concurrently live objects", s_createMaxConcurrentGroup));
2966 static const CaseDescriptions s_multithreadedCreatePerThreadDeviceGroup =
2968 EMPTY_CASE_DESC(Instance), // Does not make sense
2969 EMPTY_CASE_DESC(Device), // Does not make sense
2970 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DeviceMemory>, s_deviceMemCases),
2971 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Buffer>, s_bufferCases),
2972 CASE_DESC(multithreadedCreatePerThreadDeviceTest <BufferView>, s_bufferViewCases),
2973 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Image>, s_imageCases),
2974 CASE_DESC(multithreadedCreatePerThreadDeviceTest <ImageView>, s_imageViewCases),
2975 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Semaphore>, s_semaphoreCases),
2976 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Event>, s_eventCases),
2977 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Fence>, s_fenceCases),
2978 CASE_DESC(multithreadedCreatePerThreadDeviceTest <QueryPool>, s_queryPoolCases),
2979 CASE_DESC(multithreadedCreatePerThreadDeviceTest <ShaderModule>, s_shaderModuleCases),
2980 CASE_DESC(multithreadedCreatePerThreadDeviceTest <PipelineCache>, s_pipelineCacheCases),
2981 CASE_DESC(multithreadedCreatePerThreadDeviceTest <PipelineLayout>, s_pipelineLayoutCases),
2982 CASE_DESC(multithreadedCreatePerThreadDeviceTest <RenderPass>, s_renderPassCases),
2983 CASE_DESC(multithreadedCreatePerThreadDeviceTest <GraphicsPipeline>, s_graphicsPipelineCases),
2984 CASE_DESC(multithreadedCreatePerThreadDeviceTest <ComputePipeline>, s_computePipelineCases),
2985 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2986 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Sampler>, s_samplerCases),
2987 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorPool>, s_descriptorPoolCases),
2988 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorSet>, s_descriptorSetCases),
2989 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Framebuffer>, s_framebufferCases),
2990 CASE_DESC(multithreadedCreatePerThreadDeviceTest <CommandPool>, s_commandPoolCases),
2991 CASE_DESC(multithreadedCreatePerThreadDeviceTest <CommandBuffer>, s_commandBufferCases),
2993 objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_device", "Multithreaded object construction with per-thread device ", s_multithreadedCreatePerThreadDeviceGroup));
2995 static const CaseDescriptions s_multithreadedCreatePerThreadResourcesGroup =
2997 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Instance>, s_instanceCases),
2998 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Device>, s_deviceCases),
2999 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DeviceMemory>, s_deviceMemCases),
3000 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Buffer>, s_bufferCases),
3001 CASE_DESC(multithreadedCreatePerThreadResourcesTest <BufferView>, s_bufferViewCases),
3002 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Image>, s_imageCases),
3003 CASE_DESC(multithreadedCreatePerThreadResourcesTest <ImageView>, s_imageViewCases),
3004 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Semaphore>, s_semaphoreCases),
3005 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Event>, s_eventCases),
3006 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Fence>, s_fenceCases),
3007 CASE_DESC(multithreadedCreatePerThreadResourcesTest <QueryPool>, s_queryPoolCases),
3008 CASE_DESC(multithreadedCreatePerThreadResourcesTest <ShaderModule>, s_shaderModuleCases),
3009 CASE_DESC(multithreadedCreatePerThreadResourcesTest <PipelineCache>, s_pipelineCacheCases),
3010 CASE_DESC(multithreadedCreatePerThreadResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
3011 CASE_DESC(multithreadedCreatePerThreadResourcesTest <RenderPass>, s_renderPassCases),
3012 CASE_DESC(multithreadedCreatePerThreadResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
3013 CASE_DESC(multithreadedCreatePerThreadResourcesTest <ComputePipeline>, s_computePipelineCases),
3014 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
3015 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Sampler>, s_samplerCases),
3016 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorPool>, s_descriptorPoolCases),
3017 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorSet>, s_descriptorSetCases),
3018 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Framebuffer>, s_framebufferCases),
3019 CASE_DESC(multithreadedCreatePerThreadResourcesTest <CommandPool>, s_commandPoolCases),
3020 CASE_DESC(multithreadedCreatePerThreadResourcesTest <CommandBuffer>, s_commandBufferCases),
3022 objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_resources", "Multithreaded object construction with per-thread resources", s_multithreadedCreatePerThreadResourcesGroup));
3024 static const CaseDescriptions s_multithreadedCreateSharedResourcesGroup =
3026 EMPTY_CASE_DESC(Instance),
3027 CASE_DESC(multithreadedCreateSharedResourcesTest <Device>, s_deviceCases),
3028 CASE_DESC(multithreadedCreateSharedResourcesTest <DeviceMemory>, s_deviceMemCases),
3029 CASE_DESC(multithreadedCreateSharedResourcesTest <Buffer>, s_bufferCases),
3030 CASE_DESC(multithreadedCreateSharedResourcesTest <BufferView>, s_bufferViewCases),
3031 CASE_DESC(multithreadedCreateSharedResourcesTest <Image>, s_imageCases),
3032 CASE_DESC(multithreadedCreateSharedResourcesTest <ImageView>, s_imageViewCases),
3033 CASE_DESC(multithreadedCreateSharedResourcesTest <Semaphore>, s_semaphoreCases),
3034 CASE_DESC(multithreadedCreateSharedResourcesTest <Event>, s_eventCases),
3035 CASE_DESC(multithreadedCreateSharedResourcesTest <Fence>, s_fenceCases),
3036 CASE_DESC(multithreadedCreateSharedResourcesTest <QueryPool>, s_queryPoolCases),
3037 CASE_DESC(multithreadedCreateSharedResourcesTest <ShaderModule>, s_shaderModuleCases),
3038 CASE_DESC(multithreadedCreateSharedResourcesTest <PipelineCache>, s_pipelineCacheCases),
3039 CASE_DESC(multithreadedCreateSharedResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
3040 CASE_DESC(multithreadedCreateSharedResourcesTest <RenderPass>, s_renderPassCases),
3041 CASE_DESC(multithreadedCreateSharedResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
3042 CASE_DESC(multithreadedCreateSharedResourcesTest <ComputePipeline>, s_computePipelineCases),
3043 CASE_DESC(multithreadedCreateSharedResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
3044 CASE_DESC(multithreadedCreateSharedResourcesTest <Sampler>, s_samplerCases),
3045 CASE_DESC(multithreadedCreateSharedResourcesTest <DescriptorPool>, s_descriptorPoolCases),
3046 EMPTY_CASE_DESC(DescriptorSet), // \note Needs per-thread DescriptorPool
3047 CASE_DESC(multithreadedCreateSharedResourcesTest <Framebuffer>, s_framebufferCases),
3048 CASE_DESC(multithreadedCreateSharedResourcesTest <CommandPool>, s_commandPoolCases),
3049 EMPTY_CASE_DESC(CommandBuffer), // \note Needs per-thread CommandPool
3051 objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_shared_resources", "Multithreaded object construction with shared resources", s_multithreadedCreateSharedResourcesGroup));
3053 static const CaseDescriptions s_createSingleAllocCallbacksGroup =
3055 CASE_DESC(createSingleAllocCallbacksTest <Instance>, s_instanceCases),
3056 CASE_DESC(createSingleAllocCallbacksTest <Device>, s_deviceCases),
3057 CASE_DESC(createSingleAllocCallbacksTest <DeviceMemory>, s_deviceMemCases),
3058 CASE_DESC(createSingleAllocCallbacksTest <Buffer>, s_bufferCases),
3059 CASE_DESC(createSingleAllocCallbacksTest <BufferView>, s_bufferViewCases),
3060 CASE_DESC(createSingleAllocCallbacksTest <Image>, s_imageCases),
3061 CASE_DESC(createSingleAllocCallbacksTest <ImageView>, s_imageViewCases),
3062 CASE_DESC(createSingleAllocCallbacksTest <Semaphore>, s_semaphoreCases),
3063 CASE_DESC(createSingleAllocCallbacksTest <Event>, s_eventCases),
3064 CASE_DESC(createSingleAllocCallbacksTest <Fence>, s_fenceCases),
3065 CASE_DESC(createSingleAllocCallbacksTest <QueryPool>, s_queryPoolCases),
3066 CASE_DESC(createSingleAllocCallbacksTest <ShaderModule>, s_shaderModuleCases),
3067 CASE_DESC(createSingleAllocCallbacksTest <PipelineCache>, s_pipelineCacheCases),
3068 CASE_DESC(createSingleAllocCallbacksTest <PipelineLayout>, s_pipelineLayoutCases),
3069 CASE_DESC(createSingleAllocCallbacksTest <RenderPass>, s_renderPassCases),
3070 CASE_DESC(createSingleAllocCallbacksTest <GraphicsPipeline>, s_graphicsPipelineCases),
3071 CASE_DESC(createSingleAllocCallbacksTest <ComputePipeline>, s_computePipelineCases),
3072 CASE_DESC(createSingleAllocCallbacksTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
3073 CASE_DESC(createSingleAllocCallbacksTest <Sampler>, s_samplerCases),
3074 CASE_DESC(createSingleAllocCallbacksTest <DescriptorPool>, s_descriptorPoolCases),
3075 CASE_DESC(createSingleAllocCallbacksTest <DescriptorSet>, s_descriptorSetCases),
3076 CASE_DESC(createSingleAllocCallbacksTest <Framebuffer>, s_framebufferCases),
3077 CASE_DESC(createSingleAllocCallbacksTest <CommandPool>, s_commandPoolCases),
3078 CASE_DESC(createSingleAllocCallbacksTest <CommandBuffer>, s_commandBufferCases),
3080 objectMgmtTests->addChild(createGroup(testCtx, "single_alloc_callbacks", "Create single object", s_createSingleAllocCallbacksGroup));
3082 // \note Skip pooled objects in this test group. They are properly handled by the "multiple" group farther down below.
3083 static const CaseDescriptions s_allocCallbackFailGroup =
3085 CASE_DESC(allocCallbackFailTest <Instance>, s_instanceCases),
3086 CASE_DESC(allocCallbackFailTest <Device>, s_deviceCases),
3087 CASE_DESC(allocCallbackFailTest <DeviceMemory>, s_deviceMemCases),
3088 CASE_DESC(allocCallbackFailTest <Buffer>, s_bufferCases),
3089 CASE_DESC(allocCallbackFailTest <BufferView>, s_bufferViewCases),
3090 CASE_DESC(allocCallbackFailTest <Image>, s_imageCases),
3091 CASE_DESC(allocCallbackFailTest <ImageView>, s_imageViewCases),
3092 CASE_DESC(allocCallbackFailTest <Semaphore>, s_semaphoreCases),
3093 CASE_DESC(allocCallbackFailTest <Event>, s_eventCases),
3094 CASE_DESC(allocCallbackFailTest <Fence>, s_fenceCases),
3095 CASE_DESC(allocCallbackFailTest <QueryPool>, s_queryPoolCases),
3096 CASE_DESC(allocCallbackFailTest <ShaderModule>, s_shaderModuleCases),
3097 CASE_DESC(allocCallbackFailTest <PipelineCache>, s_pipelineCacheCases),
3098 CASE_DESC(allocCallbackFailTest <PipelineLayout>, s_pipelineLayoutCases),
3099 CASE_DESC(allocCallbackFailTest <RenderPass>, s_renderPassCases),
3100 CASE_DESC(allocCallbackFailTest <GraphicsPipeline>, s_graphicsPipelineCases),
3101 CASE_DESC(allocCallbackFailTest <ComputePipeline>, s_computePipelineCases),
3102 CASE_DESC(allocCallbackFailTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
3103 CASE_DESC(allocCallbackFailTest <Sampler>, s_samplerCases),
3104 CASE_DESC(allocCallbackFailTest <DescriptorPool>, s_descriptorPoolCases),
3105 EMPTY_CASE_DESC(DescriptorSet),
3106 CASE_DESC(allocCallbackFailTest <Framebuffer>, s_framebufferCases),
3107 CASE_DESC(allocCallbackFailTest <CommandPool>, s_commandPoolCases),
3108 EMPTY_CASE_DESC(CommandBuffer),
3110 objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail", "Allocation callback failure", s_allocCallbackFailGroup));
3112 // \note Test objects that can be created in bulk
3113 static const CaseDescriptions s_allocCallbackFailMultipleObjectsGroup =
3115 EMPTY_CASE_DESC(Instance), // most objects can be created one at a time only
3116 EMPTY_CASE_DESC(Device),
3117 EMPTY_CASE_DESC(DeviceMemory),
3118 EMPTY_CASE_DESC(Buffer),
3119 EMPTY_CASE_DESC(BufferView),
3120 EMPTY_CASE_DESC(Image),
3121 EMPTY_CASE_DESC(ImageView),
3122 EMPTY_CASE_DESC(Semaphore),
3123 EMPTY_CASE_DESC(Event),
3124 EMPTY_CASE_DESC(Fence),
3125 EMPTY_CASE_DESC(QueryPool),
3126 EMPTY_CASE_DESC(ShaderModule),
3127 EMPTY_CASE_DESC(PipelineCache),
3128 EMPTY_CASE_DESC(PipelineLayout),
3129 EMPTY_CASE_DESC(RenderPass),
3130 CASE_DESC(allocCallbackFailMultipleObjectsTest <GraphicsPipeline>, s_graphicsPipelineCases),
3131 CASE_DESC(allocCallbackFailMultipleObjectsTest <ComputePipeline>, s_computePipelineCases),
3132 EMPTY_CASE_DESC(DescriptorSetLayout),
3133 EMPTY_CASE_DESC(Sampler),
3134 EMPTY_CASE_DESC(DescriptorPool),
3135 CASE_DESC(allocCallbackFailMultipleObjectsTest <DescriptorSet>, s_descriptorSetCases),
3136 EMPTY_CASE_DESC(Framebuffer),
3137 EMPTY_CASE_DESC(CommandPool),
3138 CASE_DESC(allocCallbackFailMultipleObjectsTest <CommandBuffer>, s_commandBufferCases),
3140 objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail_multiple", "Allocation callback failure creating multiple objects with one call", s_allocCallbackFailMultipleObjectsGroup));
3142 return objectMgmtTests.release();