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 * 8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 11c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 13c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 19c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * 20c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *//*! 21c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * \file 22c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * \brief Reference renderer. 23c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *//*--------------------------------------------------------------------*/ 24c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 25c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "vktPipelineReferenceRenderer.hpp" 26c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "vktPipelineClearUtil.hpp" 27c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "rrShadingContext.hpp" 28c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "rrVertexAttrib.hpp" 29c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 30c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimnamespace vkt 31c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 32c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimnamespace pipeline 33c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 34c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 35c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimusing namespace vk; 36c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 37120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimrr::BlendFunc mapVkBlendFactor (VkBlendFactor blend) 384698bb4451c7d984b7e070d524130deb5a775f1aDae Kim{ 394698bb4451c7d984b7e070d524130deb5a775f1aDae Kim switch (blend) 404698bb4451c7d984b7e070d524130deb5a775f1aDae Kim { 41120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ZERO: return rr::BLENDFUNC_ZERO; 42120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE: return rr::BLENDFUNC_ONE; 43120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC_COLOR: return rr::BLENDFUNC_SRC_COLOR; 44120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: return rr::BLENDFUNC_ONE_MINUS_SRC_COLOR; 45120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_DST_COLOR: return rr::BLENDFUNC_DST_COLOR; 46120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR: return rr::BLENDFUNC_ONE_MINUS_DST_COLOR; 47120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC_ALPHA: return rr::BLENDFUNC_SRC_ALPHA; 48120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA: return rr::BLENDFUNC_ONE_MINUS_SRC_ALPHA; 49120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_DST_ALPHA: return rr::BLENDFUNC_DST_ALPHA; 50120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA: return rr::BLENDFUNC_ONE_MINUS_DST_ALPHA; 51120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_CONSTANT_COLOR: return rr::BLENDFUNC_CONSTANT_COLOR; 52120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR: return rr::BLENDFUNC_ONE_MINUS_CONSTANT_COLOR; 53120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_CONSTANT_ALPHA: return rr::BLENDFUNC_CONSTANT_ALPHA; 54120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: return rr::BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA; 55120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC_ALPHA_SATURATE: return rr::BLENDFUNC_SRC_ALPHA_SATURATE; 56120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC1_COLOR: return rr::BLENDFUNC_SRC1_COLOR; 57120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR: return rr::BLENDFUNC_ONE_MINUS_SRC1_COLOR; 58120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_SRC1_ALPHA: return rr::BLENDFUNC_SRC1_ALPHA; 59120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA: return rr::BLENDFUNC_ONE_MINUS_SRC1_ALPHA; 604698bb4451c7d984b7e070d524130deb5a775f1aDae Kim default: 614698bb4451c7d984b7e070d524130deb5a775f1aDae Kim DE_ASSERT(false); 624698bb4451c7d984b7e070d524130deb5a775f1aDae Kim } 634698bb4451c7d984b7e070d524130deb5a775f1aDae Kim return rr::BLENDFUNC_LAST; 644698bb4451c7d984b7e070d524130deb5a775f1aDae Kim} 654698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 664698bb4451c7d984b7e070d524130deb5a775f1aDae Kimrr::BlendEquation mapVkBlendOp (VkBlendOp blendOp) 674698bb4451c7d984b7e070d524130deb5a775f1aDae Kim{ 684698bb4451c7d984b7e070d524130deb5a775f1aDae Kim switch (blendOp) 694698bb4451c7d984b7e070d524130deb5a775f1aDae Kim { 704698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_ADD: return rr::BLENDEQUATION_ADD; 714698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_SUBTRACT: return rr::BLENDEQUATION_SUBTRACT; 724698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_REVERSE_SUBTRACT: return rr::BLENDEQUATION_REVERSE_SUBTRACT; 734698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_MIN: return rr::BLENDEQUATION_MIN; 744698bb4451c7d984b7e070d524130deb5a775f1aDae Kim case VK_BLEND_OP_MAX: return rr::BLENDEQUATION_MAX; 754698bb4451c7d984b7e070d524130deb5a775f1aDae Kim default: 764698bb4451c7d984b7e070d524130deb5a775f1aDae Kim DE_ASSERT(false); 774698bb4451c7d984b7e070d524130deb5a775f1aDae Kim } 784698bb4451c7d984b7e070d524130deb5a775f1aDae Kim return rr::BLENDEQUATION_LAST; 794698bb4451c7d984b7e070d524130deb5a775f1aDae Kim} 804698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 81120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimtcu::BVec4 mapVkColorComponentFlags (VkColorComponentFlags flags) 824698bb4451c7d984b7e070d524130deb5a775f1aDae Kim{ 83120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim return tcu::BVec4((flags & VK_COLOR_COMPONENT_R_BIT) != 0, 84120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (flags & VK_COLOR_COMPONENT_G_BIT) != 0, 85120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (flags & VK_COLOR_COMPONENT_B_BIT) != 0, 86120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (flags & VK_COLOR_COMPONENT_A_BIT) != 0); 874698bb4451c7d984b7e070d524130deb5a775f1aDae Kim} 884698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 89c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimrr::TestFunc mapVkCompareOp (VkCompareOp compareFunc) 90c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 91c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim switch (compareFunc) 92c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 93120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_NEVER: return rr::TESTFUNC_NEVER; 94120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_LESS: return rr::TESTFUNC_LESS; 95120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_EQUAL: return rr::TESTFUNC_EQUAL; 96120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_LESS_OR_EQUAL: return rr::TESTFUNC_LEQUAL; 97120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_GREATER: return rr::TESTFUNC_GREATER; 98120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_NOT_EQUAL: return rr::TESTFUNC_NOTEQUAL; 99120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_GREATER_OR_EQUAL: return rr::TESTFUNC_GEQUAL; 100120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_COMPARE_OP_ALWAYS: return rr::TESTFUNC_ALWAYS; 101c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim default: 102c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim DE_ASSERT(false); 103c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 104c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return rr::TESTFUNC_LAST; 105c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 106c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 107c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimrr::PrimitiveType mapVkPrimitiveTopology (VkPrimitiveTopology primitiveTopology) 108c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 109c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim switch (primitiveTopology) 110c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 111120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: return rr::PRIMITIVETYPE_POINTS; 112120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_LIST: return rr::PRIMITIVETYPE_LINES; 113120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: return rr::PRIMITIVETYPE_LINE_STRIP; 114120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: return rr::PRIMITIVETYPE_TRIANGLES; 115120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN: return rr::PRIMITIVETYPE_TRIANGLE_FAN; 116120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: return rr::PRIMITIVETYPE_TRIANGLE_STRIP; 117120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY: return rr::PRIMITIVETYPE_LINES_ADJACENCY; 118120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY: return rr::PRIMITIVETYPE_LINE_STRIP_ADJACENCY; 119120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY: return rr::PRIMITIVETYPE_TRIANGLES_ADJACENCY; 120120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY: return rr::PRIMITIVETYPE_TRIANGLE_STRIP_ADJACENCY; 121c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim default: 122c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim DE_ASSERT(false); 123c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 124c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return rr::PRIMITIVETYPE_LAST; 125c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 126c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 1279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimrr::StencilOp mapVkStencilOp (vk::VkStencilOp stencilOp) 1289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim switch (stencilOp) 1309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 131120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_KEEP: return rr::STENCILOP_KEEP; 132120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_ZERO: return rr::STENCILOP_ZERO; 133120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_REPLACE: return rr::STENCILOP_REPLACE; 134120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_CLAMP: return rr::STENCILOP_INCR; 135120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_CLAMP: return rr::STENCILOP_DECR; 136120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INVERT: return rr::STENCILOP_INVERT; 137120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_WRAP: return rr::STENCILOP_INCR_WRAP; 138120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_WRAP: return rr::STENCILOP_DECR_WRAP; 1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim default: 1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(false); 1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 1429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return rr::STENCILOP_LAST; 1439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 1449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 145e8849a85b21e64ece65abc17248f01a9591784fePyry Haulostcu::Vec4 swizzle (const tcu::Vec4& color, const tcu::UVec4& swizzle) 146e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos{ 147e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos const float channelValues[] = 148e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos { 149e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 0.0f, 150e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 1.0f, 151e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.x(), 152e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.y(), 153e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.z(), 154e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos color.w() 155e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos }; 156e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 157e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos return tcu::Vec4(channelValues[swizzle.x()], 158e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos channelValues[swizzle.y()], 159e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos channelValues[swizzle.z()], 160e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos channelValues[swizzle.w()]); 161e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos} 162e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 163c6e8b5a8389a64972259b357407b5e0f4edd5716Dae KimReferenceRenderer::ReferenceRenderer(int surfaceWidth, 164c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim int surfaceHeight, 165c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim int numSamples, 166c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const tcu::TextureFormat& colorFormat, 167c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const tcu::TextureFormat& depthStencilFormat, 168c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const rr::Program* const program) 169c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim : m_surfaceWidth (surfaceWidth) 170c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_surfaceHeight (surfaceHeight) 171c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_numSamples (numSamples) 172c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_colorFormat (colorFormat) 173c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_depthStencilFormat (depthStencilFormat) 174c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim , m_program (program) 175c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 176c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const tcu::TextureChannelClass formatClass = tcu::getTextureChannelClass(colorFormat.type); 177c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const bool hasDepthStencil = (m_depthStencilFormat.order != tcu::TextureFormat::CHANNELORDER_LAST); 178c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const bool hasDepthBufferOnly = (m_depthStencilFormat.order == tcu::TextureFormat::D); 179c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const bool hasStencilBufferOnly = (m_depthStencilFormat.order == tcu::TextureFormat::S); 180c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const int actualSamples = (formatClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER || formatClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)? 1: m_numSamples; 181c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 182c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_colorBuffer.setStorage(m_colorFormat, actualSamples, m_surfaceWidth, m_surfaceHeight); 183c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_resolveColorBuffer.setStorage(m_colorFormat, m_surfaceWidth, m_surfaceHeight); 184c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 185c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim if (formatClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 186c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 187c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_colorBuffer.getAccess(), defaultClearColorInt(m_colorFormat)); 188c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_resolveColorBuffer.getAccess(), defaultClearColorInt(m_colorFormat)); 189c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 190c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else if (formatClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) 191c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 192c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_colorBuffer.getAccess(), defaultClearColorUint(m_colorFormat)); 193c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clear(m_resolveColorBuffer.getAccess(), defaultClearColorUint(m_colorFormat)); 194c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 195c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else 196c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 1974698bb4451c7d984b7e070d524130deb5a775f1aDae Kim tcu::Vec4 clearColor = defaultClearColor(m_colorFormat); 1984698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 1994698bb4451c7d984b7e070d524130deb5a775f1aDae Kim if (isSRGB(m_colorFormat)) 2004698bb4451c7d984b7e070d524130deb5a775f1aDae Kim clearColor = tcu::linearToSRGB(clearColor); 2014698bb4451c7d984b7e070d524130deb5a775f1aDae Kim 2024698bb4451c7d984b7e070d524130deb5a775f1aDae Kim tcu::clear(m_colorBuffer.getAccess(), clearColor); 2034698bb4451c7d984b7e070d524130deb5a775f1aDae Kim tcu::clear(m_resolveColorBuffer.getAccess(), clearColor); 204c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 205c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 206c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim if (hasDepthStencil) 207c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 208c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim if (hasDepthBufferOnly) 209c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 210c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_depthStencilBuffer.setStorage(m_depthStencilFormat, actualSamples, surfaceWidth, surfaceHeight); 211c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clearDepth(m_depthStencilBuffer.getAccess(), defaultClearDepth()); 212c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 213c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderTarget = new rr::RenderTarget(rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess()), 214c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthStencilBuffer.getAccess())); 215c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 216c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else if (hasStencilBufferOnly) 217c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 218c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_depthStencilBuffer.setStorage(m_depthStencilFormat, actualSamples, surfaceWidth, surfaceHeight); 219c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clearStencil(m_depthStencilBuffer.getAccess(), defaultClearStencil()); 220c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 221c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderTarget = new rr::RenderTarget(rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess()), 222c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess(), 223c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthStencilBuffer.getAccess())); 224c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 225c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else 226c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 227c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_depthStencilBuffer.setStorage(m_depthStencilFormat, actualSamples, surfaceWidth, surfaceHeight); 228c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 229c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim tcu::clearDepth(m_depthStencilBuffer.getAccess(), defaultClearDepth()); 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::fromMultisampleAccess(m_depthStencilBuffer.getAccess()), 234c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_depthStencilBuffer.getAccess())); 235c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 236c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 237c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim else 238c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 239c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderTarget = new rr::RenderTarget(rr::MultisamplePixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess())); 240c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 241c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 242c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 243c6e8b5a8389a64972259b357407b5e0f4edd5716Dae KimReferenceRenderer::~ReferenceRenderer (void) 244c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 245c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim delete m_renderTarget; 246c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 247c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 2489cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kimvoid ReferenceRenderer::colorClear(const tcu::Vec4& color) 2499cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kim{ 2509cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kim tcu::clear(m_colorBuffer.getAccess(), color); 2519cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kim tcu::clear(m_resolveColorBuffer.getAccess(), color); 2529cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kim} 2539cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kim 254c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimvoid ReferenceRenderer::draw (const rr::RenderState& renderState, 255c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const rr::PrimitiveType primitive, 256c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const std::vector<Vertex4RGBA>& vertexBuffer) 257c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 258c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const rr::PrimitiveList primitives(primitive, (int)vertexBuffer.size(), 0); 259c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 260c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim std::vector<tcu::Vec4> positions; 261c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim std::vector<tcu::Vec4> colors; 262c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 263c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim for (size_t vertexNdx = 0; vertexNdx < vertexBuffer.size(); vertexNdx++) 264c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim { 265c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim const Vertex4RGBA& v = vertexBuffer[vertexNdx]; 266c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim positions.push_back(v.position); 267c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim colors.push_back(v.color); 268c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim } 269c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 270c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::VertexAttrib vertexAttribs[2]; 271c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 272c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim // Position attribute 273c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[0].type = rr::VERTEXATTRIBTYPE_FLOAT; 274c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[0].size = 4; 275c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[0].pointer = positions.data(); 276c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim // UV attribute 277c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[1].type = rr::VERTEXATTRIBTYPE_FLOAT; 278c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[1].size = 4; 279c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim vertexAttribs[1].pointer = colors.data(); 280c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 281c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::DrawCommand drawQuadCommand(renderState, *m_renderTarget, *m_program, 2, vertexAttribs, primitives); 282c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 283c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim m_renderer.draw(drawQuadCommand); 284c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 285c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 28683a6066224454de177655eb414dd3453c2059536Dae Kimvoid ReferenceRenderer::draw (const rr::RenderState& renderState, 28783a6066224454de177655eb414dd3453c2059536Dae Kim const rr::PrimitiveType primitive, 28883a6066224454de177655eb414dd3453c2059536Dae Kim const std::vector<Vertex4Tex4>& vertexBuffer) 28983a6066224454de177655eb414dd3453c2059536Dae Kim{ 29083a6066224454de177655eb414dd3453c2059536Dae Kim const rr::PrimitiveList primitives(primitive, (int)vertexBuffer.size(), 0); 29183a6066224454de177655eb414dd3453c2059536Dae Kim 29283a6066224454de177655eb414dd3453c2059536Dae Kim std::vector<tcu::Vec4> positions; 29383a6066224454de177655eb414dd3453c2059536Dae Kim std::vector<tcu::Vec4> texCoords; 29483a6066224454de177655eb414dd3453c2059536Dae Kim 29583a6066224454de177655eb414dd3453c2059536Dae Kim for (size_t vertexNdx = 0; vertexNdx < vertexBuffer.size(); vertexNdx++) 29683a6066224454de177655eb414dd3453c2059536Dae Kim { 29783a6066224454de177655eb414dd3453c2059536Dae Kim const Vertex4Tex4& v = vertexBuffer[vertexNdx]; 29883a6066224454de177655eb414dd3453c2059536Dae Kim positions.push_back(v.position); 29983a6066224454de177655eb414dd3453c2059536Dae Kim texCoords.push_back(v.texCoord); 30083a6066224454de177655eb414dd3453c2059536Dae Kim } 30183a6066224454de177655eb414dd3453c2059536Dae Kim 30283a6066224454de177655eb414dd3453c2059536Dae Kim rr::VertexAttrib vertexAttribs[2]; 30383a6066224454de177655eb414dd3453c2059536Dae Kim 30483a6066224454de177655eb414dd3453c2059536Dae Kim // Position attribute 30583a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[0].type = rr::VERTEXATTRIBTYPE_FLOAT; 30683a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[0].size = 4; 30783a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[0].pointer = positions.data(); 30883a6066224454de177655eb414dd3453c2059536Dae Kim // UV attribute 30983a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[1].type = rr::VERTEXATTRIBTYPE_FLOAT; 31083a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[1].size = 4; 31183a6066224454de177655eb414dd3453c2059536Dae Kim vertexAttribs[1].pointer = texCoords.data(); 31283a6066224454de177655eb414dd3453c2059536Dae Kim 31383a6066224454de177655eb414dd3453c2059536Dae Kim rr::DrawCommand drawQuadCommand(renderState, *m_renderTarget, *m_program, 2, vertexAttribs, primitives); 31483a6066224454de177655eb414dd3453c2059536Dae Kim 31583a6066224454de177655eb414dd3453c2059536Dae Kim m_renderer.draw(drawQuadCommand); 31683a6066224454de177655eb414dd3453c2059536Dae Kim} 31783a6066224454de177655eb414dd3453c2059536Dae Kim 318c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimtcu::PixelBufferAccess ReferenceRenderer::getAccess (void) 319c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 320c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::MultisampleConstPixelBufferAccess multiSampleAccess = rr::MultisampleConstPixelBufferAccess::fromMultisampleAccess(m_colorBuffer.getAccess()); 321c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim rr::resolveMultisampleColorBuffer(m_resolveColorBuffer.getAccess(), multiSampleAccess); 322c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 323c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return m_resolveColorBuffer.getAccess(); 324c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 325c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 326c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimconst rr::ViewportState ReferenceRenderer::getViewportState (void) const 327c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{ 328c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim return rr::ViewportState(rr::WindowRectangle(0, 0, m_surfaceWidth, m_surfaceHeight)); 329c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} 330c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim 331c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} // pipeline 332c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} // vkt 333