1c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#ifndef _VKTPIPELINEREFERENCERENDERER_HPP
2c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#define _VKTPIPELINEREFERENCERENDERER_HPP
3c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim/*------------------------------------------------------------------------
4c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Vulkan Conformance Tests
5c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * ------------------------
6c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *
7c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Copyright (c) 2015 The Khronos Group Inc.
8c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * Copyright (c) 2015 Imagination Technologies Ltd.
9c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
13c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
15c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
20978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
21c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *
22c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *//*!
23c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * \file
24c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim * \brief Reference renderer.
25c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim *//*--------------------------------------------------------------------*/
26c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
27c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "vkDefs.hpp"
28c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "vktPipelineVertexUtil.hpp"
29c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "tcuVector.hpp"
30c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "tcuVectorType.hpp"
31c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "tcuTexture.hpp"
32c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "tcuTextureUtil.hpp"
33c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "rrRenderState.hpp"
34c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include "rrRenderer.hpp"
35c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#include <cstring>
36c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
37c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimnamespace vkt
38c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{
39c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
40c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimnamespace pipeline
41c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{
42c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
43e8849a85b21e64ece65abc17248f01a9591784fePyry Haulostcu::Vec4	swizzle		(const tcu::Vec4& color, const tcu::UVec4& swizzle);
4483a6066224454de177655eb414dd3453c2059536Dae Kim
45c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimclass ColorVertexShader : public rr::VertexShader
46c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{
47c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimpublic:
48c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	ColorVertexShader (void) : rr::VertexShader(2, 2)
49c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	{
50c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
51c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		m_inputs[1].type	= rr::GENERICVECTYPE_FLOAT;
52c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
53c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		m_outputs[0].type	= rr::GENERICVECTYPE_FLOAT;
54c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		m_outputs[1].type	= rr::GENERICVECTYPE_FLOAT;
55c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	}
56c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
57c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	virtual ~ColorVertexShader (void) {}
58c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
59c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	virtual void shadeVertices (const rr::VertexAttrib*		inputs,
60c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim								rr::VertexPacket* const*	packets,
61c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim								const int					numPackets) const
62c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	{
63c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		tcu::Vec4 position;
64c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		tcu::Vec4 color;
65c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
66c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
67c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		{
68c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			rr::VertexPacket* const packet	= packets[packetNdx];
69c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
70c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			readVertexAttrib(position, inputs[0], packet->instanceNdx, packet->vertexNdx);
71c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			readVertexAttrib(color, inputs[1], packet->instanceNdx, packet->vertexNdx);
72c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
73c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			packet->outputs[0]	= position;
74c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			packet->outputs[1]	= color;
75c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			packet->position	= position;
76c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		}
77c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	}
78c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim};
79c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
8083a6066224454de177655eb414dd3453c2059536Dae Kimclass TexCoordVertexShader : public rr::VertexShader
8183a6066224454de177655eb414dd3453c2059536Dae Kim{
8283a6066224454de177655eb414dd3453c2059536Dae Kimpublic:
8383a6066224454de177655eb414dd3453c2059536Dae Kim	TexCoordVertexShader (void) : rr::VertexShader(2, 2)
8483a6066224454de177655eb414dd3453c2059536Dae Kim	{
8583a6066224454de177655eb414dd3453c2059536Dae Kim		m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
8683a6066224454de177655eb414dd3453c2059536Dae Kim		m_inputs[1].type	= rr::GENERICVECTYPE_FLOAT;
8783a6066224454de177655eb414dd3453c2059536Dae Kim
8883a6066224454de177655eb414dd3453c2059536Dae Kim		m_outputs[0].type	= rr::GENERICVECTYPE_FLOAT;
8983a6066224454de177655eb414dd3453c2059536Dae Kim		m_outputs[1].type	= rr::GENERICVECTYPE_FLOAT;
9083a6066224454de177655eb414dd3453c2059536Dae Kim	}
9183a6066224454de177655eb414dd3453c2059536Dae Kim
9283a6066224454de177655eb414dd3453c2059536Dae Kim	virtual ~TexCoordVertexShader (void) {}
9383a6066224454de177655eb414dd3453c2059536Dae Kim
9483a6066224454de177655eb414dd3453c2059536Dae Kim	virtual void shadeVertices (const rr::VertexAttrib*		inputs,
9583a6066224454de177655eb414dd3453c2059536Dae Kim								rr::VertexPacket* const*	packets,
9683a6066224454de177655eb414dd3453c2059536Dae Kim								const int					numPackets) const
9783a6066224454de177655eb414dd3453c2059536Dae Kim	{
9883a6066224454de177655eb414dd3453c2059536Dae Kim		tcu::Vec4 position;
9983a6066224454de177655eb414dd3453c2059536Dae Kim		tcu::Vec4 texCoord;
10083a6066224454de177655eb414dd3453c2059536Dae Kim
10183a6066224454de177655eb414dd3453c2059536Dae Kim		for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
10283a6066224454de177655eb414dd3453c2059536Dae Kim		{
10383a6066224454de177655eb414dd3453c2059536Dae Kim			rr::VertexPacket* const packet	= packets[packetNdx];
10483a6066224454de177655eb414dd3453c2059536Dae Kim
10583a6066224454de177655eb414dd3453c2059536Dae Kim			readVertexAttrib(position, inputs[0], packet->instanceNdx, packet->vertexNdx);
10683a6066224454de177655eb414dd3453c2059536Dae Kim			readVertexAttrib(texCoord, inputs[1], packet->instanceNdx, packet->vertexNdx);
10783a6066224454de177655eb414dd3453c2059536Dae Kim
10883a6066224454de177655eb414dd3453c2059536Dae Kim			packet->outputs[0]	= position;
10983a6066224454de177655eb414dd3453c2059536Dae Kim			packet->outputs[1]	= texCoord;
11083a6066224454de177655eb414dd3453c2059536Dae Kim			packet->position	= position;
11183a6066224454de177655eb414dd3453c2059536Dae Kim		}
11283a6066224454de177655eb414dd3453c2059536Dae Kim	}
11383a6066224454de177655eb414dd3453c2059536Dae Kim};
11483a6066224454de177655eb414dd3453c2059536Dae Kim
115c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimclass ColorFragmentShader : public rr::FragmentShader
116c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{
117c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimprivate:
118c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const tcu::TextureFormat		m_colorFormat;
119c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const tcu::TextureFormat		m_depthStencilFormat;
120c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
121c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimpublic:
122c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	ColorFragmentShader (const tcu::TextureFormat& colorFormat,
123c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim						 const tcu::TextureFormat& depthStencilFormat)
124c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		: rr::FragmentShader	(2, 1)
125c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		, m_colorFormat			(colorFormat)
126c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		, m_depthStencilFormat	(depthStencilFormat)
127c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	{
128c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(m_colorFormat.type);
129c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
130c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
131c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		m_inputs[1].type	= rr::GENERICVECTYPE_FLOAT;
132c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		m_outputs[0].type	= (channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)? rr::GENERICVECTYPE_INT32 :
133c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim							  (channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)? rr::GENERICVECTYPE_UINT32
134c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim							  : rr::GENERICVECTYPE_FLOAT;
135c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	}
136c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
137c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	virtual ~ColorFragmentShader (void) {}
138c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
139c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	virtual void shadeFragments (rr::FragmentPacket*				packets,
140c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim								 const int							numPackets,
141c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim								 const rr::FragmentShadingContext&	context) const
142c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	{
143c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
144c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		{
145c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			const rr::FragmentPacket& packet = packets[packetNdx];
146c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
147c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			if (m_depthStencilFormat.order == tcu::TextureFormat::D || m_depthStencilFormat.order == tcu::TextureFormat::DS)
148c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			{
149c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim				for (int fragNdx = 0; fragNdx < 4; fragNdx++)
150c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim				{
151c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim					const tcu::Vec4 vtxPosition = rr::readVarying<float>(packet, context, 0, fragNdx);
152c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim					rr::writeFragmentDepth(context, packetNdx, fragNdx, 0, vtxPosition.z());
153c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim				}
154c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			}
155c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
156c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			for (int fragNdx = 0; fragNdx < 4; fragNdx++)
157c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			{
158c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim				const tcu::Vec4 vtxColor = rr::readVarying<float>(packet, context, 1, fragNdx);
1594698bb4451c7d984b7e070d524130deb5a775f1aDae Kim				rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, vtxColor);
160c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim			}
161c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim		}
162c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	}
163c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim};
164c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
165387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosclass CoordinateCaptureFragmentShader : public rr::FragmentShader
16683a6066224454de177655eb414dd3453c2059536Dae Kim{
16783a6066224454de177655eb414dd3453c2059536Dae Kimpublic:
168387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	CoordinateCaptureFragmentShader (void)
169387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		: rr::FragmentShader(2, 1)
17083a6066224454de177655eb414dd3453c2059536Dae Kim	{
17183a6066224454de177655eb414dd3453c2059536Dae Kim		m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
17283a6066224454de177655eb414dd3453c2059536Dae Kim		m_inputs[1].type	= rr::GENERICVECTYPE_FLOAT;
173387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		m_outputs[0].type	= rr::GENERICVECTYPE_FLOAT;
17483a6066224454de177655eb414dd3453c2059536Dae Kim	}
17583a6066224454de177655eb414dd3453c2059536Dae Kim
176387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	virtual ~CoordinateCaptureFragmentShader (void)
17783a6066224454de177655eb414dd3453c2059536Dae Kim	{
17883a6066224454de177655eb414dd3453c2059536Dae Kim	}
17983a6066224454de177655eb414dd3453c2059536Dae Kim
18083a6066224454de177655eb414dd3453c2059536Dae Kim	virtual void shadeFragments (rr::FragmentPacket*				packets,
18183a6066224454de177655eb414dd3453c2059536Dae Kim								 const int							numPackets,
18283a6066224454de177655eb414dd3453c2059536Dae Kim								 const rr::FragmentShadingContext&	context) const
18383a6066224454de177655eb414dd3453c2059536Dae Kim	{
18483a6066224454de177655eb414dd3453c2059536Dae Kim		for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
18583a6066224454de177655eb414dd3453c2059536Dae Kim		{
18683a6066224454de177655eb414dd3453c2059536Dae Kim			const rr::FragmentPacket& packet = packets[packetNdx];
18783a6066224454de177655eb414dd3453c2059536Dae Kim
18883a6066224454de177655eb414dd3453c2059536Dae Kim			for (int fragNdx = 0; fragNdx < 4; fragNdx++)
18983a6066224454de177655eb414dd3453c2059536Dae Kim			{
19083a6066224454de177655eb414dd3453c2059536Dae Kim				const tcu::Vec4	vtxTexCoord	= rr::readVarying<float>(packet, context, 1, fragNdx);
191387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos				rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, vtxTexCoord);
19283a6066224454de177655eb414dd3453c2059536Dae Kim			}
19383a6066224454de177655eb414dd3453c2059536Dae Kim		}
19483a6066224454de177655eb414dd3453c2059536Dae Kim	}
19583a6066224454de177655eb414dd3453c2059536Dae Kim};
19683a6066224454de177655eb414dd3453c2059536Dae Kim
19783a6066224454de177655eb414dd3453c2059536Dae Kimclass Program
19883a6066224454de177655eb414dd3453c2059536Dae Kim{
19983a6066224454de177655eb414dd3453c2059536Dae Kimpublic:
20083a6066224454de177655eb414dd3453c2059536Dae Kim	virtual ~Program (void) { }
20183a6066224454de177655eb414dd3453c2059536Dae Kim
20283a6066224454de177655eb414dd3453c2059536Dae Kim	virtual rr::Program getReferenceProgram (void) const = 0;
20383a6066224454de177655eb414dd3453c2059536Dae Kim};
20483a6066224454de177655eb414dd3453c2059536Dae Kim
205387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosclass CoordinateCaptureProgram : public Program
20683a6066224454de177655eb414dd3453c2059536Dae Kim{
20783a6066224454de177655eb414dd3453c2059536Dae Kimprivate:
208387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	TexCoordVertexShader			m_vertexShader;
209387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	CoordinateCaptureFragmentShader	m_fragmentShader;
21083a6066224454de177655eb414dd3453c2059536Dae Kimpublic:
211387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	CoordinateCaptureProgram (void)
21283a6066224454de177655eb414dd3453c2059536Dae Kim	{
21383a6066224454de177655eb414dd3453c2059536Dae Kim	}
21483a6066224454de177655eb414dd3453c2059536Dae Kim
215387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	virtual ~CoordinateCaptureProgram (void) { }
21683a6066224454de177655eb414dd3453c2059536Dae Kim
21783a6066224454de177655eb414dd3453c2059536Dae Kim	virtual rr::Program getReferenceProgram (void) const
21883a6066224454de177655eb414dd3453c2059536Dae Kim	{
21983a6066224454de177655eb414dd3453c2059536Dae Kim		return rr::Program(&m_vertexShader, &m_fragmentShader);
22083a6066224454de177655eb414dd3453c2059536Dae Kim	}
22183a6066224454de177655eb414dd3453c2059536Dae Kim};
22283a6066224454de177655eb414dd3453c2059536Dae Kim
223c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimclass ReferenceRenderer
224c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim{
225c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimpublic:
226c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim								ReferenceRenderer		(int							surfaceWidth,
227c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim														 int							surfaceHeight,
228c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim														 int							numSamples,
229c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim														 const tcu::TextureFormat&		colorFormat,
230c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim														 const tcu::TextureFormat&		depthStencilFormat,
231c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim														 const rr::Program* const		program);
232c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
233c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	virtual						~ReferenceRenderer		(void);
234c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
2359cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kim	void						colorClear				(const tcu::Vec4& color);
2369cdb2bb91b0c5404e6b27c5adac5017d3c767d03Dae Kim
237c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	void						draw					(const rr::RenderState&				renderState,
238c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim														 const rr::PrimitiveType			primitive,
239c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim														 const std::vector<Vertex4RGBA>&	vertexBuffer);
24083a6066224454de177655eb414dd3453c2059536Dae Kim
24183a6066224454de177655eb414dd3453c2059536Dae Kim	void						draw					(const rr::RenderState&				renderState,
24283a6066224454de177655eb414dd3453c2059536Dae Kim														 const rr::PrimitiveType			primitive,
24383a6066224454de177655eb414dd3453c2059536Dae Kim														 const std::vector<Vertex4Tex4>&	vertexBuffer);
24483a6066224454de177655eb414dd3453c2059536Dae Kim
245c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	tcu::PixelBufferAccess		getAccess				(void);
246c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const rr::ViewportState		getViewportState		(void) const;
247c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
248c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kimprivate:
249c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	rr::Renderer				m_renderer;
250c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
251c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const int					m_surfaceWidth;
252c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const int					m_surfaceHeight;
253c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const int					m_numSamples;
254c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
255c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const tcu::TextureFormat	m_colorFormat;
256c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const tcu::TextureFormat	m_depthStencilFormat;
257c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
258c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	tcu::TextureLevel			m_colorBuffer;
259c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	tcu::TextureLevel			m_resolveColorBuffer;
260c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	tcu::TextureLevel			m_depthStencilBuffer;
261c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
262c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	rr::RenderTarget*			m_renderTarget;
263c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim	const rr::Program*			m_program;
264c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim};
265c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
266120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimrr::TestFunc					mapVkCompareOp				(vk::VkCompareOp compareFunc);
267120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimrr::PrimitiveType				mapVkPrimitiveTopology		(vk::VkPrimitiveTopology primitiveTopology);
268120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimrr::BlendFunc					mapVkBlendFactor			(vk::VkBlendFactor blendFactor);
269120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimrr::BlendEquation				mapVkBlendOp				(vk::VkBlendOp blendOp);
270120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimtcu::BVec4						mapVkColorComponentFlags	(vk::VkColorComponentFlags flags);
271120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimrr::StencilOp					mapVkStencilOp				(vk::VkStencilOp stencilOp);
272c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
273c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} // pipeline
274c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim} // vkt
275c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim
276c6e8b5a8389a64972259b357407b5e0f4edd5716Dae Kim#endif // _VKTPIPELINEREFERENCERENDERER_HPP
277