1 #ifndef _VKTPIPELINEMULTISAMPLEBASE_HPP 2 #define _VKTPIPELINEMULTISAMPLEBASE_HPP 3 /*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2016 The Khronos Group Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file vktPipelineMultisampleBase.hpp 23 * \brief Multisample Tests Base Classes 24 *//*--------------------------------------------------------------------*/ 25 26 #include "vktPipelineMultisampleTestsUtil.hpp" 27 #include "vktTestCase.hpp" 28 #include "tcuVector.hpp" 29 30 namespace vkt 31 { 32 namespace pipeline 33 { 34 namespace multisample 35 { 36 37 struct ImageMSParams 38 { 39 ImageMSParams(const vk::VkSampleCountFlagBits samples, const tcu::UVec3& size) : numSamples(samples), imageSize(size) {} 40 41 vk::VkSampleCountFlagBits numSamples; 42 tcu::UVec3 imageSize; 43 }; 44 45 class MultisampleCaseBase : public TestCase 46 { 47 public: 48 MultisampleCaseBase (tcu::TestContext& testCtx, 49 const std::string& name, 50 const ImageMSParams& imageMSParams) 51 : TestCase(testCtx, name, "") 52 , m_imageMSParams(imageMSParams) 53 {} 54 55 protected: 56 const ImageMSParams m_imageMSParams; 57 }; 58 59 typedef MultisampleCaseBase* (*MultisampleCaseFuncPtr)(tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams); 60 61 class MultisampleInstanceBase : public TestInstance 62 { 63 public: 64 MultisampleInstanceBase (Context& context, 65 const ImageMSParams& imageMSParams) 66 : TestInstance (context) 67 , m_imageMSParams (imageMSParams) 68 , m_imageType (IMAGE_TYPE_2D) 69 , m_imageFormat (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8)) 70 {} 71 72 typedef std::vector<vk::VkVertexInputAttributeDescription> VertexAttribDescVec; 73 74 struct VertexDataDesc 75 { 76 vk::VkPrimitiveTopology primitiveTopology; 77 deUint32 verticesCount; 78 deUint32 dataStride; 79 vk::VkDeviceSize dataSize; 80 VertexAttribDescVec vertexAttribDescVec; 81 }; 82 83 protected: 84 85 void validateImageSize (const vk::InstanceInterface& instance, 86 const vk::VkPhysicalDevice physicalDevice, 87 const ImageType imageType, 88 const tcu::UVec3& imageSize) const; 89 90 void validateImageFeatureFlags (const vk::InstanceInterface& instance, 91 const vk::VkPhysicalDevice physicalDevice, 92 const vk::VkFormat format, 93 const vk::VkFormatFeatureFlags featureFlags) const; 94 95 void validateImageInfo (const vk::InstanceInterface& instance, 96 const vk::VkPhysicalDevice physicalDevice, 97 const vk::VkImageCreateInfo& imageInfo) const; 98 99 virtual VertexDataDesc getVertexDataDescripton (void) const = 0; 100 101 virtual void uploadVertexData (const vk::Allocation& vertexBufferAllocation, 102 const VertexDataDesc& vertexDataDescripton) const = 0; 103 protected: 104 const ImageMSParams m_imageMSParams; 105 const ImageType m_imageType; 106 const tcu::TextureFormat m_imageFormat; 107 }; 108 109 } // multisample 110 111 template <class CaseClass> 112 tcu::TestCaseGroup* makeMSGroup (tcu::TestContext& testCtx, 113 const std::string groupName, 114 const tcu::UVec3 imageSizes[], 115 const deUint32 imageSizesElemCount, 116 const vk::VkSampleCountFlagBits imageSamples[], 117 const deUint32 imageSamplesElemCount) 118 { 119 de::MovePtr<tcu::TestCaseGroup> caseGroup(new tcu::TestCaseGroup(testCtx, groupName.c_str(), "")); 120 121 for (deUint32 imageSizeNdx = 0u; imageSizeNdx < imageSizesElemCount; ++imageSizeNdx) 122 { 123 const tcu::UVec3 imageSize = imageSizes[imageSizeNdx]; 124 std::ostringstream imageSizeStream; 125 126 imageSizeStream << imageSize.x() << "_" << imageSize.y() << "_" << imageSize.z(); 127 128 de::MovePtr<tcu::TestCaseGroup> sizeGroup(new tcu::TestCaseGroup(testCtx, imageSizeStream.str().c_str(), "")); 129 130 for (deUint32 imageSamplesNdx = 0u; imageSamplesNdx < imageSamplesElemCount; ++imageSamplesNdx) 131 { 132 const vk::VkSampleCountFlagBits samples = imageSamples[imageSamplesNdx]; 133 const multisample::ImageMSParams imageMSParams = multisample::ImageMSParams(samples, imageSize); 134 135 sizeGroup->addChild(CaseClass::createCase(testCtx, "samples_" + de::toString(samples), imageMSParams)); 136 } 137 138 caseGroup->addChild(sizeGroup.release()); 139 } 140 return caseGroup.release(); 141 } 142 143 } // pipeline 144 } // vkt 145 146 #endif // _VKTPIPELINEMULTISAMPLEBASE_HPP 147