vktApiSmokeTests.cpp revision 3d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410
134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos/*------------------------------------------------------------------------- 234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * Vulkan Conformance Tests 334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * ------------------------ 434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * 534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * Copyright (c) 2015 Google Inc. 634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * 7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 1034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 1834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * 1934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *//*! 2034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * \file 2134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos * \brief Simple Smoke Tests 2234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos *//*--------------------------------------------------------------------*/ 2334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 2434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vktApiTests.hpp" 2534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 2634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vktTestCaseUtil.hpp" 2734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 2834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkDefs.hpp" 2934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkPlatform.hpp" 3034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkStrUtil.hpp" 3134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkRef.hpp" 3234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkRefUtil.hpp" 3334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkQueryUtil.hpp" 3434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkMemUtil.hpp" 3534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkDeviceUtil.hpp" 3634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "vkPrograms.hpp" 370ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos#include "vkTypeUtil.hpp" 384ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "vkImageUtil.hpp" 3934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 4034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "tcuTestLog.hpp" 4134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "tcuFormatUtil.hpp" 424ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "tcuTextureUtil.hpp" 434ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "tcuImageCompare.hpp" 444ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 454ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos#include "rrRenderer.hpp" 4634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 4734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos#include "deUniquePtr.hpp" 4834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 4934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosnamespace vkt 5034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 5134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosnamespace api 5234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 5334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 5434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosnamespace 5534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 5634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 5734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing namespace vk; 5834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing std::vector; 5934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing tcu::TestLog; 6034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulosusing de::UniquePtr; 6134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 6234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestStatus createSamplerTest (Context& context) 6334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 6434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkDevice vkDevice = context.getDevice(); 6534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const DeviceInterface& vk = context.getDeviceInterface(); 6634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 6734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 6834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const struct VkSamplerCreateInfo samplerInfo = 6934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 7068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // sType 7168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 7268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 7368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FILTER_NEAREST, // magFilter 7468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FILTER_NEAREST, // minFilter 75689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_SAMPLER_MIPMAP_MODE_NEAREST, // mipmapMode 7668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // addressModeU 7768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // addressModeV 7868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // addressModeW 7968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // mipLodBias 80689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_FALSE, // anisotropyEnable 810aeee78a8c5276964d855b097b91059daa3fd79aPyry Haulos 1.0f, // maxAnisotropy 8268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FALSE, // compareEnable 8368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPARE_OP_ALWAYS, // compareOp 8468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // minLod 8568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // maxLod 8668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, // borderColor 8768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // unnormalizedCoords 8834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 8934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 9034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos Move<VkSampler> tmpSampler = createSampler(vk, vkDevice, &samplerInfo); 9134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos Move<VkSampler> tmp2Sampler; 9234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 9334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos tmp2Sampler = tmpSampler; 9434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 9534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkSampler> sampler (tmp2Sampler); 9634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 9734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 9834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos return tcu::TestStatus::pass("Creating sampler succeeded"); 9934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} 10034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 1017485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid createShaderProgs (SourceCollections& dst) 10234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 1037485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn dst.glslSources.add("test") << glu::VertexSource( 104fd7944ef801e5be2e9883c4acc6c9d826574e743Csaba Osztrogonác "#version 310 es\n" 10534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos "in highp vec4 a_position;\n" 10634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos "void main (void) { gl_Position = a_position; }\n"); 10734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} 10834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 10934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestStatus createShaderModuleTest (Context& context) 11034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 11134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkDevice vkDevice = context.getDevice(); 11234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const DeviceInterface& vk = context.getDeviceInterface(); 11334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkShaderModule> shader (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("test"), 0)); 11434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 11534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos return tcu::TestStatus::pass("Creating shader module succeeded"); 11634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} 11734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 1187485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid createTriangleAsmProgs (SourceCollections& dst) 11934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 1207485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn dst.spirvAsmSources.add("vert") << 1217485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpCapability Shader\n" 1227485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%1 = OpExtInstImport \"GLSL.std.450\"\n" 1237485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpMemoryModel Logical GLSL450\n" 12421c0fb00ba42f8077fe62868301cf0be711d8147Lei Zhang " OpEntryPoint Vertex %4 \"main\" %10 %12 %16 %17\n" 1258e061635437aa8a4d572a585d400378eb43fcfbeDae Kim " OpSource ESSL 300\n" 1267485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpName %4 \"main\"\n" 1277485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpName %10 \"gl_Position\"\n" 1287485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpName %12 \"a_position\"\n" 129a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn " OpName %16 \"gl_VertexIndex\"\n" 130a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn " OpName %17 \"gl_InstanceIndex\"\n" 1317485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpDecorate %10 BuiltIn Position\n" 1327485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpDecorate %12 Location 0\n" 133a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn " OpDecorate %16 BuiltIn VertexIndex\n" 134a0cfd75ba580cdd649b82211875371f8a2959a27Andrew Woloszyn " OpDecorate %17 BuiltIn InstanceIndex\n" 1357485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%2 = OpTypeVoid\n" 1367485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%3 = OpTypeFunction %2\n" 1377485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%7 = OpTypeFloat 32\n" 1387485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%8 = OpTypeVector %7 4\n" 1397485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%9 = OpTypePointer Output %8\n" 1407485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%10 = OpVariable %9 Output\n" 1417485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%11 = OpTypePointer Input %8\n" 1427485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%12 = OpVariable %11 Input\n" 1437485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%14 = OpTypeInt 32 1\n" 1447485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%15 = OpTypePointer Input %14\n" 1457485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%16 = OpVariable %15 Input\n" 1467485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%17 = OpVariable %15 Input\n" 1477485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%4 = OpFunction %2 None %3\n" 1487485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%5 = OpLabel\n" 1497485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%13 = OpLoad %8 %12\n" 1507485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpStore %10 %13\n" 1517485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpBranch %6\n" 1527485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%6 = OpLabel\n" 1537485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpReturn\n" 1547485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpFunctionEnd\n"; 1557485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn dst.spirvAsmSources.add("frag") << 1567485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpCapability Shader\n" 1577485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%1 = OpExtInstImport \"GLSL.std.450\"\n" 1587485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpMemoryModel Logical GLSL450\n" 15921c0fb00ba42f8077fe62868301cf0be711d8147Lei Zhang " OpEntryPoint Fragment %4 \"main\" %10\n" 1607485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpExecutionMode %4 OriginLowerLeft\n" 1618e061635437aa8a4d572a585d400378eb43fcfbeDae Kim " OpSource ESSL 300\n" 1627485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpName %4 \"main\"\n" 1637485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpName %10 \"o_color\"\n" 1647485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpDecorate %10 RelaxedPrecision\n" 1657485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpDecorate %10 Location 0\n" 1667485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%2 = OpTypeVoid\n" 1677485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%3 = OpTypeFunction %2\n" 1687485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%7 = OpTypeFloat 32\n" 1697485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%8 = OpTypeVector %7 4\n" 1707485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%9 = OpTypePointer Output %8\n" 1717485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%10 = OpVariable %9 Output\n" 1727485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%11 = OpConstant %7 1065353216\n" 1737485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%12 = OpConstant %7 0\n" 1747485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%13 = OpConstantComposite %8 %11 %12 %11 %11\n" 1757485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%4 = OpFunction %2 None %3\n" 1767485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%5 = OpLabel\n" 1777485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpStore %10 %13\n" 1787485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpBranch %6\n" 1797485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn "%6 = OpLabel\n" 1807485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpReturn\n" 1817485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn " OpFunctionEnd\n"; 1827485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn} 1837485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn 1847485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszynvoid createTriangleProgs (SourceCollections& dst) 1857485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn{ 1867485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn dst.glslSources.add("vert") << glu::VertexSource( 187fd7944ef801e5be2e9883c4acc6c9d826574e743Csaba Osztrogonác "#version 310 es\n" 18834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos "layout(location = 0) in highp vec4 a_position;\n" 18934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos "void main (void) { gl_Position = a_position; }\n"); 1907485f0bbab69ed556d54503e8f94bedc5b71175dAndrew Woloszyn dst.glslSources.add("frag") << glu::FragmentSource( 191fd7944ef801e5be2e9883c4acc6c9d826574e743Csaba Osztrogonác "#version 310 es\n" 19234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos "layout(location = 0) out lowp vec4 o_color;\n" 19334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos "void main (void) { o_color = vec4(1.0, 0.0, 1.0, 1.0); }\n"); 19434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} 19534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 1964ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosclass RefVertexShader : public rr::VertexShader 1974ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{ 1984ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulospublic: 1994ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos RefVertexShader (void) 2004ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos : rr::VertexShader(1, 0) 2014ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2024ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos m_inputs[0].type = rr::GENERICVECTYPE_FLOAT; 2034ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 2044ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 2054ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const 2064ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2074ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 2084ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2094ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos packets[packetNdx]->position = rr::readVertexAttribFloat(inputs[0], 2104ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos packets[packetNdx]->instanceNdx, 2114ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos packets[packetNdx]->vertexNdx); 2124ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 2134ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 2144ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos}; 2154ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 2164ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosclass RefFragmentShader : public rr::FragmentShader 2174ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{ 2184ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulospublic: 2194ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos RefFragmentShader (void) 2204ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos : rr::FragmentShader(0, 1) 2214ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2224ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos m_outputs[0].type = rr::GENERICVECTYPE_FLOAT; 2234ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 2244ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 2254ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos void shadeFragments (rr::FragmentPacket*, const int numPackets, const rr::FragmentShadingContext& context) const 2264ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2274ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx) 2284ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2294ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos for (int fragNdx = 0; fragNdx < rr::NUM_FRAGMENTS_PER_PACKET; ++fragNdx) 2304ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2314ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, tcu::Vec4(1.0f, 0.0f, 1.0f, 1.0f)); 2324ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 2334ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 2344ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 2354ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos}; 2364ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 2374ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulosvoid renderReferenceTriangle (const tcu::PixelBufferAccess& dst, const tcu::Vec4 (&vertices)[3]) 2384ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos{ 2394ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const RefVertexShader vertShader; 2404ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const RefFragmentShader fragShader; 2414ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const rr::Program program (&vertShader, &fragShader); 2424ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const rr::MultisamplePixelBufferAccess colorBuffer = rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(dst); 2434ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const rr::RenderTarget renderTarget (colorBuffer); 2444ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const rr::RenderState renderState ((rr::ViewportState(colorBuffer))); 2454ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const rr::Renderer renderer; 2464ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const rr::VertexAttrib vertexAttribs[] = 2474ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 2484ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos rr::VertexAttrib(rr::VERTEXATTRIBTYPE_FLOAT, 4, sizeof(tcu::Vec4), 0, vertices[0].getPtr()) 2494ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos }; 2504ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 2514ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos renderer.draw(rr::DrawCommand(renderState, 2524ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos renderTarget, 2534ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos program, 2544ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos DE_LENGTH_OF_ARRAY(vertexAttribs), 2554ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos &vertexAttribs[0], 2564ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos rr::PrimitiveList(rr::PRIMITIVETYPE_TRIANGLES, DE_LENGTH_OF_ARRAY(vertices), 0))); 2574ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos} 2584ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 25934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestStatus renderTriangleTest (Context& context) 26034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 26134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkDevice vkDevice = context.getDevice(); 26234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const DeviceInterface& vk = context.getDeviceInterface(); 26334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkQueue queue = context.getUniversalQueue(); 26434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 26534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())); 26634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const tcu::IVec2 renderSize (256, 256); 2674ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const VkFormat colorFormat = VK_FORMAT_R8G8B8A8_UNORM; 2684ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const tcu::Vec4 clearColor (0.125f, 0.25f, 0.75f, 1.0f); 26934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 27034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const tcu::Vec4 vertices[] = 27134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 27234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f), 27334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f), 27434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f) 27534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 27634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 27734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkBufferCreateInfo vertexBufferParams = 27834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 27968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // sType 28068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 28168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 28268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkDeviceSize)sizeof(vertices), // size 28368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // usage 28468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHARING_MODE_EXCLUSIVE, // sharingMode 28568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // queueFamilyIndexCount 28668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &queueFamilyIndex, // pQueueFamilyIndices 28734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 28834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkBuffer> vertexBuffer (createBuffer(vk, vkDevice, &vertexBufferParams)); 28934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const UniquePtr<Allocation> vertexBufferMemory (memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible)); 29034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 29134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset())); 29234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 29334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkDeviceSize imageSizeBytes = (VkDeviceSize)(sizeof(deUint32)*renderSize.x()*renderSize.y()); 29434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkBufferCreateInfo readImageBufferParams = 29534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 29668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // sType 29768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 29868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkBufferCreateFlags)0u, // flags 29968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos imageSizeBytes, // size 30068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BUFFER_USAGE_TRANSFER_DST_BIT, // usage 30168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHARING_MODE_EXCLUSIVE, // sharingMode 30268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // queueFamilyIndexCount 30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &queueFamilyIndex, // pQueueFamilyIndices 30434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 30534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkBuffer> readImageBuffer (createBuffer(vk, vkDevice, &readImageBufferParams)); 30634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const UniquePtr<Allocation> readImageBufferMemory (memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible)); 30734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 30834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset())); 30934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 31034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkImageCreateInfo imageParams = 31134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 31268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType 31368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 31468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 31568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TYPE_2D, // imageType 31668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, // format 317689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { (deUint32)renderSize.x(), (deUint32)renderSize.y(), 1 }, // extent 31868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // mipLevels 31968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // arraySize 32068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, // samples 32168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TILING_OPTIMAL, // tiling 32268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // usage 32368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHARING_MODE_EXCLUSIVE, // sharingMode 32468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // queueFamilyIndexCount 32568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &queueFamilyIndex, // pQueueFamilyIndices 32668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_UNDEFINED, // initialLayout 32734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 32834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 32934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkImage> image (createImage(vk, vkDevice, &imageParams)); 33034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const UniquePtr<Allocation> imageMemory (memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any)); 33134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 33234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.bindImageMemory(vkDevice, *image, imageMemory->getMemory(), imageMemory->getOffset())); 33334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 33434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkAttachmentDescription colorAttDesc = 33534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 33668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 33768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, // format 33868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, // samples 33968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ATTACHMENT_LOAD_OP_CLEAR, // loadOp 34068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ATTACHMENT_STORE_OP_STORE, // storeOp 34168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ATTACHMENT_LOAD_OP_DONT_CARE, // stencilLoadOp 34268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ATTACHMENT_STORE_OP_DONT_CARE, // stencilStoreOp 34368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // initialLayout 34468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // finalLayout 34534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 34634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkAttachmentReference colorAttRef = 34734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 34868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // attachment 34968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // layout 35034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 35134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkSubpassDescription subpassDesc = 35234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 35368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkSubpassDescriptionFlags)0u, // flags 35468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint 35568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // inputAttachmentCount 35668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pInputAttachments 35768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // colorAttachmentCount 35868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &colorAttRef, // pColorAttachments 35968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pResolveAttachments 36068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // depthStencilAttachment 36168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // preserveAttachmentCount 36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pPreserveAttachments 36334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 36434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkRenderPassCreateInfo renderPassParams = 36534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 36668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // sType 36768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 36868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 36968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // attachmentCount 37068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &colorAttDesc, // pAttachments 37168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // subpassCount 37268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &subpassDesc, // pSubpasses 37368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // dependencyCount 37468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pDependencies 37534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 37634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkRenderPass> renderPass (createRenderPass(vk, vkDevice, &renderPassParams)); 37734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 3783d2071b82061ee418aa87064333069281133eddaPyry Haulos const VkImageViewCreateInfo colorAttViewParams = 37934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 38068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // sType 38168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 38268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 38368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *image, // image 38468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_VIEW_TYPE_2D, // viewType 38568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, // format 3863d2071b82061ee418aa87064333069281133eddaPyry Haulos { 38768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_R, 38868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_G, 38968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_B, 39068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_A 39168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // components 3923d2071b82061ee418aa87064333069281133eddaPyry Haulos { 39368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 39468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseMipLevel 39568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // levelCount 39668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 39768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 39868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // subresourceRange 39934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 4003d2071b82061ee418aa87064333069281133eddaPyry Haulos const Unique<VkImageView> colorAttView (createImageView(vk, vkDevice, &colorAttViewParams)); 40134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 40234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos // Pipeline layout 40334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineLayoutCreateInfo pipelineLayoutParams = 40434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 40568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType 40668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 40768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (vk::VkPipelineLayoutCreateFlags)0, 40868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // setLayoutCount 40968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pSetLayouts 41068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // pushConstantRangeCount 41168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pPushConstantRanges 41234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 41334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkPipelineLayout> pipelineLayout (createPipelineLayout(vk, vkDevice, &pipelineLayoutParams)); 41434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 41568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos // Shaders 41668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkShaderModule> vertShaderModule (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("vert"), 0)); 41768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkShaderModule> fragShaderModule (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("frag"), 0)); 41868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 41934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos // Pipeline 42034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkSpecializationInfo emptyShaderSpecParams = 42134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 42268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // mapEntryCount 42368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pMap 42468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // dataSize 42568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pData 42634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 42734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineShaderStageCreateInfo shaderStageParams[] = 42834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 42934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 43068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 43168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 43268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 43368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_VERTEX_BIT, // stage 43468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *vertShaderModule, // module 43568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", // pName 43668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &emptyShaderSpecParams, // pSpecializationInfo 43734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }, 43834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 43968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 44068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 44168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 44268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_FRAGMENT_BIT, // stage 44368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *fragShaderModule, // module 44468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", // pName 44568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &emptyShaderSpecParams, // pSpecializationInfo 44634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 44734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 44834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineDepthStencilStateCreateInfo depthStencilParams = 44934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 45068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // sType 45168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 45268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 45368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FALSE, // depthTestEnable 45468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FALSE, // depthWriteEnable 45568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPARE_OP_ALWAYS, // depthCompareOp 45668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FALSE, // depthBoundsTestEnable 45768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FALSE, // stencilTestEnable 45834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 45968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STENCIL_OP_KEEP, // failOp 46068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STENCIL_OP_KEEP, // passOp 46168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STENCIL_OP_KEEP, // depthFailOp 46268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPARE_OP_ALWAYS, // compareOp 46368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // compareMask 46468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // writeMask 46568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // reference 46668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // front 46734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 46868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STENCIL_OP_KEEP, // failOp 46968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STENCIL_OP_KEEP, // passOp 47068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STENCIL_OP_KEEP, // depthFailOp 47168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPARE_OP_ALWAYS, // compareOp 47268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // compareMask 47368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // writeMask 47468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // reference 47568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // back; 4763d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 0.0f, // float minDepthBounds; 4773d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 1.0f, // float maxDepthBounds; 4783d2071b82061ee418aa87064333069281133eddaPyry Haulos }; 4793d2071b82061ee418aa87064333069281133eddaPyry Haulos const VkViewport viewport0 = 4803d2071b82061ee418aa87064333069281133eddaPyry Haulos { 48168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // x 48268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // y 48368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (float)renderSize.x(), // width 48468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (float)renderSize.y(), // height 48568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // minDepth 48668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1.0f, // maxDepth 4873d2071b82061ee418aa87064333069281133eddaPyry Haulos }; 4883d2071b82061ee418aa87064333069281133eddaPyry Haulos const VkRect2D scissor0 = 4893d2071b82061ee418aa87064333069281133eddaPyry Haulos { 4903d2071b82061ee418aa87064333069281133eddaPyry Haulos { 49168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // x 49268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // y 49368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // offset 4943d2071b82061ee418aa87064333069281133eddaPyry Haulos { 495689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)renderSize.x(), // width 496689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)renderSize.y(), // height 49768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // extent; 49834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 49934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineViewportStateCreateInfo viewportParams = 50034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 50168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // sType 50268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 50368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 50468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // viewportCount 50568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &viewport0, // pViewports 50668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // scissorCount 50768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &scissor0 // pScissors 50834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 5093d2071b82061ee418aa87064333069281133eddaPyry Haulos const VkSampleMask sampleMask = ~0u; 51034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineMultisampleStateCreateInfo multisampleParams = 51134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 51268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // sType 51368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 51468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 51568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, // rasterizationSamples 51668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // sampleShadingEnable 51768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // minSampleShading 51868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &sampleMask, // sampleMask 51968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToCoverageEnable 52068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToOneEnable 52168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 52268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkPipelineRasterizationStateCreateInfo rasterParams = 52368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 52468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // sType 52568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 52668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 52768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_TRUE, // depthClampEnable 52868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // rasterizerDiscardEnable 52968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_POLYGON_MODE_FILL, // polygonMode 53068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CULL_MODE_NONE, // cullMode 53168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FRONT_FACE_COUNTER_CLOCKWISE, // frontFace 53268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // depthBiasEnable 53368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // depthBiasConstantFactor 53468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // depthBiasClamp 53568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0.0f, // depthBiasSlopeFactor 53668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1.0f, // lineWidth 53734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 53834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineInputAssemblyStateCreateInfo inputAssemblyParams = 53934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 54068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // sType 54168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 54268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 54368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // topology 54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FALSE, // primitiveRestartEnable 54534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 54634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkVertexInputBindingDescription vertexBinding0 = 54734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 54868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // binding 54968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)sizeof(tcu::Vec4), // stride 55068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_VERTEX_INPUT_RATE_VERTEX, // inputRate 55134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 55234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkVertexInputAttributeDescription vertexAttrib0 = 55334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 55468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // location 55568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // binding 55668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_R32G32B32A32_SFLOAT, // format 55768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // offset 55834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 55934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = 56034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 56168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType 56268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 56368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 56468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // vertexBindingDescriptionCount 56568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &vertexBinding0, // pVertexBindingDescriptions 56668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // vertexAttributeDescriptionCount 56768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &vertexAttrib0, // pVertexAttributeDescriptions 56834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 56934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineColorBlendAttachmentState attBlendParams = 57034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 57168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // blendEnable 57268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // srcColorBlendFactor 57368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ZERO, // dstColorBlendFactor 57468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // colorBlendOp 57568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // srcAlphaBlendFactor 57668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ZERO, // dstAlphaBlendFactor 57768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // alphaBlendOp 57868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VK_COLOR_COMPONENT_R_BIT| 57968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_G_BIT| 58068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_B_BIT| 58168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_A_BIT), // colorWriteMask 58234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 58334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkPipelineColorBlendStateCreateInfo blendParams = 58434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 58568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // sType 58668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 58768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 58868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FALSE, // logicOpEnable 58968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_LOGIC_OP_COPY, // logicOp 59068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // attachmentCount 59168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &attBlendParams, // pAttachments 59268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 0.0f, 0.0f, 0.0f, 0.0f }, // blendConstants[4] 5933d2071b82061ee418aa87064333069281133eddaPyry Haulos }; 59434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkGraphicsPipelineCreateInfo pipelineParams = 59534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 59668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // sType 59768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 59868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 59968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)DE_LENGTH_OF_ARRAY(shaderStageParams), // stageCount 60068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos shaderStageParams, // pStages 60168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &vertexInputStateParams, // pVertexInputState 60268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &inputAssemblyParams, // pInputAssemblyState 60368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pTessellationState 60468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &viewportParams, // pViewportState 60568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &rasterParams, // pRasterizationState 60668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &multisampleParams, // pMultisampleState 60768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &depthStencilParams, // pDepthStencilState 60868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &blendParams, // pColorBlendState 60986a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // pDynamicState 61068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *pipelineLayout, // layout 61168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *renderPass, // renderPass 61268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // subpass 61368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // basePipelineHandle 61468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // basePipelineIndex 61534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 61634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 61734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkPipeline> pipeline (createGraphicsPipeline(vk, vkDevice, DE_NULL, &pipelineParams)); 61834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 61934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos // Framebuffer 62034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkFramebufferCreateInfo framebufferParams = 62134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 62268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // sType 62368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 62468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 62568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *renderPass, // renderPass 62668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // attachmentCount 62768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &*colorAttView, // pAttachments 62868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)renderSize.x(), // width 62968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)renderSize.y(), // height 63068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layers 63134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 6323d2071b82061ee418aa87064333069281133eddaPyry Haulos const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, vkDevice, &framebufferParams)); 63334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 63468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandPoolCreateInfo cmdPoolParams = 63534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 63668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType 63768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 63868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags 63968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // queueFamilyIndex 64034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 64168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 64234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 64334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos // Command buffer 64468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferAllocateInfo cmdBufParams = 64534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 64668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType 64768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 64868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *cmdPool, // pool 64968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level 65068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // bufferCount 65134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 65268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 65334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 65468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferBeginInfo cmdBufBeginParams = 65534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 65668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 65768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 65868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 659689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 66034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 66134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 66234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos // Record commands 66334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginParams)); 66434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 66534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 66634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkMemoryBarrier vertFlushBarrier = 66734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 66868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_MEMORY_BARRIER, // sType 66968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 67068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_HOST_WRITE_BIT, // srcAccessMask 67168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, // dstAccessMask 67234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 67334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkImageMemoryBarrier colorAttBarrier = 67434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 67568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 67668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 67768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // srcAccessMask 67868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VK_ACCESS_COLOR_ATTACHMENT_READ_BIT| 67968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT), // dstAccessMask 68068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 68168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout 68268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // srcQueueFamilyIndex 68368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // dstQueueFamilyIndex 68468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *image, // image 68534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 68668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 68768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseMipLevel 68868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // levelCount 68968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 69068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 69168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos } // subresourceRange 69234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 693689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, (VkDependencyFlags)0, 1, &vertFlushBarrier, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &colorAttBarrier); 69434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 69534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 69634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 6974ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const VkClearValue clearValue = makeClearValueColorF32(clearColor[0], 6984ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos clearColor[1], 6994ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos clearColor[2], 7004ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos clearColor[3]); 70134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkRenderPassBeginInfo passBeginParams = 70234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 70368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // sType 70468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 70568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *renderPass, // renderPass 70668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *framebuffer, // framebuffer 707689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 708689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 0, 0 }, 709689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { (deUint32)renderSize.x(), (deUint32)renderSize.y() } 710689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }, // renderArea 71168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // clearValueCount 71268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &clearValue, // pClearValues 71334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 71468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdBeginRenderPass(*cmdBuf, &passBeginParams, VK_SUBPASS_CONTENTS_INLINE); 71534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 71634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 71734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline); 71834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 71934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkDeviceSize bindingOffset = 0; 72034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos vk.cmdBindVertexBuffers(*cmdBuf, 0u, 1u, &vertexBuffer.get(), &bindingOffset); 72134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 7223d2071b82061ee418aa87064333069281133eddaPyry Haulos vk.cmdDraw(*cmdBuf, 3u, 1u, 0u, 0u); 72334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos vk.cmdEndRenderPass(*cmdBuf); 72434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 72534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 72634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkImageMemoryBarrier renderFinishBarrier = 72734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 72868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 72968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 73068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // outputMask 73168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_TRANSFER_READ_BIT, // inputMask 73268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout 73368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout 73468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // srcQueueFamilyIndex 73568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // dstQueueFamilyIndex 73668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *image, // image 73734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 73868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 73968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseMipLevel 74068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // mipLevels 74168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArraySlice 74268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // arraySize 74368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos } // subresourceRange 74434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 745689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &renderFinishBarrier); 74634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 74734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 74834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 74934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkBufferImageCopy copyParams = 75034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 75168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkDeviceSize)0u, // bufferOffset 75268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)renderSize.x(), // bufferRowLength 75368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)renderSize.y(), // bufferImageHeight 75434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 75568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 75668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // mipLevel 75768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 75868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 75968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // imageSubresource 76068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 0u, 0u, 0u }, // imageOffset 761689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 762689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)renderSize.x(), 763689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)renderSize.y(), 764689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 1u 765689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos } // imageExtent 76634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 76768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(*cmdBuf, *image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, ©Params); 76834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 76934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 77034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 77134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkBufferMemoryBarrier copyFinishBarrier = 77234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 77368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // sType 77468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 77568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask 77668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_HOST_READ_BIT, // dstAccessMask 77768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // srcQueueFamilyIndex 77868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // dstQueueFamilyIndex 77968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *readImageBuffer, // buffer 78068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // offset 78168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos imageSizeBytes // size 78234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 783689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, ©FinishBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL); 78434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 78534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 78634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.endCommandBuffer(*cmdBuf)); 78734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 78834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos // Upload vertex data 78934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 7907965292de01eac3af42c1de1e61b9442739eb188Pyry Haulos const VkMappedMemoryRange range = 79134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 79268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType 79368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 79468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vertexBufferMemory->getMemory(), // memory 79568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // offset 79668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkDeviceSize)sizeof(vertices), // size 79734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 7987965292de01eac3af42c1de1e61b9442739eb188Pyry Haulos void* vertexBufPtr = vertexBufferMemory->getHostPtr(); 79934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 80034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos deMemcpy(vertexBufPtr, &vertices[0], sizeof(vertices)); 80134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.flushMappedMemoryRanges(vkDevice, 1u, &range)); 80234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 80334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 80434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos // Submit & wait for completion 80534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 80634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const VkFenceCreateInfo fenceParams = 80734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 80868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // sType 80968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 81068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // flags 81168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 81268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubmitInfo submitInfo = 81368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 81468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 81568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 81668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // waitSemaphoreCount 81768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pWaitSemaphores 818689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 81968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // commandBufferCount 82068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &cmdBuf.get(), // pCommandBuffers 82168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // signalSemaphoreCount 82268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pSignalSemaphores 82334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 82434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceParams)); 82534823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 82668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 82734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), DE_TRUE, ~0ull)); 82834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 82934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 8304ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos // Read results, render reference, compare 83134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 8324ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const tcu::TextureFormat tcuFormat = vk::mapVkFormat(colorFormat); 8334ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const VkMappedMemoryRange range = 83434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos { 83568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType 83668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pNext 83768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos readImageBufferMemory->getMemory(), // memory 83868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // offset 83968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos imageSizeBytes, // size 84034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos }; 8414ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const tcu::ConstPixelBufferAccess resultAccess (tcuFormat, renderSize.x(), renderSize.y(), 1, readImageBufferMemory->getHostPtr()); 84234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 84334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos VK_CHECK(vk.invalidateMappedMemoryRanges(vkDevice, 1u, &range)); 8444ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 8454ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos { 8464ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos tcu::TextureLevel refImage (tcuFormat, renderSize.x(), renderSize.y()); 8474ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const tcu::UVec4 threshold (0u); 8484ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos const tcu::IVec3 posDeviation (1,1,0); 8494ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 8504ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos tcu::clear(refImage.getAccess(), clearColor); 8514ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos renderReferenceTriangle(refImage.getAccess(), vertices); 8524ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos 8534ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos if (tcu::intThresholdPositionDeviationCompare(context.getTestContext().getLog(), 8544ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos "ComparisonResult", 8554ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos "Image comparison result", 8564ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos refImage.getAccess(), 8574ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos resultAccess, 8584ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos threshold, 8594ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos posDeviation, 8604ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos false, 8614ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos tcu::COMPARE_LOG_RESULT)) 8624ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos return tcu::TestStatus::pass("Rendering succeeded"); 8634ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos else 8644ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos return tcu::TestStatus::fail("Image comparison failed"); 8654ec2e131d2a984fe8a2f0e8f58c4f77faec35106Pyry Haulos } 86634823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos } 86734823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 86834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos return tcu::TestStatus::pass("Rendering succeeded"); 86934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} 87034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 87141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvitcu::TestStatus renderTriangleUnusedResolveAttachmentTest (Context& context) 87241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi{ 87341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkDevice vkDevice = context.getDevice(); 87441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const DeviceInterface& vk = context.getDeviceInterface(); 87541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkQueue queue = context.getUniversalQueue(); 87641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 87741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())); 87841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const tcu::IVec2 renderSize (256, 256); 87941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkFormat colorFormat = VK_FORMAT_R8G8B8A8_UNORM; 88041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const tcu::Vec4 clearColor (0.125f, 0.25f, 0.75f, 1.0f); 88141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 88241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const tcu::Vec4 vertices[] = 88341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 88441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f), 88541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f), 88641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f) 88741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 88841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 88941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkBufferCreateInfo vertexBufferParams = 89041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 89141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // sType 89241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 89341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 89441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (VkDeviceSize)sizeof(vertices), // size 89541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // usage 89641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SHARING_MODE_EXCLUSIVE, // sharingMode 89741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // queueFamilyIndexCount 89841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &queueFamilyIndex, // pQueueFamilyIndices 89941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 90041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkBuffer> vertexBuffer (createBuffer(vk, vkDevice, &vertexBufferParams)); 90141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const UniquePtr<Allocation> vertexBufferMemory (memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible)); 90241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 90341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset())); 90441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 90541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkDeviceSize imageSizeBytes = (VkDeviceSize)(sizeof(deUint32)*renderSize.x()*renderSize.y()); 90641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkBufferCreateInfo readImageBufferParams = 90741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 90841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // sType 90941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 91041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (VkBufferCreateFlags)0u, // flags 91141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi imageSizeBytes, // size 91241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BUFFER_USAGE_TRANSFER_DST_BIT, // usage 91341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SHARING_MODE_EXCLUSIVE, // sharingMode 91441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // queueFamilyIndexCount 91541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &queueFamilyIndex, // pQueueFamilyIndices 91641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 91741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkBuffer> readImageBuffer (createBuffer(vk, vkDevice, &readImageBufferParams)); 91841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const UniquePtr<Allocation> readImageBufferMemory (memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible)); 91941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 92041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset())); 92141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 92241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkImageCreateInfo imageParams = 92341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 92441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType 92541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 92641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 92741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_TYPE_2D, // imageType 92841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FORMAT_R8G8B8A8_UNORM, // format 92941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { (deUint32)renderSize.x(), (deUint32)renderSize.y(), 1 }, // extent 93041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // mipLevels 93141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // arraySize 93241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SAMPLE_COUNT_1_BIT, // samples 93341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_TILING_OPTIMAL, // tiling 93441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // usage 93541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SHARING_MODE_EXCLUSIVE, // sharingMode 93641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // queueFamilyIndexCount 93741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &queueFamilyIndex, // pQueueFamilyIndices 93841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_UNDEFINED, // initialLayout 93941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 94041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 94141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkImage> image (createImage(vk, vkDevice, &imageParams)); 94241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const UniquePtr<Allocation> imageMemory (memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any)); 94341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 94441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.bindImageMemory(vkDevice, *image, imageMemory->getMemory(), imageMemory->getOffset())); 94541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 94641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkAttachmentDescription colorAttDesc = 94741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 94841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 94941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FORMAT_R8G8B8A8_UNORM, // format 95041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SAMPLE_COUNT_1_BIT, // samples 95141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, // loadOp 95241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, // storeOp 95341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, // stencilLoadOp 95441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, // stencilStoreOp 95541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // initialLayout 95641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // finalLayout 95741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 95841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkAttachmentReference colorAttRef = 95941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 96041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // attachment 96141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // layout 96241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 96341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkAttachmentReference resolveAttRef = 96441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 96541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ATTACHMENT_UNUSED, 96641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_GENERAL 96741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 96841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkSubpassDescription subpassDesc = 96941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 97041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (VkSubpassDescriptionFlags)0u, // flags 97141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint 97241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // inputAttachmentCount 97341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pInputAttachments 97441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // colorAttachmentCount 97541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &colorAttRef, // pColorAttachments 97641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &resolveAttRef, // pResolveAttachments 97741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // depthStencilAttachment 97841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // preserveAttachmentCount 97941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pPreserveAttachments 98041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 98141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkRenderPassCreateInfo renderPassParams = 98241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 98341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // sType 98441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 98541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 98641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // attachmentCount 98741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &colorAttDesc, // pAttachments 98841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // subpassCount 98941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &subpassDesc, // pSubpasses 99041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // dependencyCount 99141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pDependencies 99241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 99341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkRenderPass> renderPass (createRenderPass(vk, vkDevice, &renderPassParams)); 99441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 99541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkImageViewCreateInfo colorAttViewParams = 99641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 99741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // sType 99841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 99941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 100041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *image, // image 100141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_VIEW_TYPE_2D, // viewType 100241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FORMAT_R8G8B8A8_UNORM, // format 100341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 100441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMPONENT_SWIZZLE_R, 100541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMPONENT_SWIZZLE_G, 100641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMPONENT_SWIZZLE_B, 100741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMPONENT_SWIZZLE_A 100841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // components 100941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 101041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 101141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // baseMipLevel 101241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // levelCount 101341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // baseArrayLayer 101441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // layerCount 101541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // subresourceRange 101641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 101741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkImageView> colorAttView (createImageView(vk, vkDevice, &colorAttViewParams)); 101841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 101941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Pipeline layout 102041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineLayoutCreateInfo pipelineLayoutParams = 102141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 102241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType 102341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 102441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (vk::VkPipelineLayoutCreateFlags)0, 102541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // setLayoutCount 102641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pSetLayouts 102741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // pushConstantRangeCount 102841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pPushConstantRanges 102941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 103041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkPipelineLayout> pipelineLayout (createPipelineLayout(vk, vkDevice, &pipelineLayoutParams)); 103141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 103241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Shaders 103341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkShaderModule> vertShaderModule (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("vert"), 0)); 103441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkShaderModule> fragShaderModule (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("frag"), 0)); 103541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 103641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Pipeline 103741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkSpecializationInfo emptyShaderSpecParams = 103841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 103941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // mapEntryCount 104041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pMap 104141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0, // dataSize 104241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pData 104341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 104441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineShaderStageCreateInfo shaderStageParams[] = 104541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 104641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 104741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 104841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 104941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 105041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SHADER_STAGE_VERTEX_BIT, // stage 105141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *vertShaderModule, // module 105241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi "main", // pName 105341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &emptyShaderSpecParams, // pSpecializationInfo 105441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, 105541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 105641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 105741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 105841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 105941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SHADER_STAGE_FRAGMENT_BIT, // stage 106041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *fragShaderModule, // module 106141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi "main", // pName 106241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &emptyShaderSpecParams, // pSpecializationInfo 106341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 106441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 106541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineDepthStencilStateCreateInfo depthStencilParams = 106641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 106741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // sType 106841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 106941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 107041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_FALSE, // depthTestEnable 107141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_FALSE, // depthWriteEnable 107241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMPARE_OP_ALWAYS, // depthCompareOp 107341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_FALSE, // depthBoundsTestEnable 107441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_FALSE, // stencilTestEnable 107541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 107641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STENCIL_OP_KEEP, // failOp 107741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STENCIL_OP_KEEP, // passOp 107841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STENCIL_OP_KEEP, // depthFailOp 107941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMPARE_OP_ALWAYS, // compareOp 108041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // compareMask 108141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // writeMask 108241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // reference 108341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // front 108441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 108541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STENCIL_OP_KEEP, // failOp 108641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STENCIL_OP_KEEP, // passOp 108741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STENCIL_OP_KEEP, // depthFailOp 108841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMPARE_OP_ALWAYS, // compareOp 108941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // compareMask 109041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // writeMask 109141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // reference 109241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // back; 109341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi -1.0f, // float minDepthBounds; 109441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi +1.0f, // float maxDepthBounds; 109541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 109641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkViewport viewport0 = 109741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 109841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0.0f, // x 109941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0.0f, // y 110041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (float)renderSize.x(), // width 110141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (float)renderSize.y(), // height 110241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0.0f, // minDepth 110341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1.0f, // maxDepth 110441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 110541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkRect2D scissor0 = 110641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 110741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 110841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // x 110941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // y 111041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // offset 111141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 111241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.x(), // width 111341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.y(), // height 111441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // extent; 111541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 111641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineViewportStateCreateInfo viewportParams = 111741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 111841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // sType 111941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 112041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 112141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // viewportCount 112241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &viewport0, // pViewports 112341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // scissorCount 112441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &scissor0 // pScissors 112541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 112641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkSampleMask sampleMask = ~0u; 112741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineMultisampleStateCreateInfo multisampleParams = 112841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 112941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // sType 113041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 113141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 113241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_SAMPLE_COUNT_1_BIT, // rasterizationSamples 113341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FALSE, // sampleShadingEnable 113441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0.0f, // minSampleShading 113541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &sampleMask, // sampleMask 113641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FALSE, // alphaToCoverageEnable 113741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FALSE, // alphaToOneEnable 113841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 113941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineRasterizationStateCreateInfo rasterParams = 114041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 114141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // sType 114241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 114341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 114441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_TRUE, // depthClampEnable 114541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FALSE, // rasterizerDiscardEnable 114641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_POLYGON_MODE_FILL, // polygonMode 114741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CULL_MODE_NONE, // cullMode 114841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FRONT_FACE_COUNTER_CLOCKWISE, // frontFace 114941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FALSE, // depthBiasEnable 115041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0.0f, // depthBiasConstantFactor 115141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0.0f, // depthBiasClamp 115241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0.0f, // depthBiasSlopeFactor 115341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1.0f, // lineWidth 115441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 115541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineInputAssemblyStateCreateInfo inputAssemblyParams = 115641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 115741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // sType 115841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 115941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 116041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // topology 116141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_FALSE, // primitiveRestartEnable 116241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 116341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkVertexInputBindingDescription vertexBinding0 = 116441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 116541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // binding 116641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)sizeof(tcu::Vec4), // stride 116741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_VERTEX_INPUT_RATE_VERTEX, // inputRate 116841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 116941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkVertexInputAttributeDescription vertexAttrib0 = 117041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 117141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // location 117241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // binding 117341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FORMAT_R32G32B32A32_SFLOAT, // format 117441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // offset 117541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 117641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = 117741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 117841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType 117941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 118041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 118141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // vertexBindingDescriptionCount 118241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &vertexBinding0, // pVertexBindingDescriptions 118341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // vertexAttributeDescriptionCount 118441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &vertexAttrib0, // pVertexAttributeDescriptions 118541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 118641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineColorBlendAttachmentState attBlendParams = 118741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 118841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_FALSE, // blendEnable 118941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BLEND_FACTOR_ONE, // srcColorBlendFactor 119041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BLEND_FACTOR_ZERO, // dstColorBlendFactor 119141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BLEND_OP_ADD, // colorBlendOp 119241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BLEND_FACTOR_ONE, // srcAlphaBlendFactor 119341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BLEND_FACTOR_ZERO, // dstAlphaBlendFactor 119441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_BLEND_OP_ADD, // alphaBlendOp 119541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (VK_COLOR_COMPONENT_R_BIT| 119641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COLOR_COMPONENT_G_BIT| 119741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COLOR_COMPONENT_B_BIT| 119841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COLOR_COMPONENT_A_BIT), // colorWriteMask 119941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 120041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkPipelineColorBlendStateCreateInfo blendParams = 120141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 120241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // sType 120341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 120441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 120541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_FALSE, // logicOpEnable 120641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_LOGIC_OP_COPY, // logicOp 120741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // attachmentCount 120841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &attBlendParams, // pAttachments 120941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 0.0f, 0.0f, 0.0f, 0.0f }, // blendConstants[4] 121041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 121141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkGraphicsPipelineCreateInfo pipelineParams = 121241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 121341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // sType 121441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 121541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 121641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)DE_LENGTH_OF_ARRAY(shaderStageParams), // stageCount 121741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi shaderStageParams, // pStages 121841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &vertexInputStateParams, // pVertexInputState 121941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &inputAssemblyParams, // pInputAssemblyState 122041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pTessellationState 122141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &viewportParams, // pViewportState 122241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &rasterParams, // pRasterizationState 122341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &multisampleParams, // pMultisampleState 122441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &depthStencilParams, // pDepthStencilState 122541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &blendParams, // pColorBlendState 122641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // pDynamicState 122741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *pipelineLayout, // layout 122841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *renderPass, // renderPass 122941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // subpass 123041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // basePipelineHandle 123141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // basePipelineIndex 123241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 123341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 123441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkPipeline> pipeline (createGraphicsPipeline(vk, vkDevice, DE_NULL, &pipelineParams)); 123541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 123641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Framebuffer 123741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkFramebufferCreateInfo framebufferParams = 123841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 123941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // sType 124041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 124141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 124241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *renderPass, // renderPass 124341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // attachmentCount 124441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &*colorAttView, // pAttachments 124541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.x(), // width 124641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.y(), // height 124741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // layers 124841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 124941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, vkDevice, &framebufferParams)); 125041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 125141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkCommandPoolCreateInfo cmdPoolParams = 125241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 125341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType 125441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 125541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags 125641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi queueFamilyIndex, // queueFamilyIndex 125741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 125841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 125941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 126041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Command buffer 126141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkCommandBufferAllocateInfo cmdBufParams = 126241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 126341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType 126441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 126541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *cmdPool, // pool 126641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level 126741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // bufferCount 126841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 126941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 127041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 127141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkCommandBufferBeginInfo cmdBufBeginParams = 127241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 127341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 127441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 127541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 127641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (const VkCommandBufferInheritanceInfo*)DE_NULL, 127741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 127841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 127941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Record commands 128041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginParams)); 128141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 128241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 128341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkMemoryBarrier vertFlushBarrier = 128441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 128541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_MEMORY_BARRIER, // sType 128641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 128741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ACCESS_HOST_WRITE_BIT, // srcAccessMask 128841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, // dstAccessMask 128941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 129041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkImageMemoryBarrier colorAttBarrier = 129141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 129241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 129341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 129441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // srcAccessMask 129541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (VK_ACCESS_COLOR_ATTACHMENT_READ_BIT| 129641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT), // dstAccessMask 129741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 129841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout 129941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi queueFamilyIndex, // srcQueueFamilyIndex 130041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi queueFamilyIndex, // dstQueueFamilyIndex 130141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *image, // image 130241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 130341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 130441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // baseMipLevel 130541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // levelCount 130641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // baseArrayLayer 130741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // layerCount 130841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } // subresourceRange 130941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 131041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, (VkDependencyFlags)0, 1, &vertFlushBarrier, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &colorAttBarrier); 131141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 131241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 131341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 131441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkClearValue clearValue = makeClearValueColorF32(clearColor[0], 131541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi clearColor[1], 131641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi clearColor[2], 131741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi clearColor[3]); 131841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkRenderPassBeginInfo passBeginParams = 131941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 132041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // sType 132141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 132241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *renderPass, // renderPass 132341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *framebuffer, // framebuffer 132441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 132541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 0, 0 }, 132641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { (deUint32)renderSize.x(), (deUint32)renderSize.y() } 132741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // renderArea 132841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // clearValueCount 132941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &clearValue, // pClearValues 133041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 133141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdBeginRenderPass(*cmdBuf, &passBeginParams, VK_SUBPASS_CONTENTS_INLINE); 133241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 133341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 133441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline); 133541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 133641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkDeviceSize bindingOffset = 0; 133741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdBindVertexBuffers(*cmdBuf, 0u, 1u, &vertexBuffer.get(), &bindingOffset); 133841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 133941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdDraw(*cmdBuf, 3u, 1u, 0u, 0u); 134041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdEndRenderPass(*cmdBuf); 134141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 134241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 134341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkImageMemoryBarrier renderFinishBarrier = 134441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 134541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 134641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 134741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // outputMask 134841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ACCESS_TRANSFER_READ_BIT, // inputMask 134941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout 135041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout 135141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi queueFamilyIndex, // srcQueueFamilyIndex 135241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi queueFamilyIndex, // dstQueueFamilyIndex 135341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *image, // image 135441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 135541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 135641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // baseMipLevel 135741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // mipLevels 135841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // baseArraySlice 135941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // arraySize 136041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } // subresourceRange 136141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 136241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &renderFinishBarrier); 136341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 136441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 136541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 136641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkBufferImageCopy copyParams = 136741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 136841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (VkDeviceSize)0u, // bufferOffset 136941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.x(), // bufferRowLength 137041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.y(), // bufferImageHeight 137141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 137241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 137341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // mipLevel 137441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // baseArrayLayer 137541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // layerCount 137641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }, // imageSubresource 137741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 0u, 0u, 0u }, // imageOffset 137841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 137941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.x(), 138041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (deUint32)renderSize.y(), 138141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u 138241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } // imageExtent 138341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 138441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdCopyImageToBuffer(*cmdBuf, *image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, ©Params); 138541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 138641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 138741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 138841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkBufferMemoryBarrier copyFinishBarrier = 138941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 139041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // sType 139141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 139241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask 139341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_ACCESS_HOST_READ_BIT, // dstAccessMask 139441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi queueFamilyIndex, // srcQueueFamilyIndex 139541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi queueFamilyIndex, // dstQueueFamilyIndex 139641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi *readImageBuffer, // buffer 139741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // offset 139841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi imageSizeBytes // size 139941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 140041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, ©FinishBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL); 140141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 140241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 140341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.endCommandBuffer(*cmdBuf)); 140441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 140541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Upload vertex data 140641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 140741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkMappedMemoryRange range = 140841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 140941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType 141041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 141141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi vertexBufferMemory->getMemory(), // memory 141241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0, // offset 141341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (VkDeviceSize)sizeof(vertices), // size 141441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 141541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi void* vertexBufPtr = vertexBufferMemory->getHostPtr(); 141641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 141741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi deMemcpy(vertexBufPtr, &vertices[0], sizeof(vertices)); 141841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.flushMappedMemoryRanges(vkDevice, 1u, &range)); 141941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 142041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 142141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Submit & wait for completion 142241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 142341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkFenceCreateInfo fenceParams = 142441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 142541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // sType 142641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 142741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // flags 142841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 142941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkSubmitInfo submitInfo = 143041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 143141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 143241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 143341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // waitSemaphoreCount 143441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pWaitSemaphores 143541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi (const VkPipelineStageFlags*)DE_NULL, 143641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 1u, // commandBufferCount 143741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi &cmdBuf.get(), // pCommandBuffers 143841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0u, // signalSemaphoreCount 143941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pSignalSemaphores 144041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 144141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceParams)); 144241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 144341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 144441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), DE_TRUE, ~0ull)); 144541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 144641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 144741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi // Read results, render reference, compare 144841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 144941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const tcu::TextureFormat tcuFormat = vk::mapVkFormat(colorFormat); 145041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const VkMappedMemoryRange range = 145141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 145241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType 145341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi DE_NULL, // pNext 145441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi readImageBufferMemory->getMemory(), // memory 145541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 0, // offset 145641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi imageSizeBytes, // size 145741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi }; 145841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const tcu::ConstPixelBufferAccess resultAccess (tcuFormat, renderSize.x(), renderSize.y(), 1, readImageBufferMemory->getHostPtr()); 145941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 146041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi VK_CHECK(vk.invalidateMappedMemoryRanges(vkDevice, 1u, &range)); 146141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 146241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi { 146341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi tcu::TextureLevel refImage (tcuFormat, renderSize.x(), renderSize.y()); 146441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const tcu::UVec4 threshold (0u); 146541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi const tcu::IVec3 posDeviation (1,1,0); 146641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 146741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi tcu::clear(refImage.getAccess(), clearColor); 146841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi renderReferenceTriangle(refImage.getAccess(), vertices); 146941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 147041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi if (tcu::intThresholdPositionDeviationCompare(context.getTestContext().getLog(), 147141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi "ComparisonResult", 147241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi "Image comparison result", 147341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi refImage.getAccess(), 147441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi resultAccess, 147541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi threshold, 147641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi posDeviation, 147741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi false, 147841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi tcu::COMPARE_LOG_RESULT)) 147941ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi return tcu::TestStatus::pass("Rendering succeeded"); 148041ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi else 148141ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi return tcu::TestStatus::fail("Image comparison failed"); 148241ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 148341ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi } 148441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 148541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi return tcu::TestStatus::pass("Rendering succeeded"); 148641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi} 148741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi 148834823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // anonymous 148934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 149034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulostcu::TestCaseGroup* createSmokeTests (tcu::TestContext& testCtx) 149134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos{ 149234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos de::MovePtr<tcu::TestCaseGroup> smokeTests (new tcu::TestCaseGroup(testCtx, "smoke", "Smoke Tests")); 149334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 149441ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi addFunctionCase (smokeTests.get(), "create_sampler", "", createSamplerTest); 149541ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi addFunctionCaseWithPrograms (smokeTests.get(), "create_shader", "", createShaderProgs, createShaderModuleTest); 149641ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi addFunctionCaseWithPrograms (smokeTests.get(), "triangle", "", createTriangleProgs, renderTriangleTest); 149741ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi addFunctionCaseWithPrograms (smokeTests.get(), "asm_triangle", "", createTriangleAsmProgs, renderTriangleTest); 149841ff4d37f7c0bca4df89667da1f689d00a4dbccbMika Isojärvi addFunctionCaseWithPrograms (smokeTests.get(), "unused_resolve_attachment", "", createTriangleProgs, renderTriangleUnusedResolveAttachmentTest); 149934823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 150034823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos return smokeTests.release(); 150134823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} 150234823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos 150334823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // api 150434823916fd57e1694b2af8ed159811ca9bd40958Pyry Haulos} // vkt 1505