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