#ifndef _VKTMEMORYMODELSHAREDLAYOUTCASE_HPP #define _VKTMEMORYMODELSHAREDLAYOUTCASE_HPP /*------------------------------------------------------------------------ * Vulkan Conformance Tests * ------------------------ * * Copyright (c) 2021 The Khronos Group Inc. * Copyright (c) 2021 Google LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Shared memory layout tests. *//*--------------------------------------------------------------------*/ #include "vktTestCase.hpp" #include "tcuDefs.hpp" #include "gluShaderUtil.hpp" #include "gluVarType.hpp" #include "deRandom.hpp" #include "deSharedPtr.hpp" #include namespace vkt { namespace MemoryModel { typedef de::SharedPtr NamedStructSP; struct SharedStructVarEntry { SharedStructVarEntry(glu::DataType type_, int arraySize_) : type(type_), arraySize(arraySize_) {} glu::DataType type; int arraySize; }; struct SharedStructVar { std::string name; glu::VarType type; int arraySize; int topLevelArraySize; std::vector entries; // Contains all the values assigned to the variable. std::vector entryValues; }; class SharedStruct { public: typedef std::vector::iterator iterator; typedef std::vector::const_iterator const_iterator; SharedStruct (const std::string name, const std::string instanceName) : m_name(name), m_instanceName(instanceName) {} const std::string getName (void) const { return m_name; } const std::string getInstanceName (void) const { return m_instanceName; } void addMember (SharedStructVar var) { m_members.push_back(var); } int getNumMembers (void) { return static_cast(m_members.size()); } inline iterator begin (void) { return m_members.begin(); } inline const_iterator begin (void) const { return m_members.begin(); } inline iterator end (void) { return m_members.end(); } inline const_iterator end (void) const { return m_members.end(); } private: // Shared struct name std::string m_name; // Shared struct instance name std::string m_instanceName; // Contains the members of this struct. std::vector m_members; }; class ShaderInterface { public: ShaderInterface (void) {} ~ShaderInterface (void) {} SharedStruct& allocSharedObject (const std::string& name, const std::string& instanceName); NamedStructSP allocStruct (const std::string& name); std::vector& getStructs (void) { return m_structs; } int getNumStructs (void) { return static_cast(m_structs.size()); } int getNumSharedObjects (void) const { return static_cast(m_sharedMemoryObjects.size()); } std::vector& getSharedObjects (void) { return m_sharedMemoryObjects; } const std::vector& getSharedObjects (void) const { return m_sharedMemoryObjects; } void enable8BitTypes (bool enabled) { m_8BitTypesEnabled = enabled; } void enable16BitTypes (bool enabled) { m_16BitTypesEnabled = enabled; } bool is8BitTypesEnabled (void) const { return m_8BitTypesEnabled; } bool is16BitTypesEnabled (void) const { return m_16BitTypesEnabled; } private: ShaderInterface (const ShaderInterface&); ShaderInterface& operator= (const ShaderInterface&); std::vector m_structs; std::vector m_sharedMemoryObjects; bool m_8BitTypesEnabled; bool m_16BitTypesEnabled; }; class SharedLayoutCaseInstance : public TestInstance { public: SharedLayoutCaseInstance(Context& context) : TestInstance(context) {} virtual ~SharedLayoutCaseInstance(void) {} virtual tcu::TestStatus iterate(void); }; class SharedLayoutCase : public vkt::TestCase { public: SharedLayoutCase (tcu::TestContext& testCtx, const char* name, const char* description) : TestCase(testCtx, name, description) {} virtual ~SharedLayoutCase (void) {} virtual void delayedInit (void); virtual void initPrograms (vk::SourceCollections& programCollection) const; virtual TestInstance* createInstance (Context& context) const; virtual void checkSupport (Context& context) const; protected: ShaderInterface m_interface; std::string m_computeShaderSrc; private: SharedLayoutCase (const SharedLayoutCase&); SharedLayoutCase& operator= (const SharedLayoutCase&); }; class RandomSharedLayoutCase : public SharedLayoutCase { public: RandomSharedLayoutCase (tcu::TestContext& testCtx, const char* name, const char* description, deUint32 features, deUint32 seed); private: void generateSharedMemoryObject (de::Random& rnd); void generateSharedMemoryVar (de::Random& rnd, SharedStruct& object); glu::VarType generateType (de::Random& rnd, int typeDepth, bool arrayOk); deUint32 m_features; int m_maxArrayLength; deUint32 m_seed; const int m_maxSharedObjects = 3; const int m_maxSharedObjectMembers = 4; const int m_maxStructMembers = 3; }; } // MemoryModel } // vkt #endif // _VKTMEMORYMODELSHAREDLAYOUTCASE_HPP