1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 2e5c31af7Sopenharmony_ci * Vulkan Conformance Tests 3e5c31af7Sopenharmony_ci * ------------------------ 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright (c) 2015 Google Inc. 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 10e5c31af7Sopenharmony_ci * 11e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 17e5c31af7Sopenharmony_ci * limitations under the License. 18e5c31af7Sopenharmony_ci * 19e5c31af7Sopenharmony_ci *//*! 20e5c31af7Sopenharmony_ci * \file 21e5c31af7Sopenharmony_ci * \brief Object management tests 22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci#include "vktApiObjectManagementTests.hpp" 25e5c31af7Sopenharmony_ci#include "vktTestCaseUtil.hpp" 26e5c31af7Sopenharmony_ci#include "vktCustomInstancesDevices.hpp" 27e5c31af7Sopenharmony_ci 28e5c31af7Sopenharmony_ci#include "vkDefs.hpp" 29e5c31af7Sopenharmony_ci#include "vkRef.hpp" 30e5c31af7Sopenharmony_ci#include "vkRefUtil.hpp" 31e5c31af7Sopenharmony_ci#include "vkQueryUtil.hpp" 32e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp" 33e5c31af7Sopenharmony_ci#include "vkPrograms.hpp" 34e5c31af7Sopenharmony_ci#include "vkTypeUtil.hpp" 35e5c31af7Sopenharmony_ci#include "vkPlatform.hpp" 36e5c31af7Sopenharmony_ci#include "vkStrUtil.hpp" 37e5c31af7Sopenharmony_ci#include "vkAllocationCallbackUtil.hpp" 38e5c31af7Sopenharmony_ci#include "vkObjTypeImpl.inl" 39e5c31af7Sopenharmony_ci#include "vkObjUtil.hpp" 40e5c31af7Sopenharmony_ci#include "vkBuilderUtil.hpp" 41e5c31af7Sopenharmony_ci#include "vkSafetyCriticalUtil.hpp" 42e5c31af7Sopenharmony_ci 43e5c31af7Sopenharmony_ci#include "vktTestGroupUtil.hpp" 44e5c31af7Sopenharmony_ci 45e5c31af7Sopenharmony_ci#include "tcuVector.hpp" 46e5c31af7Sopenharmony_ci#include "tcuResultCollector.hpp" 47e5c31af7Sopenharmony_ci#include "tcuCommandLine.hpp" 48e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp" 49e5c31af7Sopenharmony_ci#include "tcuPlatform.hpp" 50e5c31af7Sopenharmony_ci 51e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp" 52e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp" 53e5c31af7Sopenharmony_ci#include "deArrayUtil.hpp" 54e5c31af7Sopenharmony_ci#include "deSpinBarrier.hpp" 55e5c31af7Sopenharmony_ci#include "deThread.hpp" 56e5c31af7Sopenharmony_ci#include "deInt32.h" 57e5c31af7Sopenharmony_ci 58e5c31af7Sopenharmony_ci#include <limits> 59e5c31af7Sopenharmony_ci#include <algorithm> 60e5c31af7Sopenharmony_ci 61e5c31af7Sopenharmony_ci#define VK_DESCRIPTOR_TYPE_LAST (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + 1) 62e5c31af7Sopenharmony_ci 63e5c31af7Sopenharmony_cinamespace vkt 64e5c31af7Sopenharmony_ci{ 65e5c31af7Sopenharmony_cinamespace api 66e5c31af7Sopenharmony_ci{ 67e5c31af7Sopenharmony_ci 68e5c31af7Sopenharmony_cinamespace 69e5c31af7Sopenharmony_ci{ 70e5c31af7Sopenharmony_ci 71e5c31af7Sopenharmony_ciusing namespace vk; 72e5c31af7Sopenharmony_ci 73e5c31af7Sopenharmony_ciusing de::UniquePtr; 74e5c31af7Sopenharmony_ciusing de::MovePtr; 75e5c31af7Sopenharmony_ciusing de::SharedPtr; 76e5c31af7Sopenharmony_ci 77e5c31af7Sopenharmony_ciusing tcu::IVec3; 78e5c31af7Sopenharmony_ciusing tcu::UVec3; 79e5c31af7Sopenharmony_ciusing tcu::ResultCollector; 80e5c31af7Sopenharmony_ciusing tcu::TestStatus; 81e5c31af7Sopenharmony_ciusing tcu::TestLog; 82e5c31af7Sopenharmony_ci 83e5c31af7Sopenharmony_ciusing std::string; 84e5c31af7Sopenharmony_ciusing std::vector; 85e5c31af7Sopenharmony_ci 86e5c31af7Sopenharmony_citypedef SharedPtr<Move<VkPipeline> > VkPipelineSp; // Move so it's possible to disown the handle 87e5c31af7Sopenharmony_citypedef SharedPtr<Move<VkDescriptorSet> > VkDescriptorSetSp; 88e5c31af7Sopenharmony_citypedef SharedPtr<Move<VkCommandBuffer> > VkCommandBufferSp; 89e5c31af7Sopenharmony_ci 90e5c31af7Sopenharmony_ciclass ThreadGroupThread; 91e5c31af7Sopenharmony_ci 92e5c31af7Sopenharmony_ci/*--------------------------------------------------------------------*//*! 93e5c31af7Sopenharmony_ci * \brief Thread group 94e5c31af7Sopenharmony_ci * 95e5c31af7Sopenharmony_ci * Thread group manages collection of threads that are expected to be 96e5c31af7Sopenharmony_ci * launched simultaneously as a group. 97e5c31af7Sopenharmony_ci * 98e5c31af7Sopenharmony_ci * Shared barrier is provided for synchronizing execution. Terminating thread 99e5c31af7Sopenharmony_ci * early either by returning from ThreadGroupThread::runThread() or throwing 100e5c31af7Sopenharmony_ci * an exception is safe, and other threads will continue execution. The 101e5c31af7Sopenharmony_ci * thread that has been terminated is simply removed from the synchronization 102e5c31af7Sopenharmony_ci * group. 103e5c31af7Sopenharmony_ci * 104e5c31af7Sopenharmony_ci * TestException-based exceptions are collected and translated into a 105e5c31af7Sopenharmony_ci * tcu::TestStatus by using tcu::ResultCollector. 106e5c31af7Sopenharmony_ci * 107e5c31af7Sopenharmony_ci * Use cases for ThreadGroup include for example testing thread-safety of 108e5c31af7Sopenharmony_ci * certain API operations by poking API simultaneously from multiple 109e5c31af7Sopenharmony_ci * threads. 110e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 111e5c31af7Sopenharmony_ci 112e5c31af7Sopenharmony_ciclass ThreadGroup 113e5c31af7Sopenharmony_ci{ 114e5c31af7Sopenharmony_cipublic: 115e5c31af7Sopenharmony_ci ThreadGroup (void); 116e5c31af7Sopenharmony_ci ~ThreadGroup (void); 117e5c31af7Sopenharmony_ci 118e5c31af7Sopenharmony_ci void add (de::MovePtr<ThreadGroupThread> thread); 119e5c31af7Sopenharmony_ci TestStatus run (void); 120e5c31af7Sopenharmony_ci 121e5c31af7Sopenharmony_ciprivate: 122e5c31af7Sopenharmony_ci typedef std::vector<de::SharedPtr<ThreadGroupThread> > ThreadVector; 123e5c31af7Sopenharmony_ci 124e5c31af7Sopenharmony_ci ThreadVector m_threads; 125e5c31af7Sopenharmony_ci de::SpinBarrier m_barrier; 126e5c31af7Sopenharmony_ci} DE_WARN_UNUSED_TYPE; 127e5c31af7Sopenharmony_ci 128e5c31af7Sopenharmony_ciclass ThreadGroupThread : private de::Thread 129e5c31af7Sopenharmony_ci{ 130e5c31af7Sopenharmony_cipublic: 131e5c31af7Sopenharmony_ci ThreadGroupThread (void); 132e5c31af7Sopenharmony_ci virtual ~ThreadGroupThread (void); 133e5c31af7Sopenharmony_ci 134e5c31af7Sopenharmony_ci void start (de::SpinBarrier* groupBarrier); 135e5c31af7Sopenharmony_ci 136e5c31af7Sopenharmony_ci ResultCollector& getResultCollector (void) { return m_resultCollector; } 137e5c31af7Sopenharmony_ci 138e5c31af7Sopenharmony_ci using de::Thread::join; 139e5c31af7Sopenharmony_ci 140e5c31af7Sopenharmony_ciprotected: 141e5c31af7Sopenharmony_ci virtual void runThread (void) = 0; 142e5c31af7Sopenharmony_ci 143e5c31af7Sopenharmony_ci void barrier (void); 144e5c31af7Sopenharmony_ci 145e5c31af7Sopenharmony_ciprivate: 146e5c31af7Sopenharmony_ci ThreadGroupThread (const ThreadGroupThread&); 147e5c31af7Sopenharmony_ci ThreadGroupThread& operator= (const ThreadGroupThread&); 148e5c31af7Sopenharmony_ci 149e5c31af7Sopenharmony_ci void run (void); 150e5c31af7Sopenharmony_ci 151e5c31af7Sopenharmony_ci ResultCollector m_resultCollector; 152e5c31af7Sopenharmony_ci de::SpinBarrier* m_barrier; 153e5c31af7Sopenharmony_ci}; 154e5c31af7Sopenharmony_ci 155e5c31af7Sopenharmony_ci// ThreadGroup 156e5c31af7Sopenharmony_ci 157e5c31af7Sopenharmony_ciThreadGroup::ThreadGroup (void) 158e5c31af7Sopenharmony_ci : m_barrier(1) 159e5c31af7Sopenharmony_ci{ 160e5c31af7Sopenharmony_ci} 161e5c31af7Sopenharmony_ci 162e5c31af7Sopenharmony_ciThreadGroup::~ThreadGroup (void) 163e5c31af7Sopenharmony_ci{ 164e5c31af7Sopenharmony_ci} 165e5c31af7Sopenharmony_ci 166e5c31af7Sopenharmony_civoid ThreadGroup::add (de::MovePtr<ThreadGroupThread> thread) 167e5c31af7Sopenharmony_ci{ 168e5c31af7Sopenharmony_ci m_threads.push_back(de::SharedPtr<ThreadGroupThread>(thread.release())); 169e5c31af7Sopenharmony_ci} 170e5c31af7Sopenharmony_ci 171e5c31af7Sopenharmony_citcu::TestStatus ThreadGroup::run (void) 172e5c31af7Sopenharmony_ci{ 173e5c31af7Sopenharmony_ci tcu::ResultCollector resultCollector; 174e5c31af7Sopenharmony_ci 175e5c31af7Sopenharmony_ci m_barrier.reset((int)m_threads.size()); 176e5c31af7Sopenharmony_ci 177e5c31af7Sopenharmony_ci for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter) 178e5c31af7Sopenharmony_ci (*threadIter)->start(&m_barrier); 179e5c31af7Sopenharmony_ci 180e5c31af7Sopenharmony_ci for (ThreadVector::iterator threadIter = m_threads.begin(); threadIter != m_threads.end(); ++threadIter) 181e5c31af7Sopenharmony_ci { 182e5c31af7Sopenharmony_ci tcu::ResultCollector& threadResult = (*threadIter)->getResultCollector(); 183e5c31af7Sopenharmony_ci (*threadIter)->join(); 184e5c31af7Sopenharmony_ci resultCollector.addResult(threadResult.getResult(), threadResult.getMessage()); 185e5c31af7Sopenharmony_ci } 186e5c31af7Sopenharmony_ci 187e5c31af7Sopenharmony_ci return tcu::TestStatus(resultCollector.getResult(), resultCollector.getMessage()); 188e5c31af7Sopenharmony_ci} 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_ci// ThreadGroupThread 191e5c31af7Sopenharmony_ci 192e5c31af7Sopenharmony_ciThreadGroupThread::ThreadGroupThread (void) 193e5c31af7Sopenharmony_ci : m_barrier(DE_NULL) 194e5c31af7Sopenharmony_ci{ 195e5c31af7Sopenharmony_ci} 196e5c31af7Sopenharmony_ci 197e5c31af7Sopenharmony_ciThreadGroupThread::~ThreadGroupThread (void) 198e5c31af7Sopenharmony_ci{ 199e5c31af7Sopenharmony_ci} 200e5c31af7Sopenharmony_ci 201e5c31af7Sopenharmony_civoid ThreadGroupThread::start (de::SpinBarrier* groupBarrier) 202e5c31af7Sopenharmony_ci{ 203e5c31af7Sopenharmony_ci m_barrier = groupBarrier; 204e5c31af7Sopenharmony_ci de::Thread::start(); 205e5c31af7Sopenharmony_ci} 206e5c31af7Sopenharmony_ci 207e5c31af7Sopenharmony_civoid ThreadGroupThread::run (void) 208e5c31af7Sopenharmony_ci{ 209e5c31af7Sopenharmony_ci try 210e5c31af7Sopenharmony_ci { 211e5c31af7Sopenharmony_ci runThread(); 212e5c31af7Sopenharmony_ci } 213e5c31af7Sopenharmony_ci catch (const tcu::TestException& e) 214e5c31af7Sopenharmony_ci { 215e5c31af7Sopenharmony_ci getResultCollector().addResult(e.getTestResult(), e.getMessage()); 216e5c31af7Sopenharmony_ci } 217e5c31af7Sopenharmony_ci catch (const std::exception& e) 218e5c31af7Sopenharmony_ci { 219e5c31af7Sopenharmony_ci getResultCollector().addResult(QP_TEST_RESULT_FAIL, e.what()); 220e5c31af7Sopenharmony_ci } 221e5c31af7Sopenharmony_ci catch (...) 222e5c31af7Sopenharmony_ci { 223e5c31af7Sopenharmony_ci getResultCollector().addResult(QP_TEST_RESULT_FAIL, "Exception"); 224e5c31af7Sopenharmony_ci } 225e5c31af7Sopenharmony_ci 226e5c31af7Sopenharmony_ci m_barrier->removeThread(de::SpinBarrier::WAIT_MODE_AUTO); 227e5c31af7Sopenharmony_ci} 228e5c31af7Sopenharmony_ci 229e5c31af7Sopenharmony_ciinline void ThreadGroupThread::barrier (void) 230e5c31af7Sopenharmony_ci{ 231e5c31af7Sopenharmony_ci m_barrier->sync(de::SpinBarrier::WAIT_MODE_AUTO); 232e5c31af7Sopenharmony_ci} 233e5c31af7Sopenharmony_ci 234e5c31af7Sopenharmony_cideUint32 getDefaultTestThreadCount (void) 235e5c31af7Sopenharmony_ci{ 236e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 237e5c31af7Sopenharmony_ci return de::clamp(deGetNumAvailableLogicalCores(), 2u, 8u); 238e5c31af7Sopenharmony_ci#else 239e5c31af7Sopenharmony_ci return 2u; 240e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 241e5c31af7Sopenharmony_ci 242e5c31af7Sopenharmony_ci} 243e5c31af7Sopenharmony_ci 244e5c31af7Sopenharmony_ci// Utilities 245e5c31af7Sopenharmony_ci 246e5c31af7Sopenharmony_cistruct Environment 247e5c31af7Sopenharmony_ci{ 248e5c31af7Sopenharmony_ci const PlatformInterface& vkp; 249e5c31af7Sopenharmony_ci deUint32 apiVersion; 250e5c31af7Sopenharmony_ci const InstanceInterface& instanceInterface; 251e5c31af7Sopenharmony_ci VkInstance instance; 252e5c31af7Sopenharmony_ci const DeviceInterface& vkd; 253e5c31af7Sopenharmony_ci VkDevice device; 254e5c31af7Sopenharmony_ci deUint32 queueFamilyIndex; 255e5c31af7Sopenharmony_ci const BinaryCollection& programBinaries; 256e5c31af7Sopenharmony_ci const VkAllocationCallbacks* allocationCallbacks; 257e5c31af7Sopenharmony_ci deUint32 maxResourceConsumers; // Maximum number of objects using same Object::Resources concurrently 258e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 259e5c31af7Sopenharmony_ci de::SharedPtr<ResourceInterface> resourceInterface; 260e5c31af7Sopenharmony_ci VkPhysicalDeviceVulkanSC10Properties vulkanSC10Properties; 261e5c31af7Sopenharmony_ci VkPhysicalDeviceProperties properties; 262e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 263e5c31af7Sopenharmony_ci const tcu::CommandLine& commandLine; 264e5c31af7Sopenharmony_ci 265e5c31af7Sopenharmony_ci Environment (Context& context, deUint32 maxResourceConsumers_) 266e5c31af7Sopenharmony_ci : vkp (context.getPlatformInterface()) 267e5c31af7Sopenharmony_ci , apiVersion (context.getUsedApiVersion()) 268e5c31af7Sopenharmony_ci , instanceInterface (context.getInstanceInterface()) 269e5c31af7Sopenharmony_ci , instance (context.getInstance()) 270e5c31af7Sopenharmony_ci , vkd (context.getDeviceInterface()) 271e5c31af7Sopenharmony_ci , device (context.getDevice()) 272e5c31af7Sopenharmony_ci , queueFamilyIndex (context.getUniversalQueueFamilyIndex()) 273e5c31af7Sopenharmony_ci , programBinaries (context.getBinaryCollection()) 274e5c31af7Sopenharmony_ci , allocationCallbacks (DE_NULL) 275e5c31af7Sopenharmony_ci , maxResourceConsumers (maxResourceConsumers_) 276e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 277e5c31af7Sopenharmony_ci , resourceInterface (context.getResourceInterface()) 278e5c31af7Sopenharmony_ci , vulkanSC10Properties (context.getDeviceVulkanSC10Properties()) 279e5c31af7Sopenharmony_ci , properties (context.getDeviceProperties()) 280e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 281e5c31af7Sopenharmony_ci , commandLine (context.getTestContext().getCommandLine()) 282e5c31af7Sopenharmony_ci { 283e5c31af7Sopenharmony_ci } 284e5c31af7Sopenharmony_ci 285e5c31af7Sopenharmony_ci Environment (const PlatformInterface& vkp_, 286e5c31af7Sopenharmony_ci deUint32 apiVersion_, 287e5c31af7Sopenharmony_ci const InstanceInterface& instanceInterface_, 288e5c31af7Sopenharmony_ci VkInstance instance_, 289e5c31af7Sopenharmony_ci const DeviceInterface& vkd_, 290e5c31af7Sopenharmony_ci VkDevice device_, 291e5c31af7Sopenharmony_ci deUint32 queueFamilyIndex_, 292e5c31af7Sopenharmony_ci const BinaryCollection& programBinaries_, 293e5c31af7Sopenharmony_ci const VkAllocationCallbacks* allocationCallbacks_, 294e5c31af7Sopenharmony_ci deUint32 maxResourceConsumers_, 295e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 296e5c31af7Sopenharmony_ci de::SharedPtr<ResourceInterface> resourceInterface_, 297e5c31af7Sopenharmony_ci const VkPhysicalDeviceVulkanSC10Properties& vulkanSC10Properties_, 298e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 299e5c31af7Sopenharmony_ci const tcu::CommandLine& commandLine_) 300e5c31af7Sopenharmony_ci : vkp (vkp_) 301e5c31af7Sopenharmony_ci , apiVersion (apiVersion_) 302e5c31af7Sopenharmony_ci , instanceInterface (instanceInterface_) 303e5c31af7Sopenharmony_ci , instance (instance_) 304e5c31af7Sopenharmony_ci , vkd (vkd_) 305e5c31af7Sopenharmony_ci , device (device_) 306e5c31af7Sopenharmony_ci , queueFamilyIndex (queueFamilyIndex_) 307e5c31af7Sopenharmony_ci , programBinaries (programBinaries_) 308e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 309e5c31af7Sopenharmony_ci , allocationCallbacks(DE_NULL) 310e5c31af7Sopenharmony_ci#else 311e5c31af7Sopenharmony_ci , allocationCallbacks(allocationCallbacks_) 312e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 313e5c31af7Sopenharmony_ci , maxResourceConsumers (maxResourceConsumers_) 314e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 315e5c31af7Sopenharmony_ci , resourceInterface (resourceInterface_) 316e5c31af7Sopenharmony_ci , vulkanSC10Properties (vulkanSC10Properties_) 317e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 318e5c31af7Sopenharmony_ci , commandLine (commandLine_) 319e5c31af7Sopenharmony_ci { 320e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 321e5c31af7Sopenharmony_ci DE_UNREF(allocationCallbacks_); 322e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 323e5c31af7Sopenharmony_ci } 324e5c31af7Sopenharmony_ci}; 325e5c31af7Sopenharmony_ci 326e5c31af7Sopenharmony_citemplate<typename Case> 327e5c31af7Sopenharmony_cistruct Dependency 328e5c31af7Sopenharmony_ci{ 329e5c31af7Sopenharmony_ci typename Case::Resources resources; 330e5c31af7Sopenharmony_ci Unique<typename Case::Type> object; 331e5c31af7Sopenharmony_ci 332e5c31af7Sopenharmony_ci Dependency (const Environment& env, const typename Case::Parameters& params) 333e5c31af7Sopenharmony_ci : resources (env, params) 334e5c31af7Sopenharmony_ci , object (Case::create(env, resources, params)) 335e5c31af7Sopenharmony_ci {} 336e5c31af7Sopenharmony_ci}; 337e5c31af7Sopenharmony_ci 338e5c31af7Sopenharmony_citemplate<typename T> 339e5c31af7Sopenharmony_ciT roundUpToNextMultiple (T value, T multiple) 340e5c31af7Sopenharmony_ci{ 341e5c31af7Sopenharmony_ci if (value % multiple == 0) 342e5c31af7Sopenharmony_ci return value; 343e5c31af7Sopenharmony_ci else 344e5c31af7Sopenharmony_ci return value + multiple - (value % multiple); 345e5c31af7Sopenharmony_ci} 346e5c31af7Sopenharmony_ci 347e5c31af7Sopenharmony_ci#if defined(DE_DEBUG) 348e5c31af7Sopenharmony_citemplate<typename T> 349e5c31af7Sopenharmony_cibool isPowerOfTwo (T value) 350e5c31af7Sopenharmony_ci{ 351e5c31af7Sopenharmony_ci return ((value & (value - T(1))) == 0); 352e5c31af7Sopenharmony_ci} 353e5c31af7Sopenharmony_ci#endif 354e5c31af7Sopenharmony_ci 355e5c31af7Sopenharmony_citemplate<typename T> 356e5c31af7Sopenharmony_ciT alignToPowerOfTwo (T value, T align) 357e5c31af7Sopenharmony_ci{ 358e5c31af7Sopenharmony_ci DE_ASSERT(isPowerOfTwo(align)); 359e5c31af7Sopenharmony_ci return (value + align - T(1)) & ~(align - T(1)); 360e5c31af7Sopenharmony_ci} 361e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 362e5c31af7Sopenharmony_ciinline bool hasDeviceExtension (Context& context, const string name) 363e5c31af7Sopenharmony_ci{ 364e5c31af7Sopenharmony_ci return context.isDeviceFunctionalitySupported(name); 365e5c31af7Sopenharmony_ci} 366e5c31af7Sopenharmony_ci#endif 367e5c31af7Sopenharmony_ci 368e5c31af7Sopenharmony_ciVkDeviceSize getPageTableSize (const tcu::PlatformMemoryLimits& limits, VkDeviceSize allocationSize) 369e5c31af7Sopenharmony_ci{ 370e5c31af7Sopenharmony_ci VkDeviceSize totalSize = 0; 371e5c31af7Sopenharmony_ci 372e5c31af7Sopenharmony_ci for (size_t levelNdx = 0; levelNdx < limits.devicePageTableHierarchyLevels; ++levelNdx) 373e5c31af7Sopenharmony_ci { 374e5c31af7Sopenharmony_ci const VkDeviceSize coveredAddressSpaceSize = limits.devicePageSize<<levelNdx; 375e5c31af7Sopenharmony_ci const VkDeviceSize numPagesNeeded = alignToPowerOfTwo(allocationSize, coveredAddressSpaceSize) / coveredAddressSpaceSize; 376e5c31af7Sopenharmony_ci 377e5c31af7Sopenharmony_ci totalSize += numPagesNeeded*limits.devicePageTableEntrySize; 378e5c31af7Sopenharmony_ci } 379e5c31af7Sopenharmony_ci 380e5c31af7Sopenharmony_ci return totalSize; 381e5c31af7Sopenharmony_ci} 382e5c31af7Sopenharmony_ci 383e5c31af7Sopenharmony_cisize_t getCurrentSystemMemoryUsage (const AllocationCallbackRecorder& allocRecoder) 384e5c31af7Sopenharmony_ci{ 385e5c31af7Sopenharmony_ci const size_t systemAllocationOverhead = sizeof(void*)*2; 386e5c31af7Sopenharmony_ci AllocationCallbackValidationResults validationResults; 387e5c31af7Sopenharmony_ci 388e5c31af7Sopenharmony_ci validateAllocationCallbacks(allocRecoder, &validationResults); 389e5c31af7Sopenharmony_ci TCU_CHECK(validationResults.violations.empty()); 390e5c31af7Sopenharmony_ci 391e5c31af7Sopenharmony_ci return getLiveSystemAllocationTotal(validationResults) + systemAllocationOverhead*validationResults.liveAllocations.size(); 392e5c31af7Sopenharmony_ci} 393e5c31af7Sopenharmony_ci 394e5c31af7Sopenharmony_citemplate<typename Object> 395e5c31af7Sopenharmony_cisize_t computeSystemMemoryUsage (Context& context, const typename Object::Parameters& params) 396e5c31af7Sopenharmony_ci{ 397e5c31af7Sopenharmony_ci AllocationCallbackRecorder allocRecorder (getSystemAllocator()); 398e5c31af7Sopenharmony_ci const Environment env (context.getPlatformInterface(), 399e5c31af7Sopenharmony_ci context.getUsedApiVersion(), 400e5c31af7Sopenharmony_ci context.getInstanceInterface(), 401e5c31af7Sopenharmony_ci context.getInstance(), 402e5c31af7Sopenharmony_ci context.getDeviceInterface(), 403e5c31af7Sopenharmony_ci context.getDevice(), 404e5c31af7Sopenharmony_ci context.getUniversalQueueFamilyIndex(), 405e5c31af7Sopenharmony_ci context.getBinaryCollection(), 406e5c31af7Sopenharmony_ci allocRecorder.getCallbacks(), 407e5c31af7Sopenharmony_ci 1u, 408e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 409e5c31af7Sopenharmony_ci context.getResourceInterface(), 410e5c31af7Sopenharmony_ci context.getDeviceVulkanSC10Properties(), 411e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 412e5c31af7Sopenharmony_ci context.getTestContext().getCommandLine()); 413e5c31af7Sopenharmony_ci const typename Object::Resources res (env, params); 414e5c31af7Sopenharmony_ci const size_t resourceMemoryUsage = getCurrentSystemMemoryUsage(allocRecorder); 415e5c31af7Sopenharmony_ci 416e5c31af7Sopenharmony_ci { 417e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj (Object::create(env, res, params)); 418e5c31af7Sopenharmony_ci const size_t totalMemoryUsage = getCurrentSystemMemoryUsage(allocRecorder); 419e5c31af7Sopenharmony_ci 420e5c31af7Sopenharmony_ci return totalMemoryUsage - resourceMemoryUsage; 421e5c31af7Sopenharmony_ci } 422e5c31af7Sopenharmony_ci} 423e5c31af7Sopenharmony_ci 424e5c31af7Sopenharmony_cisize_t getSafeObjectCount (const tcu::PlatformMemoryLimits& memoryLimits, 425e5c31af7Sopenharmony_ci size_t objectSystemMemoryUsage, 426e5c31af7Sopenharmony_ci VkDeviceSize objectDeviceMemoryUsage = 0) 427e5c31af7Sopenharmony_ci{ 428e5c31af7Sopenharmony_ci const VkDeviceSize roundedUpDeviceMemory = roundUpToNextMultiple(objectDeviceMemoryUsage, memoryLimits.deviceMemoryAllocationGranularity); 429e5c31af7Sopenharmony_ci 430e5c31af7Sopenharmony_ci if (memoryLimits.totalDeviceLocalMemory > 0 && roundedUpDeviceMemory > 0) 431e5c31af7Sopenharmony_ci { 432e5c31af7Sopenharmony_ci if (objectSystemMemoryUsage > 0) 433e5c31af7Sopenharmony_ci return de::min(memoryLimits.totalSystemMemory / objectSystemMemoryUsage, 434e5c31af7Sopenharmony_ci (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory)); 435e5c31af7Sopenharmony_ci else 436e5c31af7Sopenharmony_ci return (size_t)(memoryLimits.totalDeviceLocalMemory / roundedUpDeviceMemory); 437e5c31af7Sopenharmony_ci } 438e5c31af7Sopenharmony_ci else if (objectSystemMemoryUsage + roundedUpDeviceMemory > 0) 439e5c31af7Sopenharmony_ci { 440e5c31af7Sopenharmony_ci DE_ASSERT(roundedUpDeviceMemory <= std::numeric_limits<size_t>::max() - objectSystemMemoryUsage); 441e5c31af7Sopenharmony_ci return memoryLimits.totalSystemMemory / (objectSystemMemoryUsage + (size_t)roundedUpDeviceMemory); 442e5c31af7Sopenharmony_ci } 443e5c31af7Sopenharmony_ci else 444e5c31af7Sopenharmony_ci { 445e5c31af7Sopenharmony_ci // Warning: at this point driver has probably not implemented allocation callbacks correctly 446e5c31af7Sopenharmony_ci return std::numeric_limits<size_t>::max(); 447e5c31af7Sopenharmony_ci } 448e5c31af7Sopenharmony_ci} 449e5c31af7Sopenharmony_ci 450e5c31af7Sopenharmony_citcu::PlatformMemoryLimits getPlatformMemoryLimits (Context& context) 451e5c31af7Sopenharmony_ci{ 452e5c31af7Sopenharmony_ci tcu::PlatformMemoryLimits memoryLimits; 453e5c31af7Sopenharmony_ci 454e5c31af7Sopenharmony_ci context.getTestContext().getPlatform().getMemoryLimits(memoryLimits); 455e5c31af7Sopenharmony_ci 456e5c31af7Sopenharmony_ci return memoryLimits; 457e5c31af7Sopenharmony_ci} 458e5c31af7Sopenharmony_ci 459e5c31af7Sopenharmony_cisize_t getSafeObjectCount (Context& context, size_t objectSystemMemoryUsage, VkDeviceSize objectDeviceMemorySize = 0) 460e5c31af7Sopenharmony_ci{ 461e5c31af7Sopenharmony_ci return getSafeObjectCount(getPlatformMemoryLimits(context), objectSystemMemoryUsage, objectDeviceMemorySize); 462e5c31af7Sopenharmony_ci} 463e5c31af7Sopenharmony_ci 464e5c31af7Sopenharmony_ciVkDeviceSize getPageTableSize (Context& context, VkDeviceSize allocationSize) 465e5c31af7Sopenharmony_ci{ 466e5c31af7Sopenharmony_ci return getPageTableSize(getPlatformMemoryLimits(context), allocationSize); 467e5c31af7Sopenharmony_ci} 468e5c31af7Sopenharmony_ci 469e5c31af7Sopenharmony_citemplate<typename Object> 470e5c31af7Sopenharmony_cideUint32 getSafeObjectCount (Context& context, 471e5c31af7Sopenharmony_ci const typename Object::Parameters& params, 472e5c31af7Sopenharmony_ci deUint32 hardCountLimit, 473e5c31af7Sopenharmony_ci VkDeviceSize deviceMemoryUsage = 0) 474e5c31af7Sopenharmony_ci{ 475e5c31af7Sopenharmony_ci return (deUint32)de::min((size_t)hardCountLimit, 476e5c31af7Sopenharmony_ci getSafeObjectCount(context, 477e5c31af7Sopenharmony_ci computeSystemMemoryUsage<Object>(context, params), 478e5c31af7Sopenharmony_ci deviceMemoryUsage)); 479e5c31af7Sopenharmony_ci} 480e5c31af7Sopenharmony_ci 481e5c31af7Sopenharmony_ci// Object definitions 482e5c31af7Sopenharmony_ci 483e5c31af7Sopenharmony_cienum 484e5c31af7Sopenharmony_ci{ 485e5c31af7Sopenharmony_ci MAX_CONCURRENT_INSTANCES = 32, 486e5c31af7Sopenharmony_ci MAX_CONCURRENT_DEVICES = 32, 487e5c31af7Sopenharmony_ci MAX_CONCURRENT_SYNC_PRIMITIVES = 100, 488e5c31af7Sopenharmony_ci MAX_CONCURRENT_PIPELINE_CACHES = 128, 489e5c31af7Sopenharmony_ci MAX_CONCURRENT_QUERY_POOLS = 8192, 490e5c31af7Sopenharmony_ci DEFAULT_MAX_CONCURRENT_OBJECTS = 16*1024, 491e5c31af7Sopenharmony_ci}; 492e5c31af7Sopenharmony_ci 493e5c31af7Sopenharmony_cistruct Instance 494e5c31af7Sopenharmony_ci{ 495e5c31af7Sopenharmony_ci typedef VkInstance Type; 496e5c31af7Sopenharmony_ci 497e5c31af7Sopenharmony_ci struct Parameters 498e5c31af7Sopenharmony_ci { 499e5c31af7Sopenharmony_ci const vector<string> instanceExtensions; 500e5c31af7Sopenharmony_ci 501e5c31af7Sopenharmony_ci Parameters (void) {} 502e5c31af7Sopenharmony_ci 503e5c31af7Sopenharmony_ci Parameters (vector<string>& extensions) 504e5c31af7Sopenharmony_ci : instanceExtensions (extensions) 505e5c31af7Sopenharmony_ci {} 506e5c31af7Sopenharmony_ci }; 507e5c31af7Sopenharmony_ci 508e5c31af7Sopenharmony_ci struct Resources 509e5c31af7Sopenharmony_ci { 510e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 511e5c31af7Sopenharmony_ci }; 512e5c31af7Sopenharmony_ci 513e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 514e5c31af7Sopenharmony_ci { 515e5c31af7Sopenharmony_ci return getSafeObjectCount<Instance>(context, params, MAX_CONCURRENT_INSTANCES); 516e5c31af7Sopenharmony_ci } 517e5c31af7Sopenharmony_ci 518e5c31af7Sopenharmony_ci static Move<VkInstance> create (const Environment& env, const Resources&, const Parameters& params) 519e5c31af7Sopenharmony_ci { 520e5c31af7Sopenharmony_ci vector<const char*> extensionNamePtrs; 521e5c31af7Sopenharmony_ci const vector<VkExtensionProperties> instanceExts = enumerateInstanceExtensionProperties(env.vkp, DE_NULL); 522e5c31af7Sopenharmony_ci for (const auto& extName : params.instanceExtensions) 523e5c31af7Sopenharmony_ci { 524e5c31af7Sopenharmony_ci bool extNotInCore = !isCoreInstanceExtension(env.apiVersion, extName); 525e5c31af7Sopenharmony_ci if (extNotInCore && !isExtensionStructSupported(instanceExts.begin(), instanceExts.end(), RequiredExtension(extName))) 526e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, (extName + " is not supported").c_str()); 527e5c31af7Sopenharmony_ci 528e5c31af7Sopenharmony_ci if (extNotInCore) 529e5c31af7Sopenharmony_ci extensionNamePtrs.push_back(extName.c_str()); 530e5c31af7Sopenharmony_ci } 531e5c31af7Sopenharmony_ci 532e5c31af7Sopenharmony_ci const VkApplicationInfo appInfo = 533e5c31af7Sopenharmony_ci { 534e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_APPLICATION_INFO, 535e5c31af7Sopenharmony_ci DE_NULL, 536e5c31af7Sopenharmony_ci DE_NULL, // pApplicationName 537e5c31af7Sopenharmony_ci 0u, // applicationVersion 538e5c31af7Sopenharmony_ci DE_NULL, // pEngineName 539e5c31af7Sopenharmony_ci 0u, // engineVersion 540e5c31af7Sopenharmony_ci env.apiVersion 541e5c31af7Sopenharmony_ci }; 542e5c31af7Sopenharmony_ci 543e5c31af7Sopenharmony_ci const VkInstanceCreateInfo instanceInfo = 544e5c31af7Sopenharmony_ci { 545e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 546e5c31af7Sopenharmony_ci DE_NULL, 547e5c31af7Sopenharmony_ci (VkInstanceCreateFlags)0, 548e5c31af7Sopenharmony_ci &appInfo, 549e5c31af7Sopenharmony_ci 0u, // enabledLayerNameCount 550e5c31af7Sopenharmony_ci DE_NULL, // ppEnabledLayerNames 551e5c31af7Sopenharmony_ci (deUint32)extensionNamePtrs.size(), // enabledExtensionNameCount 552e5c31af7Sopenharmony_ci extensionNamePtrs.empty() ? DE_NULL : &extensionNamePtrs[0], // ppEnabledExtensionNames 553e5c31af7Sopenharmony_ci }; 554e5c31af7Sopenharmony_ci 555e5c31af7Sopenharmony_ci return createInstance(env.vkp, &instanceInfo, env.allocationCallbacks); 556e5c31af7Sopenharmony_ci } 557e5c31af7Sopenharmony_ci}; 558e5c31af7Sopenharmony_ci 559e5c31af7Sopenharmony_cistruct Device 560e5c31af7Sopenharmony_ci{ 561e5c31af7Sopenharmony_ci typedef VkDevice Type; 562e5c31af7Sopenharmony_ci 563e5c31af7Sopenharmony_ci struct Parameters 564e5c31af7Sopenharmony_ci { 565e5c31af7Sopenharmony_ci deUint32 deviceIndex; 566e5c31af7Sopenharmony_ci VkQueueFlags queueFlags; 567e5c31af7Sopenharmony_ci 568e5c31af7Sopenharmony_ci Parameters (deUint32 deviceIndex_, VkQueueFlags queueFlags_) 569e5c31af7Sopenharmony_ci : deviceIndex (deviceIndex_) 570e5c31af7Sopenharmony_ci , queueFlags (queueFlags_) 571e5c31af7Sopenharmony_ci {} 572e5c31af7Sopenharmony_ci }; 573e5c31af7Sopenharmony_ci 574e5c31af7Sopenharmony_ci struct Resources 575e5c31af7Sopenharmony_ci { 576e5c31af7Sopenharmony_ci Dependency<Instance> instance; 577e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 578e5c31af7Sopenharmony_ci InstanceDriver vki; 579e5c31af7Sopenharmony_ci#else 580e5c31af7Sopenharmony_ci InstanceDriverSC vki; 581e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 582e5c31af7Sopenharmony_ci 583e5c31af7Sopenharmony_ci VkPhysicalDevice physicalDevice; 584e5c31af7Sopenharmony_ci deUint32 queueFamilyIndex; 585e5c31af7Sopenharmony_ci 586e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 587e5c31af7Sopenharmony_ci : instance (env, Instance::Parameters()) 588e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 589e5c31af7Sopenharmony_ci , vki(env.vkp, *instance.object) 590e5c31af7Sopenharmony_ci#else 591e5c31af7Sopenharmony_ci , vki(env.vkp, *instance.object, env.commandLine, env.resourceInterface) 592e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 593e5c31af7Sopenharmony_ci , physicalDevice (0) 594e5c31af7Sopenharmony_ci , queueFamilyIndex (~0u) 595e5c31af7Sopenharmony_ci { 596e5c31af7Sopenharmony_ci { 597e5c31af7Sopenharmony_ci const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(vki, *instance.object); 598e5c31af7Sopenharmony_ci 599e5c31af7Sopenharmony_ci if (physicalDevices.size() <= (size_t)params.deviceIndex) 600e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device not found"); 601e5c31af7Sopenharmony_ci 602e5c31af7Sopenharmony_ci physicalDevice = physicalDevices[params.deviceIndex]; 603e5c31af7Sopenharmony_ci } 604e5c31af7Sopenharmony_ci 605e5c31af7Sopenharmony_ci { 606e5c31af7Sopenharmony_ci const vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice); 607e5c31af7Sopenharmony_ci bool foundMatching = false; 608e5c31af7Sopenharmony_ci 609e5c31af7Sopenharmony_ci for (size_t curQueueNdx = 0; curQueueNdx < queueProps.size(); curQueueNdx++) 610e5c31af7Sopenharmony_ci { 611e5c31af7Sopenharmony_ci if ((queueProps[curQueueNdx].queueFlags & params.queueFlags) == params.queueFlags) 612e5c31af7Sopenharmony_ci { 613e5c31af7Sopenharmony_ci queueFamilyIndex = (deUint32)curQueueNdx; 614e5c31af7Sopenharmony_ci foundMatching = true; 615e5c31af7Sopenharmony_ci } 616e5c31af7Sopenharmony_ci } 617e5c31af7Sopenharmony_ci 618e5c31af7Sopenharmony_ci if (!foundMatching) 619e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Matching queue not found"); 620e5c31af7Sopenharmony_ci } 621e5c31af7Sopenharmony_ci } 622e5c31af7Sopenharmony_ci }; 623e5c31af7Sopenharmony_ci 624e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 625e5c31af7Sopenharmony_ci { 626e5c31af7Sopenharmony_ci return getSafeObjectCount<Device>(context, params, MAX_CONCURRENT_DEVICES); 627e5c31af7Sopenharmony_ci } 628e5c31af7Sopenharmony_ci 629e5c31af7Sopenharmony_ci static Move<VkDevice> create (const Environment& env, const Resources& res, const Parameters&) 630e5c31af7Sopenharmony_ci { 631e5c31af7Sopenharmony_ci const float queuePriority = 1.0; 632e5c31af7Sopenharmony_ci 633e5c31af7Sopenharmony_ci const VkDeviceQueueCreateInfo queues[] = 634e5c31af7Sopenharmony_ci { 635e5c31af7Sopenharmony_ci { 636e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 637e5c31af7Sopenharmony_ci DE_NULL, 638e5c31af7Sopenharmony_ci (VkDeviceQueueCreateFlags)0, 639e5c31af7Sopenharmony_ci res.queueFamilyIndex, 640e5c31af7Sopenharmony_ci 1u, // queueCount 641e5c31af7Sopenharmony_ci &queuePriority, // pQueuePriorities 642e5c31af7Sopenharmony_ci } 643e5c31af7Sopenharmony_ci }; 644e5c31af7Sopenharmony_ci 645e5c31af7Sopenharmony_ci void* pNext = DE_NULL; 646e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 647e5c31af7Sopenharmony_ci VkDeviceObjectReservationCreateInfo memReservationInfo = env.commandLine.isSubProcess() ? env.resourceInterface->getStatMax() : resetDeviceObjectReservationCreateInfo(); 648e5c31af7Sopenharmony_ci memReservationInfo.pNext = pNext; 649e5c31af7Sopenharmony_ci pNext = &memReservationInfo; 650e5c31af7Sopenharmony_ci 651e5c31af7Sopenharmony_ci VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features(); 652e5c31af7Sopenharmony_ci sc10Features.pNext = pNext; 653e5c31af7Sopenharmony_ci pNext = &sc10Features; 654e5c31af7Sopenharmony_ci 655e5c31af7Sopenharmony_ci VkPipelineCacheCreateInfo pcCI; 656e5c31af7Sopenharmony_ci std::vector<VkPipelinePoolSize> poolSizes; 657e5c31af7Sopenharmony_ci if (env.commandLine.isSubProcess()) 658e5c31af7Sopenharmony_ci { 659e5c31af7Sopenharmony_ci if (env.resourceInterface->getCacheDataSize() > 0) 660e5c31af7Sopenharmony_ci { 661e5c31af7Sopenharmony_ci pcCI = 662e5c31af7Sopenharmony_ci { 663e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType; 664e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext; 665e5c31af7Sopenharmony_ci VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT | 666e5c31af7Sopenharmony_ci VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT, // VkPipelineCacheCreateFlags flags; 667e5c31af7Sopenharmony_ci env.resourceInterface->getCacheDataSize(), // deUintptr initialDataSize; 668e5c31af7Sopenharmony_ci env.resourceInterface->getCacheData() // const void* pInitialData; 669e5c31af7Sopenharmony_ci }; 670e5c31af7Sopenharmony_ci memReservationInfo.pipelineCacheCreateInfoCount = 1; 671e5c31af7Sopenharmony_ci memReservationInfo.pPipelineCacheCreateInfos = &pcCI; 672e5c31af7Sopenharmony_ci } 673e5c31af7Sopenharmony_ci 674e5c31af7Sopenharmony_ci poolSizes = env.resourceInterface->getPipelinePoolSizes(); 675e5c31af7Sopenharmony_ci if (!poolSizes.empty()) 676e5c31af7Sopenharmony_ci { 677e5c31af7Sopenharmony_ci memReservationInfo.pipelinePoolSizeCount = deUint32(poolSizes.size()); 678e5c31af7Sopenharmony_ci memReservationInfo.pPipelinePoolSizes = poolSizes.data(); 679e5c31af7Sopenharmony_ci } 680e5c31af7Sopenharmony_ci } 681e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 682e5c31af7Sopenharmony_ci 683e5c31af7Sopenharmony_ci VkPhysicalDeviceFeatures enabledFeatures = getPhysicalDeviceFeatures(res.vki, res.physicalDevice); 684e5c31af7Sopenharmony_ci 685e5c31af7Sopenharmony_ci const VkDeviceCreateInfo deviceInfo = 686e5c31af7Sopenharmony_ci { 687e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 688e5c31af7Sopenharmony_ci pNext, 689e5c31af7Sopenharmony_ci (VkDeviceCreateFlags)0, 690e5c31af7Sopenharmony_ci DE_LENGTH_OF_ARRAY(queues), 691e5c31af7Sopenharmony_ci queues, 692e5c31af7Sopenharmony_ci 0u, // enabledLayerNameCount 693e5c31af7Sopenharmony_ci DE_NULL, // ppEnabledLayerNames 694e5c31af7Sopenharmony_ci 0u, // enabledExtensionNameCount 695e5c31af7Sopenharmony_ci DE_NULL, // ppEnabledExtensionNames 696e5c31af7Sopenharmony_ci &enabledFeatures, // pEnabledFeatures 697e5c31af7Sopenharmony_ci }; 698e5c31af7Sopenharmony_ci 699e5c31af7Sopenharmony_ci return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevice, &deviceInfo, env.allocationCallbacks); 700e5c31af7Sopenharmony_ci } 701e5c31af7Sopenharmony_ci}; 702e5c31af7Sopenharmony_ci 703e5c31af7Sopenharmony_ci 704e5c31af7Sopenharmony_cistruct DeviceGroup 705e5c31af7Sopenharmony_ci{ 706e5c31af7Sopenharmony_ci typedef VkDevice Type; 707e5c31af7Sopenharmony_ci 708e5c31af7Sopenharmony_ci struct Parameters 709e5c31af7Sopenharmony_ci { 710e5c31af7Sopenharmony_ci deUint32 deviceGroupIndex; 711e5c31af7Sopenharmony_ci deUint32 deviceIndex; 712e5c31af7Sopenharmony_ci VkQueueFlags queueFlags; 713e5c31af7Sopenharmony_ci 714e5c31af7Sopenharmony_ci Parameters (deUint32 deviceGroupIndex_, deUint32 deviceIndex_, VkQueueFlags queueFlags_) 715e5c31af7Sopenharmony_ci : deviceGroupIndex (deviceGroupIndex_) 716e5c31af7Sopenharmony_ci , deviceIndex (deviceIndex_) 717e5c31af7Sopenharmony_ci , queueFlags (queueFlags_) 718e5c31af7Sopenharmony_ci {} 719e5c31af7Sopenharmony_ci }; 720e5c31af7Sopenharmony_ci 721e5c31af7Sopenharmony_ci struct Resources 722e5c31af7Sopenharmony_ci { 723e5c31af7Sopenharmony_ci vector<string> extensions; 724e5c31af7Sopenharmony_ci Dependency<Instance> instance; 725e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 726e5c31af7Sopenharmony_ci InstanceDriver vki; 727e5c31af7Sopenharmony_ci#else 728e5c31af7Sopenharmony_ci InstanceDriverSC vki; 729e5c31af7Sopenharmony_ci#endif 730e5c31af7Sopenharmony_ci vector<VkPhysicalDevice> physicalDevices; 731e5c31af7Sopenharmony_ci deUint32 physicalDeviceCount; 732e5c31af7Sopenharmony_ci deUint32 queueFamilyIndex; 733e5c31af7Sopenharmony_ci 734e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 735e5c31af7Sopenharmony_ci : extensions (1, "VK_KHR_device_group_creation") 736e5c31af7Sopenharmony_ci , instance (env, Instance::Parameters(extensions)) 737e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 738e5c31af7Sopenharmony_ci , vki (env.vkp, *instance.object) 739e5c31af7Sopenharmony_ci#else 740e5c31af7Sopenharmony_ci , vki (env.vkp, *instance.object, env.commandLine, env.resourceInterface) 741e5c31af7Sopenharmony_ci#endif 742e5c31af7Sopenharmony_ci , physicalDeviceCount (0) 743e5c31af7Sopenharmony_ci , queueFamilyIndex (~0u) 744e5c31af7Sopenharmony_ci { 745e5c31af7Sopenharmony_ci { 746e5c31af7Sopenharmony_ci const vector<VkPhysicalDeviceGroupProperties> devGroupProperties = enumeratePhysicalDeviceGroups(vki, *instance.object); 747e5c31af7Sopenharmony_ci 748e5c31af7Sopenharmony_ci if (devGroupProperties.size() <= (size_t)params.deviceGroupIndex) 749e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device Group not found"); 750e5c31af7Sopenharmony_ci 751e5c31af7Sopenharmony_ci physicalDeviceCount = devGroupProperties[params.deviceGroupIndex].physicalDeviceCount; 752e5c31af7Sopenharmony_ci physicalDevices.resize(physicalDeviceCount); 753e5c31af7Sopenharmony_ci 754e5c31af7Sopenharmony_ci for (deUint32 physicalDeviceIdx = 0; physicalDeviceIdx < physicalDeviceCount; physicalDeviceIdx++) 755e5c31af7Sopenharmony_ci physicalDevices[physicalDeviceIdx] = devGroupProperties[params.deviceGroupIndex].physicalDevices[physicalDeviceIdx]; 756e5c31af7Sopenharmony_ci } 757e5c31af7Sopenharmony_ci 758e5c31af7Sopenharmony_ci { 759e5c31af7Sopenharmony_ci const vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevices[params.deviceIndex]); 760e5c31af7Sopenharmony_ci bool foundMatching = false; 761e5c31af7Sopenharmony_ci 762e5c31af7Sopenharmony_ci for (size_t curQueueNdx = 0; curQueueNdx < queueProps.size(); curQueueNdx++) 763e5c31af7Sopenharmony_ci { 764e5c31af7Sopenharmony_ci if ((queueProps[curQueueNdx].queueFlags & params.queueFlags) == params.queueFlags) 765e5c31af7Sopenharmony_ci { 766e5c31af7Sopenharmony_ci queueFamilyIndex = (deUint32)curQueueNdx; 767e5c31af7Sopenharmony_ci foundMatching = true; 768e5c31af7Sopenharmony_ci } 769e5c31af7Sopenharmony_ci } 770e5c31af7Sopenharmony_ci 771e5c31af7Sopenharmony_ci if (!foundMatching) 772e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Matching queue not found"); 773e5c31af7Sopenharmony_ci } 774e5c31af7Sopenharmony_ci } 775e5c31af7Sopenharmony_ci }; 776e5c31af7Sopenharmony_ci 777e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 778e5c31af7Sopenharmony_ci { 779e5c31af7Sopenharmony_ci return getSafeObjectCount<DeviceGroup>(context, params, MAX_CONCURRENT_DEVICES); 780e5c31af7Sopenharmony_ci } 781e5c31af7Sopenharmony_ci 782e5c31af7Sopenharmony_ci static Move<VkDevice> create (const Environment& env, const Resources& res, const Parameters& params) 783e5c31af7Sopenharmony_ci { 784e5c31af7Sopenharmony_ci const float queuePriority = 1.0; 785e5c31af7Sopenharmony_ci 786e5c31af7Sopenharmony_ci const VkDeviceQueueCreateInfo queues[] = 787e5c31af7Sopenharmony_ci { 788e5c31af7Sopenharmony_ci { 789e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 790e5c31af7Sopenharmony_ci DE_NULL, // pNext 791e5c31af7Sopenharmony_ci (VkDeviceQueueCreateFlags)0, // flags 792e5c31af7Sopenharmony_ci res.queueFamilyIndex, // queueFamilyIndex 793e5c31af7Sopenharmony_ci 1u, // queueCount 794e5c31af7Sopenharmony_ci &queuePriority, // pQueuePriorities 795e5c31af7Sopenharmony_ci } 796e5c31af7Sopenharmony_ci }; 797e5c31af7Sopenharmony_ci 798e5c31af7Sopenharmony_ci VkDeviceGroupDeviceCreateInfo deviceGroupInfo = 799e5c31af7Sopenharmony_ci { 800e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO, //stype 801e5c31af7Sopenharmony_ci DE_NULL, //pNext 802e5c31af7Sopenharmony_ci res.physicalDeviceCount, //physicalDeviceCount 803e5c31af7Sopenharmony_ci res.physicalDevices.data() //physicalDevices 804e5c31af7Sopenharmony_ci }; 805e5c31af7Sopenharmony_ci 806e5c31af7Sopenharmony_ci void* pNext = &deviceGroupInfo; 807e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 808e5c31af7Sopenharmony_ci VkDeviceObjectReservationCreateInfo memReservationInfo = env.commandLine.isSubProcess() ? env.resourceInterface->getStatMax() : resetDeviceObjectReservationCreateInfo(); 809e5c31af7Sopenharmony_ci memReservationInfo.pNext = pNext; 810e5c31af7Sopenharmony_ci pNext = &memReservationInfo; 811e5c31af7Sopenharmony_ci 812e5c31af7Sopenharmony_ci VkPhysicalDeviceVulkanSC10Features sc10Features = createDefaultSC10Features(); 813e5c31af7Sopenharmony_ci sc10Features.pNext = pNext; 814e5c31af7Sopenharmony_ci pNext = &sc10Features; 815e5c31af7Sopenharmony_ci 816e5c31af7Sopenharmony_ci VkPipelineCacheCreateInfo pcCI; 817e5c31af7Sopenharmony_ci std::vector<VkPipelinePoolSize> poolSizes; 818e5c31af7Sopenharmony_ci if (env.commandLine.isSubProcess()) 819e5c31af7Sopenharmony_ci { 820e5c31af7Sopenharmony_ci if (env.resourceInterface->getCacheDataSize() > 0) 821e5c31af7Sopenharmony_ci { 822e5c31af7Sopenharmony_ci pcCI = 823e5c31af7Sopenharmony_ci { 824e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType; 825e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext; 826e5c31af7Sopenharmony_ci VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT | 827e5c31af7Sopenharmony_ci VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT, // VkPipelineCacheCreateFlags flags; 828e5c31af7Sopenharmony_ci env.resourceInterface->getCacheDataSize(), // deUintptr initialDataSize; 829e5c31af7Sopenharmony_ci env.resourceInterface->getCacheData() // const void* pInitialData; 830e5c31af7Sopenharmony_ci }; 831e5c31af7Sopenharmony_ci memReservationInfo.pipelineCacheCreateInfoCount = 1; 832e5c31af7Sopenharmony_ci memReservationInfo.pPipelineCacheCreateInfos = &pcCI; 833e5c31af7Sopenharmony_ci } 834e5c31af7Sopenharmony_ci 835e5c31af7Sopenharmony_ci poolSizes = env.resourceInterface->getPipelinePoolSizes(); 836e5c31af7Sopenharmony_ci if (!poolSizes.empty()) 837e5c31af7Sopenharmony_ci { 838e5c31af7Sopenharmony_ci memReservationInfo.pipelinePoolSizeCount = deUint32(poolSizes.size()); 839e5c31af7Sopenharmony_ci memReservationInfo.pPipelinePoolSizes = poolSizes.data(); 840e5c31af7Sopenharmony_ci } 841e5c31af7Sopenharmony_ci } 842e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 843e5c31af7Sopenharmony_ci 844e5c31af7Sopenharmony_ci VkPhysicalDeviceFeatures enabledFeatures = getPhysicalDeviceFeatures(res.vki, res.physicalDevices[params.deviceIndex]); 845e5c31af7Sopenharmony_ci 846e5c31af7Sopenharmony_ci const VkDeviceCreateInfo deviceGroupCreateInfo = 847e5c31af7Sopenharmony_ci { 848e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 849e5c31af7Sopenharmony_ci pNext, 850e5c31af7Sopenharmony_ci (VkDeviceCreateFlags)0, 851e5c31af7Sopenharmony_ci DE_LENGTH_OF_ARRAY(queues), 852e5c31af7Sopenharmony_ci queues, 853e5c31af7Sopenharmony_ci 0u, // enabledLayerNameCount 854e5c31af7Sopenharmony_ci DE_NULL, // ppEnabledLayerNames 855e5c31af7Sopenharmony_ci 0u, // enabledExtensionNameCount 856e5c31af7Sopenharmony_ci DE_NULL, // ppEnabledExtensionNames 857e5c31af7Sopenharmony_ci &enabledFeatures, // pEnabledFeatures 858e5c31af7Sopenharmony_ci }; 859e5c31af7Sopenharmony_ci 860e5c31af7Sopenharmony_ci return createCustomDevice(env.commandLine.isValidationEnabled(), env.vkp, env.instance, res.vki, res.physicalDevices[params.deviceIndex], &deviceGroupCreateInfo, env.allocationCallbacks); 861e5c31af7Sopenharmony_ci } 862e5c31af7Sopenharmony_ci}; 863e5c31af7Sopenharmony_ci 864e5c31af7Sopenharmony_cistruct DeviceMemory 865e5c31af7Sopenharmony_ci{ 866e5c31af7Sopenharmony_ci typedef VkDeviceMemory Type; 867e5c31af7Sopenharmony_ci 868e5c31af7Sopenharmony_ci struct Parameters 869e5c31af7Sopenharmony_ci { 870e5c31af7Sopenharmony_ci VkDeviceSize size; 871e5c31af7Sopenharmony_ci deUint32 memoryTypeIndex; 872e5c31af7Sopenharmony_ci 873e5c31af7Sopenharmony_ci Parameters (VkDeviceSize size_, deUint32 memoryTypeIndex_) 874e5c31af7Sopenharmony_ci : size (size_) 875e5c31af7Sopenharmony_ci , memoryTypeIndex (memoryTypeIndex_) 876e5c31af7Sopenharmony_ci { 877e5c31af7Sopenharmony_ci DE_ASSERT(memoryTypeIndex < VK_MAX_MEMORY_TYPES); 878e5c31af7Sopenharmony_ci } 879e5c31af7Sopenharmony_ci }; 880e5c31af7Sopenharmony_ci 881e5c31af7Sopenharmony_ci struct Resources 882e5c31af7Sopenharmony_ci { 883e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 884e5c31af7Sopenharmony_ci }; 885e5c31af7Sopenharmony_ci 886e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 887e5c31af7Sopenharmony_ci { 888e5c31af7Sopenharmony_ci const VkDeviceSize deviceMemoryUsage = params.size + getPageTableSize(context, params.size); 889e5c31af7Sopenharmony_ci 890e5c31af7Sopenharmony_ci return getSafeObjectCount<DeviceMemory>(context, 891e5c31af7Sopenharmony_ci params, 892e5c31af7Sopenharmony_ci de::min(context.getDeviceProperties().limits.maxMemoryAllocationCount, 893e5c31af7Sopenharmony_ci (deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS), 894e5c31af7Sopenharmony_ci deviceMemoryUsage); 895e5c31af7Sopenharmony_ci } 896e5c31af7Sopenharmony_ci 897e5c31af7Sopenharmony_ci static Move<VkDeviceMemory> create (const Environment& env, const Resources&, const Parameters& params) 898e5c31af7Sopenharmony_ci { 899e5c31af7Sopenharmony_ci const VkMemoryAllocateInfo allocInfo = 900e5c31af7Sopenharmony_ci { 901e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, 902e5c31af7Sopenharmony_ci DE_NULL, 903e5c31af7Sopenharmony_ci params.size, 904e5c31af7Sopenharmony_ci params.memoryTypeIndex 905e5c31af7Sopenharmony_ci }; 906e5c31af7Sopenharmony_ci 907e5c31af7Sopenharmony_ci return allocateMemory(env.vkd, env.device, &allocInfo, env.allocationCallbacks); 908e5c31af7Sopenharmony_ci } 909e5c31af7Sopenharmony_ci}; 910e5c31af7Sopenharmony_ci 911e5c31af7Sopenharmony_ciDeviceMemory::Parameters getDeviceMemoryParameters (const VkMemoryRequirements& memReqs) 912e5c31af7Sopenharmony_ci{ 913e5c31af7Sopenharmony_ci return DeviceMemory::Parameters(memReqs.size, deCtz32(memReqs.memoryTypeBits)); 914e5c31af7Sopenharmony_ci} 915e5c31af7Sopenharmony_ci 916e5c31af7Sopenharmony_ciDeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkImage image) 917e5c31af7Sopenharmony_ci{ 918e5c31af7Sopenharmony_ci return getDeviceMemoryParameters(getImageMemoryRequirements(env.vkd, env.device, image)); 919e5c31af7Sopenharmony_ci} 920e5c31af7Sopenharmony_ci 921e5c31af7Sopenharmony_ciDeviceMemory::Parameters getDeviceMemoryParameters (const Environment& env, VkBuffer image) 922e5c31af7Sopenharmony_ci{ 923e5c31af7Sopenharmony_ci return getDeviceMemoryParameters(getBufferMemoryRequirements(env.vkd, env.device, image)); 924e5c31af7Sopenharmony_ci} 925e5c31af7Sopenharmony_ci 926e5c31af7Sopenharmony_cistruct Buffer 927e5c31af7Sopenharmony_ci{ 928e5c31af7Sopenharmony_ci typedef VkBuffer Type; 929e5c31af7Sopenharmony_ci 930e5c31af7Sopenharmony_ci struct Parameters 931e5c31af7Sopenharmony_ci { 932e5c31af7Sopenharmony_ci VkDeviceSize size; 933e5c31af7Sopenharmony_ci VkBufferUsageFlags usage; 934e5c31af7Sopenharmony_ci 935e5c31af7Sopenharmony_ci Parameters (VkDeviceSize size_, 936e5c31af7Sopenharmony_ci VkBufferUsageFlags usage_) 937e5c31af7Sopenharmony_ci : size (size_) 938e5c31af7Sopenharmony_ci , usage (usage_) 939e5c31af7Sopenharmony_ci {} 940e5c31af7Sopenharmony_ci }; 941e5c31af7Sopenharmony_ci 942e5c31af7Sopenharmony_ci struct Resources 943e5c31af7Sopenharmony_ci { 944e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 945e5c31af7Sopenharmony_ci }; 946e5c31af7Sopenharmony_ci 947e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 948e5c31af7Sopenharmony_ci { 949e5c31af7Sopenharmony_ci const Environment env (context, 1u); 950e5c31af7Sopenharmony_ci const Resources res (env, params); 951e5c31af7Sopenharmony_ci const Unique<VkBuffer> buffer (create(env, res, params)); 952e5c31af7Sopenharmony_ci const VkMemoryRequirements memReqs = getBufferMemoryRequirements(env.vkd, env.device, *buffer); 953e5c31af7Sopenharmony_ci 954e5c31af7Sopenharmony_ci return getSafeObjectCount<Buffer>(context, 955e5c31af7Sopenharmony_ci params, 956e5c31af7Sopenharmony_ci DEFAULT_MAX_CONCURRENT_OBJECTS, 957e5c31af7Sopenharmony_ci getPageTableSize(context, memReqs.size)); 958e5c31af7Sopenharmony_ci } 959e5c31af7Sopenharmony_ci 960e5c31af7Sopenharmony_ci static Move<VkBuffer> create (const Environment& env, const Resources&, const Parameters& params) 961e5c31af7Sopenharmony_ci { 962e5c31af7Sopenharmony_ci const VkBufferCreateInfo bufferInfo = 963e5c31af7Sopenharmony_ci { 964e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, 965e5c31af7Sopenharmony_ci DE_NULL, 966e5c31af7Sopenharmony_ci (VkBufferCreateFlags)0, 967e5c31af7Sopenharmony_ci params.size, 968e5c31af7Sopenharmony_ci params.usage, 969e5c31af7Sopenharmony_ci VK_SHARING_MODE_EXCLUSIVE, 970e5c31af7Sopenharmony_ci 1u, 971e5c31af7Sopenharmony_ci &env.queueFamilyIndex 972e5c31af7Sopenharmony_ci }; 973e5c31af7Sopenharmony_ci 974e5c31af7Sopenharmony_ci return createBuffer(env.vkd, env.device, &bufferInfo, env.allocationCallbacks); 975e5c31af7Sopenharmony_ci } 976e5c31af7Sopenharmony_ci}; 977e5c31af7Sopenharmony_ci 978e5c31af7Sopenharmony_cistruct BufferView 979e5c31af7Sopenharmony_ci{ 980e5c31af7Sopenharmony_ci typedef VkBufferView Type; 981e5c31af7Sopenharmony_ci 982e5c31af7Sopenharmony_ci struct Parameters 983e5c31af7Sopenharmony_ci { 984e5c31af7Sopenharmony_ci Buffer::Parameters buffer; 985e5c31af7Sopenharmony_ci VkFormat format; 986e5c31af7Sopenharmony_ci VkDeviceSize offset; 987e5c31af7Sopenharmony_ci VkDeviceSize range; 988e5c31af7Sopenharmony_ci 989e5c31af7Sopenharmony_ci Parameters (const Buffer::Parameters& buffer_, 990e5c31af7Sopenharmony_ci VkFormat format_, 991e5c31af7Sopenharmony_ci VkDeviceSize offset_, 992e5c31af7Sopenharmony_ci VkDeviceSize range_) 993e5c31af7Sopenharmony_ci : buffer (buffer_) 994e5c31af7Sopenharmony_ci , format (format_) 995e5c31af7Sopenharmony_ci , offset (offset_) 996e5c31af7Sopenharmony_ci , range (range_) 997e5c31af7Sopenharmony_ci {} 998e5c31af7Sopenharmony_ci }; 999e5c31af7Sopenharmony_ci 1000e5c31af7Sopenharmony_ci struct Resources 1001e5c31af7Sopenharmony_ci { 1002e5c31af7Sopenharmony_ci Dependency<Buffer> buffer; 1003e5c31af7Sopenharmony_ci Dependency<DeviceMemory> memory; 1004e5c31af7Sopenharmony_ci 1005e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 1006e5c31af7Sopenharmony_ci : buffer(env, params.buffer) 1007e5c31af7Sopenharmony_ci , memory(env, getDeviceMemoryParameters(env, *buffer.object)) 1008e5c31af7Sopenharmony_ci { 1009e5c31af7Sopenharmony_ci VK_CHECK(env.vkd.bindBufferMemory(env.device, *buffer.object, *memory.object, 0)); 1010e5c31af7Sopenharmony_ci } 1011e5c31af7Sopenharmony_ci }; 1012e5c31af7Sopenharmony_ci 1013e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1014e5c31af7Sopenharmony_ci { 1015e5c31af7Sopenharmony_ci return getSafeObjectCount<BufferView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 1016e5c31af7Sopenharmony_ci } 1017e5c31af7Sopenharmony_ci 1018e5c31af7Sopenharmony_ci static Move<VkBufferView> create (const Environment& env, const Resources& res, const Parameters& params) 1019e5c31af7Sopenharmony_ci { 1020e5c31af7Sopenharmony_ci const VkBufferViewCreateInfo bufferViewInfo = 1021e5c31af7Sopenharmony_ci { 1022e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO, 1023e5c31af7Sopenharmony_ci DE_NULL, 1024e5c31af7Sopenharmony_ci (VkBufferViewCreateFlags)0, 1025e5c31af7Sopenharmony_ci *res.buffer.object, 1026e5c31af7Sopenharmony_ci params.format, 1027e5c31af7Sopenharmony_ci params.offset, 1028e5c31af7Sopenharmony_ci params.range 1029e5c31af7Sopenharmony_ci }; 1030e5c31af7Sopenharmony_ci 1031e5c31af7Sopenharmony_ci return createBufferView(env.vkd, env.device, &bufferViewInfo, env.allocationCallbacks); 1032e5c31af7Sopenharmony_ci } 1033e5c31af7Sopenharmony_ci}; 1034e5c31af7Sopenharmony_ci 1035e5c31af7Sopenharmony_cistruct Image 1036e5c31af7Sopenharmony_ci{ 1037e5c31af7Sopenharmony_ci typedef VkImage Type; 1038e5c31af7Sopenharmony_ci 1039e5c31af7Sopenharmony_ci struct Parameters 1040e5c31af7Sopenharmony_ci { 1041e5c31af7Sopenharmony_ci VkImageCreateFlags flags; 1042e5c31af7Sopenharmony_ci VkImageType imageType; 1043e5c31af7Sopenharmony_ci VkFormat format; 1044e5c31af7Sopenharmony_ci VkExtent3D extent; 1045e5c31af7Sopenharmony_ci deUint32 mipLevels; 1046e5c31af7Sopenharmony_ci deUint32 arraySize; 1047e5c31af7Sopenharmony_ci VkSampleCountFlagBits samples; 1048e5c31af7Sopenharmony_ci VkImageTiling tiling; 1049e5c31af7Sopenharmony_ci VkImageUsageFlags usage; 1050e5c31af7Sopenharmony_ci VkImageLayout initialLayout; 1051e5c31af7Sopenharmony_ci 1052e5c31af7Sopenharmony_ci Parameters (VkImageCreateFlags flags_, 1053e5c31af7Sopenharmony_ci VkImageType imageType_, 1054e5c31af7Sopenharmony_ci VkFormat format_, 1055e5c31af7Sopenharmony_ci VkExtent3D extent_, 1056e5c31af7Sopenharmony_ci deUint32 mipLevels_, 1057e5c31af7Sopenharmony_ci deUint32 arraySize_, 1058e5c31af7Sopenharmony_ci VkSampleCountFlagBits samples_, 1059e5c31af7Sopenharmony_ci VkImageTiling tiling_, 1060e5c31af7Sopenharmony_ci VkImageUsageFlags usage_, 1061e5c31af7Sopenharmony_ci VkImageLayout initialLayout_) 1062e5c31af7Sopenharmony_ci : flags (flags_) 1063e5c31af7Sopenharmony_ci , imageType (imageType_) 1064e5c31af7Sopenharmony_ci , format (format_) 1065e5c31af7Sopenharmony_ci , extent (extent_) 1066e5c31af7Sopenharmony_ci , mipLevels (mipLevels_) 1067e5c31af7Sopenharmony_ci , arraySize (arraySize_) 1068e5c31af7Sopenharmony_ci , samples (samples_) 1069e5c31af7Sopenharmony_ci , tiling (tiling_) 1070e5c31af7Sopenharmony_ci , usage (usage_) 1071e5c31af7Sopenharmony_ci , initialLayout (initialLayout_) 1072e5c31af7Sopenharmony_ci {} 1073e5c31af7Sopenharmony_ci }; 1074e5c31af7Sopenharmony_ci 1075e5c31af7Sopenharmony_ci struct Resources 1076e5c31af7Sopenharmony_ci { 1077e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1078e5c31af7Sopenharmony_ci }; 1079e5c31af7Sopenharmony_ci 1080e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1081e5c31af7Sopenharmony_ci { 1082e5c31af7Sopenharmony_ci const Environment env (context, 1u); 1083e5c31af7Sopenharmony_ci const Resources res (env, params); 1084e5c31af7Sopenharmony_ci const Unique<VkImage> image (create(env, res, params)); 1085e5c31af7Sopenharmony_ci const VkMemoryRequirements memReqs = getImageMemoryRequirements(env.vkd, env.device, *image); 1086e5c31af7Sopenharmony_ci 1087e5c31af7Sopenharmony_ci return getSafeObjectCount<Image>(context, 1088e5c31af7Sopenharmony_ci params, 1089e5c31af7Sopenharmony_ci DEFAULT_MAX_CONCURRENT_OBJECTS, 1090e5c31af7Sopenharmony_ci getPageTableSize(context, memReqs.size)); 1091e5c31af7Sopenharmony_ci } 1092e5c31af7Sopenharmony_ci 1093e5c31af7Sopenharmony_ci static Move<VkImage> create (const Environment& env, const Resources&, const Parameters& params) 1094e5c31af7Sopenharmony_ci { 1095e5c31af7Sopenharmony_ci const VkImageCreateInfo imageInfo = 1096e5c31af7Sopenharmony_ci { 1097e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 1098e5c31af7Sopenharmony_ci DE_NULL, 1099e5c31af7Sopenharmony_ci params.flags, 1100e5c31af7Sopenharmony_ci params.imageType, 1101e5c31af7Sopenharmony_ci params.format, 1102e5c31af7Sopenharmony_ci params.extent, 1103e5c31af7Sopenharmony_ci params.mipLevels, 1104e5c31af7Sopenharmony_ci params.arraySize, 1105e5c31af7Sopenharmony_ci params.samples, 1106e5c31af7Sopenharmony_ci params.tiling, 1107e5c31af7Sopenharmony_ci params.usage, 1108e5c31af7Sopenharmony_ci VK_SHARING_MODE_EXCLUSIVE, // sharingMode 1109e5c31af7Sopenharmony_ci 1u, // queueFamilyIndexCount 1110e5c31af7Sopenharmony_ci &env.queueFamilyIndex, // pQueueFamilyIndices 1111e5c31af7Sopenharmony_ci params.initialLayout 1112e5c31af7Sopenharmony_ci }; 1113e5c31af7Sopenharmony_ci 1114e5c31af7Sopenharmony_ci return createImage(env.vkd, env.device, &imageInfo, env.allocationCallbacks); 1115e5c31af7Sopenharmony_ci } 1116e5c31af7Sopenharmony_ci}; 1117e5c31af7Sopenharmony_ci 1118e5c31af7Sopenharmony_cistruct ImageView 1119e5c31af7Sopenharmony_ci{ 1120e5c31af7Sopenharmony_ci typedef VkImageView Type; 1121e5c31af7Sopenharmony_ci 1122e5c31af7Sopenharmony_ci struct Parameters 1123e5c31af7Sopenharmony_ci { 1124e5c31af7Sopenharmony_ci Image::Parameters image; 1125e5c31af7Sopenharmony_ci VkImageViewType viewType; 1126e5c31af7Sopenharmony_ci VkFormat format; 1127e5c31af7Sopenharmony_ci VkComponentMapping components; 1128e5c31af7Sopenharmony_ci VkImageSubresourceRange subresourceRange; 1129e5c31af7Sopenharmony_ci 1130e5c31af7Sopenharmony_ci Parameters (const Image::Parameters& image_, 1131e5c31af7Sopenharmony_ci VkImageViewType viewType_, 1132e5c31af7Sopenharmony_ci VkFormat format_, 1133e5c31af7Sopenharmony_ci VkComponentMapping components_, 1134e5c31af7Sopenharmony_ci VkImageSubresourceRange subresourceRange_) 1135e5c31af7Sopenharmony_ci : image (image_) 1136e5c31af7Sopenharmony_ci , viewType (viewType_) 1137e5c31af7Sopenharmony_ci , format (format_) 1138e5c31af7Sopenharmony_ci , components (components_) 1139e5c31af7Sopenharmony_ci , subresourceRange (subresourceRange_) 1140e5c31af7Sopenharmony_ci {} 1141e5c31af7Sopenharmony_ci }; 1142e5c31af7Sopenharmony_ci 1143e5c31af7Sopenharmony_ci struct Resources 1144e5c31af7Sopenharmony_ci { 1145e5c31af7Sopenharmony_ci Dependency<Image> image; 1146e5c31af7Sopenharmony_ci Dependency<DeviceMemory> memory; 1147e5c31af7Sopenharmony_ci 1148e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 1149e5c31af7Sopenharmony_ci : image (env, params.image) 1150e5c31af7Sopenharmony_ci , memory(env, getDeviceMemoryParameters(env, *image.object)) 1151e5c31af7Sopenharmony_ci { 1152e5c31af7Sopenharmony_ci VK_CHECK(env.vkd.bindImageMemory(env.device, *image.object, *memory.object, 0)); 1153e5c31af7Sopenharmony_ci } 1154e5c31af7Sopenharmony_ci }; 1155e5c31af7Sopenharmony_ci 1156e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1157e5c31af7Sopenharmony_ci { 1158e5c31af7Sopenharmony_ci return getSafeObjectCount<ImageView>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 1159e5c31af7Sopenharmony_ci } 1160e5c31af7Sopenharmony_ci 1161e5c31af7Sopenharmony_ci static Move<VkImageView> create (const Environment& env, const Resources& res, const Parameters& params) 1162e5c31af7Sopenharmony_ci { 1163e5c31af7Sopenharmony_ci const VkImageViewCreateInfo imageViewInfo = 1164e5c31af7Sopenharmony_ci { 1165e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 1166e5c31af7Sopenharmony_ci DE_NULL, 1167e5c31af7Sopenharmony_ci (VkImageViewCreateFlags)0, 1168e5c31af7Sopenharmony_ci *res.image.object, 1169e5c31af7Sopenharmony_ci params.viewType, 1170e5c31af7Sopenharmony_ci params.format, 1171e5c31af7Sopenharmony_ci params.components, 1172e5c31af7Sopenharmony_ci params.subresourceRange, 1173e5c31af7Sopenharmony_ci }; 1174e5c31af7Sopenharmony_ci 1175e5c31af7Sopenharmony_ci return createImageView(env.vkd, env.device, &imageViewInfo, env.allocationCallbacks); 1176e5c31af7Sopenharmony_ci } 1177e5c31af7Sopenharmony_ci}; 1178e5c31af7Sopenharmony_ci 1179e5c31af7Sopenharmony_cistruct Semaphore 1180e5c31af7Sopenharmony_ci{ 1181e5c31af7Sopenharmony_ci typedef VkSemaphore Type; 1182e5c31af7Sopenharmony_ci 1183e5c31af7Sopenharmony_ci struct Parameters 1184e5c31af7Sopenharmony_ci { 1185e5c31af7Sopenharmony_ci VkSemaphoreCreateFlags flags; 1186e5c31af7Sopenharmony_ci 1187e5c31af7Sopenharmony_ci Parameters (VkSemaphoreCreateFlags flags_) 1188e5c31af7Sopenharmony_ci : flags(flags_) 1189e5c31af7Sopenharmony_ci {} 1190e5c31af7Sopenharmony_ci }; 1191e5c31af7Sopenharmony_ci 1192e5c31af7Sopenharmony_ci struct Resources 1193e5c31af7Sopenharmony_ci { 1194e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1195e5c31af7Sopenharmony_ci }; 1196e5c31af7Sopenharmony_ci 1197e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1198e5c31af7Sopenharmony_ci { 1199e5c31af7Sopenharmony_ci return getSafeObjectCount<Semaphore>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES); 1200e5c31af7Sopenharmony_ci } 1201e5c31af7Sopenharmony_ci 1202e5c31af7Sopenharmony_ci static Move<VkSemaphore> create (const Environment& env, const Resources&, const Parameters& params) 1203e5c31af7Sopenharmony_ci { 1204e5c31af7Sopenharmony_ci const VkSemaphoreCreateInfo semaphoreInfo = 1205e5c31af7Sopenharmony_ci { 1206e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, 1207e5c31af7Sopenharmony_ci DE_NULL, 1208e5c31af7Sopenharmony_ci params.flags 1209e5c31af7Sopenharmony_ci }; 1210e5c31af7Sopenharmony_ci 1211e5c31af7Sopenharmony_ci return createSemaphore(env.vkd, env.device, &semaphoreInfo, env.allocationCallbacks); 1212e5c31af7Sopenharmony_ci } 1213e5c31af7Sopenharmony_ci}; 1214e5c31af7Sopenharmony_ci 1215e5c31af7Sopenharmony_cistruct Fence 1216e5c31af7Sopenharmony_ci{ 1217e5c31af7Sopenharmony_ci typedef VkFence Type; 1218e5c31af7Sopenharmony_ci 1219e5c31af7Sopenharmony_ci struct Parameters 1220e5c31af7Sopenharmony_ci { 1221e5c31af7Sopenharmony_ci VkFenceCreateFlags flags; 1222e5c31af7Sopenharmony_ci 1223e5c31af7Sopenharmony_ci Parameters (VkFenceCreateFlags flags_) 1224e5c31af7Sopenharmony_ci : flags(flags_) 1225e5c31af7Sopenharmony_ci {} 1226e5c31af7Sopenharmony_ci }; 1227e5c31af7Sopenharmony_ci 1228e5c31af7Sopenharmony_ci struct Resources 1229e5c31af7Sopenharmony_ci { 1230e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1231e5c31af7Sopenharmony_ci }; 1232e5c31af7Sopenharmony_ci 1233e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1234e5c31af7Sopenharmony_ci { 1235e5c31af7Sopenharmony_ci return getSafeObjectCount<Fence>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES); 1236e5c31af7Sopenharmony_ci } 1237e5c31af7Sopenharmony_ci 1238e5c31af7Sopenharmony_ci static Move<VkFence> create (const Environment& env, const Resources&, const Parameters& params) 1239e5c31af7Sopenharmony_ci { 1240e5c31af7Sopenharmony_ci const VkFenceCreateInfo fenceInfo = 1241e5c31af7Sopenharmony_ci { 1242e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, 1243e5c31af7Sopenharmony_ci DE_NULL, 1244e5c31af7Sopenharmony_ci params.flags 1245e5c31af7Sopenharmony_ci }; 1246e5c31af7Sopenharmony_ci 1247e5c31af7Sopenharmony_ci return createFence(env.vkd, env.device, &fenceInfo, env.allocationCallbacks); 1248e5c31af7Sopenharmony_ci } 1249e5c31af7Sopenharmony_ci}; 1250e5c31af7Sopenharmony_ci 1251e5c31af7Sopenharmony_cistruct Event 1252e5c31af7Sopenharmony_ci{ 1253e5c31af7Sopenharmony_ci typedef VkEvent Type; 1254e5c31af7Sopenharmony_ci 1255e5c31af7Sopenharmony_ci struct Parameters 1256e5c31af7Sopenharmony_ci { 1257e5c31af7Sopenharmony_ci VkEventCreateFlags flags; 1258e5c31af7Sopenharmony_ci 1259e5c31af7Sopenharmony_ci Parameters (VkEventCreateFlags flags_) 1260e5c31af7Sopenharmony_ci : flags(flags_) 1261e5c31af7Sopenharmony_ci {} 1262e5c31af7Sopenharmony_ci }; 1263e5c31af7Sopenharmony_ci 1264e5c31af7Sopenharmony_ci struct Resources 1265e5c31af7Sopenharmony_ci { 1266e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1267e5c31af7Sopenharmony_ci }; 1268e5c31af7Sopenharmony_ci 1269e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1270e5c31af7Sopenharmony_ci { 1271e5c31af7Sopenharmony_ci return getSafeObjectCount<Event>(context, params, MAX_CONCURRENT_SYNC_PRIMITIVES); 1272e5c31af7Sopenharmony_ci } 1273e5c31af7Sopenharmony_ci 1274e5c31af7Sopenharmony_ci static Move<VkEvent> create (const Environment& env, const Resources&, const Parameters& params) 1275e5c31af7Sopenharmony_ci { 1276e5c31af7Sopenharmony_ci const VkEventCreateInfo eventInfo = 1277e5c31af7Sopenharmony_ci { 1278e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, 1279e5c31af7Sopenharmony_ci DE_NULL, 1280e5c31af7Sopenharmony_ci params.flags 1281e5c31af7Sopenharmony_ci }; 1282e5c31af7Sopenharmony_ci 1283e5c31af7Sopenharmony_ci return createEvent(env.vkd, env.device, &eventInfo, env.allocationCallbacks); 1284e5c31af7Sopenharmony_ci } 1285e5c31af7Sopenharmony_ci}; 1286e5c31af7Sopenharmony_ci 1287e5c31af7Sopenharmony_cistruct QueryPool 1288e5c31af7Sopenharmony_ci{ 1289e5c31af7Sopenharmony_ci typedef VkQueryPool Type; 1290e5c31af7Sopenharmony_ci 1291e5c31af7Sopenharmony_ci struct Parameters 1292e5c31af7Sopenharmony_ci { 1293e5c31af7Sopenharmony_ci VkQueryType queryType; 1294e5c31af7Sopenharmony_ci deUint32 entryCount; 1295e5c31af7Sopenharmony_ci VkQueryPipelineStatisticFlags pipelineStatistics; 1296e5c31af7Sopenharmony_ci 1297e5c31af7Sopenharmony_ci Parameters (VkQueryType queryType_, 1298e5c31af7Sopenharmony_ci deUint32 entryCount_, 1299e5c31af7Sopenharmony_ci VkQueryPipelineStatisticFlags pipelineStatistics_) 1300e5c31af7Sopenharmony_ci : queryType (queryType_) 1301e5c31af7Sopenharmony_ci , entryCount (entryCount_) 1302e5c31af7Sopenharmony_ci , pipelineStatistics (pipelineStatistics_) 1303e5c31af7Sopenharmony_ci {} 1304e5c31af7Sopenharmony_ci }; 1305e5c31af7Sopenharmony_ci 1306e5c31af7Sopenharmony_ci struct Resources 1307e5c31af7Sopenharmony_ci { 1308e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1309e5c31af7Sopenharmony_ci }; 1310e5c31af7Sopenharmony_ci 1311e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1312e5c31af7Sopenharmony_ci { 1313e5c31af7Sopenharmony_ci return getSafeObjectCount<QueryPool>(context, params, MAX_CONCURRENT_QUERY_POOLS); 1314e5c31af7Sopenharmony_ci } 1315e5c31af7Sopenharmony_ci 1316e5c31af7Sopenharmony_ci static Move<VkQueryPool> create (const Environment& env, const Resources&, const Parameters& params) 1317e5c31af7Sopenharmony_ci { 1318e5c31af7Sopenharmony_ci const VkQueryPoolCreateInfo queryPoolInfo = 1319e5c31af7Sopenharmony_ci { 1320e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, 1321e5c31af7Sopenharmony_ci DE_NULL, 1322e5c31af7Sopenharmony_ci (VkQueryPoolCreateFlags)0, 1323e5c31af7Sopenharmony_ci params.queryType, 1324e5c31af7Sopenharmony_ci params.entryCount, 1325e5c31af7Sopenharmony_ci params.pipelineStatistics 1326e5c31af7Sopenharmony_ci }; 1327e5c31af7Sopenharmony_ci 1328e5c31af7Sopenharmony_ci return createQueryPool(env.vkd, env.device, &queryPoolInfo, env.allocationCallbacks); 1329e5c31af7Sopenharmony_ci } 1330e5c31af7Sopenharmony_ci}; 1331e5c31af7Sopenharmony_ci 1332e5c31af7Sopenharmony_cistruct ShaderModule 1333e5c31af7Sopenharmony_ci{ 1334e5c31af7Sopenharmony_ci typedef VkShaderModule Type; 1335e5c31af7Sopenharmony_ci 1336e5c31af7Sopenharmony_ci struct Parameters 1337e5c31af7Sopenharmony_ci { 1338e5c31af7Sopenharmony_ci VkShaderStageFlagBits shaderStage; 1339e5c31af7Sopenharmony_ci string binaryName; 1340e5c31af7Sopenharmony_ci 1341e5c31af7Sopenharmony_ci Parameters (VkShaderStageFlagBits shaderStage_, 1342e5c31af7Sopenharmony_ci const std::string& binaryName_) 1343e5c31af7Sopenharmony_ci : shaderStage (shaderStage_) 1344e5c31af7Sopenharmony_ci , binaryName (binaryName_) 1345e5c31af7Sopenharmony_ci {} 1346e5c31af7Sopenharmony_ci }; 1347e5c31af7Sopenharmony_ci 1348e5c31af7Sopenharmony_ci struct Resources 1349e5c31af7Sopenharmony_ci { 1350e5c31af7Sopenharmony_ci const ProgramBinary& binary; 1351e5c31af7Sopenharmony_ci 1352e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 1353e5c31af7Sopenharmony_ci : binary(env.programBinaries.get(params.binaryName)) 1354e5c31af7Sopenharmony_ci {} 1355e5c31af7Sopenharmony_ci }; 1356e5c31af7Sopenharmony_ci 1357e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1358e5c31af7Sopenharmony_ci { 1359e5c31af7Sopenharmony_ci return getSafeObjectCount<ShaderModule>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 1360e5c31af7Sopenharmony_ci } 1361e5c31af7Sopenharmony_ci 1362e5c31af7Sopenharmony_ci static const char* getSource (VkShaderStageFlagBits stage) 1363e5c31af7Sopenharmony_ci { 1364e5c31af7Sopenharmony_ci switch (stage) 1365e5c31af7Sopenharmony_ci { 1366e5c31af7Sopenharmony_ci case VK_SHADER_STAGE_VERTEX_BIT: 1367e5c31af7Sopenharmony_ci return "#version 310 es\n" 1368e5c31af7Sopenharmony_ci "layout(location = 0) in highp vec4 a_position;\n" 1369e5c31af7Sopenharmony_ci "void main () { gl_Position = a_position; }\n"; 1370e5c31af7Sopenharmony_ci 1371e5c31af7Sopenharmony_ci case VK_SHADER_STAGE_FRAGMENT_BIT: 1372e5c31af7Sopenharmony_ci return "#version 310 es\n" 1373e5c31af7Sopenharmony_ci "layout(location = 0) out mediump vec4 o_color;\n" 1374e5c31af7Sopenharmony_ci "void main () { o_color = vec4(1.0, 0.5, 0.25, 1.0); }"; 1375e5c31af7Sopenharmony_ci 1376e5c31af7Sopenharmony_ci case VK_SHADER_STAGE_COMPUTE_BIT: 1377e5c31af7Sopenharmony_ci return "#version 310 es\n" 1378e5c31af7Sopenharmony_ci "layout(binding = 0) buffer Input { highp uint dataIn[]; };\n" 1379e5c31af7Sopenharmony_ci "layout(binding = 1) buffer Output { highp uint dataOut[]; };\n" 1380e5c31af7Sopenharmony_ci "void main (void)\n" 1381e5c31af7Sopenharmony_ci "{\n" 1382e5c31af7Sopenharmony_ci " dataOut[gl_GlobalInvocationID.x] = ~dataIn[gl_GlobalInvocationID.x];\n" 1383e5c31af7Sopenharmony_ci "}\n"; 1384e5c31af7Sopenharmony_ci 1385e5c31af7Sopenharmony_ci default: 1386e5c31af7Sopenharmony_ci DE_FATAL("Not implemented"); 1387e5c31af7Sopenharmony_ci return DE_NULL; 1388e5c31af7Sopenharmony_ci } 1389e5c31af7Sopenharmony_ci } 1390e5c31af7Sopenharmony_ci 1391e5c31af7Sopenharmony_ci static void initPrograms (SourceCollections& dst, Parameters params) 1392e5c31af7Sopenharmony_ci { 1393e5c31af7Sopenharmony_ci const char* const source = getSource(params.shaderStage); 1394e5c31af7Sopenharmony_ci 1395e5c31af7Sopenharmony_ci DE_ASSERT(source); 1396e5c31af7Sopenharmony_ci 1397e5c31af7Sopenharmony_ci dst.glslSources.add(params.binaryName) 1398e5c31af7Sopenharmony_ci << glu::ShaderSource(getGluShaderType(params.shaderStage), source); 1399e5c31af7Sopenharmony_ci } 1400e5c31af7Sopenharmony_ci 1401e5c31af7Sopenharmony_ci static Move<VkShaderModule> create (const Environment& env, const Resources& res, const Parameters&) 1402e5c31af7Sopenharmony_ci { 1403e5c31af7Sopenharmony_ci const VkShaderModuleCreateInfo shaderModuleInfo = 1404e5c31af7Sopenharmony_ci { 1405e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, 1406e5c31af7Sopenharmony_ci DE_NULL, 1407e5c31af7Sopenharmony_ci (VkShaderModuleCreateFlags)0, 1408e5c31af7Sopenharmony_ci res.binary.getSize(), 1409e5c31af7Sopenharmony_ci (const deUint32*)res.binary.getBinary(), 1410e5c31af7Sopenharmony_ci }; 1411e5c31af7Sopenharmony_ci 1412e5c31af7Sopenharmony_ci return createShaderModule(env.vkd, env.device, &shaderModuleInfo, env.allocationCallbacks); 1413e5c31af7Sopenharmony_ci } 1414e5c31af7Sopenharmony_ci}; 1415e5c31af7Sopenharmony_ci 1416e5c31af7Sopenharmony_cistruct PipelineCache 1417e5c31af7Sopenharmony_ci{ 1418e5c31af7Sopenharmony_ci typedef VkPipelineCache Type; 1419e5c31af7Sopenharmony_ci 1420e5c31af7Sopenharmony_ci struct Parameters 1421e5c31af7Sopenharmony_ci { 1422e5c31af7Sopenharmony_ci Parameters (void) {} 1423e5c31af7Sopenharmony_ci }; 1424e5c31af7Sopenharmony_ci 1425e5c31af7Sopenharmony_ci struct Resources 1426e5c31af7Sopenharmony_ci { 1427e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1428e5c31af7Sopenharmony_ci }; 1429e5c31af7Sopenharmony_ci 1430e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1431e5c31af7Sopenharmony_ci { 1432e5c31af7Sopenharmony_ci return getSafeObjectCount<PipelineCache>(context, params, MAX_CONCURRENT_PIPELINE_CACHES); 1433e5c31af7Sopenharmony_ci } 1434e5c31af7Sopenharmony_ci 1435e5c31af7Sopenharmony_ci static void initPrograms(SourceCollections& dst, Parameters) 1436e5c31af7Sopenharmony_ci { 1437e5c31af7Sopenharmony_ci ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp")); 1438e5c31af7Sopenharmony_ci } 1439e5c31af7Sopenharmony_ci 1440e5c31af7Sopenharmony_ci static Move<VkPipelineCache> create (const Environment& env, const Resources&, const Parameters&) 1441e5c31af7Sopenharmony_ci { 1442e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 1443e5c31af7Sopenharmony_ci // creating dummy compute pipeline to ensure pipeline cache is not empty 1444e5c31af7Sopenharmony_ci if (!env.commandLine.isSubProcess()) 1445e5c31af7Sopenharmony_ci { 1446e5c31af7Sopenharmony_ci const Unique<VkShaderModule> shaderModule (createShaderModule(env.vkd, env.device, env.programBinaries.get("comp"), 0u)); 1447e5c31af7Sopenharmony_ci 1448e5c31af7Sopenharmony_ci const Move<VkDescriptorSetLayout> descriptorSetLayout (DescriptorSetLayoutBuilder() 1449e5c31af7Sopenharmony_ci .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT) 1450e5c31af7Sopenharmony_ci .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT) 1451e5c31af7Sopenharmony_ci .build(env.vkd, env.device)); 1452e5c31af7Sopenharmony_ci 1453e5c31af7Sopenharmony_ci const Move<VkPipelineLayout> pipelineLayout (makePipelineLayout(env.vkd, env.device, *descriptorSetLayout)); 1454e5c31af7Sopenharmony_ci 1455e5c31af7Sopenharmony_ci const VkPipelineShaderStageCreateInfo stageCreateInfo = 1456e5c31af7Sopenharmony_ci { 1457e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 1458e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext; 1459e5c31af7Sopenharmony_ci 0u, // VkPipelineShaderStageCreateFlags flags; 1460e5c31af7Sopenharmony_ci VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage; 1461e5c31af7Sopenharmony_ci *shaderModule, // VkShaderModule module; 1462e5c31af7Sopenharmony_ci "main", // const char* pName; 1463e5c31af7Sopenharmony_ci DE_NULL, // const VkSpecializationInfo* pSpecializationInfo; 1464e5c31af7Sopenharmony_ci }; 1465e5c31af7Sopenharmony_ci 1466e5c31af7Sopenharmony_ci const VkComputePipelineCreateInfo pipelineInfo = 1467e5c31af7Sopenharmony_ci { 1468e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType 1469e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext 1470e5c31af7Sopenharmony_ci (VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags 1471e5c31af7Sopenharmony_ci stageCreateInfo, // VkPipelineShaderStageCreateInfo stage 1472e5c31af7Sopenharmony_ci *pipelineLayout, // VkPipelineLayout layout 1473e5c31af7Sopenharmony_ci DE_NULL, // VkPipeline basePipelineHandle 1474e5c31af7Sopenharmony_ci 0u // deInt32 basePipelineIndex 1475e5c31af7Sopenharmony_ci }; 1476e5c31af7Sopenharmony_ci 1477e5c31af7Sopenharmony_ci Move<VkPipeline> pipeline = createComputePipeline(env.vkd, env.device, DE_NULL, &pipelineInfo); 1478e5c31af7Sopenharmony_ci } 1479e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 1480e5c31af7Sopenharmony_ci const VkPipelineCacheCreateInfo pipelineCacheInfo = 1481e5c31af7Sopenharmony_ci { 1482e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, // VkStructureType sType; 1483e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext; 1484e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 1485e5c31af7Sopenharmony_ci (VkPipelineCacheCreateFlags)0u, // VkPipelineCacheCreateFlags flags; 1486e5c31af7Sopenharmony_ci 0u, // size_t initialDataSize; 1487e5c31af7Sopenharmony_ci DE_NULL, // const void* pInitialData; 1488e5c31af7Sopenharmony_ci#else 1489e5c31af7Sopenharmony_ci VK_PIPELINE_CACHE_CREATE_READ_ONLY_BIT | 1490e5c31af7Sopenharmony_ci VK_PIPELINE_CACHE_CREATE_USE_APPLICATION_STORAGE_BIT, // VkPipelineCacheCreateFlags flags; 1491e5c31af7Sopenharmony_ci env.resourceInterface->getCacheDataSize(), // deUintptr initialDataSize; 1492e5c31af7Sopenharmony_ci env.resourceInterface->getCacheData() // const void* pInitialData; 1493e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 1494e5c31af7Sopenharmony_ci }; 1495e5c31af7Sopenharmony_ci 1496e5c31af7Sopenharmony_ci return createPipelineCache(env.vkd, env.device, &pipelineCacheInfo, env.allocationCallbacks); 1497e5c31af7Sopenharmony_ci } 1498e5c31af7Sopenharmony_ci}; 1499e5c31af7Sopenharmony_ci 1500e5c31af7Sopenharmony_cistruct Sampler 1501e5c31af7Sopenharmony_ci{ 1502e5c31af7Sopenharmony_ci typedef VkSampler Type; 1503e5c31af7Sopenharmony_ci 1504e5c31af7Sopenharmony_ci struct Parameters 1505e5c31af7Sopenharmony_ci { 1506e5c31af7Sopenharmony_ci VkFilter magFilter; 1507e5c31af7Sopenharmony_ci VkFilter minFilter; 1508e5c31af7Sopenharmony_ci VkSamplerMipmapMode mipmapMode; 1509e5c31af7Sopenharmony_ci VkSamplerAddressMode addressModeU; 1510e5c31af7Sopenharmony_ci VkSamplerAddressMode addressModeV; 1511e5c31af7Sopenharmony_ci VkSamplerAddressMode addressModeW; 1512e5c31af7Sopenharmony_ci float mipLodBias; 1513e5c31af7Sopenharmony_ci VkBool32 anisotropyEnable; 1514e5c31af7Sopenharmony_ci float maxAnisotropy; 1515e5c31af7Sopenharmony_ci VkBool32 compareEnable; 1516e5c31af7Sopenharmony_ci VkCompareOp compareOp; 1517e5c31af7Sopenharmony_ci float minLod; 1518e5c31af7Sopenharmony_ci float maxLod; 1519e5c31af7Sopenharmony_ci VkBorderColor borderColor; 1520e5c31af7Sopenharmony_ci VkBool32 unnormalizedCoordinates; 1521e5c31af7Sopenharmony_ci 1522e5c31af7Sopenharmony_ci // \todo [2015-09-17 pyry] Other configurations 1523e5c31af7Sopenharmony_ci Parameters (void) 1524e5c31af7Sopenharmony_ci : magFilter (VK_FILTER_NEAREST) 1525e5c31af7Sopenharmony_ci , minFilter (VK_FILTER_NEAREST) 1526e5c31af7Sopenharmony_ci , mipmapMode (VK_SAMPLER_MIPMAP_MODE_NEAREST) 1527e5c31af7Sopenharmony_ci , addressModeU (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) 1528e5c31af7Sopenharmony_ci , addressModeV (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) 1529e5c31af7Sopenharmony_ci , addressModeW (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) 1530e5c31af7Sopenharmony_ci , mipLodBias (0.0f) 1531e5c31af7Sopenharmony_ci , anisotropyEnable (VK_FALSE) 1532e5c31af7Sopenharmony_ci , maxAnisotropy (1.0f) 1533e5c31af7Sopenharmony_ci , compareEnable (VK_FALSE) 1534e5c31af7Sopenharmony_ci , compareOp (VK_COMPARE_OP_ALWAYS) 1535e5c31af7Sopenharmony_ci , minLod (-1000.f) 1536e5c31af7Sopenharmony_ci , maxLod (+1000.f) 1537e5c31af7Sopenharmony_ci , borderColor (VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK) 1538e5c31af7Sopenharmony_ci , unnormalizedCoordinates (VK_FALSE) 1539e5c31af7Sopenharmony_ci {} 1540e5c31af7Sopenharmony_ci }; 1541e5c31af7Sopenharmony_ci 1542e5c31af7Sopenharmony_ci struct Resources 1543e5c31af7Sopenharmony_ci { 1544e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1545e5c31af7Sopenharmony_ci }; 1546e5c31af7Sopenharmony_ci 1547e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1548e5c31af7Sopenharmony_ci { 1549e5c31af7Sopenharmony_ci return getSafeObjectCount<Sampler>(context, 1550e5c31af7Sopenharmony_ci params, 1551e5c31af7Sopenharmony_ci de::min(context.getDeviceProperties().limits.maxSamplerAllocationCount, 1552e5c31af7Sopenharmony_ci (deUint32)DEFAULT_MAX_CONCURRENT_OBJECTS)); 1553e5c31af7Sopenharmony_ci } 1554e5c31af7Sopenharmony_ci 1555e5c31af7Sopenharmony_ci static Move<VkSampler> create (const Environment& env, const Resources&, const Parameters& params) 1556e5c31af7Sopenharmony_ci { 1557e5c31af7Sopenharmony_ci const VkSamplerCreateInfo samplerInfo = 1558e5c31af7Sopenharmony_ci { 1559e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, 1560e5c31af7Sopenharmony_ci DE_NULL, 1561e5c31af7Sopenharmony_ci (VkSamplerCreateFlags)0, 1562e5c31af7Sopenharmony_ci params.magFilter, 1563e5c31af7Sopenharmony_ci params.minFilter, 1564e5c31af7Sopenharmony_ci params.mipmapMode, 1565e5c31af7Sopenharmony_ci params.addressModeU, 1566e5c31af7Sopenharmony_ci params.addressModeV, 1567e5c31af7Sopenharmony_ci params.addressModeW, 1568e5c31af7Sopenharmony_ci params.mipLodBias, 1569e5c31af7Sopenharmony_ci params.anisotropyEnable, 1570e5c31af7Sopenharmony_ci params.maxAnisotropy, 1571e5c31af7Sopenharmony_ci params.compareEnable, 1572e5c31af7Sopenharmony_ci params.compareOp, 1573e5c31af7Sopenharmony_ci params.minLod, 1574e5c31af7Sopenharmony_ci params.maxLod, 1575e5c31af7Sopenharmony_ci params.borderColor, 1576e5c31af7Sopenharmony_ci params.unnormalizedCoordinates 1577e5c31af7Sopenharmony_ci }; 1578e5c31af7Sopenharmony_ci 1579e5c31af7Sopenharmony_ci return createSampler(env.vkd, env.device, &samplerInfo, env.allocationCallbacks); 1580e5c31af7Sopenharmony_ci } 1581e5c31af7Sopenharmony_ci}; 1582e5c31af7Sopenharmony_ci 1583e5c31af7Sopenharmony_cistruct DescriptorSetLayout 1584e5c31af7Sopenharmony_ci{ 1585e5c31af7Sopenharmony_ci typedef VkDescriptorSetLayout Type; 1586e5c31af7Sopenharmony_ci 1587e5c31af7Sopenharmony_ci struct Parameters 1588e5c31af7Sopenharmony_ci { 1589e5c31af7Sopenharmony_ci struct Binding 1590e5c31af7Sopenharmony_ci { 1591e5c31af7Sopenharmony_ci deUint32 binding; 1592e5c31af7Sopenharmony_ci VkDescriptorType descriptorType; 1593e5c31af7Sopenharmony_ci deUint32 descriptorCount; 1594e5c31af7Sopenharmony_ci VkShaderStageFlags stageFlags; 1595e5c31af7Sopenharmony_ci bool useImmutableSampler; 1596e5c31af7Sopenharmony_ci 1597e5c31af7Sopenharmony_ci Binding (deUint32 binding_, 1598e5c31af7Sopenharmony_ci VkDescriptorType descriptorType_, 1599e5c31af7Sopenharmony_ci deUint32 descriptorCount_, 1600e5c31af7Sopenharmony_ci VkShaderStageFlags stageFlags_, 1601e5c31af7Sopenharmony_ci bool useImmutableSampler_) 1602e5c31af7Sopenharmony_ci : binding (binding_) 1603e5c31af7Sopenharmony_ci , descriptorType (descriptorType_) 1604e5c31af7Sopenharmony_ci , descriptorCount (descriptorCount_) 1605e5c31af7Sopenharmony_ci , stageFlags (stageFlags_) 1606e5c31af7Sopenharmony_ci , useImmutableSampler (useImmutableSampler_) 1607e5c31af7Sopenharmony_ci {} 1608e5c31af7Sopenharmony_ci 1609e5c31af7Sopenharmony_ci Binding (void) {} 1610e5c31af7Sopenharmony_ci }; 1611e5c31af7Sopenharmony_ci 1612e5c31af7Sopenharmony_ci vector<Binding> bindings; 1613e5c31af7Sopenharmony_ci 1614e5c31af7Sopenharmony_ci Parameters (const vector<Binding>& bindings_) 1615e5c31af7Sopenharmony_ci : bindings(bindings_) 1616e5c31af7Sopenharmony_ci {} 1617e5c31af7Sopenharmony_ci 1618e5c31af7Sopenharmony_ci static Parameters empty (void) 1619e5c31af7Sopenharmony_ci { 1620e5c31af7Sopenharmony_ci return Parameters(vector<Binding>()); 1621e5c31af7Sopenharmony_ci } 1622e5c31af7Sopenharmony_ci 1623e5c31af7Sopenharmony_ci static Parameters single (deUint32 binding, 1624e5c31af7Sopenharmony_ci VkDescriptorType descriptorType, 1625e5c31af7Sopenharmony_ci deUint32 descriptorCount, 1626e5c31af7Sopenharmony_ci VkShaderStageFlags stageFlags, 1627e5c31af7Sopenharmony_ci bool useImmutableSampler = false) 1628e5c31af7Sopenharmony_ci { 1629e5c31af7Sopenharmony_ci vector<Binding> bindings; 1630e5c31af7Sopenharmony_ci bindings.push_back(Binding(binding, descriptorType, descriptorCount, stageFlags, useImmutableSampler)); 1631e5c31af7Sopenharmony_ci return Parameters(bindings); 1632e5c31af7Sopenharmony_ci } 1633e5c31af7Sopenharmony_ci }; 1634e5c31af7Sopenharmony_ci 1635e5c31af7Sopenharmony_ci struct Resources 1636e5c31af7Sopenharmony_ci { 1637e5c31af7Sopenharmony_ci vector<VkDescriptorSetLayoutBinding> bindings; 1638e5c31af7Sopenharmony_ci MovePtr<Dependency<Sampler> > immutableSampler; 1639e5c31af7Sopenharmony_ci vector<VkSampler> immutableSamplersPtr; 1640e5c31af7Sopenharmony_ci 1641e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 1642e5c31af7Sopenharmony_ci { 1643e5c31af7Sopenharmony_ci // Create immutable sampler if needed 1644e5c31af7Sopenharmony_ci for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++) 1645e5c31af7Sopenharmony_ci { 1646e5c31af7Sopenharmony_ci if (cur->useImmutableSampler && !immutableSampler) 1647e5c31af7Sopenharmony_ci { 1648e5c31af7Sopenharmony_ci immutableSampler = de::newMovePtr<Dependency<Sampler> >(env, Sampler::Parameters()); 1649e5c31af7Sopenharmony_ci 1650e5c31af7Sopenharmony_ci if (cur->useImmutableSampler && immutableSamplersPtr.size() < (size_t)cur->descriptorCount) 1651e5c31af7Sopenharmony_ci immutableSamplersPtr.resize(cur->descriptorCount, *immutableSampler->object); 1652e5c31af7Sopenharmony_ci } 1653e5c31af7Sopenharmony_ci } 1654e5c31af7Sopenharmony_ci 1655e5c31af7Sopenharmony_ci for (vector<Parameters::Binding>::const_iterator cur = params.bindings.begin(); cur != params.bindings.end(); cur++) 1656e5c31af7Sopenharmony_ci { 1657e5c31af7Sopenharmony_ci const VkDescriptorSetLayoutBinding binding = 1658e5c31af7Sopenharmony_ci { 1659e5c31af7Sopenharmony_ci cur->binding, 1660e5c31af7Sopenharmony_ci cur->descriptorType, 1661e5c31af7Sopenharmony_ci cur->descriptorCount, 1662e5c31af7Sopenharmony_ci cur->stageFlags, 1663e5c31af7Sopenharmony_ci (cur->useImmutableSampler ? &immutableSamplersPtr[0] : DE_NULL) 1664e5c31af7Sopenharmony_ci }; 1665e5c31af7Sopenharmony_ci 1666e5c31af7Sopenharmony_ci bindings.push_back(binding); 1667e5c31af7Sopenharmony_ci } 1668e5c31af7Sopenharmony_ci } 1669e5c31af7Sopenharmony_ci }; 1670e5c31af7Sopenharmony_ci 1671e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1672e5c31af7Sopenharmony_ci { 1673e5c31af7Sopenharmony_ci return getSafeObjectCount<DescriptorSetLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 1674e5c31af7Sopenharmony_ci } 1675e5c31af7Sopenharmony_ci 1676e5c31af7Sopenharmony_ci static Move<VkDescriptorSetLayout> create (const Environment& env, const Resources& res, const Parameters&) 1677e5c31af7Sopenharmony_ci { 1678e5c31af7Sopenharmony_ci const VkDescriptorSetLayoutCreateInfo descriptorSetLayoutInfo = 1679e5c31af7Sopenharmony_ci { 1680e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 1681e5c31af7Sopenharmony_ci DE_NULL, 1682e5c31af7Sopenharmony_ci (VkDescriptorSetLayoutCreateFlags)0, 1683e5c31af7Sopenharmony_ci (deUint32)res.bindings.size(), 1684e5c31af7Sopenharmony_ci (res.bindings.empty() ? DE_NULL : &res.bindings[0]) 1685e5c31af7Sopenharmony_ci }; 1686e5c31af7Sopenharmony_ci 1687e5c31af7Sopenharmony_ci return createDescriptorSetLayout(env.vkd, env.device, &descriptorSetLayoutInfo, env.allocationCallbacks); 1688e5c31af7Sopenharmony_ci } 1689e5c31af7Sopenharmony_ci}; 1690e5c31af7Sopenharmony_ci 1691e5c31af7Sopenharmony_cistruct PipelineLayout 1692e5c31af7Sopenharmony_ci{ 1693e5c31af7Sopenharmony_ci typedef VkPipelineLayout Type; 1694e5c31af7Sopenharmony_ci 1695e5c31af7Sopenharmony_ci struct Parameters 1696e5c31af7Sopenharmony_ci { 1697e5c31af7Sopenharmony_ci vector<DescriptorSetLayout::Parameters> descriptorSetLayouts; 1698e5c31af7Sopenharmony_ci vector<VkPushConstantRange> pushConstantRanges; 1699e5c31af7Sopenharmony_ci 1700e5c31af7Sopenharmony_ci Parameters (void) {} 1701e5c31af7Sopenharmony_ci 1702e5c31af7Sopenharmony_ci static Parameters empty (void) 1703e5c31af7Sopenharmony_ci { 1704e5c31af7Sopenharmony_ci return Parameters(); 1705e5c31af7Sopenharmony_ci } 1706e5c31af7Sopenharmony_ci 1707e5c31af7Sopenharmony_ci static Parameters singleDescriptorSet (const DescriptorSetLayout::Parameters& descriptorSetLayout) 1708e5c31af7Sopenharmony_ci { 1709e5c31af7Sopenharmony_ci Parameters params; 1710e5c31af7Sopenharmony_ci params.descriptorSetLayouts.push_back(descriptorSetLayout); 1711e5c31af7Sopenharmony_ci return params; 1712e5c31af7Sopenharmony_ci } 1713e5c31af7Sopenharmony_ci }; 1714e5c31af7Sopenharmony_ci 1715e5c31af7Sopenharmony_ci struct Resources 1716e5c31af7Sopenharmony_ci { 1717e5c31af7Sopenharmony_ci typedef SharedPtr<Dependency<DescriptorSetLayout> > DescriptorSetLayoutDepSp; 1718e5c31af7Sopenharmony_ci typedef vector<DescriptorSetLayoutDepSp> DescriptorSetLayouts; 1719e5c31af7Sopenharmony_ci 1720e5c31af7Sopenharmony_ci DescriptorSetLayouts descriptorSetLayouts; 1721e5c31af7Sopenharmony_ci vector<VkDescriptorSetLayout> pSetLayouts; 1722e5c31af7Sopenharmony_ci 1723e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 1724e5c31af7Sopenharmony_ci { 1725e5c31af7Sopenharmony_ci for (vector<DescriptorSetLayout::Parameters>::const_iterator dsParams = params.descriptorSetLayouts.begin(); 1726e5c31af7Sopenharmony_ci dsParams != params.descriptorSetLayouts.end(); 1727e5c31af7Sopenharmony_ci ++dsParams) 1728e5c31af7Sopenharmony_ci { 1729e5c31af7Sopenharmony_ci descriptorSetLayouts.push_back(DescriptorSetLayoutDepSp(new Dependency<DescriptorSetLayout>(env, *dsParams))); 1730e5c31af7Sopenharmony_ci pSetLayouts.push_back(*descriptorSetLayouts.back()->object); 1731e5c31af7Sopenharmony_ci } 1732e5c31af7Sopenharmony_ci } 1733e5c31af7Sopenharmony_ci }; 1734e5c31af7Sopenharmony_ci 1735e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1736e5c31af7Sopenharmony_ci { 1737e5c31af7Sopenharmony_ci return getSafeObjectCount<PipelineLayout>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 1738e5c31af7Sopenharmony_ci } 1739e5c31af7Sopenharmony_ci 1740e5c31af7Sopenharmony_ci static Move<VkPipelineLayout> create (const Environment& env, const Resources& res, const Parameters& params) 1741e5c31af7Sopenharmony_ci { 1742e5c31af7Sopenharmony_ci const VkPipelineLayoutCreateInfo pipelineLayoutInfo = 1743e5c31af7Sopenharmony_ci { 1744e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 1745e5c31af7Sopenharmony_ci DE_NULL, 1746e5c31af7Sopenharmony_ci (VkPipelineLayoutCreateFlags)0, 1747e5c31af7Sopenharmony_ci (deUint32)res.pSetLayouts.size(), 1748e5c31af7Sopenharmony_ci (res.pSetLayouts.empty() ? DE_NULL : &res.pSetLayouts[0]), 1749e5c31af7Sopenharmony_ci (deUint32)params.pushConstantRanges.size(), 1750e5c31af7Sopenharmony_ci (params.pushConstantRanges.empty() ? DE_NULL : ¶ms.pushConstantRanges[0]), 1751e5c31af7Sopenharmony_ci }; 1752e5c31af7Sopenharmony_ci 1753e5c31af7Sopenharmony_ci return createPipelineLayout(env.vkd, env.device, &pipelineLayoutInfo, env.allocationCallbacks); 1754e5c31af7Sopenharmony_ci } 1755e5c31af7Sopenharmony_ci}; 1756e5c31af7Sopenharmony_ci 1757e5c31af7Sopenharmony_cistruct RenderPass 1758e5c31af7Sopenharmony_ci{ 1759e5c31af7Sopenharmony_ci typedef VkRenderPass Type; 1760e5c31af7Sopenharmony_ci 1761e5c31af7Sopenharmony_ci // \todo [2015-09-17 pyry] More interesting configurations 1762e5c31af7Sopenharmony_ci struct Parameters 1763e5c31af7Sopenharmony_ci { 1764e5c31af7Sopenharmony_ci Parameters (void) {} 1765e5c31af7Sopenharmony_ci }; 1766e5c31af7Sopenharmony_ci 1767e5c31af7Sopenharmony_ci struct Resources 1768e5c31af7Sopenharmony_ci { 1769e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 1770e5c31af7Sopenharmony_ci }; 1771e5c31af7Sopenharmony_ci 1772e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1773e5c31af7Sopenharmony_ci { 1774e5c31af7Sopenharmony_ci return getSafeObjectCount<RenderPass>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 1775e5c31af7Sopenharmony_ci } 1776e5c31af7Sopenharmony_ci 1777e5c31af7Sopenharmony_ci static Move<VkRenderPass> create (const Environment& env, const Resources&, const Parameters&) 1778e5c31af7Sopenharmony_ci { 1779e5c31af7Sopenharmony_ci return makeRenderPass(env.vkd, env.device, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_D16_UNORM, 1780e5c31af7Sopenharmony_ci VK_ATTACHMENT_LOAD_OP_CLEAR, 1781e5c31af7Sopenharmony_ci VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1782e5c31af7Sopenharmony_ci VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1783e5c31af7Sopenharmony_ci VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1784e5c31af7Sopenharmony_ci VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1785e5c31af7Sopenharmony_ci env.allocationCallbacks); 1786e5c31af7Sopenharmony_ci } 1787e5c31af7Sopenharmony_ci}; 1788e5c31af7Sopenharmony_ci 1789e5c31af7Sopenharmony_cistruct GraphicsPipeline 1790e5c31af7Sopenharmony_ci{ 1791e5c31af7Sopenharmony_ci typedef VkPipeline Type; 1792e5c31af7Sopenharmony_ci 1793e5c31af7Sopenharmony_ci // \todo [2015-09-17 pyry] More interesting configurations 1794e5c31af7Sopenharmony_ci struct Parameters 1795e5c31af7Sopenharmony_ci { 1796e5c31af7Sopenharmony_ci Parameters (void) {} 1797e5c31af7Sopenharmony_ci }; 1798e5c31af7Sopenharmony_ci 1799e5c31af7Sopenharmony_ci struct Resources 1800e5c31af7Sopenharmony_ci { 1801e5c31af7Sopenharmony_ci Dependency<ShaderModule> vertexShader; 1802e5c31af7Sopenharmony_ci Dependency<ShaderModule> fragmentShader; 1803e5c31af7Sopenharmony_ci Dependency<PipelineLayout> layout; 1804e5c31af7Sopenharmony_ci Dependency<RenderPass> renderPass; 1805e5c31af7Sopenharmony_ci Dependency<PipelineCache> pipelineCache; 1806e5c31af7Sopenharmony_ci 1807e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters&) 1808e5c31af7Sopenharmony_ci : vertexShader (env, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert")) 1809e5c31af7Sopenharmony_ci , fragmentShader (env, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag")) 1810e5c31af7Sopenharmony_ci , layout (env, PipelineLayout::Parameters::singleDescriptorSet( 1811e5c31af7Sopenharmony_ci DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u, VK_SHADER_STAGE_FRAGMENT_BIT, true))) 1812e5c31af7Sopenharmony_ci , renderPass (env, RenderPass::Parameters()) 1813e5c31af7Sopenharmony_ci , pipelineCache (env, PipelineCache::Parameters()) 1814e5c31af7Sopenharmony_ci {} 1815e5c31af7Sopenharmony_ci }; 1816e5c31af7Sopenharmony_ci 1817e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 1818e5c31af7Sopenharmony_ci { 1819e5c31af7Sopenharmony_ci return getSafeObjectCount<GraphicsPipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 1820e5c31af7Sopenharmony_ci } 1821e5c31af7Sopenharmony_ci 1822e5c31af7Sopenharmony_ci static void initPrograms (SourceCollections& dst, Parameters) 1823e5c31af7Sopenharmony_ci { 1824e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 1825e5c31af7Sopenharmony_ci // Pipeline cache dependency uses compute shader to ensure that pipeline cache is not empty in subprocess. 1826e5c31af7Sopenharmony_ci // We have to add this shader even if we don't plan to use it later in any *.graphics_pipeline test 1827e5c31af7Sopenharmony_ci ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp")); 1828e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 1829e5c31af7Sopenharmony_ci ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_VERTEX_BIT, "vert")); 1830e5c31af7Sopenharmony_ci ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_FRAGMENT_BIT, "frag")); 1831e5c31af7Sopenharmony_ci } 1832e5c31af7Sopenharmony_ci 1833e5c31af7Sopenharmony_ci static vector<VkPipelineSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkPipeline>* const pOutHandles, VkResult* const pOutResult) 1834e5c31af7Sopenharmony_ci { 1835e5c31af7Sopenharmony_ci DE_ASSERT(pOutResult); 1836e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles); 1837e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles->size() != 0); 1838e5c31af7Sopenharmony_ci 1839e5c31af7Sopenharmony_ci const VkPipelineShaderStageCreateInfo stages[] = 1840e5c31af7Sopenharmony_ci { 1841e5c31af7Sopenharmony_ci { 1842e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 1843e5c31af7Sopenharmony_ci DE_NULL, 1844e5c31af7Sopenharmony_ci (VkPipelineShaderStageCreateFlags)0, 1845e5c31af7Sopenharmony_ci VK_SHADER_STAGE_VERTEX_BIT, 1846e5c31af7Sopenharmony_ci *res.vertexShader.object, 1847e5c31af7Sopenharmony_ci "main", 1848e5c31af7Sopenharmony_ci DE_NULL, // pSpecializationInfo 1849e5c31af7Sopenharmony_ci }, 1850e5c31af7Sopenharmony_ci { 1851e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 1852e5c31af7Sopenharmony_ci DE_NULL, 1853e5c31af7Sopenharmony_ci (VkPipelineShaderStageCreateFlags)0, 1854e5c31af7Sopenharmony_ci VK_SHADER_STAGE_FRAGMENT_BIT, 1855e5c31af7Sopenharmony_ci *res.fragmentShader.object, 1856e5c31af7Sopenharmony_ci "main", 1857e5c31af7Sopenharmony_ci DE_NULL, // pSpecializationInfo 1858e5c31af7Sopenharmony_ci } 1859e5c31af7Sopenharmony_ci }; 1860e5c31af7Sopenharmony_ci const VkVertexInputBindingDescription vertexBindings[] = 1861e5c31af7Sopenharmony_ci { 1862e5c31af7Sopenharmony_ci { 1863e5c31af7Sopenharmony_ci 0u, // binding 1864e5c31af7Sopenharmony_ci 16u, // stride 1865e5c31af7Sopenharmony_ci VK_VERTEX_INPUT_RATE_VERTEX 1866e5c31af7Sopenharmony_ci } 1867e5c31af7Sopenharmony_ci }; 1868e5c31af7Sopenharmony_ci const VkVertexInputAttributeDescription vertexAttribs[] = 1869e5c31af7Sopenharmony_ci { 1870e5c31af7Sopenharmony_ci { 1871e5c31af7Sopenharmony_ci 0u, // location 1872e5c31af7Sopenharmony_ci 0u, // binding 1873e5c31af7Sopenharmony_ci VK_FORMAT_R32G32B32A32_SFLOAT, 1874e5c31af7Sopenharmony_ci 0u, // offset 1875e5c31af7Sopenharmony_ci } 1876e5c31af7Sopenharmony_ci }; 1877e5c31af7Sopenharmony_ci const VkPipelineVertexInputStateCreateInfo vertexInputState = 1878e5c31af7Sopenharmony_ci { 1879e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, 1880e5c31af7Sopenharmony_ci DE_NULL, 1881e5c31af7Sopenharmony_ci (VkPipelineVertexInputStateCreateFlags)0, 1882e5c31af7Sopenharmony_ci DE_LENGTH_OF_ARRAY(vertexBindings), 1883e5c31af7Sopenharmony_ci vertexBindings, 1884e5c31af7Sopenharmony_ci DE_LENGTH_OF_ARRAY(vertexAttribs), 1885e5c31af7Sopenharmony_ci vertexAttribs 1886e5c31af7Sopenharmony_ci }; 1887e5c31af7Sopenharmony_ci const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = 1888e5c31af7Sopenharmony_ci { 1889e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, 1890e5c31af7Sopenharmony_ci DE_NULL, 1891e5c31af7Sopenharmony_ci (VkPipelineInputAssemblyStateCreateFlags)0, 1892e5c31af7Sopenharmony_ci VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 1893e5c31af7Sopenharmony_ci VK_FALSE // primitiveRestartEnable 1894e5c31af7Sopenharmony_ci }; 1895e5c31af7Sopenharmony_ci const VkViewport viewport = makeViewport(tcu::UVec2(64)); 1896e5c31af7Sopenharmony_ci const VkRect2D scissor = makeRect2D(tcu::UVec2(64)); 1897e5c31af7Sopenharmony_ci 1898e5c31af7Sopenharmony_ci const VkPipelineViewportStateCreateInfo viewportState = 1899e5c31af7Sopenharmony_ci { 1900e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, 1901e5c31af7Sopenharmony_ci DE_NULL, 1902e5c31af7Sopenharmony_ci (VkPipelineViewportStateCreateFlags)0, 1903e5c31af7Sopenharmony_ci 1u, 1904e5c31af7Sopenharmony_ci &viewport, 1905e5c31af7Sopenharmony_ci 1u, 1906e5c31af7Sopenharmony_ci &scissor, 1907e5c31af7Sopenharmony_ci }; 1908e5c31af7Sopenharmony_ci const VkPipelineRasterizationStateCreateInfo rasterState = 1909e5c31af7Sopenharmony_ci { 1910e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, 1911e5c31af7Sopenharmony_ci DE_NULL, 1912e5c31af7Sopenharmony_ci (VkPipelineRasterizationStateCreateFlags)0, 1913e5c31af7Sopenharmony_ci VK_FALSE, // depthClampEnable 1914e5c31af7Sopenharmony_ci VK_FALSE, // rasterizerDiscardEnable 1915e5c31af7Sopenharmony_ci VK_POLYGON_MODE_FILL, 1916e5c31af7Sopenharmony_ci VK_CULL_MODE_BACK_BIT, 1917e5c31af7Sopenharmony_ci VK_FRONT_FACE_COUNTER_CLOCKWISE, 1918e5c31af7Sopenharmony_ci VK_FALSE, // depthBiasEnable 1919e5c31af7Sopenharmony_ci 0.0f, // depthBiasConstantFactor 1920e5c31af7Sopenharmony_ci 0.0f, // depthBiasClamp 1921e5c31af7Sopenharmony_ci 0.0f, // depthBiasSlopeFactor 1922e5c31af7Sopenharmony_ci 1.0f, // lineWidth 1923e5c31af7Sopenharmony_ci }; 1924e5c31af7Sopenharmony_ci const VkPipelineMultisampleStateCreateInfo multisampleState = 1925e5c31af7Sopenharmony_ci { 1926e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, 1927e5c31af7Sopenharmony_ci DE_NULL, 1928e5c31af7Sopenharmony_ci (VkPipelineMultisampleStateCreateFlags)0, 1929e5c31af7Sopenharmony_ci VK_SAMPLE_COUNT_1_BIT, 1930e5c31af7Sopenharmony_ci VK_FALSE, // sampleShadingEnable 1931e5c31af7Sopenharmony_ci 1.0f, // minSampleShading 1932e5c31af7Sopenharmony_ci DE_NULL, // pSampleMask 1933e5c31af7Sopenharmony_ci VK_FALSE, // alphaToCoverageEnable 1934e5c31af7Sopenharmony_ci VK_FALSE, // alphaToOneEnable 1935e5c31af7Sopenharmony_ci }; 1936e5c31af7Sopenharmony_ci const VkPipelineDepthStencilStateCreateInfo depthStencilState = 1937e5c31af7Sopenharmony_ci { 1938e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, 1939e5c31af7Sopenharmony_ci DE_NULL, 1940e5c31af7Sopenharmony_ci (VkPipelineDepthStencilStateCreateFlags)0, 1941e5c31af7Sopenharmony_ci VK_TRUE, // depthTestEnable 1942e5c31af7Sopenharmony_ci VK_TRUE, // depthWriteEnable 1943e5c31af7Sopenharmony_ci VK_COMPARE_OP_LESS, // depthCompareOp 1944e5c31af7Sopenharmony_ci VK_FALSE, // depthBoundsTestEnable 1945e5c31af7Sopenharmony_ci VK_FALSE, // stencilTestEnable 1946e5c31af7Sopenharmony_ci { VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u }, 1947e5c31af7Sopenharmony_ci { VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u }, 1948e5c31af7Sopenharmony_ci 0.0f, // minDepthBounds 1949e5c31af7Sopenharmony_ci 1.0f, // maxDepthBounds 1950e5c31af7Sopenharmony_ci }; 1951e5c31af7Sopenharmony_ci const VkPipelineColorBlendAttachmentState colorBlendAttState[]= 1952e5c31af7Sopenharmony_ci { 1953e5c31af7Sopenharmony_ci { 1954e5c31af7Sopenharmony_ci VK_FALSE, // blendEnable 1955e5c31af7Sopenharmony_ci VK_BLEND_FACTOR_ONE, 1956e5c31af7Sopenharmony_ci VK_BLEND_FACTOR_ZERO, 1957e5c31af7Sopenharmony_ci VK_BLEND_OP_ADD, 1958e5c31af7Sopenharmony_ci VK_BLEND_FACTOR_ONE, 1959e5c31af7Sopenharmony_ci VK_BLEND_FACTOR_ZERO, 1960e5c31af7Sopenharmony_ci VK_BLEND_OP_ADD, 1961e5c31af7Sopenharmony_ci VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT 1962e5c31af7Sopenharmony_ci } 1963e5c31af7Sopenharmony_ci }; 1964e5c31af7Sopenharmony_ci const VkPipelineColorBlendStateCreateInfo colorBlendState = 1965e5c31af7Sopenharmony_ci { 1966e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, 1967e5c31af7Sopenharmony_ci DE_NULL, 1968e5c31af7Sopenharmony_ci (VkPipelineColorBlendStateCreateFlags)0, 1969e5c31af7Sopenharmony_ci VK_FALSE, // logicOpEnable 1970e5c31af7Sopenharmony_ci VK_LOGIC_OP_COPY, 1971e5c31af7Sopenharmony_ci DE_LENGTH_OF_ARRAY(colorBlendAttState), 1972e5c31af7Sopenharmony_ci colorBlendAttState, 1973e5c31af7Sopenharmony_ci { 0.0f, 0.0f, 0.0f, 0.0f } // blendConstants 1974e5c31af7Sopenharmony_ci }; 1975e5c31af7Sopenharmony_ci const VkGraphicsPipelineCreateInfo pipelineInfo = 1976e5c31af7Sopenharmony_ci { 1977e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, 1978e5c31af7Sopenharmony_ci DE_NULL, 1979e5c31af7Sopenharmony_ci (VkPipelineCreateFlags)0, 1980e5c31af7Sopenharmony_ci DE_LENGTH_OF_ARRAY(stages), 1981e5c31af7Sopenharmony_ci stages, 1982e5c31af7Sopenharmony_ci &vertexInputState, 1983e5c31af7Sopenharmony_ci &inputAssemblyState, 1984e5c31af7Sopenharmony_ci DE_NULL, // pTessellationState 1985e5c31af7Sopenharmony_ci &viewportState, 1986e5c31af7Sopenharmony_ci &rasterState, 1987e5c31af7Sopenharmony_ci &multisampleState, 1988e5c31af7Sopenharmony_ci &depthStencilState, 1989e5c31af7Sopenharmony_ci &colorBlendState, 1990e5c31af7Sopenharmony_ci (const VkPipelineDynamicStateCreateInfo*)DE_NULL, 1991e5c31af7Sopenharmony_ci *res.layout.object, 1992e5c31af7Sopenharmony_ci *res.renderPass.object, 1993e5c31af7Sopenharmony_ci 0u, // subpass 1994e5c31af7Sopenharmony_ci (VkPipeline)0, // basePipelineHandle 1995e5c31af7Sopenharmony_ci 0, // basePipelineIndex 1996e5c31af7Sopenharmony_ci }; 1997e5c31af7Sopenharmony_ci 1998e5c31af7Sopenharmony_ci const deUint32 numPipelines = static_cast<deUint32>(pOutHandles->size()); 1999e5c31af7Sopenharmony_ci VkPipeline* const pHandles = &(*pOutHandles)[0]; 2000e5c31af7Sopenharmony_ci vector<VkGraphicsPipelineCreateInfo> pipelineInfos (numPipelines, pipelineInfo); 2001e5c31af7Sopenharmony_ci 2002e5c31af7Sopenharmony_ci *pOutResult = env.vkd.createGraphicsPipelines(env.device, *res.pipelineCache.object, numPipelines, &pipelineInfos[0], env.allocationCallbacks, pHandles); 2003e5c31af7Sopenharmony_ci 2004e5c31af7Sopenharmony_ci vector<VkPipelineSp> pipelines; 2005e5c31af7Sopenharmony_ci 2006e5c31af7Sopenharmony_ci // Even if an error is returned, some pipelines may have been created successfully 2007e5c31af7Sopenharmony_ci for (deUint32 i = 0; i < numPipelines; ++i) 2008e5c31af7Sopenharmony_ci { 2009e5c31af7Sopenharmony_ci if (pHandles[i] != DE_NULL) 2010e5c31af7Sopenharmony_ci pipelines.push_back(VkPipelineSp(new Move<VkPipeline>(check<VkPipeline>(pHandles[i]), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks)))); 2011e5c31af7Sopenharmony_ci } 2012e5c31af7Sopenharmony_ci 2013e5c31af7Sopenharmony_ci return pipelines; 2014e5c31af7Sopenharmony_ci } 2015e5c31af7Sopenharmony_ci 2016e5c31af7Sopenharmony_ci static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&) 2017e5c31af7Sopenharmony_ci { 2018e5c31af7Sopenharmony_ci vector<VkPipeline> handles (1, DE_NULL); 2019e5c31af7Sopenharmony_ci VkResult result = VK_NOT_READY; 2020e5c31af7Sopenharmony_ci vector<VkPipelineSp> scopedHandles = createMultiple(env, res, Parameters(), &handles, &result); 2021e5c31af7Sopenharmony_ci 2022e5c31af7Sopenharmony_ci VK_CHECK(result); 2023e5c31af7Sopenharmony_ci return Move<VkPipeline>(check<VkPipeline>(scopedHandles.front()->disown()), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks)); 2024e5c31af7Sopenharmony_ci } 2025e5c31af7Sopenharmony_ci}; 2026e5c31af7Sopenharmony_ci 2027e5c31af7Sopenharmony_cistruct ComputePipeline 2028e5c31af7Sopenharmony_ci{ 2029e5c31af7Sopenharmony_ci typedef VkPipeline Type; 2030e5c31af7Sopenharmony_ci 2031e5c31af7Sopenharmony_ci // \todo [2015-09-17 pyry] More interesting configurations 2032e5c31af7Sopenharmony_ci struct Parameters 2033e5c31af7Sopenharmony_ci { 2034e5c31af7Sopenharmony_ci Parameters (void) {} 2035e5c31af7Sopenharmony_ci }; 2036e5c31af7Sopenharmony_ci 2037e5c31af7Sopenharmony_ci struct Resources 2038e5c31af7Sopenharmony_ci { 2039e5c31af7Sopenharmony_ci Dependency<ShaderModule> shaderModule; 2040e5c31af7Sopenharmony_ci Dependency<PipelineLayout> layout; 2041e5c31af7Sopenharmony_ci Dependency<PipelineCache> pipelineCache; 2042e5c31af7Sopenharmony_ci 2043e5c31af7Sopenharmony_ci static DescriptorSetLayout::Parameters getDescriptorSetLayout (void) 2044e5c31af7Sopenharmony_ci { 2045e5c31af7Sopenharmony_ci typedef DescriptorSetLayout::Parameters::Binding Binding; 2046e5c31af7Sopenharmony_ci 2047e5c31af7Sopenharmony_ci vector<Binding> bindings; 2048e5c31af7Sopenharmony_ci 2049e5c31af7Sopenharmony_ci bindings.push_back(Binding(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false)); 2050e5c31af7Sopenharmony_ci bindings.push_back(Binding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, VK_SHADER_STAGE_COMPUTE_BIT, false)); 2051e5c31af7Sopenharmony_ci 2052e5c31af7Sopenharmony_ci return DescriptorSetLayout::Parameters(bindings); 2053e5c31af7Sopenharmony_ci } 2054e5c31af7Sopenharmony_ci 2055e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters&) 2056e5c31af7Sopenharmony_ci : shaderModule (env, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp")) 2057e5c31af7Sopenharmony_ci , layout (env, PipelineLayout::Parameters::singleDescriptorSet(getDescriptorSetLayout())) 2058e5c31af7Sopenharmony_ci , pipelineCache (env, PipelineCache::Parameters()) 2059e5c31af7Sopenharmony_ci {} 2060e5c31af7Sopenharmony_ci }; 2061e5c31af7Sopenharmony_ci 2062e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 2063e5c31af7Sopenharmony_ci { 2064e5c31af7Sopenharmony_ci return getSafeObjectCount<ComputePipeline>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 2065e5c31af7Sopenharmony_ci } 2066e5c31af7Sopenharmony_ci 2067e5c31af7Sopenharmony_ci static void initPrograms (SourceCollections& dst, Parameters) 2068e5c31af7Sopenharmony_ci { 2069e5c31af7Sopenharmony_ci ShaderModule::initPrograms(dst, ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "comp")); 2070e5c31af7Sopenharmony_ci } 2071e5c31af7Sopenharmony_ci 2072e5c31af7Sopenharmony_ci static Move<VkPipeline> create (const Environment& env, const Resources& res, const Parameters&) 2073e5c31af7Sopenharmony_ci { 2074e5c31af7Sopenharmony_ci const VkComputePipelineCreateInfo pipelineInfo = 2075e5c31af7Sopenharmony_ci { 2076e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 2077e5c31af7Sopenharmony_ci DE_NULL, 2078e5c31af7Sopenharmony_ci (VkPipelineCreateFlags)0, 2079e5c31af7Sopenharmony_ci { 2080e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 2081e5c31af7Sopenharmony_ci DE_NULL, 2082e5c31af7Sopenharmony_ci (VkPipelineShaderStageCreateFlags)0, 2083e5c31af7Sopenharmony_ci VK_SHADER_STAGE_COMPUTE_BIT, 2084e5c31af7Sopenharmony_ci *res.shaderModule.object, 2085e5c31af7Sopenharmony_ci "main", 2086e5c31af7Sopenharmony_ci DE_NULL // pSpecializationInfo 2087e5c31af7Sopenharmony_ci }, 2088e5c31af7Sopenharmony_ci *res.layout.object, 2089e5c31af7Sopenharmony_ci (VkPipeline)0, // basePipelineHandle 2090e5c31af7Sopenharmony_ci 0u, // basePipelineIndex 2091e5c31af7Sopenharmony_ci }; 2092e5c31af7Sopenharmony_ci 2093e5c31af7Sopenharmony_ci return createComputePipeline(env.vkd, env.device, *res.pipelineCache.object, &pipelineInfo, env.allocationCallbacks); 2094e5c31af7Sopenharmony_ci } 2095e5c31af7Sopenharmony_ci 2096e5c31af7Sopenharmony_ci static vector<VkPipelineSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkPipeline>* const pOutHandles, VkResult* const pOutResult) 2097e5c31af7Sopenharmony_ci { 2098e5c31af7Sopenharmony_ci DE_ASSERT(pOutResult); 2099e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles); 2100e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles->size() != 0); 2101e5c31af7Sopenharmony_ci 2102e5c31af7Sopenharmony_ci const VkComputePipelineCreateInfo commonPipelineInfo = 2103e5c31af7Sopenharmony_ci { 2104e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 2105e5c31af7Sopenharmony_ci DE_NULL, 2106e5c31af7Sopenharmony_ci (VkPipelineCreateFlags)0, 2107e5c31af7Sopenharmony_ci { 2108e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 2109e5c31af7Sopenharmony_ci DE_NULL, 2110e5c31af7Sopenharmony_ci (VkPipelineShaderStageCreateFlags)0, 2111e5c31af7Sopenharmony_ci VK_SHADER_STAGE_COMPUTE_BIT, 2112e5c31af7Sopenharmony_ci *res.shaderModule.object, 2113e5c31af7Sopenharmony_ci "main", 2114e5c31af7Sopenharmony_ci DE_NULL // pSpecializationInfo 2115e5c31af7Sopenharmony_ci }, 2116e5c31af7Sopenharmony_ci *res.layout.object, 2117e5c31af7Sopenharmony_ci (VkPipeline)0, // basePipelineHandle 2118e5c31af7Sopenharmony_ci 0u, // basePipelineIndex 2119e5c31af7Sopenharmony_ci }; 2120e5c31af7Sopenharmony_ci 2121e5c31af7Sopenharmony_ci const deUint32 numPipelines = static_cast<deUint32>(pOutHandles->size()); 2122e5c31af7Sopenharmony_ci VkPipeline* const pHandles = &(*pOutHandles)[0]; 2123e5c31af7Sopenharmony_ci vector<VkComputePipelineCreateInfo> pipelineInfos (numPipelines, commonPipelineInfo); 2124e5c31af7Sopenharmony_ci 2125e5c31af7Sopenharmony_ci *pOutResult = env.vkd.createComputePipelines(env.device, *res.pipelineCache.object, numPipelines, &pipelineInfos[0], env.allocationCallbacks, pHandles); 2126e5c31af7Sopenharmony_ci 2127e5c31af7Sopenharmony_ci vector<VkPipelineSp> pipelines; 2128e5c31af7Sopenharmony_ci 2129e5c31af7Sopenharmony_ci // Even if an error is returned, some pipelines may have been created successfully 2130e5c31af7Sopenharmony_ci for (deUint32 i = 0; i < numPipelines; ++i) 2131e5c31af7Sopenharmony_ci { 2132e5c31af7Sopenharmony_ci if (pHandles[i] != DE_NULL) 2133e5c31af7Sopenharmony_ci pipelines.push_back(VkPipelineSp(new Move<VkPipeline>(check<VkPipeline>(pHandles[i]), Deleter<VkPipeline>(env.vkd, env.device, env.allocationCallbacks)))); 2134e5c31af7Sopenharmony_ci } 2135e5c31af7Sopenharmony_ci 2136e5c31af7Sopenharmony_ci return pipelines; 2137e5c31af7Sopenharmony_ci } 2138e5c31af7Sopenharmony_ci}; 2139e5c31af7Sopenharmony_ci 2140e5c31af7Sopenharmony_cistruct DescriptorPool 2141e5c31af7Sopenharmony_ci{ 2142e5c31af7Sopenharmony_ci typedef VkDescriptorPool Type; 2143e5c31af7Sopenharmony_ci 2144e5c31af7Sopenharmony_ci struct Parameters 2145e5c31af7Sopenharmony_ci { 2146e5c31af7Sopenharmony_ci VkDescriptorPoolCreateFlags flags; 2147e5c31af7Sopenharmony_ci deUint32 maxSets; 2148e5c31af7Sopenharmony_ci vector<VkDescriptorPoolSize> poolSizes; 2149e5c31af7Sopenharmony_ci 2150e5c31af7Sopenharmony_ci Parameters (VkDescriptorPoolCreateFlags flags_, 2151e5c31af7Sopenharmony_ci deUint32 maxSets_, 2152e5c31af7Sopenharmony_ci const vector<VkDescriptorPoolSize>& poolSizes_) 2153e5c31af7Sopenharmony_ci : flags (flags_) 2154e5c31af7Sopenharmony_ci , maxSets (maxSets_) 2155e5c31af7Sopenharmony_ci , poolSizes (poolSizes_) 2156e5c31af7Sopenharmony_ci {} 2157e5c31af7Sopenharmony_ci 2158e5c31af7Sopenharmony_ci static Parameters singleType (VkDescriptorPoolCreateFlags flags, 2159e5c31af7Sopenharmony_ci deUint32 maxSets, 2160e5c31af7Sopenharmony_ci VkDescriptorType type, 2161e5c31af7Sopenharmony_ci deUint32 count) 2162e5c31af7Sopenharmony_ci { 2163e5c31af7Sopenharmony_ci vector<VkDescriptorPoolSize> poolSizes; 2164e5c31af7Sopenharmony_ci poolSizes.push_back(makeDescriptorPoolSize(type, count)); 2165e5c31af7Sopenharmony_ci return Parameters(flags, maxSets, poolSizes); 2166e5c31af7Sopenharmony_ci } 2167e5c31af7Sopenharmony_ci }; 2168e5c31af7Sopenharmony_ci 2169e5c31af7Sopenharmony_ci struct Resources 2170e5c31af7Sopenharmony_ci { 2171e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 2172e5c31af7Sopenharmony_ci }; 2173e5c31af7Sopenharmony_ci 2174e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 2175e5c31af7Sopenharmony_ci { 2176e5c31af7Sopenharmony_ci return getSafeObjectCount<DescriptorPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 2177e5c31af7Sopenharmony_ci } 2178e5c31af7Sopenharmony_ci 2179e5c31af7Sopenharmony_ci static Move<VkDescriptorPool> create (const Environment& env, const Resources&, const Parameters& params) 2180e5c31af7Sopenharmony_ci { 2181e5c31af7Sopenharmony_ci const VkDescriptorPoolCreateInfo descriptorPoolInfo = 2182e5c31af7Sopenharmony_ci { 2183e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, 2184e5c31af7Sopenharmony_ci DE_NULL, 2185e5c31af7Sopenharmony_ci params.flags, 2186e5c31af7Sopenharmony_ci params.maxSets, 2187e5c31af7Sopenharmony_ci (deUint32)params.poolSizes.size(), 2188e5c31af7Sopenharmony_ci (params.poolSizes.empty() ? DE_NULL : ¶ms.poolSizes[0]) 2189e5c31af7Sopenharmony_ci }; 2190e5c31af7Sopenharmony_ci 2191e5c31af7Sopenharmony_ci return createDescriptorPool(env.vkd, env.device, &descriptorPoolInfo, env.allocationCallbacks); 2192e5c31af7Sopenharmony_ci } 2193e5c31af7Sopenharmony_ci}; 2194e5c31af7Sopenharmony_ci 2195e5c31af7Sopenharmony_cistruct DescriptorSet 2196e5c31af7Sopenharmony_ci{ 2197e5c31af7Sopenharmony_ci typedef VkDescriptorSet Type; 2198e5c31af7Sopenharmony_ci 2199e5c31af7Sopenharmony_ci struct Parameters 2200e5c31af7Sopenharmony_ci { 2201e5c31af7Sopenharmony_ci DescriptorSetLayout::Parameters descriptorSetLayout; 2202e5c31af7Sopenharmony_ci 2203e5c31af7Sopenharmony_ci Parameters (const DescriptorSetLayout::Parameters& descriptorSetLayout_) 2204e5c31af7Sopenharmony_ci : descriptorSetLayout(descriptorSetLayout_) 2205e5c31af7Sopenharmony_ci {} 2206e5c31af7Sopenharmony_ci }; 2207e5c31af7Sopenharmony_ci 2208e5c31af7Sopenharmony_ci struct Resources 2209e5c31af7Sopenharmony_ci { 2210e5c31af7Sopenharmony_ci Dependency<DescriptorPool> descriptorPool; 2211e5c31af7Sopenharmony_ci Dependency<DescriptorSetLayout> descriptorSetLayout; 2212e5c31af7Sopenharmony_ci 2213e5c31af7Sopenharmony_ci static vector<VkDescriptorPoolSize> computePoolSizes (const DescriptorSetLayout::Parameters& layout, int maxSets) 2214e5c31af7Sopenharmony_ci { 2215e5c31af7Sopenharmony_ci deUint32 countByType[VK_DESCRIPTOR_TYPE_LAST]; 2216e5c31af7Sopenharmony_ci vector<VkDescriptorPoolSize> typeCounts; 2217e5c31af7Sopenharmony_ci 2218e5c31af7Sopenharmony_ci std::fill(DE_ARRAY_BEGIN(countByType), DE_ARRAY_END(countByType), 0u); 2219e5c31af7Sopenharmony_ci 2220e5c31af7Sopenharmony_ci for (vector<DescriptorSetLayout::Parameters::Binding>::const_iterator cur = layout.bindings.begin(); 2221e5c31af7Sopenharmony_ci cur != layout.bindings.end(); 2222e5c31af7Sopenharmony_ci ++cur) 2223e5c31af7Sopenharmony_ci { 2224e5c31af7Sopenharmony_ci DE_ASSERT((deUint32)cur->descriptorType < VK_DESCRIPTOR_TYPE_LAST); 2225e5c31af7Sopenharmony_ci countByType[cur->descriptorType] += cur->descriptorCount * maxSets; 2226e5c31af7Sopenharmony_ci } 2227e5c31af7Sopenharmony_ci 2228e5c31af7Sopenharmony_ci for (deUint32 type = 0; type < VK_DESCRIPTOR_TYPE_LAST; ++type) 2229e5c31af7Sopenharmony_ci { 2230e5c31af7Sopenharmony_ci if (countByType[type] > 0) 2231e5c31af7Sopenharmony_ci typeCounts.push_back(makeDescriptorPoolSize((VkDescriptorType)type, countByType[type])); 2232e5c31af7Sopenharmony_ci } 2233e5c31af7Sopenharmony_ci 2234e5c31af7Sopenharmony_ci return typeCounts; 2235e5c31af7Sopenharmony_ci } 2236e5c31af7Sopenharmony_ci 2237e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 2238e5c31af7Sopenharmony_ci : descriptorPool (env, DescriptorPool::Parameters(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, env.maxResourceConsumers, computePoolSizes(params.descriptorSetLayout, env.maxResourceConsumers))) 2239e5c31af7Sopenharmony_ci , descriptorSetLayout (env, params.descriptorSetLayout) 2240e5c31af7Sopenharmony_ci { 2241e5c31af7Sopenharmony_ci } 2242e5c31af7Sopenharmony_ci }; 2243e5c31af7Sopenharmony_ci 2244e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 2245e5c31af7Sopenharmony_ci { 2246e5c31af7Sopenharmony_ci return getSafeObjectCount<DescriptorSet>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 2247e5c31af7Sopenharmony_ci } 2248e5c31af7Sopenharmony_ci 2249e5c31af7Sopenharmony_ci static Move<VkDescriptorSet> create (const Environment& env, const Resources& res, const Parameters&) 2250e5c31af7Sopenharmony_ci { 2251e5c31af7Sopenharmony_ci const VkDescriptorSetAllocateInfo allocateInfo = 2252e5c31af7Sopenharmony_ci { 2253e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 2254e5c31af7Sopenharmony_ci DE_NULL, 2255e5c31af7Sopenharmony_ci *res.descriptorPool.object, 2256e5c31af7Sopenharmony_ci 1u, 2257e5c31af7Sopenharmony_ci &res.descriptorSetLayout.object.get(), 2258e5c31af7Sopenharmony_ci }; 2259e5c31af7Sopenharmony_ci 2260e5c31af7Sopenharmony_ci return allocateDescriptorSet(env.vkd, env.device, &allocateInfo); 2261e5c31af7Sopenharmony_ci } 2262e5c31af7Sopenharmony_ci 2263e5c31af7Sopenharmony_ci static vector<VkDescriptorSetSp> createMultiple (const Environment& env, const Resources& res, const Parameters&, vector<VkDescriptorSet>* const pOutHandles, VkResult* const pOutResult) 2264e5c31af7Sopenharmony_ci { 2265e5c31af7Sopenharmony_ci DE_ASSERT(pOutResult); 2266e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles); 2267e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles->size() != 0); 2268e5c31af7Sopenharmony_ci 2269e5c31af7Sopenharmony_ci const deUint32 numDescriptorSets = static_cast<deUint32>(pOutHandles->size()); 2270e5c31af7Sopenharmony_ci VkDescriptorSet* const pHandles = &(*pOutHandles)[0]; 2271e5c31af7Sopenharmony_ci const vector<VkDescriptorSetLayout> descriptorSetLayouts (numDescriptorSets, res.descriptorSetLayout.object.get()); 2272e5c31af7Sopenharmony_ci 2273e5c31af7Sopenharmony_ci const VkDescriptorSetAllocateInfo allocateInfo = 2274e5c31af7Sopenharmony_ci { 2275e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 2276e5c31af7Sopenharmony_ci DE_NULL, 2277e5c31af7Sopenharmony_ci *res.descriptorPool.object, 2278e5c31af7Sopenharmony_ci numDescriptorSets, 2279e5c31af7Sopenharmony_ci &descriptorSetLayouts[0], 2280e5c31af7Sopenharmony_ci }; 2281e5c31af7Sopenharmony_ci 2282e5c31af7Sopenharmony_ci *pOutResult = env.vkd.allocateDescriptorSets(env.device, &allocateInfo, pHandles); 2283e5c31af7Sopenharmony_ci 2284e5c31af7Sopenharmony_ci vector<VkDescriptorSetSp> descriptorSets; 2285e5c31af7Sopenharmony_ci 2286e5c31af7Sopenharmony_ci if (*pOutResult == VK_SUCCESS) 2287e5c31af7Sopenharmony_ci { 2288e5c31af7Sopenharmony_ci for (deUint32 i = 0; i < numDescriptorSets; ++i) 2289e5c31af7Sopenharmony_ci descriptorSets.push_back(VkDescriptorSetSp(new Move<VkDescriptorSet>(check<VkDescriptorSet>(pHandles[i]), Deleter<VkDescriptorSet>(env.vkd, env.device, *res.descriptorPool.object)))); 2290e5c31af7Sopenharmony_ci } 2291e5c31af7Sopenharmony_ci 2292e5c31af7Sopenharmony_ci return descriptorSets; 2293e5c31af7Sopenharmony_ci } 2294e5c31af7Sopenharmony_ci}; 2295e5c31af7Sopenharmony_ci 2296e5c31af7Sopenharmony_cistruct Framebuffer 2297e5c31af7Sopenharmony_ci{ 2298e5c31af7Sopenharmony_ci typedef VkFramebuffer Type; 2299e5c31af7Sopenharmony_ci 2300e5c31af7Sopenharmony_ci struct Parameters 2301e5c31af7Sopenharmony_ci { 2302e5c31af7Sopenharmony_ci Parameters (void) 2303e5c31af7Sopenharmony_ci {} 2304e5c31af7Sopenharmony_ci }; 2305e5c31af7Sopenharmony_ci 2306e5c31af7Sopenharmony_ci struct Resources 2307e5c31af7Sopenharmony_ci { 2308e5c31af7Sopenharmony_ci Dependency<ImageView> colorAttachment; 2309e5c31af7Sopenharmony_ci Dependency<ImageView> depthStencilAttachment; 2310e5c31af7Sopenharmony_ci Dependency<RenderPass> renderPass; 2311e5c31af7Sopenharmony_ci 2312e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters&) 2313e5c31af7Sopenharmony_ci : colorAttachment (env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, 2314e5c31af7Sopenharmony_ci makeExtent3D(256, 256, 1), 2315e5c31af7Sopenharmony_ci 1u, 1u, 2316e5c31af7Sopenharmony_ci VK_SAMPLE_COUNT_1_BIT, 2317e5c31af7Sopenharmony_ci VK_IMAGE_TILING_OPTIMAL, 2318e5c31af7Sopenharmony_ci VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 2319e5c31af7Sopenharmony_ci VK_IMAGE_LAYOUT_UNDEFINED), 2320e5c31af7Sopenharmony_ci VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, 2321e5c31af7Sopenharmony_ci makeComponentMappingRGBA(), 2322e5c31af7Sopenharmony_ci makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u))) 2323e5c31af7Sopenharmony_ci , depthStencilAttachment (env, ImageView::Parameters(Image::Parameters(0u, VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM, 2324e5c31af7Sopenharmony_ci makeExtent3D(256, 256, 1), 2325e5c31af7Sopenharmony_ci 1u, 1u, 2326e5c31af7Sopenharmony_ci VK_SAMPLE_COUNT_1_BIT, 2327e5c31af7Sopenharmony_ci VK_IMAGE_TILING_OPTIMAL, 2328e5c31af7Sopenharmony_ci VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 2329e5c31af7Sopenharmony_ci VK_IMAGE_LAYOUT_UNDEFINED), 2330e5c31af7Sopenharmony_ci VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_D16_UNORM, 2331e5c31af7Sopenharmony_ci makeComponentMappingRGBA(), 2332e5c31af7Sopenharmony_ci makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u))) 2333e5c31af7Sopenharmony_ci , renderPass (env, RenderPass::Parameters()) 2334e5c31af7Sopenharmony_ci {} 2335e5c31af7Sopenharmony_ci }; 2336e5c31af7Sopenharmony_ci 2337e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 2338e5c31af7Sopenharmony_ci { 2339e5c31af7Sopenharmony_ci // \todo [2016-03-23 pyry] Take into account attachment sizes 2340e5c31af7Sopenharmony_ci return getSafeObjectCount<Framebuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 2341e5c31af7Sopenharmony_ci } 2342e5c31af7Sopenharmony_ci 2343e5c31af7Sopenharmony_ci static Move<VkFramebuffer> create (const Environment& env, const Resources& res, const Parameters&) 2344e5c31af7Sopenharmony_ci { 2345e5c31af7Sopenharmony_ci const VkImageView attachments[] = 2346e5c31af7Sopenharmony_ci { 2347e5c31af7Sopenharmony_ci *res.colorAttachment.object, 2348e5c31af7Sopenharmony_ci *res.depthStencilAttachment.object, 2349e5c31af7Sopenharmony_ci }; 2350e5c31af7Sopenharmony_ci const VkFramebufferCreateInfo framebufferInfo = 2351e5c31af7Sopenharmony_ci { 2352e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 2353e5c31af7Sopenharmony_ci DE_NULL, 2354e5c31af7Sopenharmony_ci (VkFramebufferCreateFlags)0, 2355e5c31af7Sopenharmony_ci *res.renderPass.object, 2356e5c31af7Sopenharmony_ci (deUint32)DE_LENGTH_OF_ARRAY(attachments), 2357e5c31af7Sopenharmony_ci attachments, 2358e5c31af7Sopenharmony_ci 256u, // width 2359e5c31af7Sopenharmony_ci 256u, // height 2360e5c31af7Sopenharmony_ci 1u // layers 2361e5c31af7Sopenharmony_ci }; 2362e5c31af7Sopenharmony_ci 2363e5c31af7Sopenharmony_ci return createFramebuffer(env.vkd, env.device, &framebufferInfo, env.allocationCallbacks); 2364e5c31af7Sopenharmony_ci } 2365e5c31af7Sopenharmony_ci}; 2366e5c31af7Sopenharmony_ci 2367e5c31af7Sopenharmony_cistruct CommandPool 2368e5c31af7Sopenharmony_ci{ 2369e5c31af7Sopenharmony_ci typedef VkCommandPool Type; 2370e5c31af7Sopenharmony_ci 2371e5c31af7Sopenharmony_ci struct Parameters 2372e5c31af7Sopenharmony_ci { 2373e5c31af7Sopenharmony_ci VkCommandPoolCreateFlags flags; 2374e5c31af7Sopenharmony_ci 2375e5c31af7Sopenharmony_ci Parameters (VkCommandPoolCreateFlags flags_) 2376e5c31af7Sopenharmony_ci : flags(flags_) 2377e5c31af7Sopenharmony_ci {} 2378e5c31af7Sopenharmony_ci }; 2379e5c31af7Sopenharmony_ci 2380e5c31af7Sopenharmony_ci struct Resources 2381e5c31af7Sopenharmony_ci { 2382e5c31af7Sopenharmony_ci Resources (const Environment&, const Parameters&) {} 2383e5c31af7Sopenharmony_ci }; 2384e5c31af7Sopenharmony_ci 2385e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 2386e5c31af7Sopenharmony_ci { 2387e5c31af7Sopenharmony_ci return getSafeObjectCount<CommandPool>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 2388e5c31af7Sopenharmony_ci } 2389e5c31af7Sopenharmony_ci 2390e5c31af7Sopenharmony_ci static Move<VkCommandPool> create (const Environment& env, const Resources&, const Parameters& params) 2391e5c31af7Sopenharmony_ci { 2392e5c31af7Sopenharmony_ci const VkCommandPoolCreateInfo cmdPoolInfo = 2393e5c31af7Sopenharmony_ci { 2394e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 2395e5c31af7Sopenharmony_ci DE_NULL, 2396e5c31af7Sopenharmony_ci params.flags, 2397e5c31af7Sopenharmony_ci env.queueFamilyIndex, 2398e5c31af7Sopenharmony_ci }; 2399e5c31af7Sopenharmony_ci 2400e5c31af7Sopenharmony_ci return createCommandPool(env.vkd, env.device, &cmdPoolInfo, env.allocationCallbacks); 2401e5c31af7Sopenharmony_ci } 2402e5c31af7Sopenharmony_ci}; 2403e5c31af7Sopenharmony_ci 2404e5c31af7Sopenharmony_cistruct CommandBuffer 2405e5c31af7Sopenharmony_ci{ 2406e5c31af7Sopenharmony_ci typedef VkCommandBuffer Type; 2407e5c31af7Sopenharmony_ci 2408e5c31af7Sopenharmony_ci struct Parameters 2409e5c31af7Sopenharmony_ci { 2410e5c31af7Sopenharmony_ci CommandPool::Parameters commandPool; 2411e5c31af7Sopenharmony_ci VkCommandBufferLevel level; 2412e5c31af7Sopenharmony_ci 2413e5c31af7Sopenharmony_ci Parameters (const CommandPool::Parameters& commandPool_, 2414e5c31af7Sopenharmony_ci VkCommandBufferLevel level_) 2415e5c31af7Sopenharmony_ci : commandPool (commandPool_) 2416e5c31af7Sopenharmony_ci , level (level_) 2417e5c31af7Sopenharmony_ci {} 2418e5c31af7Sopenharmony_ci }; 2419e5c31af7Sopenharmony_ci 2420e5c31af7Sopenharmony_ci struct Resources 2421e5c31af7Sopenharmony_ci { 2422e5c31af7Sopenharmony_ci Dependency<CommandPool> commandPool; 2423e5c31af7Sopenharmony_ci 2424e5c31af7Sopenharmony_ci Resources (const Environment& env, const Parameters& params) 2425e5c31af7Sopenharmony_ci : commandPool(env, params.commandPool) 2426e5c31af7Sopenharmony_ci {} 2427e5c31af7Sopenharmony_ci }; 2428e5c31af7Sopenharmony_ci 2429e5c31af7Sopenharmony_ci static deUint32 getMaxConcurrent (Context& context, const Parameters& params) 2430e5c31af7Sopenharmony_ci { 2431e5c31af7Sopenharmony_ci return getSafeObjectCount<CommandBuffer>(context, params, DEFAULT_MAX_CONCURRENT_OBJECTS); 2432e5c31af7Sopenharmony_ci } 2433e5c31af7Sopenharmony_ci 2434e5c31af7Sopenharmony_ci static Move<VkCommandBuffer> create (const Environment& env, const Resources& res, const Parameters& params) 2435e5c31af7Sopenharmony_ci { 2436e5c31af7Sopenharmony_ci const VkCommandBufferAllocateInfo cmdBufferInfo = 2437e5c31af7Sopenharmony_ci { 2438e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 2439e5c31af7Sopenharmony_ci DE_NULL, 2440e5c31af7Sopenharmony_ci *res.commandPool.object, 2441e5c31af7Sopenharmony_ci params.level, 2442e5c31af7Sopenharmony_ci 1, // bufferCount 2443e5c31af7Sopenharmony_ci }; 2444e5c31af7Sopenharmony_ci 2445e5c31af7Sopenharmony_ci return allocateCommandBuffer(env.vkd, env.device, &cmdBufferInfo); 2446e5c31af7Sopenharmony_ci } 2447e5c31af7Sopenharmony_ci 2448e5c31af7Sopenharmony_ci static vector<VkCommandBufferSp> createMultiple (const Environment& env, const Resources& res, const Parameters& params, vector<VkCommandBuffer>* const pOutHandles, VkResult* const pOutResult) 2449e5c31af7Sopenharmony_ci { 2450e5c31af7Sopenharmony_ci DE_ASSERT(pOutResult); 2451e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles); 2452e5c31af7Sopenharmony_ci DE_ASSERT(pOutHandles->size() != 0); 2453e5c31af7Sopenharmony_ci 2454e5c31af7Sopenharmony_ci const deUint32 numCommandBuffers = static_cast<deUint32>(pOutHandles->size()); 2455e5c31af7Sopenharmony_ci VkCommandBuffer* const pHandles = &(*pOutHandles)[0]; 2456e5c31af7Sopenharmony_ci 2457e5c31af7Sopenharmony_ci const VkCommandBufferAllocateInfo cmdBufferInfo = 2458e5c31af7Sopenharmony_ci { 2459e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 2460e5c31af7Sopenharmony_ci DE_NULL, 2461e5c31af7Sopenharmony_ci *res.commandPool.object, 2462e5c31af7Sopenharmony_ci params.level, 2463e5c31af7Sopenharmony_ci numCommandBuffers, 2464e5c31af7Sopenharmony_ci }; 2465e5c31af7Sopenharmony_ci 2466e5c31af7Sopenharmony_ci *pOutResult = env.vkd.allocateCommandBuffers(env.device, &cmdBufferInfo, pHandles); 2467e5c31af7Sopenharmony_ci 2468e5c31af7Sopenharmony_ci vector<VkCommandBufferSp> commandBuffers; 2469e5c31af7Sopenharmony_ci 2470e5c31af7Sopenharmony_ci if (*pOutResult == VK_SUCCESS) 2471e5c31af7Sopenharmony_ci { 2472e5c31af7Sopenharmony_ci for (deUint32 i = 0; i < numCommandBuffers; ++i) 2473e5c31af7Sopenharmony_ci commandBuffers.push_back(VkCommandBufferSp(new Move<VkCommandBuffer>(check<VkCommandBuffer>(pHandles[i]), Deleter<VkCommandBuffer>(env.vkd, env.device, *res.commandPool.object)))); 2474e5c31af7Sopenharmony_ci } 2475e5c31af7Sopenharmony_ci 2476e5c31af7Sopenharmony_ci return commandBuffers; 2477e5c31af7Sopenharmony_ci } 2478e5c31af7Sopenharmony_ci}; 2479e5c31af7Sopenharmony_ci 2480e5c31af7Sopenharmony_ci// Test cases 2481e5c31af7Sopenharmony_ci 2482e5c31af7Sopenharmony_citemplate<typename Object> 2483e5c31af7Sopenharmony_citcu::TestStatus createSingleTest (Context& context, typename Object::Parameters params) 2484e5c31af7Sopenharmony_ci{ 2485e5c31af7Sopenharmony_ci const Environment env (context, 1u); 2486e5c31af7Sopenharmony_ci const typename Object::Resources res (env, params); 2487e5c31af7Sopenharmony_ci 2488e5c31af7Sopenharmony_ci { 2489e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj (Object::create(env, res, params)); 2490e5c31af7Sopenharmony_ci } 2491e5c31af7Sopenharmony_ci 2492e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 2493e5c31af7Sopenharmony_ci} 2494e5c31af7Sopenharmony_ci 2495e5c31af7Sopenharmony_citemplate<typename Object> 2496e5c31af7Sopenharmony_citcu::TestStatus createMultipleUniqueResourcesTest (Context& context, typename Object::Parameters params) 2497e5c31af7Sopenharmony_ci{ 2498e5c31af7Sopenharmony_ci const Environment env (context, 1u); 2499e5c31af7Sopenharmony_ci const typename Object::Resources res0 (env, params); 2500e5c31af7Sopenharmony_ci const typename Object::Resources res1 (env, params); 2501e5c31af7Sopenharmony_ci const typename Object::Resources res2 (env, params); 2502e5c31af7Sopenharmony_ci const typename Object::Resources res3 (env, params); 2503e5c31af7Sopenharmony_ci 2504e5c31af7Sopenharmony_ci { 2505e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj0 (Object::create(env, res0, params)); 2506e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj1 (Object::create(env, res1, params)); 2507e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj2 (Object::create(env, res2, params)); 2508e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj3 (Object::create(env, res3, params)); 2509e5c31af7Sopenharmony_ci } 2510e5c31af7Sopenharmony_ci 2511e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 2512e5c31af7Sopenharmony_ci} 2513e5c31af7Sopenharmony_ci 2514e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 2515e5c31af7Sopenharmony_citemplate<> 2516e5c31af7Sopenharmony_citcu::TestStatus createMultipleUniqueResourcesTest<Instance> (Context& context, Instance::Parameters params) 2517e5c31af7Sopenharmony_ci{ 2518e5c31af7Sopenharmony_ci const Environment env(context, 1u); 2519e5c31af7Sopenharmony_ci const typename Instance::Resources res0(env, params); 2520e5c31af7Sopenharmony_ci const typename Instance::Resources res1(env, params); 2521e5c31af7Sopenharmony_ci 2522e5c31af7Sopenharmony_ci { 2523e5c31af7Sopenharmony_ci Unique<typename Instance::Type> obj0(Instance::create(env, res0, params)); 2524e5c31af7Sopenharmony_ci Unique<typename Instance::Type> obj1(Instance::create(env, res1, params)); 2525e5c31af7Sopenharmony_ci } 2526e5c31af7Sopenharmony_ci 2527e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 2528e5c31af7Sopenharmony_ci} 2529e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2530e5c31af7Sopenharmony_ci 2531e5c31af7Sopenharmony_citemplate<typename Object> 2532e5c31af7Sopenharmony_citcu::TestStatus createMultipleSharedResourcesTest (Context& context, typename Object::Parameters params) 2533e5c31af7Sopenharmony_ci{ 2534e5c31af7Sopenharmony_ci const Environment env (context, 4u); 2535e5c31af7Sopenharmony_ci const typename Object::Resources res (env, params); 2536e5c31af7Sopenharmony_ci 2537e5c31af7Sopenharmony_ci { 2538e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj0 (Object::create(env, res, params)); 2539e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj1 (Object::create(env, res, params)); 2540e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj2 (Object::create(env, res, params)); 2541e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj3 (Object::create(env, res, params)); 2542e5c31af7Sopenharmony_ci } 2543e5c31af7Sopenharmony_ci 2544e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 2545e5c31af7Sopenharmony_ci} 2546e5c31af7Sopenharmony_ci 2547e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 2548e5c31af7Sopenharmony_ci 2549e5c31af7Sopenharmony_ci// Class to wrap singleton devices used by private_data tests 2550e5c31af7Sopenharmony_ciclass SingletonDevice 2551e5c31af7Sopenharmony_ci{ 2552e5c31af7Sopenharmony_ci Move<VkDevice> createPrivateDataDevice(const Context &context, int idx) 2553e5c31af7Sopenharmony_ci { 2554e5c31af7Sopenharmony_ci const int requestedSlots[NUM_DEVICES][2] = 2555e5c31af7Sopenharmony_ci { 2556e5c31af7Sopenharmony_ci {0, 0}, 2557e5c31af7Sopenharmony_ci {1, 0}, 2558e5c31af7Sopenharmony_ci {1, 1}, 2559e5c31af7Sopenharmony_ci {4, 4}, 2560e5c31af7Sopenharmony_ci {1, 100}, 2561e5c31af7Sopenharmony_ci }; 2562e5c31af7Sopenharmony_ci 2563e5c31af7Sopenharmony_ci const float queuePriority = 1.0; 2564e5c31af7Sopenharmony_ci const VkDeviceQueueCreateInfo queues[] = 2565e5c31af7Sopenharmony_ci { 2566e5c31af7Sopenharmony_ci { 2567e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 2568e5c31af7Sopenharmony_ci DE_NULL, 2569e5c31af7Sopenharmony_ci (VkDeviceQueueCreateFlags)0, 2570e5c31af7Sopenharmony_ci context.getUniversalQueueFamilyIndex(), 2571e5c31af7Sopenharmony_ci 1u, // queueCount 2572e5c31af7Sopenharmony_ci &queuePriority, // pQueuePriorities 2573e5c31af7Sopenharmony_ci } 2574e5c31af7Sopenharmony_ci }; 2575e5c31af7Sopenharmony_ci 2576e5c31af7Sopenharmony_ci VkDevicePrivateDataCreateInfoEXT pdci0 = 2577e5c31af7Sopenharmony_ci { 2578e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT, // VkStructureType sType; 2579e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext; 2580e5c31af7Sopenharmony_ci 0u, // uint32_t privateDataSlotRequestCount; 2581e5c31af7Sopenharmony_ci }; 2582e5c31af7Sopenharmony_ci VkDevicePrivateDataCreateInfoEXT pdci1 = 2583e5c31af7Sopenharmony_ci { 2584e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT, // VkStructureType sType; 2585e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext; 2586e5c31af7Sopenharmony_ci 0u, // uint32_t privateDataSlotRequestCount; 2587e5c31af7Sopenharmony_ci }; 2588e5c31af7Sopenharmony_ci void *pNext = DE_NULL; 2589e5c31af7Sopenharmony_ci 2590e5c31af7Sopenharmony_ci if (requestedSlots[idx][0]) 2591e5c31af7Sopenharmony_ci { 2592e5c31af7Sopenharmony_ci pNext = &pdci0; 2593e5c31af7Sopenharmony_ci pdci0.privateDataSlotRequestCount = requestedSlots[idx][0]; 2594e5c31af7Sopenharmony_ci if (requestedSlots[idx][1]) 2595e5c31af7Sopenharmony_ci { 2596e5c31af7Sopenharmony_ci pdci0.pNext = &pdci1; 2597e5c31af7Sopenharmony_ci pdci1.privateDataSlotRequestCount = requestedSlots[idx][1]; 2598e5c31af7Sopenharmony_ci } 2599e5c31af7Sopenharmony_ci } 2600e5c31af7Sopenharmony_ci 2601e5c31af7Sopenharmony_ci VkPhysicalDevicePrivateDataFeaturesEXT privateDataFeatures = 2602e5c31af7Sopenharmony_ci { 2603e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT, // VkStructureType sType; 2604e5c31af7Sopenharmony_ci pNext, // void* pNext; 2605e5c31af7Sopenharmony_ci VK_TRUE, // VkBool32 privateData; 2606e5c31af7Sopenharmony_ci }; 2607e5c31af7Sopenharmony_ci pNext = &privateDataFeatures; 2608e5c31af7Sopenharmony_ci 2609e5c31af7Sopenharmony_ci const char *extName = "VK_EXT_private_data"; 2610e5c31af7Sopenharmony_ci 2611e5c31af7Sopenharmony_ci VkPhysicalDeviceFeatures enabledFeatures = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice()); 2612e5c31af7Sopenharmony_ci 2613e5c31af7Sopenharmony_ci const VkDeviceCreateInfo deviceInfo = 2614e5c31af7Sopenharmony_ci { 2615e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 2616e5c31af7Sopenharmony_ci pNext, 2617e5c31af7Sopenharmony_ci (VkDeviceCreateFlags)0, 2618e5c31af7Sopenharmony_ci DE_LENGTH_OF_ARRAY(queues), 2619e5c31af7Sopenharmony_ci queues, 2620e5c31af7Sopenharmony_ci 0u, // enabledLayerNameCount 2621e5c31af7Sopenharmony_ci DE_NULL, // ppEnabledLayerNames 2622e5c31af7Sopenharmony_ci 1u, // enabledExtensionNameCount 2623e5c31af7Sopenharmony_ci &extName, // ppEnabledExtensionNames 2624e5c31af7Sopenharmony_ci &enabledFeatures, // pEnabledFeatures 2625e5c31af7Sopenharmony_ci }; 2626e5c31af7Sopenharmony_ci 2627e5c31af7Sopenharmony_ci Move<VkDevice> device = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), 2628e5c31af7Sopenharmony_ci context.getPlatformInterface(), context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &deviceInfo, DE_NULL); 2629e5c31af7Sopenharmony_ci return device; 2630e5c31af7Sopenharmony_ci } 2631e5c31af7Sopenharmony_ci 2632e5c31af7Sopenharmony_ci SingletonDevice (const Context& context, int idx) 2633e5c31af7Sopenharmony_ci : m_logicalDevice (createPrivateDataDevice(context, idx)) 2634e5c31af7Sopenharmony_ci { 2635e5c31af7Sopenharmony_ci } 2636e5c31af7Sopenharmony_ci 2637e5c31af7Sopenharmony_ci 2638e5c31af7Sopenharmony_cipublic: 2639e5c31af7Sopenharmony_ci 2640e5c31af7Sopenharmony_ci static const int NUM_DEVICES = 5; 2641e5c31af7Sopenharmony_ci 2642e5c31af7Sopenharmony_ci static const Unique<vk::VkDevice>& getDevice(const Context& context, int idx) 2643e5c31af7Sopenharmony_ci { 2644e5c31af7Sopenharmony_ci if (!m_singletonDevice[idx]) 2645e5c31af7Sopenharmony_ci m_singletonDevice[idx] = SharedPtr<SingletonDevice>(new SingletonDevice(context, idx)); 2646e5c31af7Sopenharmony_ci 2647e5c31af7Sopenharmony_ci DE_ASSERT(m_singletonDevice[idx]); 2648e5c31af7Sopenharmony_ci return m_singletonDevice[idx]->m_logicalDevice; 2649e5c31af7Sopenharmony_ci } 2650e5c31af7Sopenharmony_ci 2651e5c31af7Sopenharmony_ci static void destroy() 2652e5c31af7Sopenharmony_ci { 2653e5c31af7Sopenharmony_ci for (int idx = 0; idx < NUM_DEVICES; ++idx) 2654e5c31af7Sopenharmony_ci m_singletonDevice[idx].clear(); 2655e5c31af7Sopenharmony_ci } 2656e5c31af7Sopenharmony_ci 2657e5c31af7Sopenharmony_ciprivate: 2658e5c31af7Sopenharmony_ci const Unique<vk::VkDevice> m_logicalDevice; 2659e5c31af7Sopenharmony_ci static SharedPtr<SingletonDevice> m_singletonDevice[NUM_DEVICES]; 2660e5c31af7Sopenharmony_ci}; 2661e5c31af7Sopenharmony_ci 2662e5c31af7Sopenharmony_ciSharedPtr<SingletonDevice> SingletonDevice::m_singletonDevice[NUM_DEVICES]; 2663e5c31af7Sopenharmony_ci 2664e5c31af7Sopenharmony_citemplate<typename T> static deUint64 HandleToInt(T t) { return t.getInternal(); } 2665e5c31af7Sopenharmony_citemplate<typename T> static deUint64 HandleToInt(T *t) { return (deUint64)(deUintptr)(t); } 2666e5c31af7Sopenharmony_ci 2667e5c31af7Sopenharmony_citemplate<typename Object> 2668e5c31af7Sopenharmony_citcu::TestStatus createPrivateDataTest (Context& context, typename Object::Parameters params) 2669e5c31af7Sopenharmony_ci{ 2670e5c31af7Sopenharmony_ci if (!context.getPrivateDataFeatures().privateData) 2671e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "privateData not supported"); 2672e5c31af7Sopenharmony_ci 2673e5c31af7Sopenharmony_ci for (int d = 0; d < SingletonDevice::NUM_DEVICES; ++d) 2674e5c31af7Sopenharmony_ci { 2675e5c31af7Sopenharmony_ci const Unique<vk::VkDevice>& device = SingletonDevice::getDevice(context, d); 2676e5c31af7Sopenharmony_ci const Environment env (context.getPlatformInterface(), 2677e5c31af7Sopenharmony_ci context.getUsedApiVersion(), 2678e5c31af7Sopenharmony_ci context.getInstanceInterface(), 2679e5c31af7Sopenharmony_ci context.getInstance(), 2680e5c31af7Sopenharmony_ci context.getDeviceInterface(), 2681e5c31af7Sopenharmony_ci *device, 2682e5c31af7Sopenharmony_ci context.getUniversalQueueFamilyIndex(), 2683e5c31af7Sopenharmony_ci context.getBinaryCollection(), 2684e5c31af7Sopenharmony_ci DE_NULL, 2685e5c31af7Sopenharmony_ci 4u, 2686e5c31af7Sopenharmony_ci context.getTestContext().getCommandLine()); 2687e5c31af7Sopenharmony_ci 2688e5c31af7Sopenharmony_ci const typename Object::Resources res (env, params); 2689e5c31af7Sopenharmony_ci 2690e5c31af7Sopenharmony_ci const VkPrivateDataSlotCreateInfoEXT createInfo = 2691e5c31af7Sopenharmony_ci { 2692e5c31af7Sopenharmony_ci VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT, // VkStructureType sType; 2693e5c31af7Sopenharmony_ci DE_NULL, // const void* pNext; 2694e5c31af7Sopenharmony_ci 0u, // VkPrivateDataSlotCreateFlagsEXT flags; 2695e5c31af7Sopenharmony_ci }; 2696e5c31af7Sopenharmony_ci 2697e5c31af7Sopenharmony_ci const int numSlots = 100; 2698e5c31af7Sopenharmony_ci 2699e5c31af7Sopenharmony_ci typedef Unique<VkPrivateDataSlot> PrivateDataSlotUp; 2700e5c31af7Sopenharmony_ci typedef SharedPtr<PrivateDataSlotUp> PrivateDataSlotSp; 2701e5c31af7Sopenharmony_ci vector<PrivateDataSlotSp> slots; 2702e5c31af7Sopenharmony_ci 2703e5c31af7Sopenharmony_ci // interleave allocating objects and slots 2704e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots / 2; ++i) 2705e5c31af7Sopenharmony_ci { 2706e5c31af7Sopenharmony_ci Move<VkPrivateDataSlot> s = createPrivateDataSlot(env.vkd, *device, &createInfo, DE_NULL); 2707e5c31af7Sopenharmony_ci slots.push_back(PrivateDataSlotSp(new PrivateDataSlotUp(s))); 2708e5c31af7Sopenharmony_ci } 2709e5c31af7Sopenharmony_ci 2710e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj0 (Object::create(env, res, params)); 2711e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj1 (Object::create(env, res, params)); 2712e5c31af7Sopenharmony_ci 2713e5c31af7Sopenharmony_ci for (int i = numSlots / 2; i < numSlots; ++i) 2714e5c31af7Sopenharmony_ci { 2715e5c31af7Sopenharmony_ci Move<VkPrivateDataSlot> s = createPrivateDataSlot(env.vkd, *device, &createInfo, DE_NULL); 2716e5c31af7Sopenharmony_ci slots.push_back(PrivateDataSlotSp(new PrivateDataSlotUp(s))); 2717e5c31af7Sopenharmony_ci } 2718e5c31af7Sopenharmony_ci 2719e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj2 (Object::create(env, res, params)); 2720e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj3 (Object::create(env, res, params)); 2721e5c31af7Sopenharmony_ci 2722e5c31af7Sopenharmony_ci Unique<typename Object::Type> *objs[4] = { &obj0, &obj1, &obj2, &obj3 }; 2723e5c31af7Sopenharmony_ci 2724e5c31af7Sopenharmony_ci for (int r = 0; r < 3; ++r) 2725e5c31af7Sopenharmony_ci { 2726e5c31af7Sopenharmony_ci deUint64 data; 2727e5c31af7Sopenharmony_ci 2728e5c31af7Sopenharmony_ci // Test private data for the objects 2729e5c31af7Sopenharmony_ci for (int o = 0; o < 4; ++o) 2730e5c31af7Sopenharmony_ci { 2731e5c31af7Sopenharmony_ci auto &obj = *objs[o]; 2732e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2733e5c31af7Sopenharmony_ci { 2734e5c31af7Sopenharmony_ci data = 1234; 2735e5c31af7Sopenharmony_ci env.vkd.getPrivateData(*device, getObjectType<typename Object::Type>(), HandleToInt(obj.get()), **slots[i], &data); 2736e5c31af7Sopenharmony_ci if (data != 0) 2737e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Expected initial value of zero"); 2738e5c31af7Sopenharmony_ci } 2739e5c31af7Sopenharmony_ci } 2740e5c31af7Sopenharmony_ci for (int o = 0; o < 4; ++o) 2741e5c31af7Sopenharmony_ci { 2742e5c31af7Sopenharmony_ci auto &obj = *objs[o]; 2743e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2744e5c31af7Sopenharmony_ci VK_CHECK(env.vkd.setPrivateData(*device, getObjectType<typename Object::Type>(), HandleToInt(obj.get()), **slots[i], i*i*i + o*o + 1)); 2745e5c31af7Sopenharmony_ci } 2746e5c31af7Sopenharmony_ci for (int o = 0; o < 4; ++o) 2747e5c31af7Sopenharmony_ci { 2748e5c31af7Sopenharmony_ci auto &obj = *objs[o]; 2749e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2750e5c31af7Sopenharmony_ci { 2751e5c31af7Sopenharmony_ci data = 1234; 2752e5c31af7Sopenharmony_ci env.vkd.getPrivateData(*device, getObjectType<typename Object::Type>(), HandleToInt(obj.get()), **slots[i], &data); 2753e5c31af7Sopenharmony_ci if (data != (deUint64)(i*i*i + o*o + 1)) 2754e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Didn't read back set value"); 2755e5c31af7Sopenharmony_ci } 2756e5c31af7Sopenharmony_ci } 2757e5c31af7Sopenharmony_ci 2758e5c31af7Sopenharmony_ci 2759e5c31af7Sopenharmony_ci // Test private data for the private data objects 2760e5c31af7Sopenharmony_ci for (int o = 0; o < numSlots; ++o) 2761e5c31af7Sopenharmony_ci { 2762e5c31af7Sopenharmony_ci auto &obj = **slots[o]; 2763e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2764e5c31af7Sopenharmony_ci { 2765e5c31af7Sopenharmony_ci data = 1234; 2766e5c31af7Sopenharmony_ci env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT, HandleToInt<VkPrivateDataSlotEXT>(obj), **slots[i], &data); 2767e5c31af7Sopenharmony_ci if (data != 0) 2768e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Expected initial value of zero"); 2769e5c31af7Sopenharmony_ci } 2770e5c31af7Sopenharmony_ci } 2771e5c31af7Sopenharmony_ci for (int o = 0; o < numSlots; ++o) 2772e5c31af7Sopenharmony_ci { 2773e5c31af7Sopenharmony_ci auto &obj = **slots[o]; 2774e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2775e5c31af7Sopenharmony_ci VK_CHECK(env.vkd.setPrivateData(*device, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT, HandleToInt<VkPrivateDataSlotEXT>(obj), **slots[i], i*i*i + o*o + 1)); 2776e5c31af7Sopenharmony_ci } 2777e5c31af7Sopenharmony_ci for (int o = 0; o < numSlots; ++o) 2778e5c31af7Sopenharmony_ci { 2779e5c31af7Sopenharmony_ci auto &obj = **slots[o]; 2780e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2781e5c31af7Sopenharmony_ci { 2782e5c31af7Sopenharmony_ci data = 1234; 2783e5c31af7Sopenharmony_ci env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT, HandleToInt<VkPrivateDataSlotEXT>(obj), **slots[i], &data); 2784e5c31af7Sopenharmony_ci if (data != (deUint64)(i*i*i + o*o + 1)) 2785e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Didn't read back set value"); 2786e5c31af7Sopenharmony_ci } 2787e5c31af7Sopenharmony_ci } 2788e5c31af7Sopenharmony_ci 2789e5c31af7Sopenharmony_ci // Test private data for the device 2790e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2791e5c31af7Sopenharmony_ci { 2792e5c31af7Sopenharmony_ci data = 1234; 2793e5c31af7Sopenharmony_ci env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_DEVICE, (deUint64)(deUintptr)(*device), **slots[i], &data); 2794e5c31af7Sopenharmony_ci if (data != 0) 2795e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Expected initial value of zero for device"); 2796e5c31af7Sopenharmony_ci } 2797e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2798e5c31af7Sopenharmony_ci VK_CHECK(env.vkd.setPrivateData(*device, VK_OBJECT_TYPE_DEVICE, (deUint64)(deUintptr)(*device), **slots[i], i*i*i + r*r + 1)); 2799e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2800e5c31af7Sopenharmony_ci { 2801e5c31af7Sopenharmony_ci data = 1234; 2802e5c31af7Sopenharmony_ci env.vkd.getPrivateData(*device, VK_OBJECT_TYPE_DEVICE, (deUint64)(deUintptr)(*device), **slots[i], &data); 2803e5c31af7Sopenharmony_ci if (data != (deUint64)(i*i*i + r*r + 1)) 2804e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Didn't read back set value from device"); 2805e5c31af7Sopenharmony_ci } 2806e5c31af7Sopenharmony_ci 2807e5c31af7Sopenharmony_ci // Destroy and realloc slots for the next iteration 2808e5c31af7Sopenharmony_ci slots.clear(); 2809e5c31af7Sopenharmony_ci for (int i = 0; i < numSlots; ++i) 2810e5c31af7Sopenharmony_ci { 2811e5c31af7Sopenharmony_ci Move<VkPrivateDataSlotEXT> s = createPrivateDataSlot(env.vkd, *device, &createInfo, DE_NULL); 2812e5c31af7Sopenharmony_ci slots.push_back(PrivateDataSlotSp(new PrivateDataSlotUp(s))); 2813e5c31af7Sopenharmony_ci } 2814e5c31af7Sopenharmony_ci } 2815e5c31af7Sopenharmony_ci } 2816e5c31af7Sopenharmony_ci 2817e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 2818e5c31af7Sopenharmony_ci} 2819e5c31af7Sopenharmony_ci 2820e5c31af7Sopenharmony_citemplate<typename Object> 2821e5c31af7Sopenharmony_citcu::TestStatus createMaxConcurrentTest (Context& context, typename Object::Parameters params) 2822e5c31af7Sopenharmony_ci{ 2823e5c31af7Sopenharmony_ci typedef Unique<typename Object::Type> UniqueObject; 2824e5c31af7Sopenharmony_ci typedef SharedPtr<UniqueObject> ObjectPtr; 2825e5c31af7Sopenharmony_ci 2826e5c31af7Sopenharmony_ci const deUint32 numObjects = Object::getMaxConcurrent(context, params); 2827e5c31af7Sopenharmony_ci const Environment env (context, numObjects); 2828e5c31af7Sopenharmony_ci const typename Object::Resources res (env, params); 2829e5c31af7Sopenharmony_ci vector<ObjectPtr> objects (numObjects); 2830e5c31af7Sopenharmony_ci const deUint32 watchdogInterval = 1024; 2831e5c31af7Sopenharmony_ci 2832e5c31af7Sopenharmony_ci context.getTestContext().getLog() 2833e5c31af7Sopenharmony_ci << TestLog::Message << "Creating " << numObjects << " " << getTypeName<typename Object::Type>() << " objects" << TestLog::EndMessage; 2834e5c31af7Sopenharmony_ci 2835e5c31af7Sopenharmony_ci for (deUint32 ndx = 0; ndx < numObjects; ndx++) 2836e5c31af7Sopenharmony_ci { 2837e5c31af7Sopenharmony_ci objects[ndx] = ObjectPtr(new UniqueObject(Object::create(env, res, params))); 2838e5c31af7Sopenharmony_ci 2839e5c31af7Sopenharmony_ci if ((ndx > 0) && ((ndx % watchdogInterval) == 0)) 2840e5c31af7Sopenharmony_ci context.getTestContext().touchWatchdog(); 2841e5c31af7Sopenharmony_ci } 2842e5c31af7Sopenharmony_ci 2843e5c31af7Sopenharmony_ci context.getTestContext().touchWatchdog(); 2844e5c31af7Sopenharmony_ci objects.clear(); 2845e5c31af7Sopenharmony_ci 2846e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 2847e5c31af7Sopenharmony_ci} 2848e5c31af7Sopenharmony_ci 2849e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2850e5c31af7Sopenharmony_ci 2851e5c31af7Sopenharmony_ci// How many objects to create per thread 2852e5c31af7Sopenharmony_citemplate<typename Object> int getCreateCount (void) { return 100; } 2853e5c31af7Sopenharmony_ci 2854e5c31af7Sopenharmony_ci// Creating VkDevice and VkInstance can take significantly longer than other object types 2855e5c31af7Sopenharmony_ci 2856e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 2857e5c31af7Sopenharmony_citemplate<> int getCreateCount<Instance> (void) { return 20; } 2858e5c31af7Sopenharmony_citemplate<> int getCreateCount<Device> (void) { return 20; } 2859e5c31af7Sopenharmony_citemplate<> int getCreateCount<DeviceGroup> (void) { return 20; } 2860e5c31af7Sopenharmony_ci#else 2861e5c31af7Sopenharmony_citemplate<> int getCreateCount<Instance> (void) { return 2; } 2862e5c31af7Sopenharmony_citemplate<> int getCreateCount<Device> (void) { return 2; } 2863e5c31af7Sopenharmony_citemplate<> int getCreateCount<DeviceGroup> (void) { return 2; } 2864e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2865e5c31af7Sopenharmony_ci 2866e5c31af7Sopenharmony_citemplate<typename Object> 2867e5c31af7Sopenharmony_ciclass CreateThread : public ThreadGroupThread 2868e5c31af7Sopenharmony_ci{ 2869e5c31af7Sopenharmony_cipublic: 2870e5c31af7Sopenharmony_ci CreateThread (const Environment& env, const typename Object::Resources& resources, const typename Object::Parameters& params) 2871e5c31af7Sopenharmony_ci : m_env (env) 2872e5c31af7Sopenharmony_ci , m_resources (resources) 2873e5c31af7Sopenharmony_ci , m_params (params) 2874e5c31af7Sopenharmony_ci {} 2875e5c31af7Sopenharmony_ci 2876e5c31af7Sopenharmony_ci void runThread (void) 2877e5c31af7Sopenharmony_ci { 2878e5c31af7Sopenharmony_ci const int numIters = getCreateCount<Object>(); 2879e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 2880e5c31af7Sopenharmony_ci const int itersBetweenSyncs = numIters / 5; 2881e5c31af7Sopenharmony_ci#else 2882e5c31af7Sopenharmony_ci const int itersBetweenSyncs = 1; 2883e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2884e5c31af7Sopenharmony_ci 2885e5c31af7Sopenharmony_ci DE_ASSERT(itersBetweenSyncs > 0); 2886e5c31af7Sopenharmony_ci 2887e5c31af7Sopenharmony_ci for (int iterNdx = 0; iterNdx < numIters; iterNdx++) 2888e5c31af7Sopenharmony_ci { 2889e5c31af7Sopenharmony_ci // Sync every Nth iteration to make entering driver at the same time more likely 2890e5c31af7Sopenharmony_ci if ((iterNdx % itersBetweenSyncs) == 0) 2891e5c31af7Sopenharmony_ci barrier(); 2892e5c31af7Sopenharmony_ci 2893e5c31af7Sopenharmony_ci { 2894e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj (Object::create(m_env, m_resources, m_params)); 2895e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 2896e5c31af7Sopenharmony_ci if (iterNdx == 0) 2897e5c31af7Sopenharmony_ci { 2898e5c31af7Sopenharmony_ci barrier(); 2899e5c31af7Sopenharmony_ci } 2900e5c31af7Sopenharmony_ci#endif 2901e5c31af7Sopenharmony_ci } 2902e5c31af7Sopenharmony_ci } 2903e5c31af7Sopenharmony_ci } 2904e5c31af7Sopenharmony_ci 2905e5c31af7Sopenharmony_ciprivate: 2906e5c31af7Sopenharmony_ci const Environment& m_env; 2907e5c31af7Sopenharmony_ci const typename Object::Resources& m_resources; 2908e5c31af7Sopenharmony_ci const typename Object::Parameters& m_params; 2909e5c31af7Sopenharmony_ci}; 2910e5c31af7Sopenharmony_ci 2911e5c31af7Sopenharmony_citemplate<typename Object> 2912e5c31af7Sopenharmony_citcu::TestStatus multithreadedCreateSharedResourcesTest (Context& context, typename Object::Parameters params) 2913e5c31af7Sopenharmony_ci{ 2914e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 2915e5c31af7Sopenharmony_ci MultithreadedDestroyGuard mdGuard (context.getResourceInterface()); 2916e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2917e5c31af7Sopenharmony_ci TestLog& log = context.getTestContext().getLog(); 2918e5c31af7Sopenharmony_ci const deUint32 numThreads = getDefaultTestThreadCount(); 2919e5c31af7Sopenharmony_ci const Environment env (context, numThreads); 2920e5c31af7Sopenharmony_ci const typename Object::Resources res (env, params); 2921e5c31af7Sopenharmony_ci ThreadGroup threads; 2922e5c31af7Sopenharmony_ci 2923e5c31af7Sopenharmony_ci log << TestLog::Message << "numThreads = " << numThreads << TestLog::EndMessage; 2924e5c31af7Sopenharmony_ci 2925e5c31af7Sopenharmony_ci for (deUint32 ndx = 0; ndx < numThreads; ndx++) 2926e5c31af7Sopenharmony_ci threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, res, params))); 2927e5c31af7Sopenharmony_ci 2928e5c31af7Sopenharmony_ci return threads.run(); 2929e5c31af7Sopenharmony_ci} 2930e5c31af7Sopenharmony_ci 2931e5c31af7Sopenharmony_citemplate<typename Object> 2932e5c31af7Sopenharmony_citcu::TestStatus multithreadedCreatePerThreadResourcesTest (Context& context, typename Object::Parameters params) 2933e5c31af7Sopenharmony_ci{ 2934e5c31af7Sopenharmony_ci typedef SharedPtr<typename Object::Resources> ResPtr; 2935e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 2936e5c31af7Sopenharmony_ci MultithreadedDestroyGuard mdGuard (context.getResourceInterface()); 2937e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2938e5c31af7Sopenharmony_ci TestLog& log = context.getTestContext().getLog(); 2939e5c31af7Sopenharmony_ci const deUint32 numThreads = getDefaultTestThreadCount(); 2940e5c31af7Sopenharmony_ci const Environment env (context, 1u); 2941e5c31af7Sopenharmony_ci vector<ResPtr> resources (numThreads); 2942e5c31af7Sopenharmony_ci ThreadGroup threads; 2943e5c31af7Sopenharmony_ci 2944e5c31af7Sopenharmony_ci log << TestLog::Message << "numThreads = " << numThreads << TestLog::EndMessage; 2945e5c31af7Sopenharmony_ci 2946e5c31af7Sopenharmony_ci for (deUint32 ndx = 0; ndx < numThreads; ndx++) 2947e5c31af7Sopenharmony_ci { 2948e5c31af7Sopenharmony_ci resources[ndx] = ResPtr(new typename Object::Resources(env, params)); 2949e5c31af7Sopenharmony_ci threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(env, *resources[ndx], params))); 2950e5c31af7Sopenharmony_ci } 2951e5c31af7Sopenharmony_ci 2952e5c31af7Sopenharmony_ci return threads.run(); 2953e5c31af7Sopenharmony_ci} 2954e5c31af7Sopenharmony_ci 2955e5c31af7Sopenharmony_cistruct EnvClone 2956e5c31af7Sopenharmony_ci{ 2957e5c31af7Sopenharmony_ci Device::Resources deviceRes; 2958e5c31af7Sopenharmony_ci Unique<VkDevice> device; 2959e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 2960e5c31af7Sopenharmony_ci de::MovePtr<vk::DeviceDriver> vkd; 2961e5c31af7Sopenharmony_ci#else 2962e5c31af7Sopenharmony_ci de::MovePtr<vk::DeviceDriverSC, vk::DeinitDeviceDeleter> vkd; 2963e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2964e5c31af7Sopenharmony_ci Environment env; 2965e5c31af7Sopenharmony_ci 2966e5c31af7Sopenharmony_ci EnvClone (const Environment& parent, const Device::Parameters& deviceParams, deUint32 maxResourceConsumers) 2967e5c31af7Sopenharmony_ci : deviceRes (parent, deviceParams) 2968e5c31af7Sopenharmony_ci , device (Device::create(parent, deviceRes, deviceParams)) 2969e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 2970e5c31af7Sopenharmony_ci , vkd(de::MovePtr<DeviceDriver>(new DeviceDriver(parent.vkp, parent.instance, *device, parent.apiVersion))) 2971e5c31af7Sopenharmony_ci , env(parent.vkp, parent.apiVersion, parent.instanceInterface, parent.instance, *vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers, parent.commandLine) 2972e5c31af7Sopenharmony_ci#else 2973e5c31af7Sopenharmony_ci , vkd(de::MovePtr<DeviceDriverSC, DeinitDeviceDeleter>(new DeviceDriverSC(parent.vkp, parent.instance, *device, parent.commandLine, parent.resourceInterface, parent.vulkanSC10Properties, parent.properties, parent.apiVersion), vk::DeinitDeviceDeleter(parent.resourceInterface.get(), *device))) 2974e5c31af7Sopenharmony_ci , env(parent.vkp, parent.apiVersion, parent.instanceInterface, parent.instance, *vkd, *device, deviceRes.queueFamilyIndex, parent.programBinaries, parent.allocationCallbacks, maxResourceConsumers, parent.resourceInterface, parent.vulkanSC10Properties, parent.commandLine) 2975e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2976e5c31af7Sopenharmony_ci { 2977e5c31af7Sopenharmony_ci } 2978e5c31af7Sopenharmony_ci}; 2979e5c31af7Sopenharmony_ci 2980e5c31af7Sopenharmony_ciDevice::Parameters getDefaulDeviceParameters (Context& context) 2981e5c31af7Sopenharmony_ci{ 2982e5c31af7Sopenharmony_ci return Device::Parameters(context.getTestContext().getCommandLine().getVKDeviceId()-1u, 2983e5c31af7Sopenharmony_ci VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT); 2984e5c31af7Sopenharmony_ci} 2985e5c31af7Sopenharmony_ci 2986e5c31af7Sopenharmony_citemplate<typename Object> 2987e5c31af7Sopenharmony_citcu::TestStatus multithreadedCreatePerThreadDeviceTest (Context& context, typename Object::Parameters params) 2988e5c31af7Sopenharmony_ci{ 2989e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 2990e5c31af7Sopenharmony_ci MultithreadedDestroyGuard mdGuard(context.getResourceInterface()); 2991e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 2992e5c31af7Sopenharmony_ci typedef SharedPtr<EnvClone> EnvPtr; 2993e5c31af7Sopenharmony_ci typedef SharedPtr<typename Object::Resources> ResPtr; 2994e5c31af7Sopenharmony_ci 2995e5c31af7Sopenharmony_ci TestLog& log = context.getTestContext().getLog(); 2996e5c31af7Sopenharmony_ci const deUint32 numThreads = getDefaultTestThreadCount(); 2997e5c31af7Sopenharmony_ci const Device::Parameters deviceParams = getDefaulDeviceParameters(context); 2998e5c31af7Sopenharmony_ci const Environment sharedEnv (context, numThreads); // For creating Device's 2999e5c31af7Sopenharmony_ci vector<EnvPtr> perThreadEnv (numThreads); 3000e5c31af7Sopenharmony_ci vector<ResPtr> resources (numThreads); 3001e5c31af7Sopenharmony_ci ThreadGroup threads; 3002e5c31af7Sopenharmony_ci 3003e5c31af7Sopenharmony_ci log << TestLog::Message << "numThreads = " << numThreads << TestLog::EndMessage; 3004e5c31af7Sopenharmony_ci 3005e5c31af7Sopenharmony_ci for (deUint32 ndx = 0; ndx < numThreads; ndx++) 3006e5c31af7Sopenharmony_ci { 3007e5c31af7Sopenharmony_ci perThreadEnv[ndx] = EnvPtr(new EnvClone(sharedEnv, deviceParams, 1u)); 3008e5c31af7Sopenharmony_ci resources[ndx] = ResPtr(new typename Object::Resources(perThreadEnv[ndx]->env, params)); 3009e5c31af7Sopenharmony_ci 3010e5c31af7Sopenharmony_ci threads.add(MovePtr<ThreadGroupThread>(new CreateThread<Object>(perThreadEnv[ndx]->env, *resources[ndx], params))); 3011e5c31af7Sopenharmony_ci } 3012e5c31af7Sopenharmony_ci 3013e5c31af7Sopenharmony_ci return threads.run(); 3014e5c31af7Sopenharmony_ci} 3015e5c31af7Sopenharmony_ci 3016e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3017e5c31af7Sopenharmony_ci 3018e5c31af7Sopenharmony_citemplate<typename Object> 3019e5c31af7Sopenharmony_citcu::TestStatus createSingleAllocCallbacksTest (Context& context, typename Object::Parameters params) 3020e5c31af7Sopenharmony_ci{ 3021e5c31af7Sopenharmony_ci const deUint32 noCmdScope = (1u << VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE) 3022e5c31af7Sopenharmony_ci | (1u << VK_SYSTEM_ALLOCATION_SCOPE_DEVICE) 3023e5c31af7Sopenharmony_ci | (1u << VK_SYSTEM_ALLOCATION_SCOPE_CACHE) 3024e5c31af7Sopenharmony_ci | (1u << VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); 3025e5c31af7Sopenharmony_ci 3026e5c31af7Sopenharmony_ci // Callbacks used by resources 3027e5c31af7Sopenharmony_ci AllocationCallbackRecorder resCallbacks (getSystemAllocator(), 128); 3028e5c31af7Sopenharmony_ci 3029e5c31af7Sopenharmony_ci // Root environment still uses default instance and device, created without callbacks 3030e5c31af7Sopenharmony_ci const Environment rootEnv (context.getPlatformInterface(), 3031e5c31af7Sopenharmony_ci context.getUsedApiVersion(), 3032e5c31af7Sopenharmony_ci context.getInstanceInterface(), 3033e5c31af7Sopenharmony_ci context.getInstance(), 3034e5c31af7Sopenharmony_ci context.getDeviceInterface(), 3035e5c31af7Sopenharmony_ci context.getDevice(), 3036e5c31af7Sopenharmony_ci context.getUniversalQueueFamilyIndex(), 3037e5c31af7Sopenharmony_ci context.getBinaryCollection(), 3038e5c31af7Sopenharmony_ci resCallbacks.getCallbacks(), 3039e5c31af7Sopenharmony_ci 1u, 3040e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 3041e5c31af7Sopenharmony_ci context.getResourceInterface(), 3042e5c31af7Sopenharmony_ci context.getDeviceVulkanSC10Properties(), 3043e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3044e5c31af7Sopenharmony_ci context.getTestContext().getCommandLine()); 3045e5c31af7Sopenharmony_ci 3046e5c31af7Sopenharmony_ci { 3047e5c31af7Sopenharmony_ci // Test env has instance & device created with callbacks 3048e5c31af7Sopenharmony_ci const EnvClone resEnv (rootEnv, getDefaulDeviceParameters(context), 1u); 3049e5c31af7Sopenharmony_ci const typename Object::Resources res (resEnv.env, params); 3050e5c31af7Sopenharmony_ci 3051e5c31af7Sopenharmony_ci // Supply a separate callback recorder just for object construction 3052e5c31af7Sopenharmony_ci AllocationCallbackRecorder objCallbacks(getSystemAllocator(), 128); 3053e5c31af7Sopenharmony_ci const Environment objEnv (resEnv.env.vkp, 3054e5c31af7Sopenharmony_ci resEnv.env.apiVersion, 3055e5c31af7Sopenharmony_ci resEnv.env.instanceInterface, 3056e5c31af7Sopenharmony_ci resEnv.env.instance, 3057e5c31af7Sopenharmony_ci resEnv.env.vkd, 3058e5c31af7Sopenharmony_ci resEnv.env.device, 3059e5c31af7Sopenharmony_ci resEnv.env.queueFamilyIndex, 3060e5c31af7Sopenharmony_ci resEnv.env.programBinaries, 3061e5c31af7Sopenharmony_ci objCallbacks.getCallbacks(), 3062e5c31af7Sopenharmony_ci resEnv.env.maxResourceConsumers, 3063e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 3064e5c31af7Sopenharmony_ci resEnv.env.resourceInterface, 3065e5c31af7Sopenharmony_ci resEnv.env.vulkanSC10Properties, 3066e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3067e5c31af7Sopenharmony_ci resEnv.env.commandLine); 3068e5c31af7Sopenharmony_ci 3069e5c31af7Sopenharmony_ci { 3070e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj (Object::create(objEnv, res, params)); 3071e5c31af7Sopenharmony_ci 3072e5c31af7Sopenharmony_ci // Validate that no command-level allocations are live 3073e5c31af7Sopenharmony_ci if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, noCmdScope)) 3074e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Invalid allocation callback"); 3075e5c31af7Sopenharmony_ci } 3076e5c31af7Sopenharmony_ci 3077e5c31af7Sopenharmony_ci // At this point all allocations made against object callbacks must have been freed 3078e5c31af7Sopenharmony_ci if (!validateAndLog(context.getTestContext().getLog(), objCallbacks, 0u)) 3079e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Invalid allocation callback"); 3080e5c31af7Sopenharmony_ci } 3081e5c31af7Sopenharmony_ci 3082e5c31af7Sopenharmony_ci if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u)) 3083e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Invalid allocation callback"); 3084e5c31af7Sopenharmony_ci 3085e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 3086e5c31af7Sopenharmony_ci} 3087e5c31af7Sopenharmony_ci 3088e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3089e5c31af7Sopenharmony_ci 3090e5c31af7Sopenharmony_citemplate<typename Object> deUint32 getOomIterLimit (void) { return 40; } 3091e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3092e5c31af7Sopenharmony_citemplate<> deUint32 getOomIterLimit<Device> (void) { return 20; } 3093e5c31af7Sopenharmony_citemplate<> deUint32 getOomIterLimit<DeviceGroup> (void) { return 20; } 3094e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3095e5c31af7Sopenharmony_ci 3096e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3097e5c31af7Sopenharmony_ci 3098e5c31af7Sopenharmony_citemplate<typename Object> 3099e5c31af7Sopenharmony_citcu::TestStatus allocCallbackFailTest (Context& context, typename Object::Parameters params) 3100e5c31af7Sopenharmony_ci{ 3101e5c31af7Sopenharmony_ci AllocationCallbackRecorder resCallbacks (getSystemAllocator(), 128); 3102e5c31af7Sopenharmony_ci const Environment rootEnv (context.getPlatformInterface(), 3103e5c31af7Sopenharmony_ci context.getUsedApiVersion(), 3104e5c31af7Sopenharmony_ci context.getInstanceInterface(), 3105e5c31af7Sopenharmony_ci context.getInstance(), 3106e5c31af7Sopenharmony_ci context.getDeviceInterface(), 3107e5c31af7Sopenharmony_ci context.getDevice(), 3108e5c31af7Sopenharmony_ci context.getUniversalQueueFamilyIndex(), 3109e5c31af7Sopenharmony_ci context.getBinaryCollection(), 3110e5c31af7Sopenharmony_ci resCallbacks.getCallbacks(), 3111e5c31af7Sopenharmony_ci 1u, 3112e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 3113e5c31af7Sopenharmony_ci context.getResourceInterface(), 3114e5c31af7Sopenharmony_ci context.getDeviceVulkanSC10Properties(), 3115e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3116e5c31af7Sopenharmony_ci context.getTestContext().getCommandLine()); 3117e5c31af7Sopenharmony_ci deUint32 numPassingAllocs = 0; 3118e5c31af7Sopenharmony_ci const deUint32 cmdLineIterCount = (deUint32)context.getTestContext().getCommandLine().getTestIterationCount(); 3119e5c31af7Sopenharmony_ci const deUint32 maxTries = cmdLineIterCount != 0 ? cmdLineIterCount : getOomIterLimit<Object>(); 3120e5c31af7Sopenharmony_ci const deUint32 finalLimit = std::max(maxTries, 10000u); 3121e5c31af7Sopenharmony_ci bool createOk = false; 3122e5c31af7Sopenharmony_ci 3123e5c31af7Sopenharmony_ci { 3124e5c31af7Sopenharmony_ci const EnvClone resEnv (rootEnv, getDefaulDeviceParameters(context), 1u); 3125e5c31af7Sopenharmony_ci const typename Object::Resources res (resEnv.env, params); 3126e5c31af7Sopenharmony_ci 3127e5c31af7Sopenharmony_ci // Iterate over test until object allocation succeeds 3128e5c31af7Sopenharmony_ci while(true) 3129e5c31af7Sopenharmony_ci { 3130e5c31af7Sopenharmony_ci DeterministicFailAllocator objAllocator(getSystemAllocator(), 3131e5c31af7Sopenharmony_ci DeterministicFailAllocator::MODE_COUNT_AND_FAIL, 3132e5c31af7Sopenharmony_ci numPassingAllocs); 3133e5c31af7Sopenharmony_ci AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128); 3134e5c31af7Sopenharmony_ci const Environment objEnv (resEnv.env.vkp, 3135e5c31af7Sopenharmony_ci resEnv.env.apiVersion, 3136e5c31af7Sopenharmony_ci resEnv.env.instanceInterface, 3137e5c31af7Sopenharmony_ci resEnv.env.instance, 3138e5c31af7Sopenharmony_ci resEnv.env.vkd, 3139e5c31af7Sopenharmony_ci resEnv.env.device, 3140e5c31af7Sopenharmony_ci resEnv.env.queueFamilyIndex, 3141e5c31af7Sopenharmony_ci resEnv.env.programBinaries, 3142e5c31af7Sopenharmony_ci recorder.getCallbacks(), 3143e5c31af7Sopenharmony_ci resEnv.env.maxResourceConsumers, 3144e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 3145e5c31af7Sopenharmony_ci resEnv.env.resourceInterface, 3146e5c31af7Sopenharmony_ci resEnv.env.vulkanSC10Properties, 3147e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3148e5c31af7Sopenharmony_ci resEnv.env.commandLine); 3149e5c31af7Sopenharmony_ci 3150e5c31af7Sopenharmony_ci context.getTestContext().getLog() 3151e5c31af7Sopenharmony_ci << TestLog::Message 3152e5c31af7Sopenharmony_ci << "Trying to create object with " << numPassingAllocs << " allocation" << (numPassingAllocs != 1 ? "s" : "") << " passing" 3153e5c31af7Sopenharmony_ci << TestLog::EndMessage; 3154e5c31af7Sopenharmony_ci 3155e5c31af7Sopenharmony_ci createOk = false; 3156e5c31af7Sopenharmony_ci try 3157e5c31af7Sopenharmony_ci { 3158e5c31af7Sopenharmony_ci Unique<typename Object::Type> obj (Object::create(objEnv, res, params)); 3159e5c31af7Sopenharmony_ci createOk = true; 3160e5c31af7Sopenharmony_ci } 3161e5c31af7Sopenharmony_ci catch (const vk::OutOfMemoryError& e) 3162e5c31af7Sopenharmony_ci { 3163e5c31af7Sopenharmony_ci if (e.getError() != VK_ERROR_OUT_OF_HOST_MEMORY) 3164e5c31af7Sopenharmony_ci { 3165e5c31af7Sopenharmony_ci context.getTestContext().getLog() << e; 3166e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Got invalid error code"); 3167e5c31af7Sopenharmony_ci } 3168e5c31af7Sopenharmony_ci } 3169e5c31af7Sopenharmony_ci 3170e5c31af7Sopenharmony_ci if (!validateAndLog(context.getTestContext().getLog(), recorder, 0u)) 3171e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Invalid allocation callback"); 3172e5c31af7Sopenharmony_ci 3173e5c31af7Sopenharmony_ci if (createOk) 3174e5c31af7Sopenharmony_ci { 3175e5c31af7Sopenharmony_ci context.getTestContext().getLog() 3176e5c31af7Sopenharmony_ci << TestLog::Message << "Object construction succeeded! " << TestLog::EndMessage; 3177e5c31af7Sopenharmony_ci break; 3178e5c31af7Sopenharmony_ci } 3179e5c31af7Sopenharmony_ci 3180e5c31af7Sopenharmony_ci ++numPassingAllocs; 3181e5c31af7Sopenharmony_ci // if allocation didn't succeed with huge limit then stop trying 3182e5c31af7Sopenharmony_ci if (numPassingAllocs >= finalLimit) 3183e5c31af7Sopenharmony_ci break; 3184e5c31af7Sopenharmony_ci // if we reached maxTries but didn't create object, try doing it with huge limit 3185e5c31af7Sopenharmony_ci if (numPassingAllocs >= maxTries) 3186e5c31af7Sopenharmony_ci numPassingAllocs = finalLimit; 3187e5c31af7Sopenharmony_ci } 3188e5c31af7Sopenharmony_ci } 3189e5c31af7Sopenharmony_ci 3190e5c31af7Sopenharmony_ci if (!validateAndLog(context.getTestContext().getLog(), resCallbacks, 0u)) 3191e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Invalid allocation callback"); 3192e5c31af7Sopenharmony_ci 3193e5c31af7Sopenharmony_ci if (numPassingAllocs == 0) 3194e5c31af7Sopenharmony_ci return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks not called"); 3195e5c31af7Sopenharmony_ci else if (numPassingAllocs >= finalLimit) 3196e5c31af7Sopenharmony_ci { 3197e5c31af7Sopenharmony_ci if (createOk) 3198e5c31af7Sopenharmony_ci { 3199e5c31af7Sopenharmony_ci context.getTestContext().getLog() 3200e5c31af7Sopenharmony_ci << TestLog::Message << "Maximum iteration count (" << maxTries << ") reached without object construction passing. " 3201e5c31af7Sopenharmony_ci << "Object was succesfully constructed with " << numPassingAllocs << " iterations limit." << TestLog::EndMessage; 3202e5c31af7Sopenharmony_ci return tcu::TestStatus(QP_TEST_RESULT_PASS, "Construction passed but not all iterations were checked"); 3203e5c31af7Sopenharmony_ci } 3204e5c31af7Sopenharmony_ci 3205e5c31af7Sopenharmony_ci context.getTestContext().getLog() 3206e5c31af7Sopenharmony_ci << TestLog::Message << "WARNING: Maximum iteration count (" << finalLimit << ") reached without object construction passing. " 3207e5c31af7Sopenharmony_ci << "OOM testing incomplete, use --deqp-test-iteration-count= to test with higher limit." << TestLog::EndMessage; 3208e5c31af7Sopenharmony_ci return tcu::TestStatus(QP_TEST_RESULT_PASS, "Max iter count reached"); 3209e5c31af7Sopenharmony_ci } 3210e5c31af7Sopenharmony_ci else 3211e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 3212e5c31af7Sopenharmony_ci} 3213e5c31af7Sopenharmony_ci 3214e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3215e5c31af7Sopenharmony_ci 3216e5c31af7Sopenharmony_ci// Determine whether an API call sets the invalid handles to NULL (true) or leaves them undefined or not modified (false) 3217e5c31af7Sopenharmony_citemplate<typename T> inline bool isNullHandleOnAllocationFailure (Context&) { return false; } 3218e5c31af7Sopenharmony_ci 3219e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3220e5c31af7Sopenharmony_citemplate<> inline bool isNullHandleOnAllocationFailure<VkCommandBuffer> (Context& context) { return hasDeviceExtension(context, "VK_KHR_maintenance1"); } 3221e5c31af7Sopenharmony_citemplate<> inline bool isNullHandleOnAllocationFailure<VkDescriptorSet> (Context& context) { return hasDeviceExtension(context, "VK_KHR_maintenance1"); } 3222e5c31af7Sopenharmony_citemplate<> inline bool isNullHandleOnAllocationFailure<VkPipeline> (Context&) { return true; } 3223e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3224e5c31af7Sopenharmony_ci 3225e5c31af7Sopenharmony_citemplate<typename T> inline bool isPooledObject (void) { return false; }; 3226e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3227e5c31af7Sopenharmony_citemplate<> inline bool isPooledObject<VkCommandBuffer> (void) { return true; }; 3228e5c31af7Sopenharmony_citemplate<> inline bool isPooledObject<VkDescriptorSet> (void) { return true; }; 3229e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3230e5c31af7Sopenharmony_ci 3231e5c31af7Sopenharmony_citemplate<typename Object> 3232e5c31af7Sopenharmony_citcu::TestStatus allocCallbackFailMultipleObjectsTest (Context& context, typename Object::Parameters params) 3233e5c31af7Sopenharmony_ci{ 3234e5c31af7Sopenharmony_ci typedef SharedPtr<Move<typename Object::Type> > ObjectTypeSp; 3235e5c31af7Sopenharmony_ci 3236e5c31af7Sopenharmony_ci static const deUint32 numObjects = 4; 3237e5c31af7Sopenharmony_ci const bool expectNullHandles = isNullHandleOnAllocationFailure<typename Object::Type>(context); 3238e5c31af7Sopenharmony_ci deUint32 numPassingAllocs = 0; 3239e5c31af7Sopenharmony_ci 3240e5c31af7Sopenharmony_ci { 3241e5c31af7Sopenharmony_ci vector<typename Object::Type> handles (numObjects); 3242e5c31af7Sopenharmony_ci VkResult result = VK_NOT_READY; 3243e5c31af7Sopenharmony_ci 3244e5c31af7Sopenharmony_ci for (; numPassingAllocs <= numObjects; ++numPassingAllocs) 3245e5c31af7Sopenharmony_ci { 3246e5c31af7Sopenharmony_ci ValidateQueryBits::fillBits(handles.begin(), handles.end()); // fill with garbage 3247e5c31af7Sopenharmony_ci 3248e5c31af7Sopenharmony_ci // \note We have to use the same allocator for both resource dependencies and the object under test, 3249e5c31af7Sopenharmony_ci // because pooled objects take memory from the pool. 3250e5c31af7Sopenharmony_ci DeterministicFailAllocator objAllocator(getSystemAllocator(), DeterministicFailAllocator::MODE_DO_NOT_COUNT, 0); 3251e5c31af7Sopenharmony_ci AllocationCallbackRecorder recorder (objAllocator.getCallbacks(), 128); 3252e5c31af7Sopenharmony_ci const Environment objEnv (context.getPlatformInterface(), 3253e5c31af7Sopenharmony_ci context.getUsedApiVersion(), 3254e5c31af7Sopenharmony_ci context.getInstanceInterface(), 3255e5c31af7Sopenharmony_ci context.getInstance(), 3256e5c31af7Sopenharmony_ci context.getDeviceInterface(), 3257e5c31af7Sopenharmony_ci context.getDevice(), 3258e5c31af7Sopenharmony_ci context.getUniversalQueueFamilyIndex(), 3259e5c31af7Sopenharmony_ci context.getBinaryCollection(), 3260e5c31af7Sopenharmony_ci recorder.getCallbacks(), 3261e5c31af7Sopenharmony_ci numObjects, 3262e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 3263e5c31af7Sopenharmony_ci context.getResourceInterface(), 3264e5c31af7Sopenharmony_ci context.getDeviceVulkanSC10Properties(), 3265e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3266e5c31af7Sopenharmony_ci context.getTestContext().getCommandLine()); 3267e5c31af7Sopenharmony_ci 3268e5c31af7Sopenharmony_ci context.getTestContext().getLog() 3269e5c31af7Sopenharmony_ci << TestLog::Message 3270e5c31af7Sopenharmony_ci << "Trying to create " << numObjects << " objects with " << numPassingAllocs << " allocation" << (numPassingAllocs != 1 ? "s" : "") << " passing" 3271e5c31af7Sopenharmony_ci << TestLog::EndMessage; 3272e5c31af7Sopenharmony_ci 3273e5c31af7Sopenharmony_ci { 3274e5c31af7Sopenharmony_ci const typename Object::Resources res (objEnv, params); 3275e5c31af7Sopenharmony_ci 3276e5c31af7Sopenharmony_ci objAllocator.reset(DeterministicFailAllocator::MODE_COUNT_AND_FAIL, numPassingAllocs); 3277e5c31af7Sopenharmony_ci const vector<ObjectTypeSp> scopedHandles = Object::createMultiple(objEnv, res, params, &handles, &result); 3278e5c31af7Sopenharmony_ci } 3279e5c31af7Sopenharmony_ci 3280e5c31af7Sopenharmony_ci if (result == VK_SUCCESS) 3281e5c31af7Sopenharmony_ci { 3282e5c31af7Sopenharmony_ci context.getTestContext().getLog() << TestLog::Message << "Construction of all objects succeeded! " << TestLog::EndMessage; 3283e5c31af7Sopenharmony_ci break; 3284e5c31af7Sopenharmony_ci } 3285e5c31af7Sopenharmony_ci else 3286e5c31af7Sopenharmony_ci { 3287e5c31af7Sopenharmony_ci if (expectNullHandles) 3288e5c31af7Sopenharmony_ci { 3289e5c31af7Sopenharmony_ci for (deUint32 nullNdx = numPassingAllocs; nullNdx < numObjects; ++nullNdx) 3290e5c31af7Sopenharmony_ci { 3291e5c31af7Sopenharmony_ci if (handles[nullNdx] != DE_NULL) 3292e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Some object handles weren't set to NULL"); 3293e5c31af7Sopenharmony_ci } 3294e5c31af7Sopenharmony_ci } 3295e5c31af7Sopenharmony_ci 3296e5c31af7Sopenharmony_ci if (result != VK_ERROR_OUT_OF_HOST_MEMORY) 3297e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Got invalid error code: " + de::toString(getResultName(result))); 3298e5c31af7Sopenharmony_ci 3299e5c31af7Sopenharmony_ci if (!validateAndLog(context.getTestContext().getLog(), recorder, 0u)) 3300e5c31af7Sopenharmony_ci return tcu::TestStatus::fail("Invalid allocation callback"); 3301e5c31af7Sopenharmony_ci } 3302e5c31af7Sopenharmony_ci } 3303e5c31af7Sopenharmony_ci } 3304e5c31af7Sopenharmony_ci 3305e5c31af7Sopenharmony_ci if (numPassingAllocs == 0) 3306e5c31af7Sopenharmony_ci { 3307e5c31af7Sopenharmony_ci if (isPooledObject<typename Object::Type>()) 3308e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Not validated: pooled objects didn't seem to use host memory"); 3309e5c31af7Sopenharmony_ci else 3310e5c31af7Sopenharmony_ci return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks not called"); 3311e5c31af7Sopenharmony_ci } 3312e5c31af7Sopenharmony_ci else 3313e5c31af7Sopenharmony_ci return tcu::TestStatus::pass("Ok"); 3314e5c31af7Sopenharmony_ci} 3315e5c31af7Sopenharmony_ci 3316e5c31af7Sopenharmony_ci// Utilities for creating groups 3317e5c31af7Sopenharmony_ci 3318e5c31af7Sopenharmony_citemplate<typename Object> 3319e5c31af7Sopenharmony_cistruct NamedParameters 3320e5c31af7Sopenharmony_ci{ 3321e5c31af7Sopenharmony_ci const char* name; 3322e5c31af7Sopenharmony_ci typename Object::Parameters parameters; 3323e5c31af7Sopenharmony_ci}; 3324e5c31af7Sopenharmony_ci 3325e5c31af7Sopenharmony_citemplate<typename Object> 3326e5c31af7Sopenharmony_cistruct CaseDescription 3327e5c31af7Sopenharmony_ci{ 3328e5c31af7Sopenharmony_ci typename FunctionInstance1<typename Object::Parameters>::Function function; 3329e5c31af7Sopenharmony_ci const NamedParameters<Object>* paramsBegin; 3330e5c31af7Sopenharmony_ci const NamedParameters<Object>* paramsEnd; 3331e5c31af7Sopenharmony_ci typename FunctionSupport1<typename Object::Parameters>::Function supportFunction; 3332e5c31af7Sopenharmony_ci}; 3333e5c31af7Sopenharmony_ci 3334e5c31af7Sopenharmony_ci#define EMPTY_CASE_DESC(OBJECT) \ 3335e5c31af7Sopenharmony_ci { (FunctionInstance1<OBJECT::Parameters>::Function)DE_NULL, DE_NULL, DE_NULL, DE_NULL } 3336e5c31af7Sopenharmony_ci 3337e5c31af7Sopenharmony_ci#define CASE_DESC(FUNCTION, CASES, SUPPORT) \ 3338e5c31af7Sopenharmony_ci { FUNCTION, DE_ARRAY_BEGIN(CASES), DE_ARRAY_END(CASES), SUPPORT } 3339e5c31af7Sopenharmony_ci 3340e5c31af7Sopenharmony_cistruct CaseDescriptions 3341e5c31af7Sopenharmony_ci{ 3342e5c31af7Sopenharmony_ci CaseDescription<Instance> instance; 3343e5c31af7Sopenharmony_ci CaseDescription<Device> device; 3344e5c31af7Sopenharmony_ci CaseDescription<DeviceGroup> deviceGroup; 3345e5c31af7Sopenharmony_ci CaseDescription<DeviceMemory> deviceMemory; 3346e5c31af7Sopenharmony_ci CaseDescription<Buffer> buffer; 3347e5c31af7Sopenharmony_ci CaseDescription<BufferView> bufferView; 3348e5c31af7Sopenharmony_ci CaseDescription<Image> image; 3349e5c31af7Sopenharmony_ci CaseDescription<ImageView> imageView; 3350e5c31af7Sopenharmony_ci CaseDescription<Semaphore> semaphore; 3351e5c31af7Sopenharmony_ci CaseDescription<Event> event; 3352e5c31af7Sopenharmony_ci CaseDescription<Fence> fence; 3353e5c31af7Sopenharmony_ci CaseDescription<QueryPool> queryPool; 3354e5c31af7Sopenharmony_ci CaseDescription<ShaderModule> shaderModule; 3355e5c31af7Sopenharmony_ci CaseDescription<PipelineCache> pipelineCache; 3356e5c31af7Sopenharmony_ci CaseDescription<PipelineLayout> pipelineLayout; 3357e5c31af7Sopenharmony_ci CaseDescription<RenderPass> renderPass; 3358e5c31af7Sopenharmony_ci CaseDescription<GraphicsPipeline> graphicsPipeline; 3359e5c31af7Sopenharmony_ci CaseDescription<ComputePipeline> computePipeline; 3360e5c31af7Sopenharmony_ci CaseDescription<DescriptorSetLayout> descriptorSetLayout; 3361e5c31af7Sopenharmony_ci CaseDescription<Sampler> sampler; 3362e5c31af7Sopenharmony_ci CaseDescription<DescriptorPool> descriptorPool; 3363e5c31af7Sopenharmony_ci CaseDescription<DescriptorSet> descriptorSet; 3364e5c31af7Sopenharmony_ci CaseDescription<Framebuffer> framebuffer; 3365e5c31af7Sopenharmony_ci CaseDescription<CommandPool> commandPool; 3366e5c31af7Sopenharmony_ci CaseDescription<CommandBuffer> commandBuffer; 3367e5c31af7Sopenharmony_ci}; 3368e5c31af7Sopenharmony_ci 3369e5c31af7Sopenharmony_citemplate<typename Object> 3370e5c31af7Sopenharmony_civoid addCases (tcu::TestCaseGroup *group, const CaseDescription<Object>& cases) 3371e5c31af7Sopenharmony_ci{ 3372e5c31af7Sopenharmony_ci for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur) 3373e5c31af7Sopenharmony_ci { 3374e5c31af7Sopenharmony_ci if(cases.supportFunction == DE_NULL) 3375e5c31af7Sopenharmony_ci addFunctionCase(group, cur->name, cases.function, cur->parameters); 3376e5c31af7Sopenharmony_ci else 3377e5c31af7Sopenharmony_ci addFunctionCase(group, cur->name, cases.supportFunction, cases.function, cur->parameters); 3378e5c31af7Sopenharmony_ci } 3379e5c31af7Sopenharmony_ci} 3380e5c31af7Sopenharmony_ci 3381e5c31af7Sopenharmony_civoid checkImageCubeArraySupport (Context& context, const ImageView::Parameters params) { 3382e5c31af7Sopenharmony_ci if (params.viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && !context.getDeviceFeatures().imageCubeArray) 3383e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "imageCubeArray feature is not supported by this implementation"); 3384e5c31af7Sopenharmony_ci} 3385e5c31af7Sopenharmony_ci 3386e5c31af7Sopenharmony_civoid checkEventSupport (Context& context, const Event::Parameters) 3387e5c31af7Sopenharmony_ci{ 3388e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3389e5c31af7Sopenharmony_ci if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events) 3390e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation"); 3391e5c31af7Sopenharmony_ci#else 3392e5c31af7Sopenharmony_ci DE_UNREF(context); 3393e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3394e5c31af7Sopenharmony_ci} 3395e5c31af7Sopenharmony_ci 3396e5c31af7Sopenharmony_civoid checkRecycleDescriptorSetMemorySupport (Context& context, const DescriptorSet::Parameters) 3397e5c31af7Sopenharmony_ci{ 3398e5c31af7Sopenharmony_ci#ifdef CTS_USES_VULKANSC 3399e5c31af7Sopenharmony_ci if (!context.getDeviceVulkanSC10Properties().recycleDescriptorSetMemory) 3400e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "VkPhysicalDeviceVulkanSC10Properties::recycleDescriptorSetMemory not supported by this implementation"); 3401e5c31af7Sopenharmony_ci#else 3402e5c31af7Sopenharmony_ci DE_UNREF(context); 3403e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3404e5c31af7Sopenharmony_ci} 3405e5c31af7Sopenharmony_ci 3406e5c31af7Sopenharmony_citemplate<typename Object> 3407e5c31af7Sopenharmony_civoid addCasesWithProgs (tcu::TestCaseGroup *group, const CaseDescription<Object>& cases) 3408e5c31af7Sopenharmony_ci{ 3409e5c31af7Sopenharmony_ci for (const NamedParameters<Object>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur) 3410e5c31af7Sopenharmony_ci { 3411e5c31af7Sopenharmony_ci if (cases.supportFunction == DE_NULL) 3412e5c31af7Sopenharmony_ci addFunctionCaseWithPrograms(group, cur->name, Object::initPrograms, cases.function, cur->parameters); 3413e5c31af7Sopenharmony_ci else 3414e5c31af7Sopenharmony_ci addFunctionCaseWithPrograms(group, cur->name, cases.supportFunction, Object::initPrograms, cases.function, cur->parameters); 3415e5c31af7Sopenharmony_ci } 3416e5c31af7Sopenharmony_ci} 3417e5c31af7Sopenharmony_ci 3418e5c31af7Sopenharmony_cistatic void createTests (tcu::TestCaseGroup* group, CaseDescriptions cases) 3419e5c31af7Sopenharmony_ci{ 3420e5c31af7Sopenharmony_ci addCases (group, cases.instance); 3421e5c31af7Sopenharmony_ci addCases (group, cases.device); 3422e5c31af7Sopenharmony_ci addCases (group, cases.deviceGroup); 3423e5c31af7Sopenharmony_ci addCases (group, cases.deviceMemory); 3424e5c31af7Sopenharmony_ci addCases (group, cases.buffer); 3425e5c31af7Sopenharmony_ci addCases (group, cases.bufferView); 3426e5c31af7Sopenharmony_ci addCases (group, cases.image); 3427e5c31af7Sopenharmony_ci addCases (group, cases.imageView); 3428e5c31af7Sopenharmony_ci addCases (group, cases.semaphore); 3429e5c31af7Sopenharmony_ci addCases (group, cases.event); 3430e5c31af7Sopenharmony_ci addCases (group, cases.fence); 3431e5c31af7Sopenharmony_ci addCases (group, cases.queryPool); 3432e5c31af7Sopenharmony_ci addCases (group, cases.sampler); 3433e5c31af7Sopenharmony_ci addCasesWithProgs (group, cases.shaderModule); 3434e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3435e5c31af7Sopenharmony_ci addCases (group, cases.pipelineCache); 3436e5c31af7Sopenharmony_ci#else 3437e5c31af7Sopenharmony_ci addCasesWithProgs (group, cases.pipelineCache); 3438e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3439e5c31af7Sopenharmony_ci addCases (group, cases.pipelineLayout); 3440e5c31af7Sopenharmony_ci addCases (group, cases.renderPass); 3441e5c31af7Sopenharmony_ci addCasesWithProgs (group, cases.graphicsPipeline); 3442e5c31af7Sopenharmony_ci addCasesWithProgs (group, cases.computePipeline); 3443e5c31af7Sopenharmony_ci addCases (group, cases.descriptorSetLayout); 3444e5c31af7Sopenharmony_ci addCases (group, cases.descriptorPool); 3445e5c31af7Sopenharmony_ci addCases (group, cases.descriptorSet); 3446e5c31af7Sopenharmony_ci addCases (group, cases.framebuffer); 3447e5c31af7Sopenharmony_ci addCases (group, cases.commandPool); 3448e5c31af7Sopenharmony_ci addCases (group, cases.commandBuffer); 3449e5c31af7Sopenharmony_ci} 3450e5c31af7Sopenharmony_ci 3451e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3452e5c31af7Sopenharmony_cistatic void cleanupGroup (tcu::TestCaseGroup* group, CaseDescriptions cases) 3453e5c31af7Sopenharmony_ci{ 3454e5c31af7Sopenharmony_ci DE_UNREF(group); 3455e5c31af7Sopenharmony_ci DE_UNREF(cases); 3456e5c31af7Sopenharmony_ci // Destroy singleton object 3457e5c31af7Sopenharmony_ci 3458e5c31af7Sopenharmony_ci SingletonDevice::destroy(); 3459e5c31af7Sopenharmony_ci} 3460e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3461e5c31af7Sopenharmony_ci 3462e5c31af7Sopenharmony_citcu::TestCaseGroup* createGroup (tcu::TestContext& testCtx, const char* name, const CaseDescriptions& cases) 3463e5c31af7Sopenharmony_ci{ 3464e5c31af7Sopenharmony_ci MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, name)); 3465e5c31af7Sopenharmony_ci createTests(group.get(), cases); 3466e5c31af7Sopenharmony_ci return group.release(); 3467e5c31af7Sopenharmony_ci} 3468e5c31af7Sopenharmony_ci 3469e5c31af7Sopenharmony_ci} // anonymous 3470e5c31af7Sopenharmony_ci 3471e5c31af7Sopenharmony_citcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx) 3472e5c31af7Sopenharmony_ci{ 3473e5c31af7Sopenharmony_ci MovePtr<tcu::TestCaseGroup> objectMgmtTests (new tcu::TestCaseGroup(testCtx, "object_management")); 3474e5c31af7Sopenharmony_ci 3475e5c31af7Sopenharmony_ci 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); 3476e5c31af7Sopenharmony_ci 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); 3477e5c31af7Sopenharmony_ci 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); 3478e5c31af7Sopenharmony_ci 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); 3479e5c31af7Sopenharmony_ci const ImageView::Parameters imgView1D (img1D, VK_IMAGE_VIEW_TYPE_1D, img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u)); 3480e5c31af7Sopenharmony_ci const ImageView::Parameters imgView1DArr (img1D, VK_IMAGE_VIEW_TYPE_1D_ARRAY, img1D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 4u)); 3481e5c31af7Sopenharmony_ci const ImageView::Parameters imgView2D (img2D, VK_IMAGE_VIEW_TYPE_2D, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u)); 3482e5c31af7Sopenharmony_ci const ImageView::Parameters imgView2DArr (img2D, VK_IMAGE_VIEW_TYPE_2D_ARRAY, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 8u)); 3483e5c31af7Sopenharmony_ci const ImageView::Parameters imgViewCube (imgCube, VK_IMAGE_VIEW_TYPE_CUBE, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 6u)); 3484e5c31af7Sopenharmony_ci const ImageView::Parameters imgViewCubeArr (imgCube, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, img2D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 12u)); 3485e5c31af7Sopenharmony_ci const ImageView::Parameters imgView3D (img3D, VK_IMAGE_VIEW_TYPE_3D, img3D.format, makeComponentMappingRGBA(), makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u)); 3486e5c31af7Sopenharmony_ci 3487e5c31af7Sopenharmony_ci const DescriptorSetLayout::Parameters singleUboDescLayout = DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u, VK_SHADER_STAGE_VERTEX_BIT); 3488e5c31af7Sopenharmony_ci 3489e5c31af7Sopenharmony_ci static const NamedParameters<Instance> s_instanceCases[] = 3490e5c31af7Sopenharmony_ci { 3491e5c31af7Sopenharmony_ci { "instance", Instance::Parameters() }, 3492e5c31af7Sopenharmony_ci }; 3493e5c31af7Sopenharmony_ci // \note Device index may change - must not be static 3494e5c31af7Sopenharmony_ci 3495e5c31af7Sopenharmony_ci const NamedParameters<Device> s_deviceCases[] = 3496e5c31af7Sopenharmony_ci { 3497e5c31af7Sopenharmony_ci { "device", Device::Parameters(testCtx.getCommandLine().getVKDeviceId()-1u, VK_QUEUE_GRAPHICS_BIT) }, 3498e5c31af7Sopenharmony_ci }; 3499e5c31af7Sopenharmony_ci const NamedParameters<DeviceGroup> s_deviceGroupCases[] = 3500e5c31af7Sopenharmony_ci { 3501e5c31af7Sopenharmony_ci { "device_group", DeviceGroup::Parameters(testCtx.getCommandLine().getVKDeviceGroupId() - 1u, testCtx.getCommandLine().getVKDeviceId() - 1u, VK_QUEUE_GRAPHICS_BIT) }, 3502e5c31af7Sopenharmony_ci }; 3503e5c31af7Sopenharmony_ci static const NamedParameters<DeviceMemory> s_deviceMemCases[] = 3504e5c31af7Sopenharmony_ci { 3505e5c31af7Sopenharmony_ci { "device_memory_small", DeviceMemory::Parameters(1024, 0u) }, 3506e5c31af7Sopenharmony_ci }; 3507e5c31af7Sopenharmony_ci static const NamedParameters<Buffer> s_bufferCases[] = 3508e5c31af7Sopenharmony_ci { 3509e5c31af7Sopenharmony_ci { "buffer_uniform_small", Buffer::Parameters(1024u, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT), }, 3510e5c31af7Sopenharmony_ci { "buffer_uniform_large", Buffer::Parameters(1024u*1024u*16u, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT), }, 3511e5c31af7Sopenharmony_ci { "buffer_storage_small", Buffer::Parameters(1024u, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), }, 3512e5c31af7Sopenharmony_ci { "buffer_storage_large", Buffer::Parameters(1024u*1024u*16u, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), }, 3513e5c31af7Sopenharmony_ci }; 3514e5c31af7Sopenharmony_ci static const NamedParameters<BufferView> s_bufferViewCases[] = 3515e5c31af7Sopenharmony_ci { 3516e5c31af7Sopenharmony_ci { "buffer_view_uniform_r8g8b8a8_unorm", BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u) }, 3517e5c31af7Sopenharmony_ci { "buffer_view_storage_r8g8b8a8_unorm", BufferView::Parameters(Buffer::Parameters(8192u, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT), VK_FORMAT_R8G8B8A8_UNORM, 0u, 4096u) }, 3518e5c31af7Sopenharmony_ci }; 3519e5c31af7Sopenharmony_ci static const NamedParameters<Image> s_imageCases[] = 3520e5c31af7Sopenharmony_ci { 3521e5c31af7Sopenharmony_ci { "image_1d", img1D }, 3522e5c31af7Sopenharmony_ci { "image_2d", img2D }, 3523e5c31af7Sopenharmony_ci { "image_3d", img3D }, 3524e5c31af7Sopenharmony_ci }; 3525e5c31af7Sopenharmony_ci static const NamedParameters<ImageView> s_imageViewCases[] = 3526e5c31af7Sopenharmony_ci { 3527e5c31af7Sopenharmony_ci { "image_view_1d", imgView1D }, 3528e5c31af7Sopenharmony_ci { "image_view_1d_arr", imgView1DArr }, 3529e5c31af7Sopenharmony_ci { "image_view_2d", imgView2D }, 3530e5c31af7Sopenharmony_ci { "image_view_2d_arr", imgView2DArr }, 3531e5c31af7Sopenharmony_ci { "image_view_cube", imgViewCube }, 3532e5c31af7Sopenharmony_ci { "image_view_cube_arr", imgViewCubeArr }, 3533e5c31af7Sopenharmony_ci { "image_view_3d", imgView3D }, 3534e5c31af7Sopenharmony_ci }; 3535e5c31af7Sopenharmony_ci static const NamedParameters<Semaphore> s_semaphoreCases[] = 3536e5c31af7Sopenharmony_ci { 3537e5c31af7Sopenharmony_ci { "semaphore", Semaphore::Parameters(0u), } 3538e5c31af7Sopenharmony_ci }; 3539e5c31af7Sopenharmony_ci static const NamedParameters<Event> s_eventCases[] = 3540e5c31af7Sopenharmony_ci { 3541e5c31af7Sopenharmony_ci { "event", Event::Parameters(0u) } 3542e5c31af7Sopenharmony_ci }; 3543e5c31af7Sopenharmony_ci static const NamedParameters<Fence> s_fenceCases[] = 3544e5c31af7Sopenharmony_ci { 3545e5c31af7Sopenharmony_ci { "fence", Fence::Parameters(0u) }, 3546e5c31af7Sopenharmony_ci { "fence_signaled", Fence::Parameters(VK_FENCE_CREATE_SIGNALED_BIT) } 3547e5c31af7Sopenharmony_ci }; 3548e5c31af7Sopenharmony_ci static const NamedParameters<QueryPool> s_queryPoolCases[] = 3549e5c31af7Sopenharmony_ci { 3550e5c31af7Sopenharmony_ci { "query_pool", QueryPool::Parameters(VK_QUERY_TYPE_OCCLUSION, 1u, 0u) } 3551e5c31af7Sopenharmony_ci }; 3552e5c31af7Sopenharmony_ci static const NamedParameters<ShaderModule> s_shaderModuleCases[] = 3553e5c31af7Sopenharmony_ci { 3554e5c31af7Sopenharmony_ci { "shader_module", ShaderModule::Parameters(VK_SHADER_STAGE_COMPUTE_BIT, "test") } 3555e5c31af7Sopenharmony_ci }; 3556e5c31af7Sopenharmony_ci static const NamedParameters<PipelineCache> s_pipelineCacheCases[] = 3557e5c31af7Sopenharmony_ci { 3558e5c31af7Sopenharmony_ci { "pipeline_cache", PipelineCache::Parameters() } 3559e5c31af7Sopenharmony_ci }; 3560e5c31af7Sopenharmony_ci static const NamedParameters<PipelineLayout> s_pipelineLayoutCases[] = 3561e5c31af7Sopenharmony_ci { 3562e5c31af7Sopenharmony_ci { "pipeline_layout_empty", PipelineLayout::Parameters::empty() }, 3563e5c31af7Sopenharmony_ci { "pipeline_layout_single", PipelineLayout::Parameters::singleDescriptorSet(singleUboDescLayout) } 3564e5c31af7Sopenharmony_ci }; 3565e5c31af7Sopenharmony_ci static const NamedParameters<RenderPass> s_renderPassCases[] = 3566e5c31af7Sopenharmony_ci { 3567e5c31af7Sopenharmony_ci { "render_pass", RenderPass::Parameters() } 3568e5c31af7Sopenharmony_ci }; 3569e5c31af7Sopenharmony_ci static const NamedParameters<GraphicsPipeline> s_graphicsPipelineCases[] = 3570e5c31af7Sopenharmony_ci { 3571e5c31af7Sopenharmony_ci { "graphics_pipeline", GraphicsPipeline::Parameters() } 3572e5c31af7Sopenharmony_ci }; 3573e5c31af7Sopenharmony_ci static const NamedParameters<ComputePipeline> s_computePipelineCases[] = 3574e5c31af7Sopenharmony_ci { 3575e5c31af7Sopenharmony_ci { "compute_pipeline", ComputePipeline::Parameters() } 3576e5c31af7Sopenharmony_ci }; 3577e5c31af7Sopenharmony_ci static const NamedParameters<DescriptorSetLayout> s_descriptorSetLayoutCases[] = 3578e5c31af7Sopenharmony_ci { 3579e5c31af7Sopenharmony_ci { "descriptor_set_layout_empty", DescriptorSetLayout::Parameters::empty() }, 3580e5c31af7Sopenharmony_ci { "descriptor_set_layout_single", singleUboDescLayout } 3581e5c31af7Sopenharmony_ci }; 3582e5c31af7Sopenharmony_ci static const NamedParameters<Sampler> s_samplerCases[] = 3583e5c31af7Sopenharmony_ci { 3584e5c31af7Sopenharmony_ci { "sampler", Sampler::Parameters() } 3585e5c31af7Sopenharmony_ci }; 3586e5c31af7Sopenharmony_ci static const NamedParameters<DescriptorPool> s_descriptorPoolCases[] = 3587e5c31af7Sopenharmony_ci { 3588e5c31af7Sopenharmony_ci { "descriptor_pool", DescriptorPool::Parameters::singleType((VkDescriptorPoolCreateFlags)0, 4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u) }, 3589e5c31af7Sopenharmony_ci { "descriptor_pool_free_descriptor_set", DescriptorPool::Parameters::singleType(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 4u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u) } 3590e5c31af7Sopenharmony_ci }; 3591e5c31af7Sopenharmony_ci static const NamedParameters<DescriptorSet> s_descriptorSetCases[] = 3592e5c31af7Sopenharmony_ci { 3593e5c31af7Sopenharmony_ci { "descriptor_set", DescriptorSet::Parameters(singleUboDescLayout) } 3594e5c31af7Sopenharmony_ci }; 3595e5c31af7Sopenharmony_ci static const NamedParameters<Framebuffer> s_framebufferCases[] = 3596e5c31af7Sopenharmony_ci { 3597e5c31af7Sopenharmony_ci { "framebuffer", Framebuffer::Parameters() } 3598e5c31af7Sopenharmony_ci }; 3599e5c31af7Sopenharmony_ci static const NamedParameters<CommandPool> s_commandPoolCases[] = 3600e5c31af7Sopenharmony_ci { 3601e5c31af7Sopenharmony_ci { "command_pool", CommandPool::Parameters((VkCommandPoolCreateFlags)0) }, 3602e5c31af7Sopenharmony_ci { "command_pool_transient", CommandPool::Parameters(VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) } 3603e5c31af7Sopenharmony_ci }; 3604e5c31af7Sopenharmony_ci static const NamedParameters<CommandBuffer> s_commandBufferCases[] = 3605e5c31af7Sopenharmony_ci { 3606e5c31af7Sopenharmony_ci { "command_buffer_primary", CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_PRIMARY) }, 3607e5c31af7Sopenharmony_ci { "command_buffer_secondary", CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_SECONDARY) } 3608e5c31af7Sopenharmony_ci }; 3609e5c31af7Sopenharmony_ci 3610e5c31af7Sopenharmony_ci const CaseDescriptions s_createSingleGroup = 3611e5c31af7Sopenharmony_ci { 3612e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Instance>, s_instanceCases, DE_NULL), 3613e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Device>, s_deviceCases, DE_NULL), 3614e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3615e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3616e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Buffer>, s_bufferCases, DE_NULL), 3617e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <BufferView>, s_bufferViewCases, DE_NULL), 3618e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Image>, s_imageCases, DE_NULL), 3619e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3620e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Semaphore>, s_semaphoreCases, DE_NULL), 3621e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Event>, s_eventCases, checkEventSupport), 3622e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Fence>, s_fenceCases, DE_NULL), 3623e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <QueryPool>, s_queryPoolCases, DE_NULL), 3624e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3625e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3626e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3627e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <RenderPass>, s_renderPassCases, DE_NULL), 3628e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3629e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3630e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3631e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Sampler>, s_samplerCases, DE_NULL), 3632e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3633e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <DescriptorSet>, s_descriptorSetCases, DE_NULL), 3634e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <Framebuffer>, s_framebufferCases, DE_NULL), 3635e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <CommandPool>, s_commandPoolCases, DE_NULL), 3636e5c31af7Sopenharmony_ci CASE_DESC(createSingleTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3637e5c31af7Sopenharmony_ci }; 3638e5c31af7Sopenharmony_ci // Create single object 3639e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "single", s_createSingleGroup)); 3640e5c31af7Sopenharmony_ci 3641e5c31af7Sopenharmony_ci const CaseDescriptions s_createMultipleUniqueResourcesGroup = 3642e5c31af7Sopenharmony_ci { 3643e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Instance>, s_instanceCases, DE_NULL), 3644e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3645e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Device>, s_deviceCases, DE_NULL), 3646e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3647e5c31af7Sopenharmony_ci#else 3648e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Device), 3649e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DeviceGroup), 3650e5c31af7Sopenharmony_ci#endif 3651e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3652e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Buffer>, s_bufferCases, DE_NULL), 3653e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <BufferView>, s_bufferViewCases, DE_NULL), 3654e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Image>, s_imageCases, DE_NULL), 3655e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3656e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Semaphore>, s_semaphoreCases, DE_NULL), 3657e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Event>, s_eventCases, checkEventSupport), 3658e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Fence>, s_fenceCases, DE_NULL), 3659e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <QueryPool>, s_queryPoolCases, DE_NULL), 3660e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3661e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3662e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3663e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <RenderPass>, s_renderPassCases, DE_NULL), 3664e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3665e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3666e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3667e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Sampler>, s_samplerCases, DE_NULL), 3668e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3669e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <DescriptorSet>, s_descriptorSetCases, DE_NULL), 3670e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <Framebuffer>, s_framebufferCases, DE_NULL), 3671e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <CommandPool>, s_commandPoolCases, DE_NULL), 3672e5c31af7Sopenharmony_ci CASE_DESC(createMultipleUniqueResourcesTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3673e5c31af7Sopenharmony_ci }; 3674e5c31af7Sopenharmony_ci // Multiple objects with per-object unique resources 3675e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "multiple_unique_resources", s_createMultipleUniqueResourcesGroup)); 3676e5c31af7Sopenharmony_ci 3677e5c31af7Sopenharmony_ci const CaseDescriptions s_createMultipleSharedResourcesGroup = 3678e5c31af7Sopenharmony_ci { 3679e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Instance), // No resources used 3680e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3681e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Device>, s_deviceCases, DE_NULL), 3682e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3683e5c31af7Sopenharmony_ci#else 3684e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Device), 3685e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DeviceGroup), 3686e5c31af7Sopenharmony_ci#endif 3687e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3688e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Buffer>, s_bufferCases, DE_NULL), 3689e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <BufferView>, s_bufferViewCases, DE_NULL), 3690e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Image>, s_imageCases, DE_NULL), 3691e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3692e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Semaphore>, s_semaphoreCases, DE_NULL), 3693e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Event>, s_eventCases, checkEventSupport), 3694e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Fence>, s_fenceCases, DE_NULL), 3695e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <QueryPool>, s_queryPoolCases, DE_NULL), 3696e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3697e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3698e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3699e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <RenderPass>, s_renderPassCases, DE_NULL), 3700e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3701e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3702e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3703e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Sampler>, s_samplerCases, DE_NULL), 3704e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3705e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <DescriptorSet>, s_descriptorSetCases, DE_NULL), 3706e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <Framebuffer>, s_framebufferCases, DE_NULL), 3707e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <CommandPool>, s_commandPoolCases, DE_NULL), 3708e5c31af7Sopenharmony_ci CASE_DESC(createMultipleSharedResourcesTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3709e5c31af7Sopenharmony_ci }; 3710e5c31af7Sopenharmony_ci // Multiple objects with shared resources 3711e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "multiple_shared_resources", s_createMultipleSharedResourcesGroup)); 3712e5c31af7Sopenharmony_ci 3713e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3714e5c31af7Sopenharmony_ci// Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL 3715e5c31af7Sopenharmony_ci const CaseDescriptions s_createMaxConcurrentGroup = 3716e5c31af7Sopenharmony_ci { 3717e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Instance>, s_instanceCases, DE_NULL), 3718e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Device>, s_deviceCases, DE_NULL), 3719e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3720e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3721e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Buffer>, s_bufferCases, DE_NULL), 3722e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <BufferView>, s_bufferViewCases, DE_NULL), 3723e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Image>, s_imageCases, DE_NULL), 3724e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3725e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Semaphore>, s_semaphoreCases, DE_NULL), 3726e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Event>, s_eventCases, checkEventSupport), 3727e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Fence>, s_fenceCases, DE_NULL), 3728e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <QueryPool>, s_queryPoolCases, DE_NULL), 3729e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3730e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3731e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3732e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <RenderPass>, s_renderPassCases, DE_NULL), 3733e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3734e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3735e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3736e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Sampler>, s_samplerCases, DE_NULL), 3737e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3738e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <DescriptorSet>, s_descriptorSetCases, DE_NULL), 3739e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <Framebuffer>, s_framebufferCases, DE_NULL), 3740e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <CommandPool>, s_commandPoolCases, DE_NULL), 3741e5c31af7Sopenharmony_ci CASE_DESC(createMaxConcurrentTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3742e5c31af7Sopenharmony_ci }; 3743e5c31af7Sopenharmony_ci // Maximum number of concurrently live objects 3744e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "max_concurrent", s_createMaxConcurrentGroup)); 3745e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3746e5c31af7Sopenharmony_ci 3747e5c31af7Sopenharmony_ci const CaseDescriptions s_multithreadedCreatePerThreadDeviceGroup = 3748e5c31af7Sopenharmony_ci { 3749e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Instance), // Does not make sense 3750e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Device), // Does not make sense 3751e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DeviceGroup), // Does not make sense 3752e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3753e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <Buffer>, s_bufferCases, DE_NULL), 3754e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <BufferView>, s_bufferViewCases, DE_NULL), 3755e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <Image>, s_imageCases, DE_NULL), 3756e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3757e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <Semaphore>, s_semaphoreCases, DE_NULL), 3758e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <Event>, s_eventCases, checkEventSupport), 3759e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <Fence>, s_fenceCases, DE_NULL), 3760e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <QueryPool>, s_queryPoolCases, DE_NULL), 3761e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3762e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3763e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3764e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <RenderPass>, s_renderPassCases, DE_NULL), 3765e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3766e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3767e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3768e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <Sampler>, s_samplerCases, DE_NULL), 3769e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3770e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <DescriptorSet>, s_descriptorSetCases, checkRecycleDescriptorSetMemorySupport), 3771e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <Framebuffer>, s_framebufferCases, DE_NULL), 3772e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <CommandPool>, s_commandPoolCases, DE_NULL), 3773e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadDeviceTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3774e5c31af7Sopenharmony_ci }; 3775e5c31af7Sopenharmony_ci // Multithreaded object construction with per-thread device 3776e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_device", s_multithreadedCreatePerThreadDeviceGroup)); 3777e5c31af7Sopenharmony_ci 3778e5c31af7Sopenharmony_ci const CaseDescriptions s_multithreadedCreatePerThreadResourcesGroup = 3779e5c31af7Sopenharmony_ci { 3780e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Instance>, s_instanceCases, DE_NULL), 3781e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Device>, s_deviceCases, DE_NULL), 3782e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3783e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3784e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Buffer>, s_bufferCases, DE_NULL), 3785e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <BufferView>, s_bufferViewCases, DE_NULL), 3786e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Image>, s_imageCases, DE_NULL), 3787e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3788e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Semaphore>, s_semaphoreCases, DE_NULL), 3789e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Event>, s_eventCases, checkEventSupport), 3790e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Fence>, s_fenceCases, DE_NULL), 3791e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <QueryPool>, s_queryPoolCases, DE_NULL), 3792e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3793e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3794e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3795e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <RenderPass>, s_renderPassCases, DE_NULL), 3796e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3797e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3798e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3799e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Sampler>, s_samplerCases, DE_NULL), 3800e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3801e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <DescriptorSet>, s_descriptorSetCases, checkRecycleDescriptorSetMemorySupport), 3802e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <Framebuffer>, s_framebufferCases, DE_NULL), 3803e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <CommandPool>, s_commandPoolCases, DE_NULL), 3804e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreatePerThreadResourcesTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3805e5c31af7Sopenharmony_ci }; 3806e5c31af7Sopenharmony_ci // Multithreaded object construction with per-thread resources 3807e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_resources", s_multithreadedCreatePerThreadResourcesGroup)); 3808e5c31af7Sopenharmony_ci 3809e5c31af7Sopenharmony_ci const CaseDescriptions s_multithreadedCreateSharedResourcesGroup = 3810e5c31af7Sopenharmony_ci { 3811e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Instance), 3812e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3813e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Device>, s_deviceCases, DE_NULL), 3814e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3815e5c31af7Sopenharmony_ci#else 3816e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Device), 3817e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DeviceGroup), 3818e5c31af7Sopenharmony_ci#endif 3819e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3820e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Buffer>, s_bufferCases, DE_NULL), 3821e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <BufferView>, s_bufferViewCases, DE_NULL), 3822e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Image>, s_imageCases, DE_NULL), 3823e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3824e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Semaphore>, s_semaphoreCases, DE_NULL), 3825e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Event>, s_eventCases, checkEventSupport), 3826e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Fence>, s_fenceCases, DE_NULL), 3827e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <QueryPool>, s_queryPoolCases, DE_NULL), 3828e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3829e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3830e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3831e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <RenderPass>, s_renderPassCases, DE_NULL), 3832e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3833e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3834e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3835e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Sampler>, s_samplerCases, DE_NULL), 3836e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3837e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DescriptorSet), // \note Needs per-thread DescriptorPool 3838e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <Framebuffer>, s_framebufferCases, DE_NULL), 3839e5c31af7Sopenharmony_ci CASE_DESC(multithreadedCreateSharedResourcesTest <CommandPool>, s_commandPoolCases, DE_NULL), 3840e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(CommandBuffer), // \note Needs per-thread CommandPool 3841e5c31af7Sopenharmony_ci }; 3842e5c31af7Sopenharmony_ci // Multithreaded object construction with shared resources 3843e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_shared_resources", s_multithreadedCreateSharedResourcesGroup)); 3844e5c31af7Sopenharmony_ci 3845e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3846e5c31af7Sopenharmony_ci 3847e5c31af7Sopenharmony_ci// Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL 3848e5c31af7Sopenharmony_ci const CaseDescriptions s_createSingleAllocCallbacksGroup = 3849e5c31af7Sopenharmony_ci { 3850e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Instance>, s_instanceCases, DE_NULL), 3851e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Device>, s_deviceCases, DE_NULL), 3852e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3853e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3854e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Buffer>, s_bufferCases, DE_NULL), 3855e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <BufferView>, s_bufferViewCases, DE_NULL), 3856e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Image>, s_imageCases, DE_NULL), 3857e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3858e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Semaphore>, s_semaphoreCases, DE_NULL), 3859e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Event>, s_eventCases, checkEventSupport), 3860e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Fence>, s_fenceCases, DE_NULL), 3861e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <QueryPool>, s_queryPoolCases, DE_NULL), 3862e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3863e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3864e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3865e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <RenderPass>, s_renderPassCases, DE_NULL), 3866e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3867e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3868e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3869e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Sampler>, s_samplerCases, DE_NULL), 3870e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3871e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <DescriptorSet>, s_descriptorSetCases, DE_NULL), 3872e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <Framebuffer>, s_framebufferCases, DE_NULL), 3873e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <CommandPool>, s_commandPoolCases, DE_NULL), 3874e5c31af7Sopenharmony_ci CASE_DESC(createSingleAllocCallbacksTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3875e5c31af7Sopenharmony_ci }; 3876e5c31af7Sopenharmony_ci // Create single object 3877e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "single_alloc_callbacks", s_createSingleAllocCallbacksGroup)); 3878e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3879e5c31af7Sopenharmony_ci 3880e5c31af7Sopenharmony_ci 3881e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3882e5c31af7Sopenharmony_ci // Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL 3883e5c31af7Sopenharmony_ci // \note Skip pooled objects in this test group. They are properly handled by the "multiple" group farther down below. 3884e5c31af7Sopenharmony_ci const CaseDescriptions s_allocCallbackFailGroup = 3885e5c31af7Sopenharmony_ci { 3886e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Instance>, s_instanceCases, DE_NULL), 3887e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Device>, s_deviceCases, DE_NULL), 3888e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <DeviceGroup>, s_deviceGroupCases, DE_NULL), 3889e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3890e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Buffer>, s_bufferCases, DE_NULL), 3891e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <BufferView>, s_bufferViewCases, DE_NULL), 3892e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Image>, s_imageCases, DE_NULL), 3893e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3894e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Semaphore>, s_semaphoreCases, DE_NULL), 3895e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Event>, s_eventCases, checkEventSupport), 3896e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Fence>, s_fenceCases, DE_NULL), 3897e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <QueryPool>, s_queryPoolCases, DE_NULL), 3898e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3899e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3900e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3901e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <RenderPass>, s_renderPassCases, DE_NULL), 3902e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3903e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3904e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3905e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Sampler>, s_samplerCases, DE_NULL), 3906e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3907e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DescriptorSet), 3908e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <Framebuffer>, s_framebufferCases, DE_NULL), 3909e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailTest <CommandPool>, s_commandPoolCases, DE_NULL), 3910e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(CommandBuffer), 3911e5c31af7Sopenharmony_ci }; 3912e5c31af7Sopenharmony_ci // Allocation callback failure 3913e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail", s_allocCallbackFailGroup)); 3914e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3915e5c31af7Sopenharmony_ci 3916e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3917e5c31af7Sopenharmony_ci // Removed from Vulkan SC test set: VkAllocationCallbacks is not supported and pointers to this type must be NULL 3918e5c31af7Sopenharmony_ci // \note Test objects that can be created in bulk 3919e5c31af7Sopenharmony_ci const CaseDescriptions s_allocCallbackFailMultipleObjectsGroup = 3920e5c31af7Sopenharmony_ci { 3921e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Instance), // most objects can be created one at a time only 3922e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Device), 3923e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DeviceGroup), 3924e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DeviceMemory), 3925e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Buffer), 3926e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(BufferView), 3927e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Image), 3928e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(ImageView), 3929e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Semaphore), 3930e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Event), 3931e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Fence), 3932e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(QueryPool), 3933e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(ShaderModule), 3934e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(PipelineCache), 3935e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(PipelineLayout), 3936e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(RenderPass), 3937e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailMultipleObjectsTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3938e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailMultipleObjectsTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3939e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DescriptorSetLayout), 3940e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Sampler), 3941e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DescriptorPool), 3942e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailMultipleObjectsTest <DescriptorSet>, s_descriptorSetCases, DE_NULL), 3943e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Framebuffer), 3944e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(CommandPool), 3945e5c31af7Sopenharmony_ci CASE_DESC(allocCallbackFailMultipleObjectsTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3946e5c31af7Sopenharmony_ci }; 3947e5c31af7Sopenharmony_ci // Allocation callback failure creating multiple objects with one call 3948e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail_multiple", s_allocCallbackFailMultipleObjectsGroup)); 3949e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3950e5c31af7Sopenharmony_ci 3951e5c31af7Sopenharmony_ci#ifndef CTS_USES_VULKANSC 3952e5c31af7Sopenharmony_ci // Removed from Vulkan SC test set: VK_EXT_private_data extension does not exist in Vulkan SC 3953e5c31af7Sopenharmony_ci const CaseDescriptions s_privateDataResourcesGroup = 3954e5c31af7Sopenharmony_ci { 3955e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Instance), // Does not make sense 3956e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(Device), // Device is tested in each object test 3957e5c31af7Sopenharmony_ci EMPTY_CASE_DESC(DeviceGroup), // Device is tested in each object test 3958e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <DeviceMemory>, s_deviceMemCases, DE_NULL), 3959e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <Buffer>, s_bufferCases, DE_NULL), 3960e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <BufferView>, s_bufferViewCases, DE_NULL), 3961e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <Image>, s_imageCases, DE_NULL), 3962e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <ImageView>, s_imageViewCases, checkImageCubeArraySupport), 3963e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <Semaphore>, s_semaphoreCases, DE_NULL), 3964e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <Event>, s_eventCases, checkEventSupport), 3965e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <Fence>, s_fenceCases, DE_NULL), 3966e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <QueryPool>, s_queryPoolCases, DE_NULL), 3967e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <ShaderModule>, s_shaderModuleCases, DE_NULL), 3968e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <PipelineCache>, s_pipelineCacheCases, DE_NULL), 3969e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <PipelineLayout>, s_pipelineLayoutCases, DE_NULL), 3970e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <RenderPass>, s_renderPassCases, DE_NULL), 3971e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <GraphicsPipeline>, s_graphicsPipelineCases, DE_NULL), 3972e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <ComputePipeline>, s_computePipelineCases, DE_NULL), 3973e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <DescriptorSetLayout>, s_descriptorSetLayoutCases, DE_NULL), 3974e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <Sampler>, s_samplerCases, DE_NULL), 3975e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <DescriptorPool>, s_descriptorPoolCases, DE_NULL), 3976e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <DescriptorSet>, s_descriptorSetCases, DE_NULL), 3977e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <Framebuffer>, s_framebufferCases, DE_NULL), 3978e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <CommandPool>, s_commandPoolCases, DE_NULL), 3979e5c31af7Sopenharmony_ci CASE_DESC(createPrivateDataTest <CommandBuffer>, s_commandBufferCases, DE_NULL), 3980e5c31af7Sopenharmony_ci }; 3981e5c31af7Sopenharmony_ci // Multiple objects with private data 3982e5c31af7Sopenharmony_ci objectMgmtTests->addChild(createTestGroup(testCtx, "private_data", createTests, s_privateDataResourcesGroup, cleanupGroup)); 3983e5c31af7Sopenharmony_ci#endif // CTS_USES_VULKANSC 3984e5c31af7Sopenharmony_ci 3985e5c31af7Sopenharmony_ci return objectMgmtTests.release(); 3986e5c31af7Sopenharmony_ci} 3987e5c31af7Sopenharmony_ci 3988e5c31af7Sopenharmony_ci} // api 3989e5c31af7Sopenharmony_ci} // vkt 3990