14f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal#ifndef _VKTSSBOLAYOUTCASE_HPP 24f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal#define _VKTSSBOLAYOUTCASE_HPP 34f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal/*------------------------------------------------------------------------ 44f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * Vulkan Conformance Tests 54f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * ------------------------ 64f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * 74f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * Copyright (c) 2015 The Khronos Group Inc. 84f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * Copyright (c) 2015 Samsung Electronics Co., Ltd. 94f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 134f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 154f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 20978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 214f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * 224f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal *//*! 234f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * \file 244f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal * \brief SSBO layout tests. 254f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal *//*--------------------------------------------------------------------*/ 264f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 27b7e19179f360dac21c36dbcbf366204d24376939Peter Gal#include "vktTestCase.hpp" 284f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal#include "tcuDefs.hpp" 294f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal#include "gluShaderUtil.hpp" 304f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal#include "gluVarType.hpp" 314f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 32b7e19179f360dac21c36dbcbf366204d24376939Peter Galnamespace vkt 334f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal{ 34d1f78adb5104f9f6cf274522f835ac10630c91d2Zoltan Janos Szabo 35b7e19179f360dac21c36dbcbf366204d24376939Peter Galnamespace ssbo 364f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal{ 374f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 384f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galenum BufferVarFlags 394f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal{ 40a69cb9ddb246aae91355ea0ca574c8cd85412280Peter Gal LAYOUT_STD140 = (1<<0), 4101b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal LAYOUT_STD430 = (1<<1), 4201b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal LAYOUT_ROW_MAJOR = (1<<2), 4301b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal LAYOUT_COLUMN_MAJOR = (1<<3), //!< \note Lack of both flags means column-major matrix. 4401b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal LAYOUT_MASK = LAYOUT_STD430|LAYOUT_STD140|LAYOUT_ROW_MAJOR|LAYOUT_COLUMN_MAJOR, 454f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 464f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal // \todo [2013-10-14 pyry] Investigate adding these. 4701b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal/* QUALIFIER_COHERENT = (1<<4), 4801b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal QUALIFIER_VOLATILE = (1<<5), 4901b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal QUALIFIER_RESTRICT = (1<<6), 5001b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal QUALIFIER_READONLY = (1<<7), 5101b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal QUALIFIER_WRITEONLY = (1<<8),*/ 52a69cb9ddb246aae91355ea0ca574c8cd85412280Peter Gal 5301b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal ACCESS_READ = (1<<9), //!< Buffer variable is read in the shader. 5401b0e6c691ace0a8968030b55dbcbfc72ede47d7Peter Gal ACCESS_WRITE = (1<<10), //!< Buffer variable is written in the shader. 554f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal}; 564f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 579b01773311a5de8a98aa072fb17debff52c1f1fbPyry Haulosenum MatrixLoadFlags 589b01773311a5de8a98aa072fb17debff52c1f1fbPyry Haulos{ 599b01773311a5de8a98aa072fb17debff52c1f1fbPyry Haulos LOAD_FULL_MATRIX = 0, 609b01773311a5de8a98aa072fb17debff52c1f1fbPyry Haulos LOAD_MATRIX_COMPONENTS = 1, 619b01773311a5de8a98aa072fb17debff52c1f1fbPyry Haulos}; 629b01773311a5de8a98aa072fb17debff52c1f1fbPyry Haulos 634f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galclass BufferVar 644f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal{ 654f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galpublic: 664f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal BufferVar (const char* name, const glu::VarType& type, deUint32 flags); 674f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 684f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal const char* getName (void) const { return m_name.c_str(); } 694f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal const glu::VarType& getType (void) const { return m_type; } 704f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal deUint32 getFlags (void) const { return m_flags; } 714f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 724f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galprivate: 734f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal std::string m_name; 744f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal glu::VarType m_type; 754f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal deUint32 m_flags; 764f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal}; 774f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 784f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galclass BufferBlock 794f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal{ 804f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galpublic: 814f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal typedef std::vector<BufferVar>::iterator iterator; 824f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal typedef std::vector<BufferVar>::const_iterator const_iterator; 834f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 844f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal BufferBlock (const char* blockName); 854f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 864f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal const char* getBlockName (void) const { return m_blockName.c_str(); } 874f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal const char* getInstanceName (void) const { return m_instanceName.empty() ? DE_NULL : m_instanceName.c_str(); } 884f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal bool isArray (void) const { return m_arraySize > 0; } 894f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal int getArraySize (void) const { return m_arraySize; } 904f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal deUint32 getFlags (void) const { return m_flags; } 914f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 924f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal void setInstanceName (const char* name) { m_instanceName = name; } 934f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal void setFlags (deUint32 flags) { m_flags = flags; } 944f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal void addMember (const BufferVar& var) { m_variables.push_back(var); } 954f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal void setArraySize (int arraySize); 964f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 974f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal int getLastUnsizedArraySize (int instanceNdx) const { return m_lastUnsizedArraySizes[instanceNdx]; } 984f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal void setLastUnsizedArraySize (int instanceNdx, int size) { m_lastUnsizedArraySizes[instanceNdx] = size; } 994f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1004f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal inline iterator begin (void) { return m_variables.begin(); } 1014f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal inline const_iterator begin (void) const { return m_variables.begin(); } 1024f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal inline iterator end (void) { return m_variables.end(); } 1034f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal inline const_iterator end (void) const { return m_variables.end(); } 1044f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1054f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galprivate: 1064f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal std::string m_blockName; 1074f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal std::string m_instanceName; 1084f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal std::vector<BufferVar> m_variables; 1094f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal int m_arraySize; //!< Array size or 0 if not interface block array. 1104f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal std::vector<int> m_lastUnsizedArraySizes; //!< Sizes of last unsized array element, can be different per instance. 1114f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal deUint32 m_flags; 1124f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal}; 1134f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1144f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galclass ShaderInterface 1154f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal{ 1164f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galpublic: 1174f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal ShaderInterface (void); 1184f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal ~ShaderInterface (void); 1194f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1204f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal glu::StructType& allocStruct (const char* name); 1214f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal const glu::StructType* findStruct (const char* name) const; 1224f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal void getNamedStructs (std::vector<const glu::StructType*>& structs) const; 1234f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1244f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal BufferBlock& allocBlock (const char* name); 1254f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1264f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal int getNumBlocks (void) const { return (int)m_bufferBlocks.size(); } 1274f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal const BufferBlock& getBlock (int ndx) const { return *m_bufferBlocks[ndx]; } 1284f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1294f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galprivate: 1304f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal ShaderInterface (const ShaderInterface&); 1314f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal ShaderInterface& operator= (const ShaderInterface&); 1324f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 1334f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal std::vector<glu::StructType*> m_structs; 1344f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal std::vector<BufferBlock*> m_bufferBlocks; 1354f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal}; 1364f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 137ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Galstruct BufferVarLayoutEntry 138ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal{ 139ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal BufferVarLayoutEntry (void) 140ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal : type (glu::TYPE_LAST) 141ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , blockNdx (-1) 142ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , offset (-1) 143ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , arraySize (-1) 144ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , arrayStride (-1) 145ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , matrixStride (-1) 146ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , topLevelArraySize (-1) 147ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , topLevelArrayStride (-1) 148ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , isRowMajor (false) 149ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal { 150ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal } 151ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 152ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal std::string name; 153ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal glu::DataType type; 154ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int blockNdx; 155ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int offset; 156ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int arraySize; 157ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int arrayStride; 158ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int matrixStride; 159ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int topLevelArraySize; 160ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int topLevelArrayStride; 161ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal bool isRowMajor; 162ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal}; 163ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 164ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Galstruct BlockLayoutEntry 165ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal{ 166ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal BlockLayoutEntry (void) 167ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal : size(0) 168ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal { 169ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal } 170ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 171ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal std::string name; 172ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int size; 173ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal std::vector<int> activeVarIndices; 174ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal}; 175ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 176ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Galclass BufferLayout 177ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal{ 178ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Galpublic: 179ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal std::vector<BlockLayoutEntry> blocks; 180ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal std::vector<BufferVarLayoutEntry> bufferVars; 181ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 182ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int getVariableIndex (const std::string& name) const; 183ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int getBlockIndex (const std::string& name) const; 184ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal}; 185ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 186ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal// BlockDataPtr 187ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 188ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Galstruct BlockDataPtr 189ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal{ 190ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal void* ptr; 191ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int size; //!< Redundant, for debugging purposes. 192ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal int lastUnsizedArraySize; 193ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 194ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal BlockDataPtr (void* ptr_, int size_, int lastUnsizedArraySize_) 195ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal : ptr (ptr_) 196ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , size (size_) 197ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , lastUnsizedArraySize (lastUnsizedArraySize_) 198ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal { 199ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal } 200ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 201ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal BlockDataPtr (void) 202ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal : ptr (DE_NULL) 203ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , size (0) 204ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal , lastUnsizedArraySize (0) 205ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal { 206ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal } 207ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal}; 208ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal 209ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Galstruct RefDataStorage 210ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal{ 211ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal std::vector<deUint8> data; 212ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal std::vector<BlockDataPtr> pointers; 213ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal}; 2144f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 215b7e19179f360dac21c36dbcbf366204d24376939Peter Galclass SSBOLayoutCase : public vkt::TestCase 2164f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal{ 2174f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galpublic: 2184f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal enum BufferMode 2194f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal { 2204f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal BUFFERMODE_SINGLE = 0, //!< Single buffer shared between uniform blocks. 2214f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal BUFFERMODE_PER_BLOCK, //!< Per-block buffers 2224f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 2234f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal BUFFERMODE_LAST 2244f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal }; 2254f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 226d1f78adb5104f9f6cf274522f835ac10630c91d2Zoltan Janos Szabo SSBOLayoutCase (tcu::TestContext& testCtx, const char* name, const char* description, BufferMode bufferMode, MatrixLoadFlags matrixLoadFlag); 227b7e19179f360dac21c36dbcbf366204d24376939Peter Gal virtual ~SSBOLayoutCase (void); 2284f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 229b7e19179f360dac21c36dbcbf366204d24376939Peter Gal virtual void initPrograms (vk::SourceCollections& programCollection) const; 230b7e19179f360dac21c36dbcbf366204d24376939Peter Gal virtual TestInstance* createInstance (Context& context) const; 2314f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 2324f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galprotected: 233d1f78adb5104f9f6cf274522f835ac10630c91d2Zoltan Janos Szabo void init (void); 234b7e19179f360dac21c36dbcbf366204d24376939Peter Gal 2354f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal BufferMode m_bufferMode; 236b7e19179f360dac21c36dbcbf366204d24376939Peter Gal ShaderInterface m_interface; 237d1f78adb5104f9f6cf274522f835ac10630c91d2Zoltan Janos Szabo MatrixLoadFlags m_matrixLoadFlag; 2384f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 2394f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Galprivate: 2404f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal SSBOLayoutCase (const SSBOLayoutCase&); 2414f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal SSBOLayoutCase& operator= (const SSBOLayoutCase&); 242b7e19179f360dac21c36dbcbf366204d24376939Peter Gal 243ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal BufferLayout m_refLayout; 244ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal RefDataStorage m_initialData; // Initial data stored in buffer. 245ba1052444e1c4c3fa6442e60f842f52f1062c49dPeter Gal RefDataStorage m_writeData; // Data written by compute shader. 246b7e19179f360dac21c36dbcbf366204d24376939Peter Gal std::string m_computeShaderSrc; 2474f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal}; 2484f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 249b7e19179f360dac21c36dbcbf366204d24376939Peter Gal} // ssbo 250b7e19179f360dac21c36dbcbf366204d24376939Peter Gal} // vkt 2514f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal 2524f9bf161ec8d735ed2afdfa4aa7b8f86b02351bdPeter Gal#endif // _VKTSSBOLAYOUTCASE_HPP 253