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