vktPipelineReferenceRenderer.cpp revision 120ed2c44030b05409d5b1164a0676389dfe87c3
1c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim/*------------------------------------------------------------------------ 2c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Vulkan Conformance Tests 3c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * ------------------------ 4c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 5c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Copyright (c) 2015 The Khronos Group Inc. 6c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Copyright (c) 2015 Imagination Technologies Ltd. 7c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 8c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Permission is hereby granted, free of charge, to any person obtaining a 9c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * copy of this software and/or associated documentation files (the 10c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * "Materials"), to deal in the Materials without restriction, including 11c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * without limitation the rights to use, copy, modify, merge, publish, 12c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * distribute, sublicense, and/or sell copies of the Materials, and to 13c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * permit persons to whom the Materials are furnished to do so, subject to 14c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * the following conditions: 15c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 16c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * The above copyright notice(s) and this permission notice shall be included 17c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * in all copies or substantial portions of the Materials. 18c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 19c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * The Materials are Confidential Information as defined by the 20c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Khronos Membership Agreement until designated non-confidential by Khronos, 21c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * at which point this condition clause shall be removed. 22c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 23c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 26c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 27c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 28c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 29c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 30c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 31c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *//*! 32c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * \file 33c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * \brief Reference renderer. 34c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *//*--------------------------------------------------------------------*/ 35c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 36c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "vktPipelineReferenceRenderer.hpp" 37c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "vktPipelineClearUtil.hpp" 38c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "rrShadingContext.hpp" 39c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "rrVertexAttrib.hpp" 40c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 41c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimnamespace vkt 42c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 43c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimnamespace pipeline 44c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 45c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 46c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimusing namespace vk; 47c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 48120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimrr::BlendFunc mapVkBlendFactor (VkBlendFactor blend) 494698bb4451c7d984b7e070d524130deb5a775f1aDae Kim{ 504698bb4451c7d984b7e070d524130deb5a775f1aDae Kim switch (blend) 514698bb4451c7d984b7e070d524130deb5a775f1aDae Kim { 52120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ZERO: return rr::BLENDFUNC_ZERO; 53120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE: return rr::BLENDFUNC_ONE; 54120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC_COLOR: return rr::BLENDFUNC_SRC_COLOR; 55120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: return rr::BLENDFUNC_ONE_MINUS_SRC_COLOR; 56120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_DST_COLOR: return rr::BLENDFUNC_DST_COLOR; 57120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR: return rr::BLENDFUNC_ONE_MINUS_DST_COLOR; 58120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC_ALPHA: return rr::BLENDFUNC_SRC_ALPHA; 59120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA: return rr::BLENDFUNC_ONE_MINUS_SRC_ALPHA; 60120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_DST_ALPHA: return rr::BLENDFUNC_DST_ALPHA; 61120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA: return rr::BLENDFUNC_ONE_MINUS_DST_ALPHA; 62120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_CONSTANT_COLOR: return rr::BLENDFUNC_CONSTANT_COLOR; 63120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR: return rr::BLENDFUNC_ONE_MINUS_CONSTANT_COLOR; 64120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_CONSTANT_ALPHA: return rr::BLENDFUNC_CONSTANT_ALPHA; 65120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: return rr::BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA; 66120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC_ALPHA_SATURATE: return rr::BLENDFUNC_SRC_ALPHA_SATURATE; 67120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC1_COLOR: return rr::BLENDFUNC_SRC1_COLOR; 68120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR: return rr::BLENDFUNC_ONE_MINUS_SRC1_COLOR; 69120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC1_ALPHA: return rr::BLENDFUNC_SRC1_ALPHA; 70120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA: return rr::BLENDFUNC_ONE_MINUS_SRC1_ALPHA; 714698bb4451c7d984b7e070d524130deb5a775f1aDae Kim default: 724698bb4451c7d984b7e070d524130deb5a775f1aDae Kim DE_ASSERT(false); 734698bb4451c7d984b7e070d524130deb5a775f1aDae Kim } 744698bb4451c7d984b7e070d524130deb5a775f1aDae Kim return rr::BLENDFUNC_LAST; 754698bb4451c7d984b7e070d524130deb5a775f1aDae Kim} 764698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 774698bb4451c7d984b7e070d524130deb5a775f1aDae Kimrr::BlendEquation mapVkBlendOp (VkBlendOp blendOp) 784698bb4451c7d984b7e070d524130deb5a775f1aDae Kim{ 794698bb4451c7d984b7e070d524130deb5a775f1aDae Kim switch (blendOp) 804698bb4451c7d984b7e070d524130deb5a775f1aDae Kim { 814698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_ADD: return rr::BLENDEQUATION_ADD; 824698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_SUBTRACT: return rr::BLENDEQUATION_SUBTRACT; 834698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_REVERSE_SUBTRACT: return rr::BLENDEQUATION_REVERSE_SUBTRACT; 844698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_MIN: return rr::BLENDEQUATION_MIN; 854698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_MAX: return rr::BLENDEQUATION_MAX; 864698bb4451c7d984b7e070d524130deb5a775f1aDae Kim default: 874698bb4451c7d984b7e070d524130deb5a775f1aDae Kim DE_ASSERT(false); 884698bb4451c7d984b7e070d524130deb5a775f1aDae Kim } 894698bb4451c7d984b7e070d524130deb5a775f1aDae Kim return rr::BLENDEQUATION_LAST; 904698bb4451c7d984b7e070d524130deb5a775f1aDae Kim} 914698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 92120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimtcu::BVec4 mapVkColorComponentFlags (VkColorComponentFlags flags) 934698bb4451c7d984b7e070d524130deb5a775f1aDae Kim{ 94120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim return tcu::BVec4((flags & VK_COLOR_COMPONENT_R_BIT) != 0, 95120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (flags & VK_COLOR_COMPONENT_G_BIT) != 0, 96120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (flags & VK_COLOR_COMPONENT_B_BIT) != 0, 97120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (flags & VK_COLOR_COMPONENT_A_BIT) != 0); 984698bb4451c7d984b7e070d524130deb5a775f1aDae Kim} 994698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 100c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimrr::TestFunc mapVkCompareOp (VkCompareOp compareFunc) 101c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 102c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim switch (compareFunc) 103c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 104120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_NEVER: return rr::TESTFUNC_NEVER; 105120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_LESS: return rr::TESTFUNC_LESS; 106120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_EQUAL: return rr::TESTFUNC_EQUAL; 107120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_LESS_OR_EQUAL: return rr::TESTFUNC_LEQUAL; 108120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_GREATER: return rr::TESTFUNC_GREATER; 109120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_NOT_EQUAL: return rr::TESTFUNC_NOTEQUAL; 110120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_GREATER_OR_EQUAL: return rr::TESTFUNC_GEQUAL; 111120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_ALWAYS: return rr::TESTFUNC_ALWAYS; 112c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim default: 113c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim DE_ASSERT(false); 114c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 115c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return rr::TESTFUNC_LAST; 116c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 117c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 118c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimrr::PrimitiveType mapVkPrimitiveTopology (VkPrimitiveTopology primitiveTopology) 119c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 120c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim switch (primitiveTopology) 121c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 122120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: return rr::PRIMITIVETYPE_POINTS; 123120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_LIST: return rr::PRIMITIVETYPE_LINES; 124120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: return rr::PRIMITIVETYPE_LINE_STRIP; 125120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: return rr::PRIMITIVETYPE_TRIANGLES; 126120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN: return rr::PRIMITIVETYPE_TRIANGLE_FAN; 127120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: return rr::PRIMITIVETYPE_TRIANGLE_STRIP; 128120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY: return rr::PRIMITIVETYPE_LINES_ADJACENCY; 129120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY: return rr::PRIMITIVETYPE_LINE_STRIP_ADJACENCY; 130120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY: return rr::PRIMITIVETYPE_TRIANGLES_ADJACENCY; 131120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY: return rr::PRIMITIVETYPE_TRIANGLE_STRIP_ADJACENCY; 132c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim default: 133c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim DE_ASSERT(false); 134c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 135c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return rr::PRIMITIVETYPE_LAST; 136c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 137c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 1389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimrr::StencilOp mapVkStencilOp (vk::VkStencilOp stencilOp) 1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim switch (stencilOp) 1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 142120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_KEEP: return rr::STENCILOP_KEEP; 143120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_ZERO: return rr::STENCILOP_ZERO; 144120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_REPLACE: return rr::STENCILOP_REPLACE; 145120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_CLAMP: return rr::STENCILOP_INCR; 146120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_CLAMP: return rr::STENCILOP_DECR; 147120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INVERT: return rr::STENCILOP_INVERT; 148120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_WRAP: return rr::STENCILOP_INCR_WRAP; 149120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_WRAP: return rr::STENCILOP_DECR_WRAP; 1509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim default: 1519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(false); 1529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 1539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return rr::STENCILOP_LAST; 1549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 1559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 156e8849a85b21e64ece65abc17248f01a9591784fePyry Haulostcu::Vec4 swizzle (const tcu::Vec4& color, const tcu::UVec4& swizzle) 157e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos{ 158e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos const float channelValues[] = 159e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos { 160e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 0.0f, 161e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 1.0f, 162e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.x(), 163e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.y(), 164e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.z(), 165e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.w() 166e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos }; 167e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 168e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos return tcu::Vec4(channelValues[swizzle.x()], 169e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos channelValues[swizzle.y()], 170e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos channelValues[swizzle.z()], 171e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos channelValues[swizzle.w()]); 172e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos} 173e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 174c6e8b5a8389a64972259b357407b5e0f4edd5716Dae KimReferenceRenderer::ReferenceRenderer(int surfaceWidth, 175c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim int surfaceHeight, 176c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim int numSamples, 177c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const tcu::TextureFormat& colorFormat, 178c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const tcu::TextureFormat& depthStencilFormat, 179c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const rr::Program* const program) 180c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim : m_surfaceWidth (surfaceWidth) 181c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_surfaceHeight (surfaceHeight) 182c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_numSamples (numSamples) 183c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_colorFormat (colorFormat) 184c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_depthStencilFormat (depthStencilFormat) 185c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_program (program) 186c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 187c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const tcu::TextureChannelClass formatClass = tcu::getTextureChannelClass(colorFormat.type); 188c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const bool hasDepthStencil = (m_depthStencilFormat.order != tcu::TextureFormat::CHANNELORDER_LAST); 189c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const bool hasDepthBufferOnly = (m_depthStencilFormat.order == tcu::TextureFormat::D); 190c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const bool hasStencilBufferOnly = (m_depthStencilFormat.order == tcu::TextureFormat::S); 191c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const int actualSamples = (formatClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER || formatClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)? 1: m_numSamples; 192c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 193c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_colorBuffer.setStorage(m_colorFormat, actualSamples, m_surfaceWidth, m_surfaceHeight); 194c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_resolveColorBuffer.setStorage(m_colorFormat, m_surfaceWidth, m_surfaceHeight); 195c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 196c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim if (formatClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 197c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 198c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_colorBuffer.getAccess(), defaultClearColorInt(m_colorFormat)); 199c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_resolveColorBuffer.getAccess(), defaultClearColorInt(m_colorFormat)); 200c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 201c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else if (formatClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) 202c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 203c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_colorBuffer.getAccess(), defaultClearColorUint(m_colorFormat)); 204c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_resolveColorBuffer.getAccess(), defaultClearColorUint(m_colorFormat)); 205c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 206c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else 207c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 2084698bb4451c7d984b7e070d524130deb5a775f1aDae Kim tcu::Vec4 clearColor = defaultClearColor(m_colorFormat); 2094698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 2104698bb4451c7d984b7e070d524130deb5a775f1aDae Kim if (isSRGB(m_colorFormat)) 2114698bb4451c7d984b7e070d524130deb5a775f1aDae Kim clearColor = tcu::linearToSRGB(clearColor); 2124698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 2134698bb4451c7d984b7e070d524130deb5a775f1aDae Kim tcu::clear(m_colorBuffer.getAccess(), clearColor); 2144698bb4451c7d984b7e070d524130deb5a775f1aDae Kim tcu::clear(m_resolveColorBuffer.getAccess(), clearColor); 215c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 216c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 217c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim if (hasDepthStencil) 218c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 219c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim if (hasDepthBufferOnly) 220c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 221c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_depthStencilBuffer.setStorage(m_depthStencilFormat, actualSamples, surfaceWidth, surfaceHeight); 222c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clearDepth(m_depthStencilBuffer.getAccess(), defaultClearDepth()); 223c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 224c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderTarget = new rr::RenderTarget(rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess()), 225c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthStencilBuffer.getAccess())); 226c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 227c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else if (hasStencilBufferOnly) 228c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 229c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_depthStencilBuffer.setStorage(m_depthStencilFormat, actualSamples, surfaceWidth, surfaceHeight); 230c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clearStencil(m_depthStencilBuffer.getAccess(), defaultClearStencil()); 231c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 232c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderTarget = new rr::RenderTarget(rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess()), 233c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess(), 234c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthStencilBuffer.getAccess())); 235c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 236c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else 237c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 238c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_depthStencilBuffer.setStorage(m_depthStencilFormat, actualSamples, surfaceWidth, surfaceHeight); 239c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 240c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clearDepth(m_depthStencilBuffer.getAccess(), defaultClearDepth()); 241c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clearStencil(m_depthStencilBuffer.getAccess(), defaultClearStencil()); 242c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 243c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderTarget = new rr::RenderTarget(rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess()), 244c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthStencilBuffer.getAccess()), 245c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthStencilBuffer.getAccess())); 246c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 247c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 248c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else 249c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 250c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderTarget = new rr::RenderTarget(rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess())); 251c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 252c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 253c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 254c6e8b5a8389a64972259b357407b5e0f4edd5716Dae KimReferenceRenderer::~ReferenceRenderer (void) 255c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 256c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim delete m_renderTarget; 257c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 258c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 259c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimvoid ReferenceRenderer::draw (const rr::RenderState& renderState, 260c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const rr::PrimitiveType primitive, 261c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const std::vector<Vertex4RGBA>& vertexBuffer) 262c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 263c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const rr::PrimitiveList primitives(primitive, (int)vertexBuffer.size(), 0); 264c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 265c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim std::vector<tcu::Vec4> positions; 266c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim std::vector<tcu::Vec4> colors; 267c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 268c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim for (size_t vertexNdx = 0; vertexNdx < vertexBuffer.size(); vertexNdx++) 269c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 270c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const Vertex4RGBA& v = vertexBuffer[vertexNdx]; 271c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim positions.push_back(v.position); 272c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim colors.push_back(v.color); 273c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 274c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 275c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::VertexAttrib vertexAttribs[2]; 276c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 277c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim // Position attribute 278c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[0].type = rr::VERTEXATTRIBTYPE_FLOAT; 279c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[0].size = 4; 280c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[0].pointer = positions.data(); 281c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim // UV attribute 282c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[1].type = rr::VERTEXATTRIBTYPE_FLOAT; 283c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[1].size = 4; 284c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[1].pointer = colors.data(); 285c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 286c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::DrawCommand drawQuadCommand(renderState, *m_renderTarget, *m_program, 2, vertexAttribs, primitives); 287c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 288c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderer.draw(drawQuadCommand); 289c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 290c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 29183a6066224454de177655eb414dd3453c2059536Dae Kimvoid ReferenceRenderer::draw (const rr::RenderState& renderState, 29283a6066224454de177655eb414dd3453c2059536Dae Kim const rr::PrimitiveType primitive, 29383a6066224454de177655eb414dd3453c2059536Dae Kim const std::vector<Vertex4Tex4>& vertexBuffer) 29483a6066224454de177655eb414dd3453c2059536Dae Kim{ 29583a6066224454de177655eb414dd3453c2059536Dae Kim const rr::PrimitiveList primitives(primitive, (int)vertexBuffer.size(), 0); 29683a6066224454de177655eb414dd3453c2059536Dae Kim 29783a6066224454de177655eb414dd3453c2059536Dae Kim std::vector<tcu::Vec4> positions; 29883a6066224454de177655eb414dd3453c2059536Dae Kim std::vector<tcu::Vec4> texCoords; 29983a6066224454de177655eb414dd3453c2059536Dae Kim 30083a6066224454de177655eb414dd3453c2059536Dae Kim for (size_t vertexNdx = 0; vertexNdx < vertexBuffer.size(); vertexNdx++) 30183a6066224454de177655eb414dd3453c2059536Dae Kim { 30283a6066224454de177655eb414dd3453c2059536Dae Kim const Vertex4Tex4& v = vertexBuffer[vertexNdx]; 30383a6066224454de177655eb414dd3453c2059536Dae Kim positions.push_back(v.position); 30483a6066224454de177655eb414dd3453c2059536Dae Kim texCoords.push_back(v.texCoord); 30583a6066224454de177655eb414dd3453c2059536Dae Kim } 30683a6066224454de177655eb414dd3453c2059536Dae Kim 30783a6066224454de177655eb414dd3453c2059536Dae Kim rr::VertexAttrib vertexAttribs[2]; 30883a6066224454de177655eb414dd3453c2059536Dae Kim 30983a6066224454de177655eb414dd3453c2059536Dae Kim // Position attribute 31083a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[0].type = rr::VERTEXATTRIBTYPE_FLOAT; 31183a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[0].size = 4; 31283a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[0].pointer = positions.data(); 31383a6066224454de177655eb414dd3453c2059536Dae Kim // UV attribute 31483a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[1].type = rr::VERTEXATTRIBTYPE_FLOAT; 31583a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[1].size = 4; 31683a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[1].pointer = texCoords.data(); 31783a6066224454de177655eb414dd3453c2059536Dae Kim 31883a6066224454de177655eb414dd3453c2059536Dae Kim rr::DrawCommand drawQuadCommand(renderState, *m_renderTarget, *m_program, 2, vertexAttribs, primitives); 31983a6066224454de177655eb414dd3453c2059536Dae Kim 32083a6066224454de177655eb414dd3453c2059536Dae Kim m_renderer.draw(drawQuadCommand); 32183a6066224454de177655eb414dd3453c2059536Dae Kim} 32283a6066224454de177655eb414dd3453c2059536Dae Kim 323c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimtcu::PixelBufferAccess ReferenceRenderer::getAccess (void) 324c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 325c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisampleConstPixelBufferAccess multiSampleAccess = rr::MultisampleConstPixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess()); 326c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::resolveMultisampleColorBuffer(m_resolveColorBuffer.getAccess(), multiSampleAccess); 327c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 328c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return m_resolveColorBuffer.getAccess(); 329c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 330c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 331c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimconst rr::ViewportState ReferenceRenderer::getViewportState (void) const 332c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 333c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return rr::ViewportState(rr::WindowRectangle(0, 0, m_surfaceWidth, m_surfaceHeight)); 334c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 335c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 336c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} // pipeline 337c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} // vkt 338