166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski/*------------------------------------------------------------------------ 266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Vulkan Conformance Tests 366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * ------------------------ 466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * 566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Copyright (c) 2016 The Khronos Group Inc. 666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * 766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Licensed under the Apache License, Version 2.0 (the "License"); 866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * you may not use this file except in compliance with the License. 966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * You may obtain a copy of the License at 1066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * 1166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * http://www.apache.org/licenses/LICENSE-2.0 1266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * 1366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Unless required by applicable law or agreed to in writing, software 1466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * distributed under the License is distributed on an "AS IS" BASIS, 1566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * See the License for the specific language governing permissions and 1766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * limitations under the License. 1866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * 1966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *//*! 2066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * \file 2166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * \brief Pipeline specialization constants test utilities 2266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *//*--------------------------------------------------------------------*/ 2366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 2466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski#include "vktPipelineSpecConstantUtil.hpp" 2566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski#include "vkTypeUtil.hpp" 2666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski#include <vector> 2766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 2866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskinamespace vkt 2966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{ 3066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskinamespace pipeline 3166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{ 3266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskiusing namespace vk; 3366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 3466980a8d7f3440111c785bc782bfd9411364269aMaciej JesionowskiGraphicsPipelineBuilder& GraphicsPipelineBuilder::setShader (const DeviceInterface& vk, 3566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkDevice device, 3666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkShaderStageFlagBits stage, 3766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const ProgramBinary& binary, 3866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkSpecializationInfo* specInfo) 3966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{ 4066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VkShaderModule module; 4166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski switch (stage) 4266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 4366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski case (VK_SHADER_STAGE_VERTEX_BIT): 4466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_ASSERT(m_vertexShaderModule.get() == DE_NULL); 4566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski m_vertexShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0); 4666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski module = *m_vertexShaderModule; 4766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski break; 4866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 4966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski case (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT): 5066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_ASSERT(m_tessControlShaderModule.get() == DE_NULL); 5166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski m_tessControlShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0); 5266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski module = *m_tessControlShaderModule; 5366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski break; 5466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 5566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski case (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT): 5666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_ASSERT(m_tessEvaluationShaderModule.get() == DE_NULL); 5766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski m_tessEvaluationShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0); 5866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski module = *m_tessEvaluationShaderModule; 5966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski break; 6066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 6166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski case (VK_SHADER_STAGE_GEOMETRY_BIT): 6266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_ASSERT(m_geometryShaderModule.get() == DE_NULL); 6366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski m_geometryShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0); 6466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski module = *m_geometryShaderModule; 6566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski break; 6666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 6766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski case (VK_SHADER_STAGE_FRAGMENT_BIT): 6866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_ASSERT(m_fragmentShaderModule.get() == DE_NULL); 6966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski m_fragmentShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0); 7066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski module = *m_fragmentShaderModule; 7166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski break; 7266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 7366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski default: 7466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_FATAL("Invalid shader stage"); 7566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski return *this; 7666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski } 7766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 7866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineShaderStageCreateInfo pipelineShaderStageInfo = 7966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 8066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 8166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 8266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags; 8366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski stage, // VkShaderStageFlagBits stage; 8466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski module, // VkShaderModule module; 8566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski "main", // const char* pName; 8666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski specInfo, // const VkSpecializationInfo* pSpecializationInfo; 8766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 8866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 8966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski m_shaderStageFlags |= stage; 9066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski m_shaderStages.push_back(pipelineShaderStageInfo); 9166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 9266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski return *this; 9366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski} 9466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 9566980a8d7f3440111c785bc782bfd9411364269aMaciej JesionowskiMove<VkPipeline> GraphicsPipelineBuilder::build (const DeviceInterface& vk, 9666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkDevice device, 9766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineLayout pipelineLayout, 9866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkRenderPass renderPass) 9966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{ 10066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkVertexInputBindingDescription vertexInputBindingDescription = 10166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 10266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u, // uint32_t binding; 10366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski sizeof(tcu::Vec4), // uint32_t stride; // Vertex is a 4-element vector XYZW, position only 10466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate; 10566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 10666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 10766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkVertexInputAttributeDescription vertexInputAttributeDescription = 10866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 10966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u, // uint32_t location; 11066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u, // uint32_t binding; 11166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 11266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u, // uint32_t offset; 11366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 11466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 11566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo = 11666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 11766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 11866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 11966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineVertexInputStateCreateFlags)0, // VkPipelineVertexInputStateCreateFlags flags; 12066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 1u, // uint32_t vertexBindingDescriptionCount; 12166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 12266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 1u, // uint32_t vertexAttributeDescriptionCount; 12366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &vertexInputAttributeDescription, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 12466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 12566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 12666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPrimitiveTopology topology = (m_shaderStageFlags & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; 12766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo = 12866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 12966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType; 13066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 13166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineInputAssemblyStateCreateFlags)0, // VkPipelineInputAssemblyStateCreateFlags flags; 13266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski topology, // VkPrimitiveTopology topology; 13366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 primitiveRestartEnable; 13466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 13566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 13666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineTessellationStateCreateInfo pipelineTessellationStateInfo = 13766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 13866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, // VkStructureType sType; 13966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 14066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineTessellationStateCreateFlags)0, // VkPipelineTessellationStateCreateFlags flags; 14166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 3u, // uint32_t patchControlPoints; 14266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 14366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 14466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkViewport viewport = makeViewport( 14566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0.0f, 0.0f, 14666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski static_cast<float>(m_renderSize.x()), static_cast<float>(m_renderSize.y()), 14766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0.0f, 1.0f); 14866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 14966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkRect2D scissor = { 15066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski makeOffset2D(0, 0), 15166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski makeExtent2D(m_renderSize.x(), m_renderSize.y()), 15266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 15366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 15466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo = 15566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 15666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; 15766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 15866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineViewportStateCreateFlags)0, // VkPipelineViewportStateCreateFlags flags; 15966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 1u, // uint32_t viewportCount; 16066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &viewport, // const VkViewport* pViewports; 16166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 1u, // uint32_t scissorCount; 16266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &scissor, // const VkRect2D* pScissors; 16366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 16466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 16566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo = 16666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 16766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType; 16866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 16966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineRasterizationStateCreateFlags)0, // VkPipelineRasterizationStateCreateFlags flags; 17066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 depthClampEnable; 17166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 rasterizerDiscardEnable; 17266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode; 17366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_CULL_MODE_NONE, // VkCullModeFlags cullMode; 17466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace; 17566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 depthBiasEnable; 17666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0.0f, // float depthBiasConstantFactor; 17766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0.0f, // float depthBiasClamp; 17866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0.0f, // float depthBiasSlopeFactor; 17966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 1.0f, // float lineWidth; 18066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 18166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 18266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo = 18366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 18466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType; 18566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 18666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineMultisampleStateCreateFlags)0, // VkPipelineMultisampleStateCreateFlags flags; 18766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples; 18866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 sampleShadingEnable; 18966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0.0f, // float minSampleShading; 19066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const VkSampleMask* pSampleMask; 19166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 alphaToCoverageEnable; 19266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE // VkBool32 alphaToOneEnable; 19366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 19466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 19566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkStencilOpState stencilOpStateBasic = makeStencilOpState( 19666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STENCIL_OP_KEEP, // stencil fail 19766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STENCIL_OP_KEEP, // depth & stencil pass 19866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STENCIL_OP_KEEP, // depth only fail 19966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_COMPARE_OP_NEVER, // compare op 20066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u, // compare mask 20166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u, // write mask 20266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u); // reference 20366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 20466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo = 20566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 20666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType; 20766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 20866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineDepthStencilStateCreateFlags)0, // VkPipelineDepthStencilStateCreateFlags flags; 20966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 depthTestEnable; 21066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 depthWriteEnable; 21166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp; 21266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 depthBoundsTestEnable; 21366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 stencilTestEnable; 21466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski stencilOpStateBasic, // VkStencilOpState front; 21566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski stencilOpStateBasic, // VkStencilOpState back; 21666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0.0f, // float minDepthBounds; 21766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 1.0f, // float maxDepthBounds; 21866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 21966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 22066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; 22166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState = 22266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 22366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 blendEnable; 22466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor; 22566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor; 22666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp; 22766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor; 22866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor; 22966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp; 23066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski colorComponentsAll, // VkColorComponentFlags colorWriteMask; 23166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 23266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 23366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo = 23466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 23566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 23666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 23766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineColorBlendStateCreateFlags)0, // VkPipelineColorBlendStateCreateFlags flags; 23866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_FALSE, // VkBool32 logicOpEnable; 23966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 24066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 1u, // deUint32 attachmentCount; 24166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &pipelineColorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments; 24266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConstants[4]; 24366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 24466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 24566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkGraphicsPipelineCreateInfo graphicsPipelineInfo = 24666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski { 24766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; 24866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const void* pNext; 24966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags; 25066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski static_cast<deUint32>(m_shaderStages.size()), // deUint32 stageCount; 25166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &m_shaderStages[0], // const VkPipelineShaderStageCreateInfo* pStages; 25266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &vertexInputStateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; 25366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &pipelineInputAssemblyStateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; 25466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski (m_shaderStageFlags & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ? &pipelineTessellationStateInfo : DE_NULL), // const VkPipelineTessellationStateCreateInfo* pTessellationState; 25566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &pipelineViewportStateInfo, // const VkPipelineViewportStateCreateInfo* pViewportState; 25666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &pipelineRasterizationStateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState; 25766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &pipelineMultisampleStateInfo, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; 25866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &pipelineDepthStencilStateInfo, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; 25966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski &pipelineColorBlendStateInfo, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; 26066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState; 26166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski pipelineLayout, // VkPipelineLayout layout; 26266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski renderPass, // VkRenderPass renderPass; 26366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0u, // deUint32 subpass; 26466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski DE_NULL, // VkPipeline basePipelineHandle; 26566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 0, // deInt32 basePipelineIndex; 26666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski }; 26766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 26866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo); 26966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski} 27066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 271acac4e187ea3f08812cd101eba2abd760c602615Maciej JesionowskiMove<VkRenderPass> makeRenderPass (const DeviceInterface& vk, 272acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkDevice device, 273acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkFormat colorFormat) 274acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski{ 275acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkAttachmentDescription colorAttachmentDescription = 276acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski { 277acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; 278acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski colorFormat, // VkFormat format; 279acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 280acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 281acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 282acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 283acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 284acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; 285acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout; 286acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski }; 287acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 288acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkAttachmentReference colorAttachmentReference = 289acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski { 290acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 0u, // deUint32 attachment; 291acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout; 292acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski }; 293acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 294acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkAttachmentReference depthAttachmentReference = 295acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski { 296acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_ATTACHMENT_UNUSED, // deUint32 attachment; 297acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout layout; 298acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski }; 299acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 300acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkSubpassDescription subpassDescription = 301acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski { 302acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; 303acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 304acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 0u, // deUint32 inputAttachmentCount; 305acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL, // const VkAttachmentReference* pInputAttachments; 306acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 1u, // deUint32 colorAttachmentCount; 307acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; 308acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL, // const VkAttachmentReference* pResolveAttachments; 309acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; 310acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 0u, // deUint32 preserveAttachmentCount; 311acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL // const deUint32* pPreserveAttachments; 312acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski }; 313acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 314acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkRenderPassCreateInfo renderPassInfo = 315acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski { 316acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 317acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL, // const void* pNext; 318acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; 319acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 1u, // deUint32 attachmentCount; 320acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski &colorAttachmentDescription, // const VkAttachmentDescription* pAttachments; 321acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 1u, // deUint32 subpassCount; 322acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski &subpassDescription, // const VkSubpassDescription* pSubpasses; 323acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 0u, // deUint32 dependencyCount; 324acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL // const VkSubpassDependency* pDependencies; 325acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski }; 326acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 327acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski return createRenderPass(vk, device, &renderPassInfo); 328acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski} 329acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 330acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowskivoid beginRenderPass (const DeviceInterface& vk, 331acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkCommandBuffer commandBuffer, 332acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkRenderPass renderPass, 333acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkFramebuffer framebuffer, 334acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkRect2D& renderArea, 335acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const tcu::Vec4& clearColor) 336acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski{ 337acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkClearValue clearValue = makeClearValueColor(clearColor); 338acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 339acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkRenderPassBeginInfo renderPassBeginInfo = { 340acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 341acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL, // const void* pNext; 342acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski renderPass, // VkRenderPass renderPass; 343acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski framebuffer, // VkFramebuffer framebuffer; 344acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski renderArea, // VkRect2D renderArea; 345acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 1u, // uint32_t clearValueCount; 346acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski &clearValue, // const VkClearValue* pClearValues; 347acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski }; 348acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 349acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski vk.cmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); 350acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski} 351acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 352acac4e187ea3f08812cd101eba2abd760c602615Maciej JesionowskiVkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const VkFormat format, const VkImageUsageFlags usage) 353acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski{ 354acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski const VkImageCreateInfo imageInfo = 355acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski { 356acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 357acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL, // const void* pNext; 358acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski (VkImageCreateFlags)0, // VkImageCreateFlags flags; 359acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_IMAGE_TYPE_2D, // VkImageType imageType; 360acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski format, // VkFormat format; 361acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski makeExtent3D(size.x(), size.y(), 1), // VkExtent3D extent; 362acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 1u, // uint32_t mipLevels; 363acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 1u, // uint32_t arrayLayers; 364acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 365acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 366acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski usage, // VkImageUsageFlags usage; 367acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 368acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 0u, // uint32_t queueFamilyIndexCount; 369acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski DE_NULL, // const uint32_t* pQueueFamilyIndices; 370acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 371acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski }; 372acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski return imageInfo; 373acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski} 374acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski 37566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskivoid requireFeatures (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const FeatureFlags flags) 37666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{ 37766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice); 37866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 37966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski if (((flags & FEATURE_TESSELLATION_SHADER) != 0) && !features.tessellationShader) 38066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski throw tcu::NotSupportedError("Tessellation shader not supported"); 38166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 38266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski if (((flags & FEATURE_GEOMETRY_SHADER) != 0) && !features.geometryShader) 38366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski throw tcu::NotSupportedError("Geometry shader not supported"); 38466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 38566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski if (((flags & FEATURE_SHADER_FLOAT_64) != 0) && !features.shaderFloat64) 38666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski throw tcu::NotSupportedError("Double-precision floats not supported"); 38766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 38866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski if (((flags & FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS) != 0) && !features.vertexPipelineStoresAndAtomics) 38966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski throw tcu::NotSupportedError("SSBO and image writes not supported in vertex pipeline"); 39066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 39166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski if (((flags & FEATURE_FRAGMENT_STORES_AND_ATOMICS) != 0) && !features.fragmentStoresAndAtomics) 39266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski throw tcu::NotSupportedError("SSBO and image writes not supported in fragment shader"); 39366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski} 39466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski 39566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski} // pipeline 39666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski} // vkt 397