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 class ThreadGroupThread;
78 /*--------------------------------------------------------------------*//*!
81 * Thread group manages collection of threads that are expected to be
82 * launched simultaneously as a group.
84 * Shared barrier is provided for synchronizing execution. Terminating thread
85 * early either by returning from ThreadGroupThread::runThread() or throwing
86 * an exception is safe, and other threads will continue execution. The
87 * thread that has been terminated is simply removed from the synchronization
90 * TestException-based exceptions are collected and translated into a
91 * tcu::TestStatus by using tcu::ResultCollector.
93 * Use cases for ThreadGroup include for example testing thread-safety of
94 * certain API operations by poking API simultaneously from multiple
96 *//*--------------------------------------------------------------------*/
103 void add (de::MovePtr<ThreadGroupThread> thread);
104 TestStatus run (void);
107 typedef std::vector<de::SharedPtr<ThreadGroupThread> > ThreadVector;
109 ThreadVector m_threads;
110 de::SpinBarrier m_barrier;
111 } DE_WARN_UNUSED_TYPE;
113 class ThreadGroupThread : private de::Thread
116 ThreadGroupThread (void);
117 virtual ~ThreadGroupThread (void);
119 void start (de::SpinBarrier* groupBarrier);
121 ResultCollector& getResultCollector (void) { return m_resultCollector; }
123 using de::Thread::join;
126 virtual void runThread (void) = 0;
131 ThreadGroupThread (const ThreadGroupThread&);
132 ThreadGroupThread& operator= (const ThreadGroupThread&);
136 ResultCollector m_resultCollector;
137 de::SpinBarrier* m_barrier;
142 ThreadGroup::ThreadGroup (void)
147 ThreadGroup::~ThreadGroup (void)
151 void ThreadGroup::add (de::MovePtr<ThreadGroupThread> thread)
153 m_threads.push_back(de::SharedPtr<ThreadGroupThread>(thread.release()));
156 tcu::TestStatus ThreadGroup::run (void)
158 tcu::ResultCollector resultCollector;
160 m_barrier.reset((int)m_threads.size());
162 for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter)
163 (*threadIter)->start(&m_barrier);
165 for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter)
167 tcu::ResultCollector& threadResult = (*threadIter)->getResultCollector();
168 (*threadIter)->join();
169 resultCollector.addResult(threadResult.getResult(), threadResult.getMessage());
172 return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage());
177 ThreadGroupThread::ThreadGroupThread (void)
182 ThreadGroupThread::~ThreadGroupThread (void)
186 void ThreadGroupThread::start (de::SpinBarrier* groupBarrier)
188 m_barrier = groupBarrier;
192 void ThreadGroupThread::run (void)
198 catch (const tcu::TestException& e)
200 getResultCollector().addResult(e.getTestResult(), e.getMessage());
202 catch (const std::exception& e)
204 getResultCollector().addResult(QP_TEST_RESULT_FAIL, e.what());
208 getResultCollector().addResult(QP_TEST_RESULT_FAIL, "Exception");
211 m_barrier->removeThread(de::SpinBarrier::WAIT_MODE_AUTO);
214 inline void ThreadGroupThread::barrier (void)
216 m_barrier->sync(de::SpinBarrier::WAIT_MODE_AUTO);
219 deUint32 getDefaultTestThreadCount (void)
221 return de::clamp(deGetNumAvailableLogicalCores(), 2u, 8u);
228 const PlatformInterface& vkp;
229 const DeviceInterface& vkd;
231 deUint32 queueFamilyIndex;
232 const BinaryCollection& programBinaries;
233 const VkAllocationCallbacks* allocationCallbacks;
234 deUint32 maxResourceConsumers; // Maximum number of objects using same Object::Resources concurrently
236 Environment (Context& context, deUint32 maxResourceConsumers_)
237 : vkp (context.getPlatformInterface())
238 , vkd (context.getDeviceInterface())
239 , device (context.getDevice())
240 , queueFamilyIndex (context.getUniversalQueueFamilyIndex())
241 , programBinaries (context.getBinaryCollection())
242 , allocationCallbacks (DE_NULL)
243 , maxResourceConsumers (maxResourceConsumers_)
247 Environment (const PlatformInterface& vkp_,
248 const DeviceInterface& vkd_,
250 deUint32 queueFamilyIndex_,
251 const BinaryCollection& programBinaries_,
252 const VkAllocationCallbacks* allocationCallbacks_,
253 deUint32 maxResourceConsumers_)
257 , queueFamilyIndex (queueFamilyIndex_)
258 , programBinaries (programBinaries_)
259 , allocationCallbacks (allocationCallbacks_)
260 , maxResourceConsumers (maxResourceConsumers_)
265 template<typename Case>
268 typename Case::Resources resources;
269 Unique<typename Case::Type> object;
271 Dependency (const Environment& env, const typename Case::Parameters& params)
272 : resources (env, params)
273 , object (Case::create(env, resources, params))
278 T roundUpToNextMultiple (T value, T multiple)
280 if (value % multiple == 0)
283 return value + multiple - (value % multiple);
286 #if defined(DE_DEBUG)
288 bool isPowerOfTwo (T value)
290 return ((value & (value - T(1))) == 0);
295 T alignToPowerOfTwo (T value, T align)
297 DE_ASSERT(isPowerOfTwo(align));
298 return (value + align - T(1)) & ~(align - T(1));
301 VkDeviceSize getPageTableSize (const PlatformMemoryLimits& limits, VkDeviceSize allocationSize)
303 VkDeviceSize totalSize = 0;
305 for (size_t levelNdx = 0; levelNdx < limits.devicePageTableHierarchyLevels; ++levelNdx)
307 const VkDeviceSize coveredAddressSpaceSize = limits.devicePageSize<<levelNdx;
308 const VkDeviceSize numPagesNeeded = alignToPowerOfTwo(allocationSize, coveredAddressSpaceSize) / coveredAddressSpaceSize;
310 totalSize += numPagesNeeded*limits.devicePageTableEntrySize;
318 size_t getCurrentSystemMemoryUsage (const AllocationCallbackRecorder& allocRecoder)
320 const size_t systemAllocationOverhead = sizeof(void*)*2;
321 AllocationCallbackValidationResults validationResults;
323 validateAllocationCallbacks(allocRecoder, &validationResults);
324 TCU_CHECK(validationResults.violations.empty());
326 return getLiveSystemAllocationTotal(validationResults) + systemAllocationOverhead*validationResults.liveAllocations.size();
329 template<typename Object>
330 size_t computeSystemMemoryUsage (Context& context, const typename Object::Parameters& params)
332 AllocationCallbackRecorder allocRecorder (getSystemAllocator());
333 const Environment env (context.getPlatformInterface(),
334 context.getDeviceInterface(),
336 context.getUniversalQueueFamilyIndex(),
337 context.getBinaryCollection(),
338 allocRecorder.getCallbacks(),
340 const typename Object::Resources res (env, params);
341 const size_t resourceMemoryUsage = getCurrentSystemMemoryUsage(allocRecorder);
344 Unique<typename Object::Type> obj (Object::create(env, res, params));
345 const size_t totalMemoryUsage = getCurrentSystemMemoryUsage(allocRecorder);
347 return totalMemoryUsage - resourceMemoryUsage;
351 size_t getSafeObjectCount (const PlatformMemoryLimits& memoryLimits,
352 size_t objectSystemMemoryUsage,
353 VkDeviceSize objectDeviceMemoryUsage = 0)
355 const VkDeviceSize roundedUpDeviceMemory = roundUpToNextMultiple(objectDeviceMemoryUsage, memoryLimits.deviceMemoryAllocationGranularity);
357 if (memoryLimits.totalDeviceLocalMemory > 0 && roundedUpDeviceMemory > 0)
359 if (objectSystemMemoryUsage > 0)
360 return de::min(memoryLimits.totalSystemMemory / objectSystemMemoryUsage,
361 (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory));
363 return (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory);
365 else if (objectSystemMemoryUsage + roundedUpDeviceMemory > 0)
367 DE_ASSERT(roundedUpDeviceMemory <= std::numeric_limits<size_t>::max() - objectSystemMemoryUsage);
368 return memoryLimits.totalSystemMemory / (objectSystemMemoryUsage + (size_t)roundedUpDeviceMemory);
372 // Warning: at this point driver has probably not implemented allocation callbacks correctly
373 return std::numeric_limits<size_t>::max();
377 PlatformMemoryLimits getPlatformMemoryLimits (Context& context)
379 PlatformMemoryLimits memoryLimits;
381 context.getTestContext().getPlatform().getVulkanPlatform().getMemoryLimits(memoryLimits);
386 size_t getSafeObjectCount (Context& context, size_t objectSystemMemoryUsage, VkDeviceSize objectDeviceMemorySize = 0)
388 return getSafeObjectCount(getPlatformMemoryLimits(context), objectSystemMemoryUsage, objectDeviceMemorySize);
391 VkDeviceSize getPageTableSize (Context& context, VkDeviceSize allocationSize)
393 return getPageTableSize(getPlatformMemoryLimits(context), allocationSize);
396 template<typename Object>
397 deUint32 getSafeObjectCount (Context& context,
398 const typename Object::Parameters& params,
399 deUint32 hardCountLimit,
400 VkDeviceSize deviceMemoryUsage = 0)
402 return (deUint32)de::min((size_t)hardCountLimit,
403 getSafeObjectCount(context,
404 computeSystemMemoryUsage<Object>(context, params),
408 // Object definitions
412 MAX_CONCURRENT_INSTANCES = 32,
413 MAX_CONCURRENT_DEVICES = 32,
414 MAX_CONCURRENT_SYNC_PRIMITIVES = 100,
415 DEFAULT_MAX_CONCURRENT_OBJECTS = 16*1024,
420 typedef VkInstance Type;
429 Resources (const Environment&, const Parameters&) {}
432 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
434 return getSafeObjectCount<Instance>(context, params, MAX_CONCURRENT_INSTANCES);
437 static Move<VkInstance> create (const Environment& env, const Resources&, const Parameters&)
439 const VkApplicationInfo appInfo =
441 VK_STRUCTURE_TYPE_APPLICATION_INFO,
443 DE_NULL, // pApplicationName
444 0u, // applicationVersion
445 DE_NULL, // pEngineName
447 VK_MAKE_VERSION(1,0,0)
449 const VkInstanceCreateInfo instanceInfo =
451 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
453 (VkInstanceCreateFlags)0,
455 0u, // enabledLayerNameCount
456 DE_NULL, // ppEnabledLayerNames
457 0u, // enabledExtensionNameCount
458 DE_NULL, // ppEnabledExtensionNames
461 return createInstance(env.vkp, &instanceInfo, env.allocationCallbacks);
467 typedef VkDevice Type;
471 deUint32 deviceIndex;
472 VkQueueFlags queueFlags;
474 Parameters (deUint32 deviceIndex_, VkQueueFlags queueFlags_)
475 : deviceIndex (deviceIndex_)
476 , queueFlags (queueFlags_)
482 Dependency<Instance> instance;
484 VkPhysicalDevice physicalDevice;
485 deUint32 queueFamilyIndex;
487 Resources (const Environment& env, const Parameters& params)
488 : instance (env, Instance::Parameters())
489 , vki (env.vkp, *instance.object)
491 , queueFamilyIndex (~0u)
494 const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(vki, *instance.object);
496 if (physicalDevices.size() <= (size_t)params.deviceIndex)
497 TCU_THROW(NotSupportedError, "Device not found");
499 physicalDevice = physicalDevices[params.deviceIndex];
503 const vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice);
504 bool foundMatching = false;
506 for (size_t curQueueNdx = 0; curQueueNdx < queueProps.size(); curQueueNdx++)
508 if ((queueProps[curQueueNdx].queueFlags & params.queueFlags) == params.queueFlags)
510 queueFamilyIndex = (deUint32)curQueueNdx;
511 foundMatching = true;
516 TCU_THROW(NotSupportedError, "Matching queue not found");
521 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
523 return getSafeObjectCount<Device>(context, params, MAX_CONCURRENT_DEVICES);
526 static Move<VkDevice> create (const Environment& env, const Resources& res, const Parameters&)
528 const float queuePriority = 1.0;
530 const VkDeviceQueueCreateInfo queues[] =
533 VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
535 (VkDeviceQueueCreateFlags)0,
536 res.queueFamilyIndex,
538 &queuePriority, // pQueuePriorities
541 const VkDeviceCreateInfo deviceInfo =
543 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
545 (VkDeviceCreateFlags)0,
546 DE_LENGTH_OF_ARRAY(queues),
548 0u, // enabledLayerNameCount
549 DE_NULL, // ppEnabledLayerNames
550 0u, // enabledExtensionNameCount
551 DE_NULL, // ppEnabledExtensionNames
552 DE_NULL, // pEnabledFeatures
555 return createDevice(res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks);
561 typedef VkDeviceMemory Type;
566 deUint32 memoryTypeIndex;
568 Parameters (VkDeviceSize size_, deUint32 memoryTypeIndex_)
570 , memoryTypeIndex (memoryTypeIndex_)
572 DE_ASSERT(memoryTypeIndex < VK_MAX_MEMORY_TYPES);
578 Resources (const Environment&, const Parameters&) {}
581 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
583 const VkDeviceSize deviceMemoryUsage = params.size + getPageTableSize(context, params.size);
585 return getSafeObjectCount<DeviceMemory>(context,
587 de::min(context.getDeviceProperties().limits.maxMemoryAllocationCount,
588 (deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS),
592 static Move<VkDeviceMemory> create (const Environment& env, const Resources&, const Parameters& params)
594 const VkMemoryAllocateInfo allocInfo =
596 VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
599 params.memoryTypeIndex
602 return allocateMemory(env.vkd, env.device, &allocInfo, env.allocationCallbacks);
606 DeviceMemory::Parameters getDeviceMemoryParameters (const VkMemoryRequirements& memReqs)
608 return DeviceMemory::Parameters(memReqs.size, deCtz32(memReqs.memoryTypeBits));
611 DeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkImage image)
613 return getDeviceMemoryParameters(getImageMemoryRequirements(env.vkd, env.device, image));
616 DeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkBuffer image)
618 return getDeviceMemoryParameters(getBufferMemoryRequirements(env.vkd, env.device, image));
623 typedef VkBuffer Type;
628 VkBufferUsageFlags usage;
630 Parameters (VkDeviceSize size_,
631 VkBufferUsageFlags usage_)
639 Resources (const Environment&, const Parameters&) {}
642 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
644 const Environment env (context, 1u);
645 const Resources res (env, params);
646 const Unique<VkBuffer> buffer (create(env, res, params));
647 const VkMemoryRequirements memReqs = getBufferMemoryRequirements(env.vkd, env.device, *buffer);
649 return getSafeObjectCount<Buffer>(context,
651 DEFAULT_MAX_CONCURRENT_OBJECTS,
652 getPageTableSize(context, memReqs.size));
655 static Move<VkBuffer> create (const Environment& env, const Resources&, const Parameters& params)
657 const VkBufferCreateInfo bufferInfo =
659 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
661 (VkBufferCreateFlags)0,
664 VK_SHARING_MODE_EXCLUSIVE,
666 &env.queueFamilyIndex
669 return createBuffer(env.vkd, env.device, &bufferInfo, env.allocationCallbacks);
675 typedef VkBufferView Type;
679 Buffer::Parameters buffer;
684 Parameters (const Buffer::Parameters& buffer_,
686 VkDeviceSize offset_,
697 Dependency<Buffer> buffer;
698 Dependency<DeviceMemory> memory;
700 Resources (const Environment& env, const Parameters& params)
701 : buffer(env, params.buffer)
702 , memory(env, getDeviceMemoryParameters(env, *buffer.object))
704 VK_CHECK(env.vkd.bindBufferMemory(env.device, *buffer.object, *memory.object, 0));
708 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
710 return getSafeObjectCount<BufferView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
713 static Move<VkBufferView> create (const Environment& env, const Resources& res, const Parameters& params)
715 const VkBufferViewCreateInfo bufferViewInfo =
717 VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,
719 (VkBufferViewCreateFlags)0,
726 return createBufferView(env.vkd, env.device, &bufferViewInfo, env.allocationCallbacks);
732 typedef VkImage Type;
736 VkImageCreateFlags flags;
737 VkImageType imageType;
742 VkSampleCountFlagBits samples;
743 VkImageTiling tiling;
744 VkImageUsageFlags usage;
745 VkImageLayout initialLayout;
747 Parameters (VkImageCreateFlags flags_,
748 VkImageType imageType_,
753 VkSampleCountFlagBits samples_,
754 VkImageTiling tiling_,
755 VkImageUsageFlags usage_,
756 VkImageLayout initialLayout_)
758 , imageType (imageType_)
761 , mipLevels (mipLevels_)
762 , arraySize (arraySize_)
766 , initialLayout (initialLayout_)
772 Resources (const Environment&, const Parameters&) {}
775 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
777 const Environment env (context, 1u);
778 const Resources res (env, params);
779 const Unique<VkImage> image (create(env, res, params));
780 const VkMemoryRequirements memReqs = getImageMemoryRequirements(env.vkd, env.device, *image);
782 return getSafeObjectCount<Image>(context,
784 DEFAULT_MAX_CONCURRENT_OBJECTS,
785 getPageTableSize(context, memReqs.size));
788 static Move<VkImage> create (const Environment& env, const Resources&, const Parameters& params)
790 const VkImageCreateInfo imageInfo =
792 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
803 VK_SHARING_MODE_EXCLUSIVE, // sharingMode
804 1u, // queueFamilyIndexCount
805 &env.queueFamilyIndex, // pQueueFamilyIndices
809 return createImage(env.vkd, env.device, &imageInfo, env.allocationCallbacks);
815 typedef VkImageView Type;
819 Image::Parameters image;
820 VkImageViewType viewType;
822 VkComponentMapping components;
823 VkImageSubresourceRange subresourceRange;
825 Parameters (const Image::Parameters& image_,
826 VkImageViewType viewType_,
828 VkComponentMapping components_,
829 VkImageSubresourceRange subresourceRange_)
831 , viewType (viewType_)
833 , components (components_)
834 , subresourceRange (subresourceRange_)
840 Dependency<Image> image;
841 Dependency<DeviceMemory> memory;
843 Resources (const Environment& env, const Parameters& params)
844 : image (env, params.image)
845 , memory(env, getDeviceMemoryParameters(env, *image.object))
847 VK_CHECK(env.vkd.bindImageMemory(env.device, *image.object, *memory.object, 0));
851 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
853 return getSafeObjectCount<ImageView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
856 static Move<VkImageView> create (const Environment& env, const Resources& res, const Parameters& params)
858 const VkImageViewCreateInfo imageViewInfo =
860 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
862 (VkImageViewCreateFlags)0,
867 params.subresourceRange,
870 return createImageView(env.vkd, env.device, &imageViewInfo, env.allocationCallbacks);
876 typedef VkSemaphore Type;
880 VkSemaphoreCreateFlags flags;
882 Parameters (VkSemaphoreCreateFlags flags_)
889 Resources (const Environment&, const Parameters&) {}
892 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
894 return getSafeObjectCount<Semaphore>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
897 static Move<VkSemaphore> create (const Environment& env, const Resources&, const Parameters& params)
899 const VkSemaphoreCreateInfo semaphoreInfo =
901 VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
906 return createSemaphore(env.vkd, env.device, &semaphoreInfo, env.allocationCallbacks);
912 typedef VkFence Type;
916 VkFenceCreateFlags flags;
918 Parameters (VkFenceCreateFlags flags_)
925 Resources (const Environment&, const Parameters&) {}
928 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
930 return getSafeObjectCount<Fence>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
933 static Move<VkFence> create (const Environment& env, const Resources&, const Parameters& params)
935 const VkFenceCreateInfo fenceInfo =
937 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
942 return createFence(env.vkd, env.device, &fenceInfo, env.allocationCallbacks);
948 typedef VkEvent Type;
952 VkEventCreateFlags flags;
954 Parameters (VkEventCreateFlags flags_)
961 Resources (const Environment&, const Parameters&) {}
964 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
966 return getSafeObjectCount<Event>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES);
969 static Move<VkEvent> create (const Environment& env, const Resources&, const Parameters& params)
971 const VkEventCreateInfo eventInfo =
973 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
978 return createEvent(env.vkd, env.device, &eventInfo, env.allocationCallbacks);
984 typedef VkQueryPool Type;
988 VkQueryType queryType;
990 VkQueryPipelineStatisticFlags pipelineStatistics;
992 Parameters (VkQueryType queryType_,
993 deUint32 entryCount_,
994 VkQueryPipelineStatisticFlags pipelineStatistics_)
995 : queryType (queryType_)
996 , entryCount (entryCount_)
997 , pipelineStatistics (pipelineStatistics_)
1003 Resources (const Environment&, const Parameters&) {}
1006 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1008 return getSafeObjectCount<QueryPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1011 static Move<VkQueryPool> create (const Environment& env, const Resources&, const Parameters& params)
1013 const VkQueryPoolCreateInfo queryPoolInfo =
1015 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
1017 (VkQueryPoolCreateFlags)0,
1020 params.pipelineStatistics
1023 return createQueryPool(env.vkd, env.device, &queryPoolInfo, env.allocationCallbacks);
1029 typedef VkShaderModule Type;
1033 VkShaderStageFlagBits shaderStage;
1036 Parameters (VkShaderStageFlagBits shaderStage_,
1037 const std::string& binaryName_)
1038 : shaderStage (shaderStage_)
1039 , binaryName (binaryName_)
1045 const ProgramBinary& binary;
1047 Resources (const Environment& env, const Parameters& params)
1048 : binary(env.programBinaries.get(params.binaryName))
1052 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1054 return getSafeObjectCount<ShaderModule>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1057 static const char* getSource (VkShaderStageFlagBits stage)
1061 case VK_SHADER_STAGE_VERTEX_BIT:
1062 return "#version 310 es\n"
1063 "layout(location = 0) in highp vec4 a_position;\n"
1064 "void main () { gl_Position = a_position; }\n";
1066 case VK_SHADER_STAGE_FRAGMENT_BIT:
1067 return "#version 310 es\n"
1068 "layout(location = 0) out mediump vec4 o_color;\n"
1069 "void main () { o_color = vec4(1.0, 0.5, 0.25, 1.0); }";
1071 case VK_SHADER_STAGE_COMPUTE_BIT:
1072 return "#version 310 es\n"
1073 "layout(binding = 0) buffer Input { highp uint dataIn[]; };\n"
1074 "layout(binding = 1) buffer Output { highp uint dataOut[]; };\n"
1075 "void main (void)\n"
1077 " dataOut[gl_GlobalInvocationID.x] = ~dataIn[gl_GlobalInvocationID.x];\n"
1081 DE_FATAL("Not implemented");
1086 static void initPrograms (SourceCollections& dst, Parameters params)
1088 const char* const source = getSource(params.shaderStage);
1092 dst.glslSources.add(params.binaryName)
1093 << glu::ShaderSource(getGluShaderType(params.shaderStage), source);
1096 static Move<VkShaderModule> create (const Environment& env, const Resources& res, const Parameters&)
1098 const VkShaderModuleCreateInfo shaderModuleInfo =
1100 VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
1102 (VkShaderModuleCreateFlags)0,
1103 res.binary.getSize(),
1104 (const deUint32*)res.binary.getBinary(),
1107 return createShaderModule(env.vkd, env.device, &shaderModuleInfo, env.allocationCallbacks);
1111 struct PipelineCache
1113 typedef VkPipelineCache Type;
1117 Parameters (void) {}
1122 Resources (const Environment&, const Parameters&) {}
1125 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1127 return getSafeObjectCount<PipelineCache>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1130 static Move<VkPipelineCache> create (const Environment& env, const Resources&, const Parameters&)
1132 const VkPipelineCacheCreateInfo pipelineCacheInfo =
1134 VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
1136 (VkPipelineCacheCreateFlags)0u,
1137 0u, // initialDataSize
1138 DE_NULL, // pInitialData
1141 return createPipelineCache(env.vkd, env.device, &pipelineCacheInfo, env.allocationCallbacks);
1147 typedef VkSampler Type;
1153 VkSamplerMipmapMode mipmapMode;
1154 VkSamplerAddressMode addressModeU;
1155 VkSamplerAddressMode addressModeV;
1156 VkSamplerAddressMode addressModeW;
1158 VkBool32 anisotropyEnable;
1159 float maxAnisotropy;
1160 VkBool32 compareEnable;
1161 VkCompareOp compareOp;
1164 VkBorderColor borderColor;
1165 VkBool32 unnormalizedCoordinates;
1167 // \todo [2015-09-17 pyry] Other configurations
1169 : magFilter (VK_FILTER_NEAREST)
1170 , minFilter (VK_FILTER_NEAREST)
1171 , mipmapMode (VK_SAMPLER_MIPMAP_MODE_NEAREST)
1172 , addressModeU (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1173 , addressModeV (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1174 , addressModeW (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
1176 , anisotropyEnable (VK_FALSE)
1177 , maxAnisotropy (1.0f)
1178 , compareEnable (VK_FALSE)
1179 , compareOp (VK_COMPARE_OP_ALWAYS)
1182 , borderColor (VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK)
1183 , unnormalizedCoordinates (VK_FALSE)
1189 Resources (const Environment&, const Parameters&) {}
1192 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1194 return getSafeObjectCount<Sampler>(context,
1196 de::min(context.getDeviceProperties().limits.maxSamplerAllocationCount,
1197 (deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS));
1200 static Move<VkSampler> create (const Environment& env, const Resources&, const Parameters& params)
1202 const VkSamplerCreateInfo samplerInfo =
1204 VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1206 (VkSamplerCreateFlags)0,
1210 params.addressModeU,
1211 params.addressModeV,
1212 params.addressModeW,
1214 params.anisotropyEnable,
1215 params.maxAnisotropy,
1216 params.compareEnable,
1221 params.unnormalizedCoordinates
1224 return createSampler(env.vkd, env.device, &samplerInfo, env.allocationCallbacks);
1228 struct DescriptorSetLayout
1230 typedef VkDescriptorSetLayout Type;
1237 VkDescriptorType descriptorType;
1238 deUint32 descriptorCount;
1239 VkShaderStageFlags stageFlags;
1240 bool useImmutableSampler;
1242 Binding (deUint32 binding_,
1243 VkDescriptorType descriptorType_,
1244 deUint32 descriptorCount_,
1245 VkShaderStageFlags stageFlags_,
1246 bool useImmutableSampler_)
1247 : binding (binding_)
1248 , descriptorType (descriptorType_)
1249 , descriptorCount (descriptorCount_)
1250 , stageFlags (stageFlags_)
1251 , useImmutableSampler (useImmutableSampler_)
1257 vector<Binding> bindings;
1259 Parameters (const vector<Binding>& bindings_)
1260 : bindings(bindings_)
1263 static Parameters empty (void)
1265 return Parameters(vector<Binding>());
1268 static Parameters single (deUint32 binding,
1269 VkDescriptorType descriptorType,
1270 deUint32 descriptorCount,
1271 VkShaderStageFlags stageFlags,
1272 bool useImmutableSampler = false)
1274 vector<Binding> bindings;
1275 bindings.push_back(Binding(binding, descriptorType, descriptorCount, stageFlags, useImmutableSampler));
1276 return Parameters(bindings);
1282 vector<VkDescriptorSetLayoutBinding> bindings;
1283 MovePtr<Dependency<Sampler> > immutableSampler;
1284 vector<VkSampler> immutableSamplersPtr;
1286 Resources (const Environment& env, const Parameters& params)
1288 // Create immutable sampler if needed
1289 for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++)
1291 if (cur->useImmutableSampler && !immutableSampler)
1293 immutableSampler = de::newMovePtr<Dependency<Sampler> >(env, Sampler::Parameters());
1295 if (cur->useImmutableSampler && immutableSamplersPtr.size() < (size_t)cur->descriptorCount)
1296 immutableSamplersPtr.resize(cur->descriptorCount, *immutableSampler->object);
1300 for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++)
1302 const VkDescriptorSetLayoutBinding binding =
1305 cur->descriptorType,
1306 cur->descriptorCount,
1308 (cur->useImmutableSampler ? &immutableSamplersPtr[0] : DE_NULL)
1311 bindings.push_back(binding);
1316 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1318 return getSafeObjectCount<DescriptorSetLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1321 static Move<VkDescriptorSetLayout> create (const Environment& env, const Resources& res, const Parameters&)
1323 const VkDescriptorSetLayoutCreateInfo descriptorSetLayoutInfo =
1325 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
1327 (VkDescriptorSetLayoutCreateFlags)0,
1328 (deUint32)res.bindings.size(),
1329 (res.bindings.empty() ? DE_NULL : &res.bindings[0])
1332 return createDescriptorSetLayout(env.vkd, env.device, &descriptorSetLayoutInfo, env.allocationCallbacks);
1336 struct PipelineLayout
1338 typedef VkPipelineLayout Type;
1342 vector<DescriptorSetLayout::Parameters> descriptorSetLayouts;
1343 vector<VkPushConstantRange> pushConstantRanges;
1345 Parameters (void) {}
1347 static Parameters empty (void)
1349 return Parameters();
1352 static Parameters singleDescriptorSet (const DescriptorSetLayout::Parameters& descriptorSetLayout)
1355 params.descriptorSetLayouts.push_back(descriptorSetLayout);
1362 typedef SharedPtr<Dependency<DescriptorSetLayout> > DescriptorSetLayoutDepSp;
1363 typedef vector<DescriptorSetLayoutDepSp> DescriptorSetLayouts;
1365 DescriptorSetLayouts descriptorSetLayouts;
1366 vector<VkDescriptorSetLayout> pSetLayouts;
1368 Resources (const Environment& env, const Parameters& params)
1370 for (vector<DescriptorSetLayout::Parameters>::const_iterator dsParams = params.descriptorSetLayouts.begin();
1371 dsParams != params.descriptorSetLayouts.end();
1374 descriptorSetLayouts.push_back(DescriptorSetLayoutDepSp(new Dependency<DescriptorSetLayout>(env, *dsParams)));
1375 pSetLayouts.push_back(*descriptorSetLayouts.back()->object);
1380 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1382 return getSafeObjectCount<PipelineLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1385 static Move<VkPipelineLayout> create (const Environment& env, const Resources& res, const Parameters& params)
1387 const VkPipelineLayoutCreateInfo pipelineLayoutInfo =
1389 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1391 (VkPipelineLayoutCreateFlags)0,
1392 (deUint32)res.pSetLayouts.size(),
1393 (res.pSetLayouts.empty() ? DE_NULL : &res.pSetLayouts[0]),
1394 (deUint32)params.pushConstantRanges.size(),
1395 (params.pushConstantRanges.empty() ? DE_NULL : ¶ms.pushConstantRanges[0]),
1398 return createPipelineLayout(env.vkd, env.device, &pipelineLayoutInfo, env.allocationCallbacks);
1404 typedef VkRenderPass Type;
1406 // \todo [2015-09-17 pyry] More interesting configurations
1409 Parameters (void) {}
1414 Resources (const Environment&, const Parameters&) {}
1417 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1419 return getSafeObjectCount<RenderPass>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1422 static Move<VkRenderPass> create (const Environment& env, const Resources&, const Parameters&)
1424 const VkAttachmentDescription attachments[] =
1427 (VkAttachmentDescriptionFlags)0,
1428 VK_FORMAT_R8G8B8A8_UNORM,
1429 VK_SAMPLE_COUNT_1_BIT,
1430 VK_ATTACHMENT_LOAD_OP_CLEAR,
1431 VK_ATTACHMENT_STORE_OP_STORE,
1432 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
1433 VK_ATTACHMENT_STORE_OP_DONT_CARE,
1434 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1435 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1438 (VkAttachmentDescriptionFlags)0,
1439 VK_FORMAT_D16_UNORM,
1440 VK_SAMPLE_COUNT_1_BIT,
1441 VK_ATTACHMENT_LOAD_OP_CLEAR,
1442 VK_ATTACHMENT_STORE_OP_DONT_CARE,
1443 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
1444 VK_ATTACHMENT_STORE_OP_DONT_CARE,
1445 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1446 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1449 const VkAttachmentReference colorAttachments[] =
1453 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1456 const VkAttachmentReference dsAttachment =
1459 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
1461 const VkSubpassDescription subpasses[] =
1464 (VkSubpassDescriptionFlags)0,
1465 VK_PIPELINE_BIND_POINT_GRAPHICS,
1466 0u, // inputAttachmentCount
1467 DE_NULL, // pInputAttachments
1468 DE_LENGTH_OF_ARRAY(colorAttachments),
1470 DE_NULL, // pResolveAttachments
1472 0u, // preserveAttachmentCount
1473 DE_NULL, // pPreserveAttachments
1476 const VkRenderPassCreateInfo renderPassInfo =
1478 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
1480 (VkRenderPassCreateFlags)0,
1481 DE_LENGTH_OF_ARRAY(attachments),
1483 DE_LENGTH_OF_ARRAY(subpasses),
1485 0u, // dependencyCount
1486 DE_NULL // pDependencies
1489 return createRenderPass(env.vkd, env.device, &renderPassInfo, env.allocationCallbacks);
1493 struct GraphicsPipeline
1495 typedef VkPipeline Type;
1497 // \todo [2015-09-17 pyry] More interesting configurations
1500 Parameters (void) {}
1505 Dependency<ShaderModule> vertexShader;
1506 Dependency<ShaderModule> fragmentShader;
1507 Dependency<PipelineLayout> layout;
1508 Dependency<RenderPass> renderPass;
1509 Dependency<PipelineCache> pipelineCache;
1511 Resources (const Environment& env, const Parameters&)
1512 : vertexShader (env, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert"))
1513 , fragmentShader (env, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag"))
1514 , layout (env, PipelineLayout::Parameters::singleDescriptorSet(
1515 DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u, VK_SHADER_STAGE_FRAGMENT_BIT, true)))
1516 , renderPass (env, RenderPass::Parameters())
1517 , pipelineCache (env, PipelineCache::Parameters())
1521 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1523 return getSafeObjectCount<GraphicsPipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1526 static void initPrograms (SourceCollections& dst, Parameters)
1528 ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert"));
1529 ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag"));
1532 static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&)
1534 const VkPipelineShaderStageCreateInfo stages[] =
1537 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1539 (VkPipelineShaderStageCreateFlags)0,
1540 VK_SHADER_STAGE_VERTEX_BIT,
1541 *res.vertexShader.object,
1543 DE_NULL, // pSpecializationInfo
1546 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1548 (VkPipelineShaderStageCreateFlags)0,
1549 VK_SHADER_STAGE_FRAGMENT_BIT,
1550 *res.fragmentShader.object,
1552 DE_NULL, // pSpecializationInfo
1555 const VkVertexInputBindingDescription vertexBindings[] =
1560 VK_VERTEX_INPUT_RATE_VERTEX
1563 const VkVertexInputAttributeDescription vertexAttribs[] =
1568 VK_FORMAT_R32G32B32A32_SFLOAT,
1572 const VkPipelineVertexInputStateCreateInfo vertexInputState =
1574 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
1576 (VkPipelineVertexInputStateCreateFlags)0,
1577 DE_LENGTH_OF_ARRAY(vertexBindings),
1579 DE_LENGTH_OF_ARRAY(vertexAttribs),
1582 const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState =
1584 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
1586 (VkPipelineInputAssemblyStateCreateFlags)0,
1587 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
1588 VK_FALSE // primitiveRestartEnable
1590 const VkViewport viewports[] =
1592 { 0.0f, 0.0f, 64.f, 64.f, 0.0f, 1.0f }
1594 const VkRect2D scissors[] =
1596 { { 0, 0 }, { 64, 64 } }
1598 const VkPipelineViewportStateCreateInfo viewportState =
1600 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
1602 (VkPipelineViewportStateCreateFlags)0,
1603 DE_LENGTH_OF_ARRAY(viewports),
1605 DE_LENGTH_OF_ARRAY(scissors),
1608 const VkPipelineRasterizationStateCreateInfo rasterState =
1610 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
1612 (VkPipelineRasterizationStateCreateFlags)0,
1613 VK_TRUE, // depthClampEnable
1614 VK_FALSE, // rasterizerDiscardEnable
1615 VK_POLYGON_MODE_FILL,
1616 VK_CULL_MODE_BACK_BIT,
1617 VK_FRONT_FACE_COUNTER_CLOCKWISE,
1618 VK_FALSE, // depthBiasEnable
1619 0.0f, // depthBiasConstantFactor
1620 0.0f, // depthBiasClamp
1621 0.0f, // depthBiasSlopeFactor
1624 const VkPipelineMultisampleStateCreateInfo multisampleState =
1626 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
1628 (VkPipelineMultisampleStateCreateFlags)0,
1629 VK_SAMPLE_COUNT_1_BIT,
1630 VK_FALSE, // sampleShadingEnable
1631 1.0f, // minSampleShading
1632 DE_NULL, // pSampleMask
1633 VK_FALSE, // alphaToCoverageEnable
1634 VK_FALSE, // alphaToOneEnable
1636 const VkPipelineDepthStencilStateCreateInfo depthStencilState =
1638 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
1640 (VkPipelineDepthStencilStateCreateFlags)0,
1641 VK_TRUE, // depthTestEnable
1642 VK_TRUE, // depthWriteEnable
1643 VK_COMPARE_OP_LESS, // depthCompareOp
1644 VK_FALSE, // depthBoundsTestEnable
1645 VK_FALSE, // stencilTestEnable
1646 { VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u },
1647 { VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u },
1648 -1.0f, // minDepthBounds
1649 +1.0f, // maxDepthBounds
1651 const VkPipelineColorBlendAttachmentState colorBlendAttState[]=
1654 VK_FALSE, // blendEnable
1655 VK_BLEND_FACTOR_ONE,
1656 VK_BLEND_FACTOR_ZERO,
1658 VK_BLEND_FACTOR_ONE,
1659 VK_BLEND_FACTOR_ZERO,
1661 VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT
1664 const VkPipelineColorBlendStateCreateInfo colorBlendState =
1666 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
1668 (VkPipelineColorBlendStateCreateFlags)0,
1669 VK_FALSE, // logicOpEnable
1671 DE_LENGTH_OF_ARRAY(colorBlendAttState),
1673 { 0.0f, 0.0f, 0.0f, 0.0f } // blendConstants
1675 const VkGraphicsPipelineCreateInfo pipelineInfo =
1677 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1679 (VkPipelineCreateFlags)0,
1680 DE_LENGTH_OF_ARRAY(stages),
1683 &inputAssemblyState,
1684 DE_NULL, // pTessellationState
1690 (const VkPipelineDynamicStateCreateInfo*)DE_NULL,
1692 *res.renderPass.object,
1694 (VkPipeline)0, // basePipelineHandle
1695 0, // basePipelineIndex
1698 return createGraphicsPipeline(env.vkd, env.device, *res.pipelineCache.object, &pipelineInfo, env.allocationCallbacks);
1702 struct ComputePipeline
1704 typedef VkPipeline Type;
1706 // \todo [2015-09-17 pyry] More interesting configurations
1709 Parameters (void) {}
1714 Dependency<ShaderModule> shaderModule;
1715 Dependency<PipelineLayout> layout;
1716 Dependency<PipelineCache> pipelineCache;
1718 static DescriptorSetLayout::Parameters getDescriptorSetLayout (void)
1720 typedef DescriptorSetLayout::Parameters::Binding Binding;
1722 vector<Binding> bindings;
1724 bindings.push_back(Binding(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false));
1725 bindings.push_back(Binding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false));
1727 return DescriptorSetLayout::Parameters(bindings);
1730 Resources (const Environment& env, const Parameters&)
1731 : shaderModule (env, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"))
1732 , layout (env, PipelineLayout::Parameters::singleDescriptorSet(getDescriptorSetLayout()))
1733 , pipelineCache (env, PipelineCache::Parameters())
1737 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1739 return getSafeObjectCount<ComputePipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1742 static void initPrograms (SourceCollections& dst, Parameters)
1744 ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp"));
1747 static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&)
1749 const VkComputePipelineCreateInfo pipelineInfo =
1751 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
1753 (VkPipelineCreateFlags)0,
1755 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1757 (VkPipelineShaderStageCreateFlags)0,
1758 VK_SHADER_STAGE_COMPUTE_BIT,
1759 *res.shaderModule.object,
1761 DE_NULL // pSpecializationInfo
1764 (VkPipeline)0, // basePipelineHandle
1765 0u, // basePipelineIndex
1768 return createComputePipeline(env.vkd, env.device, *res.pipelineCache.object, &pipelineInfo, env.allocationCallbacks);
1772 struct DescriptorPool
1774 typedef VkDescriptorPool Type;
1778 VkDescriptorPoolCreateFlags flags;
1780 vector<VkDescriptorPoolSize> poolSizes;
1782 Parameters (VkDescriptorPoolCreateFlags flags_,
1784 const vector<VkDescriptorPoolSize>& poolSizes_)
1786 , maxSets (maxSets_)
1787 , poolSizes (poolSizes_)
1790 static Parameters singleType (VkDescriptorPoolCreateFlags flags,
1792 VkDescriptorType type,
1795 vector<VkDescriptorPoolSize> poolSizes;
1796 poolSizes.push_back(makeDescriptorPoolSize(type, count));
1797 return Parameters(flags, maxSets, poolSizes);
1803 Resources (const Environment&, const Parameters&) {}
1806 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1808 return getSafeObjectCount<DescriptorPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1811 static Move<VkDescriptorPool> create (const Environment& env, const Resources&, const Parameters& params)
1813 const VkDescriptorPoolCreateInfo descriptorPoolInfo =
1815 VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
1819 (deUint32)params.poolSizes.size(),
1820 (params.poolSizes.empty() ? DE_NULL : ¶ms.poolSizes[0])
1823 return createDescriptorPool(env.vkd, env.device, &descriptorPoolInfo, env.allocationCallbacks);
1827 struct DescriptorSet
1829 typedef VkDescriptorSet Type;
1833 DescriptorSetLayout::Parameters descriptorSetLayout;
1835 Parameters (const DescriptorSetLayout::Parameters& descriptorSetLayout_)
1836 : descriptorSetLayout(descriptorSetLayout_)
1842 Dependency<DescriptorPool> descriptorPool;
1843 Dependency<DescriptorSetLayout> descriptorSetLayout;
1845 static vector<VkDescriptorPoolSize> computePoolSizes (const DescriptorSetLayout::Parameters& layout, int maxSets)
1847 deUint32 countByType[VK_DESCRIPTOR_TYPE_LAST];
1848 vector<VkDescriptorPoolSize> typeCounts;
1850 std::fill(DE_ARRAY_BEGIN(countByType), DE_ARRAY_END(countByType), 0u);
1852 for (vector<DescriptorSetLayout::Parameters::Binding>::const_iterator cur = layout.bindings.begin();
1853 cur != layout.bindings.end();
1856 DE_ASSERT((deUint32)cur->descriptorType < VK_DESCRIPTOR_TYPE_LAST);
1857 countByType[cur->descriptorType] += cur->descriptorCount * maxSets;
1860 for (deUint32 type = 0; type < VK_DESCRIPTOR_TYPE_LAST; ++type)
1862 if (countByType[type] > 0)
1863 typeCounts.push_back(makeDescriptorPoolSize((VkDescriptorType)type, countByType[type]));
1869 Resources (const Environment& env, const Parameters& params)
1870 : descriptorPool (env, DescriptorPool::Parameters(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, env.maxResourceConsumers, computePoolSizes(params.descriptorSetLayout, env.maxResourceConsumers)))
1871 , descriptorSetLayout (env, params.descriptorSetLayout)
1876 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1878 return getSafeObjectCount<DescriptorSet>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1881 static Move<VkDescriptorSet> create (const Environment& env, const Resources& res, const Parameters&)
1883 const VkDescriptorSetAllocateInfo allocateInfo =
1885 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
1887 *res.descriptorPool.object,
1889 &res.descriptorSetLayout.object.get(),
1892 return allocateDescriptorSet(env.vkd, env.device, &allocateInfo);
1898 typedef VkFramebuffer Type;
1908 Dependency<ImageView> colorAttachment;
1909 Dependency<ImageView> depthStencilAttachment;
1910 Dependency<RenderPass> renderPass;
1912 Resources (const Environment& env, const Parameters&)
1913 : colorAttachment (env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
1914 makeExtent3D(256, 256, 1),
1916 VK_SAMPLE_COUNT_1_BIT,
1917 VK_IMAGE_TILING_OPTIMAL,
1918 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
1919 VK_IMAGE_LAYOUT_UNDEFINED),
1920 VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
1921 makeComponentMappingRGBA(),
1922 makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u)))
1923 , depthStencilAttachment (env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM,
1924 makeExtent3D(256, 256, 1),
1926 VK_SAMPLE_COUNT_1_BIT,
1927 VK_IMAGE_TILING_OPTIMAL,
1928 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1929 VK_IMAGE_LAYOUT_UNDEFINED),
1930 VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_D16_UNORM,
1931 makeComponentMappingRGBA(),
1932 makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u)))
1933 , renderPass (env, RenderPass::Parameters())
1937 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1939 // \todo [2016-03-23 pyry] Take into account attachment sizes
1940 return getSafeObjectCount<Framebuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1943 static Move<VkFramebuffer> create (const Environment& env, const Resources& res, const Parameters&)
1945 const VkImageView attachments[] =
1947 *res.colorAttachment.object,
1948 *res.depthStencilAttachment.object,
1950 const VkFramebufferCreateInfo framebufferInfo =
1952 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
1954 (VkFramebufferCreateFlags)0,
1955 *res.renderPass.object,
1956 (deUint32)DE_LENGTH_OF_ARRAY(attachments),
1963 return createFramebuffer(env.vkd, env.device, &framebufferInfo, env.allocationCallbacks);
1969 typedef VkCommandPool Type;
1973 VkCommandPoolCreateFlags flags;
1975 Parameters (VkCommandPoolCreateFlags flags_)
1982 Resources (const Environment&, const Parameters&) {}
1985 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
1987 return getSafeObjectCount<CommandPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
1990 static Move<VkCommandPool> create (const Environment& env, const Resources&, const Parameters& params)
1992 const VkCommandPoolCreateInfo cmdPoolInfo =
1994 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
1997 env.queueFamilyIndex,
2000 return createCommandPool(env.vkd, env.device, &cmdPoolInfo, env.allocationCallbacks);
2004 struct CommandBuffer
2006 typedef VkCommandBuffer Type;
2010 CommandPool::Parameters commandPool;
2011 VkCommandBufferLevel level;
2013 Parameters (const CommandPool::Parameters& commandPool_,
2014 VkCommandBufferLevel level_)
2015 : commandPool (commandPool_)
2022 Dependency<CommandPool> commandPool;
2024 Resources (const Environment& env, const Parameters& params)
2025 : commandPool(env, params.commandPool)
2029 static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
2031 return getSafeObjectCount<CommandBuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS);
2034 static Move<VkCommandBuffer> create (const Environment& env, const Resources& res, const Parameters& params)
2036 const VkCommandBufferAllocateInfo cmdBufferInfo =
2038 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
2040 *res.commandPool.object,
2045 return allocateCommandBuffer(env.vkd, env.device, &cmdBufferInfo);
2051 template<typename Object>
2052 tcu::TestStatus createSingleTest (Context& context, typename Object::Parameters params)
2054 const Environment env (context, 1u);
2055 const typename Object::Resources res (env, params);
2058 Unique<typename Object::Type> obj (Object::create(env, res, params));
2061 return tcu::TestStatus::pass("Ok");
2064 template<typename Object>
2065 tcu::TestStatus createMultipleUniqueResourcesTest (Context& context, typename Object::Parameters params)
2067 const Environment env (context, 1u);
2068 const typename Object::Resources res0 (env, params);
2069 const typename Object::Resources res1 (env, params);
2070 const typename Object::Resources res2 (env, params);
2071 const typename Object::Resources res3 (env, params);
2074 Unique<typename Object::Type> obj0 (Object::create(env, res0, params));
2075 Unique<typename Object::Type> obj1 (Object::create(env, res1, params));
2076 Unique<typename Object::Type> obj2 (Object::create(env, res2, params));
2077 Unique<typename Object::Type> obj3 (Object::create(env, res3, params));
2080 return tcu::TestStatus::pass("Ok");
2083 template<typename Object>
2084 tcu::TestStatus createMultipleSharedResourcesTest (Context& context, typename Object::Parameters params)
2086 const Environment env (context, 4u);
2087 const typename Object::Resources res (env, params);
2090 Unique<typename Object::Type> obj0 (Object::create(env, res, params));
2091 Unique<typename Object::Type> obj1 (Object::create(env, res, params));
2092 Unique<typename Object::Type> obj2 (Object::create(env, res, params));
2093 Unique<typename Object::Type> obj3 (Object::create(env, res, params));
2096 return tcu::TestStatus::pass("Ok");
2099 template<typename Object>
2100 tcu::TestStatus createMaxConcurrentTest (Context& context, typename Object::Parameters params)
2102 typedef Unique<typename Object::Type> UniqueObject;
2103 typedef SharedPtr<UniqueObject> ObjectPtr;
2105 const deUint32 numObjects = Object::getMaxConcurrent(context, params);
2106 const Environment env (context, numObjects);
2107 const typename Object::Resources res (env, params);
2108 vector<ObjectPtr> objects (numObjects);
2109 const deUint32 watchdogInterval = 1024;
2111 context.getTestContext().getLog()
2112 << TestLog::Message << "Creating " << numObjects << " " << getTypeName<typename Object::Type>() << " objects" << TestLog::EndMessage;
2114 for (deUint32 ndx = 0; ndx < numObjects; ndx++)
2116 objects[ndx] = ObjectPtr(new UniqueObject(Object::create(env, res, params)));
2118 if ((ndx > 0) && ((ndx % watchdogInterval) == 0))
2119 context.getTestContext().touchWatchdog();
2124 return tcu::TestStatus::pass("Ok");
2127 template<typename Object>
2128 int getCreateCount (void)
2134 int getCreateCount<Device> (void)
2136 // Creating VkDevice can take significantly longer than other object types
2140 template<typename Object>
2141 class CreateThread : public ThreadGroupThread
2144 CreateThread (const Environment& env, const typename Object::Resources& resources, const typename Object::Parameters& params)
2146 , m_resources (resources)
2150 void runThread (void)
2152 const int numIters = getCreateCount<Object>();
2153 const int itersBetweenSyncs = numIters / 5;
2155 DE_ASSERT(itersBetweenSyncs > 0);
2157 for (int iterNdx = 0; iterNdx < numIters; iterNdx++)
2159 // Sync every Nth iteration to make entering driver at the same time more likely
2160 if ((iterNdx % itersBetweenSyncs) == 0)
2164 Unique<typename Object::Type> obj (Object::create(m_env, m_resources, m_params));
2170 const Environment& m_env;
2171 const typename Object::Resources& m_resources;
2172 const typename Object::Parameters& m_params;
2175 template<typename Object>
2176 tcu::TestStatus multithreadedCreateSharedResourcesTest (Context& context, typename Object::Parameters params)
2178 const deUint32 numThreads = getDefaultTestThreadCount();
2179 const Environment env (context, numThreads);
2180 const typename Object::Resources res (env, params);
2181 ThreadGroup threads;
2183 for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2184 threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, res, params)));
2186 return threads.run();
2189 template<typename Object>
2190 tcu::TestStatus multithreadedCreatePerThreadResourcesTest (Context& context, typename Object::Parameters params)
2192 typedef SharedPtr<typename Object::Resources> ResPtr;
2194 const deUint32 numThreads = getDefaultTestThreadCount();
2195 const Environment env (context, 1u);
2196 vector<ResPtr> resources (numThreads);
2197 ThreadGroup threads;
2199 for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2201 resources[ndx] = ResPtr(new typename Object::Resources(env, params));
2202 threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, *resources[ndx], params)));
2205 return threads.run();
2210 Device::Resources deviceRes;
2211 Unique<VkDevice> device;
2215 EnvClone (const Environment& parent, const Device::Parameters& deviceParams, deUint32 maxResourceConsumers)
2216 : deviceRes (parent, deviceParams)
2217 , device (Device::create(parent, deviceRes, deviceParams))
2218 , vkd (deviceRes.vki, *device)
2219 , env (parent.vkp, vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers)
2224 Device::Parameters getDefaulDeviceParameters (Context& context)
2226 return Device::Parameters(context.getTestContext().getCommandLine().getVKDeviceId()-1u,
2227 VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT);
2230 template<typename Object>
2231 tcu::TestStatus multithreadedCreatePerThreadDeviceTest (Context& context, typename Object::Parameters params)
2233 typedef SharedPtr<EnvClone> EnvPtr;
2234 typedef SharedPtr<typename Object::Resources> ResPtr;
2236 const deUint32 numThreads = getDefaultTestThreadCount();
2237 const Device::Parameters deviceParams = getDefaulDeviceParameters(context);
2238 const Environment sharedEnv (context, numThreads); // For creating Device's
2239 vector<EnvPtr> perThreadEnv (numThreads);
2240 vector<ResPtr> resources (numThreads);
2241 ThreadGroup threads;
2243 for (deUint32 ndx = 0; ndx < numThreads; ndx++)
2245 perThreadEnv[ndx] = EnvPtr(new EnvClone(sharedEnv, deviceParams, 1u));
2246 resources[ndx] = ResPtr(new typename Object::Resources(perThreadEnv[ndx]->env, params));
2248 threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(perThreadEnv[ndx]->env, *resources[ndx], params)));
2251 return threads.run();
2254 template<typename Object>
2255 tcu::TestStatus createSingleAllocCallbacksTest (Context& context, typename Object::Parameters params)
2257 const deUint32 noCmdScope = (1u << VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE)
2258 | (1u << VK_SYSTEM_ALLOCATION_SCOPE_DEVICE)
2259 | (1u << VK_SYSTEM_ALLOCATION_SCOPE_CACHE)
2260 | (1u << VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
2262 // Callbacks used by resources
2263 AllocationCallbackRecorder resCallbacks (getSystemAllocator(), 128);
2265 // Root environment still uses default instance and device, created without callbacks
2266 const Environment rootEnv (context.getPlatformInterface(),
2267 context.getDeviceInterface(),
2268 context.getDevice(),
2269 context.getUniversalQueueFamilyIndex(),
2270 context.getBinaryCollection(),
2271 resCallbacks.getCallbacks(),
2275 // Test env has instance & device created with callbacks
2276 const EnvClone resEnv (rootEnv, getDefaulDeviceParameters(context), 1u);
2277 const typename Object::Resources res (resEnv.env, params);
2279 // Supply a separate callback recorder just for object construction
2280 AllocationCallbackRecorder objCallbacks(getSystemAllocator(), 128);
2281 const Environment objEnv (resEnv.env.vkp,
2284 resEnv.env.queueFamilyIndex,
2285 resEnv.env.programBinaries,
2286 objCallbacks.getCallbacks(),
2287 resEnv.env.maxResourceConsumers);
2290 Unique<typename Object::Type> obj (Object::create(objEnv, res, params));
2292 // Validate that no command-level allocations are live
2293 if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, noCmdScope))
2294 return tcu::TestStatus::fail("Invalid allocation callback");
2297 // At this point all allocations made against object callbacks must have been freed
2298 if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, 0u))
2299 return tcu::TestStatus::fail("Invalid allocation callback");
2302 if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u))
2303 return tcu::TestStatus::fail("Invalid allocation callback");
2305 return tcu::TestStatus::pass("Ok");
2308 template<typename Object>
2309 tcu::TestStatus allocCallbackFailTest (Context& context, typename Object::Parameters params)
2311 AllocationCallbackRecorder resCallbacks (getSystemAllocator(), 128);
2312 const Environment rootEnv (context.getPlatformInterface(),
2313 context.getDeviceInterface(),
2314 context.getDevice(),
2315 context.getUniversalQueueFamilyIndex(),
2316 context.getBinaryCollection(),
2317 resCallbacks.getCallbacks(),
2321 const EnvClone resEnv (rootEnv, getDefaulDeviceParameters(context), 1u);
2322 const typename Object::Resources res (resEnv.env, params);
2323 deUint32 numPassingAllocs = 0;
2324 const deUint32 maxTries = 1u<<10;
2326 // Iterate over test until object allocation succeeds
2327 for (; numPassingAllocs < maxTries; ++numPassingAllocs)
2329 DeterministicFailAllocator objAllocator(getSystemAllocator(), numPassingAllocs);
2330 AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128);
2331 const Environment objEnv (resEnv.env.vkp,
2334 resEnv.env.queueFamilyIndex,
2335 resEnv.env.programBinaries,
2336 recorder.getCallbacks(),
2337 resEnv.env.maxResourceConsumers);
2338 bool createOk = false;
2340 context.getTestContext().getLog()
2342 << "Trying to create object with " << numPassingAllocs << " allocation" << (numPassingAllocs != 1 ? "s" : "") << " passing"
2343 << TestLog::EndMessage;
2347 Unique<typename Object::Type> obj (Object::create(objEnv, res, params));
2350 catch (const vk::OutOfMemoryError& e)
2352 if (e.getError() != VK_ERROR_OUT_OF_HOST_MEMORY)
2354 context.getTestContext().getLog() << e;
2355 return tcu::TestStatus::fail("Got invalid error code");
2359 if (!validateAndLog(context.getTestContext().getLog(), recorder, 0u))
2360 return tcu::TestStatus::fail("Invalid allocation callback");
2364 context.getTestContext().getLog()
2365 << TestLog::Message << "Object construction succeeded! " << TestLog::EndMessage;
2371 if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u))
2372 return tcu::TestStatus::fail("Invalid allocation callback");
2374 return tcu::TestStatus::pass("Ok");
2377 // Utilities for creating groups
2379 template<typename Object>
2380 struct NamedParameters
2383 typename Object::Parameters parameters;
2386 template<typename Object>
2387 struct CaseDescription
2389 typename FunctionInstance1<typename Object::Parameters>::Function function;
2390 const NamedParameters<Object>* paramsBegin;
2391 const NamedParameters<Object>* paramsEnd;
2394 #define EMPTY_CASE_DESC(OBJECT) \
2395 { (FunctionInstance1<OBJECT::Parameters>::Function)DE_NULL, DE_NULL, DE_NULL }
2397 #define CASE_DESC(FUNCTION, CASES) \
2398 { FUNCTION, DE_ARRAY_BEGIN(CASES), DE_ARRAY_END(CASES) }
2400 struct CaseDescriptions
2402 CaseDescription<Instance> instance;
2403 CaseDescription<Device> device;
2404 CaseDescription<DeviceMemory> deviceMemory;
2405 CaseDescription<Buffer> buffer;
2406 CaseDescription<BufferView> bufferView;
2407 CaseDescription<Image> image;
2408 CaseDescription<ImageView> imageView;
2409 CaseDescription<Semaphore> semaphore;
2410 CaseDescription<Event> event;
2411 CaseDescription<Fence> fence;
2412 CaseDescription<QueryPool> queryPool;
2413 CaseDescription<ShaderModule> shaderModule;
2414 CaseDescription<PipelineCache> pipelineCache;
2415 CaseDescription<PipelineLayout> pipelineLayout;
2416 CaseDescription<RenderPass> renderPass;
2417 CaseDescription<GraphicsPipeline> graphicsPipeline;
2418 CaseDescription<ComputePipeline> computePipeline;
2419 CaseDescription<DescriptorSetLayout> descriptorSetLayout;
2420 CaseDescription<Sampler> sampler;
2421 CaseDescription<DescriptorPool> descriptorPool;
2422 CaseDescription<DescriptorSet> descriptorSet;
2423 CaseDescription<Framebuffer> framebuffer;
2424 CaseDescription<CommandPool> commandPool;
2425 CaseDescription<CommandBuffer> commandBuffer;
2428 template<typename Object>
2429 void addCases (const MovePtr<tcu::TestCaseGroup>& group, const CaseDescription<Object>& cases)
2431 for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur)
2432 addFunctionCase(group.get(), cur->name, "", cases.function, cur->parameters);
2435 template<typename Object>
2436 void addCasesWithProgs (const MovePtr<tcu::TestCaseGroup>& group, const CaseDescription<Object>& cases)
2438 for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur)
2439 addFunctionCaseWithPrograms(group.get(), cur->name, "", Object::initPrograms, cases.function, cur->parameters);
2442 tcu::TestCaseGroup* createGroup (tcu::TestContext& testCtx, const char* name, const char* desc, const CaseDescriptions& cases)
2444 MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, name, desc));
2446 addCases (group, cases.instance);
2447 addCases (group, cases.device);
2448 addCases (group, cases.deviceMemory);
2449 addCases (group, cases.buffer);
2450 addCases (group, cases.bufferView);
2451 addCases (group, cases.image);
2452 addCases (group, cases.imageView);
2453 addCases (group, cases.semaphore);
2454 addCases (group, cases.event);
2455 addCases (group, cases.fence);
2456 addCases (group, cases.queryPool);
2457 addCases (group, cases.sampler);
2458 addCasesWithProgs (group, cases.shaderModule);
2459 addCases (group, cases.pipelineCache);
2460 addCases (group, cases.pipelineLayout);
2461 addCases (group, cases.renderPass);
2462 addCasesWithProgs (group, cases.graphicsPipeline);
2463 addCasesWithProgs (group, cases.computePipeline);
2464 addCases (group, cases.descriptorSetLayout);
2465 addCases (group, cases.descriptorPool);
2466 addCases (group, cases.descriptorSet);
2467 addCases (group, cases.framebuffer);
2468 addCases (group, cases.commandPool);
2469 addCases (group, cases.commandBuffer);
2471 return group.release();
2476 tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
2478 MovePtr<tcu::TestCaseGroup> objectMgmtTests (new tcu::TestCaseGroup(testCtx, "object_management", "Object management tests"));
2480 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);
2481 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);
2482 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);
2483 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);
2484 const ImageView::Parameters imgView1D (img1D, VK_IMAGE_VIEW_TYPE_1D, img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
2485 const ImageView::Parameters imgView1DArr (img1D, VK_IMAGE_VIEW_TYPE_1D_ARRAY, img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 4u));
2486 const ImageView::Parameters imgView2D (img2D, VK_IMAGE_VIEW_TYPE_2D, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
2487 const ImageView::Parameters imgView2DArr (img2D, VK_IMAGE_VIEW_TYPE_2D_ARRAY, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 8u));
2488 const ImageView::Parameters imgViewCube (imgCube, VK_IMAGE_VIEW_TYPE_CUBE, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 6u));
2489 const ImageView::Parameters imgViewCubeArr (imgCube, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 12u));
2490 const ImageView::Parameters imgView3D (img3D, VK_IMAGE_VIEW_TYPE_3D, img3D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
2492 const DescriptorSetLayout::Parameters singleUboDescLayout = DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u, VK_SHADER_STAGE_VERTEX_BIT);
2494 static NamedParameters<Instance> s_instanceCases[] =
2496 { "instance", Instance::Parameters() },
2498 // \note Device index may change - must not be static
2499 const NamedParameters<Device> s_deviceCases[] =
2501 { "device", Device::Parameters(testCtx.getCommandLine().getVKDeviceId()-1u, VK_QUEUE_GRAPHICS_BIT) },
2503 static const NamedParameters<DeviceMemory> s_deviceMemCases[] =
2505 { "device_memory_small", DeviceMemory::Parameters(1024, 0u) },
2507 static const NamedParameters<Buffer> s_bufferCases[] =
2509 { "buffer_uniform_small", Buffer::Parameters(1024u, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT), },
2510 { "buffer_uniform_large", Buffer::Parameters(1024u*1024u*16u, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT), },
2511 { "buffer_storage_small", Buffer::Parameters(1024u, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), },
2512 { "buffer_storage_large", Buffer::Parameters(1024u*1024u*16u, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), },
2514 static const NamedParameters<BufferView> s_bufferViewCases[] =
2516 { "buffer_view_uniform_r8g8b8a8_unorm", BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u) },
2517 { "buffer_view_storage_r8g8b8a8_unorm", BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u) },
2519 static const NamedParameters<Image> s_imageCases[] =
2521 { "image_1d", img1D },
2522 { "image_2d", img2D },
2523 { "image_3d", img3D },
2525 static const NamedParameters<ImageView> s_imageViewCases[] =
2527 { "image_view_1d", imgView1D },
2528 { "image_view_1d_arr", imgView1DArr },
2529 { "image_view_2d", imgView2D },
2530 { "image_view_2d_arr", imgView2DArr },
2531 { "image_view_cube", imgViewCube },
2532 { "image_view_cube_arr", imgViewCubeArr },
2533 { "image_view_3d", imgView3D },
2535 static const NamedParameters<Semaphore> s_semaphoreCases[] =
2537 { "semaphore", Semaphore::Parameters(0u), }
2539 static const NamedParameters<Event> s_eventCases[] =
2541 { "event", Event::Parameters(0u) }
2543 static const NamedParameters<Fence> s_fenceCases[] =
2545 { "fence", Fence::Parameters(0u) },
2546 { "fence_signaled", Fence::Parameters(VK_FENCE_CREATE_SIGNALED_BIT) }
2548 static const NamedParameters<QueryPool> s_queryPoolCases[] =
2550 { "query_pool", QueryPool::Parameters(VK_QUERY_TYPE_OCCLUSION, 1u, 0u) }
2552 static const NamedParameters<ShaderModule> s_shaderModuleCases[] =
2554 { "shader_module", ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "test") }
2556 static const NamedParameters<PipelineCache> s_pipelineCacheCases[] =
2558 { "pipeline_cache", PipelineCache::Parameters() }
2560 static const NamedParameters<PipelineLayout> s_pipelineLayoutCases[] =
2562 { "pipeline_layout_empty", PipelineLayout::Parameters::empty() },
2563 { "pipeline_layout_single", PipelineLayout::Parameters::singleDescriptorSet(singleUboDescLayout) }
2565 static const NamedParameters<RenderPass> s_renderPassCases[] =
2567 { "render_pass", RenderPass::Parameters() }
2569 static const NamedParameters<GraphicsPipeline> s_graphicsPipelineCases[] =
2571 { "graphics_pipeline", GraphicsPipeline::Parameters() }
2573 static const NamedParameters<ComputePipeline> s_computePipelineCases[] =
2575 { "compute_pipeline", ComputePipeline::Parameters() }
2577 static const NamedParameters<DescriptorSetLayout> s_descriptorSetLayoutCases[] =
2579 { "descriptor_set_layout_empty", DescriptorSetLayout::Parameters::empty() },
2580 { "descriptor_set_layout_single", singleUboDescLayout }
2582 static const NamedParameters<Sampler> s_samplerCases[] =
2584 { "sampler", Sampler::Parameters() }
2586 static const NamedParameters<DescriptorPool> s_descriptorPoolCases[] =
2588 { "descriptor_pool", DescriptorPool::Parameters::singleType((VkDescriptorPoolCreateFlags)0, 4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u) },
2589 { "descriptor_pool_free_descriptor_set", DescriptorPool::Parameters::singleType(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u) }
2591 static const NamedParameters<DescriptorSet> s_descriptorSetCases[] =
2593 { "descriptor_set", DescriptorSet::Parameters(singleUboDescLayout) }
2595 static const NamedParameters<Framebuffer> s_framebufferCases[] =
2597 { "framebuffer", Framebuffer::Parameters() }
2599 static const NamedParameters<CommandPool> s_commandPoolCases[] =
2601 { "command_pool", CommandPool::Parameters((VkCommandPoolCreateFlags)0) },
2602 { "command_pool_transient", CommandPool::Parameters(VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) }
2604 static const NamedParameters<CommandBuffer> s_commandBufferCases[] =
2606 { "command_buffer_primary", CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_PRIMARY) },
2607 { "command_buffer_secondary", CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_SECONDARY) }
2610 static const CaseDescriptions s_createSingleGroup =
2612 CASE_DESC(createSingleTest <Instance>, s_instanceCases),
2613 CASE_DESC(createSingleTest <Device>, s_deviceCases),
2614 CASE_DESC(createSingleTest <DeviceMemory>, s_deviceMemCases),
2615 CASE_DESC(createSingleTest <Buffer>, s_bufferCases),
2616 CASE_DESC(createSingleTest <BufferView>, s_bufferViewCases),
2617 CASE_DESC(createSingleTest <Image>, s_imageCases),
2618 CASE_DESC(createSingleTest <ImageView>, s_imageViewCases),
2619 CASE_DESC(createSingleTest <Semaphore>, s_semaphoreCases),
2620 CASE_DESC(createSingleTest <Event>, s_eventCases),
2621 CASE_DESC(createSingleTest <Fence>, s_fenceCases),
2622 CASE_DESC(createSingleTest <QueryPool>, s_queryPoolCases),
2623 CASE_DESC(createSingleTest <ShaderModule>, s_shaderModuleCases),
2624 CASE_DESC(createSingleTest <PipelineCache>, s_pipelineCacheCases),
2625 CASE_DESC(createSingleTest <PipelineLayout>, s_pipelineLayoutCases),
2626 CASE_DESC(createSingleTest <RenderPass>, s_renderPassCases),
2627 CASE_DESC(createSingleTest <GraphicsPipeline>, s_graphicsPipelineCases),
2628 CASE_DESC(createSingleTest <ComputePipeline>, s_computePipelineCases),
2629 CASE_DESC(createSingleTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2630 CASE_DESC(createSingleTest <Sampler>, s_samplerCases),
2631 CASE_DESC(createSingleTest <DescriptorPool>, s_descriptorPoolCases),
2632 CASE_DESC(createSingleTest <DescriptorSet>, s_descriptorSetCases),
2633 CASE_DESC(createSingleTest <Framebuffer>, s_framebufferCases),
2634 CASE_DESC(createSingleTest <CommandPool>, s_commandPoolCases),
2635 CASE_DESC(createSingleTest <CommandBuffer>, s_commandBufferCases),
2637 objectMgmtTests->addChild(createGroup(testCtx, "single", "Create single object", s_createSingleGroup));
2639 static const CaseDescriptions s_createMultipleUniqueResourcesGroup =
2641 CASE_DESC(createMultipleUniqueResourcesTest <Instance>, s_instanceCases),
2642 CASE_DESC(createMultipleUniqueResourcesTest <Device>, s_deviceCases),
2643 CASE_DESC(createMultipleUniqueResourcesTest <DeviceMemory>, s_deviceMemCases),
2644 CASE_DESC(createMultipleUniqueResourcesTest <Buffer>, s_bufferCases),
2645 CASE_DESC(createMultipleUniqueResourcesTest <BufferView>, s_bufferViewCases),
2646 CASE_DESC(createMultipleUniqueResourcesTest <Image>, s_imageCases),
2647 CASE_DESC(createMultipleUniqueResourcesTest <ImageView>, s_imageViewCases),
2648 CASE_DESC(createMultipleUniqueResourcesTest <Semaphore>, s_semaphoreCases),
2649 CASE_DESC(createMultipleUniqueResourcesTest <Event>, s_eventCases),
2650 CASE_DESC(createMultipleUniqueResourcesTest <Fence>, s_fenceCases),
2651 CASE_DESC(createMultipleUniqueResourcesTest <QueryPool>, s_queryPoolCases),
2652 CASE_DESC(createMultipleUniqueResourcesTest <ShaderModule>, s_shaderModuleCases),
2653 CASE_DESC(createMultipleUniqueResourcesTest <PipelineCache>, s_pipelineCacheCases),
2654 CASE_DESC(createMultipleUniqueResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
2655 CASE_DESC(createMultipleUniqueResourcesTest <RenderPass>, s_renderPassCases),
2656 CASE_DESC(createMultipleUniqueResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
2657 CASE_DESC(createMultipleUniqueResourcesTest <ComputePipeline>, s_computePipelineCases),
2658 CASE_DESC(createMultipleUniqueResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2659 CASE_DESC(createMultipleUniqueResourcesTest <Sampler>, s_samplerCases),
2660 CASE_DESC(createMultipleUniqueResourcesTest <DescriptorPool>, s_descriptorPoolCases),
2661 CASE_DESC(createMultipleUniqueResourcesTest <DescriptorSet>, s_descriptorSetCases),
2662 CASE_DESC(createMultipleUniqueResourcesTest <Framebuffer>, s_framebufferCases),
2663 CASE_DESC(createMultipleUniqueResourcesTest <CommandPool>, s_commandPoolCases),
2664 CASE_DESC(createMultipleUniqueResourcesTest <CommandBuffer>, s_commandBufferCases),
2666 objectMgmtTests->addChild(createGroup(testCtx, "multiple_unique_resources", "Multiple objects with per-object unique resources", s_createMultipleUniqueResourcesGroup));
2668 static const CaseDescriptions s_createMultipleSharedResourcesGroup =
2670 EMPTY_CASE_DESC(Instance), // No resources used
2671 CASE_DESC(createMultipleSharedResourcesTest <Device>, s_deviceCases),
2672 CASE_DESC(createMultipleSharedResourcesTest <DeviceMemory>, s_deviceMemCases),
2673 CASE_DESC(createMultipleSharedResourcesTest <Buffer>, s_bufferCases),
2674 CASE_DESC(createMultipleSharedResourcesTest <BufferView>, s_bufferViewCases),
2675 CASE_DESC(createMultipleSharedResourcesTest <Image>, s_imageCases),
2676 CASE_DESC(createMultipleSharedResourcesTest <ImageView>, s_imageViewCases),
2677 CASE_DESC(createMultipleSharedResourcesTest <Semaphore>, s_semaphoreCases),
2678 CASE_DESC(createMultipleSharedResourcesTest <Event>, s_eventCases),
2679 CASE_DESC(createMultipleSharedResourcesTest <Fence>, s_fenceCases),
2680 CASE_DESC(createMultipleSharedResourcesTest <QueryPool>, s_queryPoolCases),
2681 CASE_DESC(createMultipleSharedResourcesTest <ShaderModule>, s_shaderModuleCases),
2682 CASE_DESC(createMultipleSharedResourcesTest <PipelineCache>, s_pipelineCacheCases),
2683 CASE_DESC(createMultipleSharedResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
2684 CASE_DESC(createMultipleSharedResourcesTest <RenderPass>, s_renderPassCases),
2685 CASE_DESC(createMultipleSharedResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
2686 CASE_DESC(createMultipleSharedResourcesTest <ComputePipeline>, s_computePipelineCases),
2687 CASE_DESC(createMultipleSharedResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2688 CASE_DESC(createMultipleSharedResourcesTest <Sampler>, s_samplerCases),
2689 CASE_DESC(createMultipleSharedResourcesTest <DescriptorPool>, s_descriptorPoolCases),
2690 CASE_DESC(createMultipleSharedResourcesTest <DescriptorSet>, s_descriptorSetCases),
2691 CASE_DESC(createMultipleSharedResourcesTest <Framebuffer>, s_framebufferCases),
2692 CASE_DESC(createMultipleSharedResourcesTest <CommandPool>, s_commandPoolCases),
2693 CASE_DESC(createMultipleSharedResourcesTest <CommandBuffer>, s_commandBufferCases),
2695 objectMgmtTests->addChild(createGroup(testCtx, "multiple_shared_resources", "Multiple objects with shared resources", s_createMultipleSharedResourcesGroup));
2697 static const CaseDescriptions s_createMaxConcurrentGroup =
2699 CASE_DESC(createMaxConcurrentTest <Instance>, s_instanceCases),
2700 CASE_DESC(createMaxConcurrentTest <Device>, s_deviceCases),
2701 CASE_DESC(createMaxConcurrentTest <DeviceMemory>, s_deviceMemCases),
2702 CASE_DESC(createMaxConcurrentTest <Buffer>, s_bufferCases),
2703 CASE_DESC(createMaxConcurrentTest <BufferView>, s_bufferViewCases),
2704 CASE_DESC(createMaxConcurrentTest <Image>, s_imageCases),
2705 CASE_DESC(createMaxConcurrentTest <ImageView>, s_imageViewCases),
2706 CASE_DESC(createMaxConcurrentTest <Semaphore>, s_semaphoreCases),
2707 CASE_DESC(createMaxConcurrentTest <Event>, s_eventCases),
2708 CASE_DESC(createMaxConcurrentTest <Fence>, s_fenceCases),
2709 CASE_DESC(createMaxConcurrentTest <QueryPool>, s_queryPoolCases),
2710 CASE_DESC(createMaxConcurrentTest <ShaderModule>, s_shaderModuleCases),
2711 CASE_DESC(createMaxConcurrentTest <PipelineCache>, s_pipelineCacheCases),
2712 CASE_DESC(createMaxConcurrentTest <PipelineLayout>, s_pipelineLayoutCases),
2713 CASE_DESC(createMaxConcurrentTest <RenderPass>, s_renderPassCases),
2714 CASE_DESC(createMaxConcurrentTest <GraphicsPipeline>, s_graphicsPipelineCases),
2715 CASE_DESC(createMaxConcurrentTest <ComputePipeline>, s_computePipelineCases),
2716 CASE_DESC(createMaxConcurrentTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2717 CASE_DESC(createMaxConcurrentTest <Sampler>, s_samplerCases),
2718 CASE_DESC(createMaxConcurrentTest <DescriptorPool>, s_descriptorPoolCases),
2719 CASE_DESC(createMaxConcurrentTest <DescriptorSet>, s_descriptorSetCases),
2720 CASE_DESC(createMaxConcurrentTest <Framebuffer>, s_framebufferCases),
2721 CASE_DESC(createMaxConcurrentTest <CommandPool>, s_commandPoolCases),
2722 CASE_DESC(createMaxConcurrentTest <CommandBuffer>, s_commandBufferCases),
2724 objectMgmtTests->addChild(createGroup(testCtx, "max_concurrent", "Maximum number of concurrently live objects", s_createMaxConcurrentGroup));
2726 static const CaseDescriptions s_multithreadedCreatePerThreadDeviceGroup =
2728 EMPTY_CASE_DESC(Instance), // Does not make sense
2729 EMPTY_CASE_DESC(Device), // Does not make sense
2730 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DeviceMemory>, s_deviceMemCases),
2731 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Buffer>, s_bufferCases),
2732 CASE_DESC(multithreadedCreatePerThreadDeviceTest <BufferView>, s_bufferViewCases),
2733 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Image>, s_imageCases),
2734 CASE_DESC(multithreadedCreatePerThreadDeviceTest <ImageView>, s_imageViewCases),
2735 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Semaphore>, s_semaphoreCases),
2736 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Event>, s_eventCases),
2737 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Fence>, s_fenceCases),
2738 CASE_DESC(multithreadedCreatePerThreadDeviceTest <QueryPool>, s_queryPoolCases),
2739 CASE_DESC(multithreadedCreatePerThreadDeviceTest <ShaderModule>, s_shaderModuleCases),
2740 CASE_DESC(multithreadedCreatePerThreadDeviceTest <PipelineCache>, s_pipelineCacheCases),
2741 CASE_DESC(multithreadedCreatePerThreadDeviceTest <PipelineLayout>, s_pipelineLayoutCases),
2742 CASE_DESC(multithreadedCreatePerThreadDeviceTest <RenderPass>, s_renderPassCases),
2743 CASE_DESC(multithreadedCreatePerThreadDeviceTest <GraphicsPipeline>, s_graphicsPipelineCases),
2744 CASE_DESC(multithreadedCreatePerThreadDeviceTest <ComputePipeline>, s_computePipelineCases),
2745 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2746 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Sampler>, s_samplerCases),
2747 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorPool>, s_descriptorPoolCases),
2748 CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorSet>, s_descriptorSetCases),
2749 CASE_DESC(multithreadedCreatePerThreadDeviceTest <Framebuffer>, s_framebufferCases),
2750 CASE_DESC(multithreadedCreatePerThreadDeviceTest <CommandPool>, s_commandPoolCases),
2751 CASE_DESC(multithreadedCreatePerThreadDeviceTest <CommandBuffer>, s_commandBufferCases),
2753 objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_device", "Multithreaded object construction with per-thread device ", s_multithreadedCreatePerThreadDeviceGroup));
2755 static const CaseDescriptions s_multithreadedCreatePerThreadResourcesGroup =
2757 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Instance>, s_instanceCases),
2758 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Device>, s_deviceCases),
2759 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DeviceMemory>, s_deviceMemCases),
2760 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Buffer>, s_bufferCases),
2761 CASE_DESC(multithreadedCreatePerThreadResourcesTest <BufferView>, s_bufferViewCases),
2762 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Image>, s_imageCases),
2763 CASE_DESC(multithreadedCreatePerThreadResourcesTest <ImageView>, s_imageViewCases),
2764 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Semaphore>, s_semaphoreCases),
2765 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Event>, s_eventCases),
2766 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Fence>, s_fenceCases),
2767 CASE_DESC(multithreadedCreatePerThreadResourcesTest <QueryPool>, s_queryPoolCases),
2768 CASE_DESC(multithreadedCreatePerThreadResourcesTest <ShaderModule>, s_shaderModuleCases),
2769 CASE_DESC(multithreadedCreatePerThreadResourcesTest <PipelineCache>, s_pipelineCacheCases),
2770 CASE_DESC(multithreadedCreatePerThreadResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
2771 CASE_DESC(multithreadedCreatePerThreadResourcesTest <RenderPass>, s_renderPassCases),
2772 CASE_DESC(multithreadedCreatePerThreadResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
2773 CASE_DESC(multithreadedCreatePerThreadResourcesTest <ComputePipeline>, s_computePipelineCases),
2774 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2775 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Sampler>, s_samplerCases),
2776 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorPool>, s_descriptorPoolCases),
2777 CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorSet>, s_descriptorSetCases),
2778 CASE_DESC(multithreadedCreatePerThreadResourcesTest <Framebuffer>, s_framebufferCases),
2779 CASE_DESC(multithreadedCreatePerThreadResourcesTest <CommandPool>, s_commandPoolCases),
2780 CASE_DESC(multithreadedCreatePerThreadResourcesTest <CommandBuffer>, s_commandBufferCases),
2782 objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_resources", "Multithreaded object construction with per-thread resources", s_multithreadedCreatePerThreadResourcesGroup));
2784 static const CaseDescriptions s_multithreadedCreateSharedResourcesGroup =
2786 EMPTY_CASE_DESC(Instance),
2787 CASE_DESC(multithreadedCreateSharedResourcesTest <Device>, s_deviceCases),
2788 CASE_DESC(multithreadedCreateSharedResourcesTest <DeviceMemory>, s_deviceMemCases),
2789 CASE_DESC(multithreadedCreateSharedResourcesTest <Buffer>, s_bufferCases),
2790 CASE_DESC(multithreadedCreateSharedResourcesTest <BufferView>, s_bufferViewCases),
2791 CASE_DESC(multithreadedCreateSharedResourcesTest <Image>, s_imageCases),
2792 CASE_DESC(multithreadedCreateSharedResourcesTest <ImageView>, s_imageViewCases),
2793 CASE_DESC(multithreadedCreateSharedResourcesTest <Semaphore>, s_semaphoreCases),
2794 CASE_DESC(multithreadedCreateSharedResourcesTest <Event>, s_eventCases),
2795 CASE_DESC(multithreadedCreateSharedResourcesTest <Fence>, s_fenceCases),
2796 CASE_DESC(multithreadedCreateSharedResourcesTest <QueryPool>, s_queryPoolCases),
2797 CASE_DESC(multithreadedCreateSharedResourcesTest <ShaderModule>, s_shaderModuleCases),
2798 CASE_DESC(multithreadedCreateSharedResourcesTest <PipelineCache>, s_pipelineCacheCases),
2799 CASE_DESC(multithreadedCreateSharedResourcesTest <PipelineLayout>, s_pipelineLayoutCases),
2800 CASE_DESC(multithreadedCreateSharedResourcesTest <RenderPass>, s_renderPassCases),
2801 CASE_DESC(multithreadedCreateSharedResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases),
2802 CASE_DESC(multithreadedCreateSharedResourcesTest <ComputePipeline>, s_computePipelineCases),
2803 CASE_DESC(multithreadedCreateSharedResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2804 CASE_DESC(multithreadedCreateSharedResourcesTest <Sampler>, s_samplerCases),
2805 CASE_DESC(multithreadedCreateSharedResourcesTest <DescriptorPool>, s_descriptorPoolCases),
2806 EMPTY_CASE_DESC(DescriptorSet), // \note Needs per-thread DescriptorPool
2807 CASE_DESC(multithreadedCreateSharedResourcesTest <Framebuffer>, s_framebufferCases),
2808 CASE_DESC(multithreadedCreateSharedResourcesTest <CommandPool>, s_commandPoolCases),
2809 EMPTY_CASE_DESC(CommandBuffer), // \note Needs per-thread CommandPool
2811 objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_shared_resources", "Multithreaded object construction with shared resources", s_multithreadedCreateSharedResourcesGroup));
2813 static const CaseDescriptions s_createSingleAllocCallbacksGroup =
2815 CASE_DESC(createSingleAllocCallbacksTest <Instance>, s_instanceCases),
2816 CASE_DESC(createSingleAllocCallbacksTest <Device>, s_deviceCases),
2817 CASE_DESC(createSingleAllocCallbacksTest <DeviceMemory>, s_deviceMemCases),
2818 CASE_DESC(createSingleAllocCallbacksTest <Buffer>, s_bufferCases),
2819 CASE_DESC(createSingleAllocCallbacksTest <BufferView>, s_bufferViewCases),
2820 CASE_DESC(createSingleAllocCallbacksTest <Image>, s_imageCases),
2821 CASE_DESC(createSingleAllocCallbacksTest <ImageView>, s_imageViewCases),
2822 CASE_DESC(createSingleAllocCallbacksTest <Semaphore>, s_semaphoreCases),
2823 CASE_DESC(createSingleAllocCallbacksTest <Event>, s_eventCases),
2824 CASE_DESC(createSingleAllocCallbacksTest <Fence>, s_fenceCases),
2825 CASE_DESC(createSingleAllocCallbacksTest <QueryPool>, s_queryPoolCases),
2826 CASE_DESC(createSingleAllocCallbacksTest <ShaderModule>, s_shaderModuleCases),
2827 CASE_DESC(createSingleAllocCallbacksTest <PipelineCache>, s_pipelineCacheCases),
2828 CASE_DESC(createSingleAllocCallbacksTest <PipelineLayout>, s_pipelineLayoutCases),
2829 CASE_DESC(createSingleAllocCallbacksTest <RenderPass>, s_renderPassCases),
2830 CASE_DESC(createSingleAllocCallbacksTest <GraphicsPipeline>, s_graphicsPipelineCases),
2831 CASE_DESC(createSingleAllocCallbacksTest <ComputePipeline>, s_computePipelineCases),
2832 CASE_DESC(createSingleAllocCallbacksTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2833 CASE_DESC(createSingleAllocCallbacksTest <Sampler>, s_samplerCases),
2834 CASE_DESC(createSingleAllocCallbacksTest <DescriptorPool>, s_descriptorPoolCases),
2835 CASE_DESC(createSingleAllocCallbacksTest <DescriptorSet>, s_descriptorSetCases),
2836 CASE_DESC(createSingleAllocCallbacksTest <Framebuffer>, s_framebufferCases),
2837 CASE_DESC(createSingleAllocCallbacksTest <CommandPool>, s_commandPoolCases),
2838 CASE_DESC(createSingleAllocCallbacksTest <CommandBuffer>, s_commandBufferCases),
2840 objectMgmtTests->addChild(createGroup(testCtx, "single_alloc_callbacks", "Create single object", s_createSingleAllocCallbacksGroup));
2842 static const CaseDescriptions s_allocCallbackFailGroup =
2844 CASE_DESC(allocCallbackFailTest <Instance>, s_instanceCases),
2845 CASE_DESC(allocCallbackFailTest <Device>, s_deviceCases),
2846 CASE_DESC(allocCallbackFailTest <DeviceMemory>, s_deviceMemCases),
2847 CASE_DESC(allocCallbackFailTest <Buffer>, s_bufferCases),
2848 CASE_DESC(allocCallbackFailTest <BufferView>, s_bufferViewCases),
2849 CASE_DESC(allocCallbackFailTest <Image>, s_imageCases),
2850 CASE_DESC(allocCallbackFailTest <ImageView>, s_imageViewCases),
2851 CASE_DESC(allocCallbackFailTest <Semaphore>, s_semaphoreCases),
2852 CASE_DESC(allocCallbackFailTest <Event>, s_eventCases),
2853 CASE_DESC(allocCallbackFailTest <Fence>, s_fenceCases),
2854 CASE_DESC(allocCallbackFailTest <QueryPool>, s_queryPoolCases),
2855 CASE_DESC(allocCallbackFailTest <ShaderModule>, s_shaderModuleCases),
2856 CASE_DESC(allocCallbackFailTest <PipelineCache>, s_pipelineCacheCases),
2857 CASE_DESC(allocCallbackFailTest <PipelineLayout>, s_pipelineLayoutCases),
2858 CASE_DESC(allocCallbackFailTest <RenderPass>, s_renderPassCases),
2859 CASE_DESC(allocCallbackFailTest <GraphicsPipeline>, s_graphicsPipelineCases),
2860 CASE_DESC(allocCallbackFailTest <ComputePipeline>, s_computePipelineCases),
2861 CASE_DESC(allocCallbackFailTest <DescriptorSetLayout>, s_descriptorSetLayoutCases),
2862 CASE_DESC(allocCallbackFailTest <Sampler>, s_samplerCases),
2863 CASE_DESC(allocCallbackFailTest <DescriptorPool>, s_descriptorPoolCases),
2864 CASE_DESC(allocCallbackFailTest <DescriptorSet>, s_descriptorSetCases),
2865 CASE_DESC(allocCallbackFailTest <Framebuffer>, s_framebufferCases),
2866 CASE_DESC(allocCallbackFailTest <CommandPool>, s_commandPoolCases),
2867 CASE_DESC(allocCallbackFailTest <CommandBuffer>, s_commandBufferCases),
2869 objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail", "Allocation callback failure", s_allocCallbackFailGroup));
2871 return objectMgmtTests.release();