1#ifndef _RRRENDERER_HPP
2#define _RRRENDERER_HPP
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program Reference Renderer
5 * -----------------------------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file
23 * \brief Reference renderer interface.
24 *//*--------------------------------------------------------------------*/
25
26#include "rrDefs.hpp"
27#include "rrShaders.hpp"
28#include "rrRenderState.hpp"
29#include "rrPrimitiveTypes.hpp"
30#include "rrMultisamplePixelBufferAccess.hpp"
31#include "tcuTexture.hpp"
32
33namespace rr
34{
35
36class RenderTarget
37{
38public:
39	enum
40	{
41		MAX_COLOR_BUFFERS	= 4
42	};
43
44	RenderTarget (const MultisamplePixelBufferAccess& colorMultisampleBuffer,
45				  const MultisamplePixelBufferAccess& depthMultisampleBuffer	= MultisamplePixelBufferAccess(),
46				  const MultisamplePixelBufferAccess& stencilMultisampleBuffer	= MultisamplePixelBufferAccess())
47		: numColorBuffers	(1)
48		, depthBuffer		(depthMultisampleBuffer)
49		, stencilBuffer		(stencilMultisampleBuffer)
50	{
51		colorBuffers[0] = colorMultisampleBuffer;
52	}
53
54	MultisamplePixelBufferAccess			colorBuffers[MAX_COLOR_BUFFERS];
55	const int								numColorBuffers;
56	const MultisamplePixelBufferAccess		depthBuffer;
57	const MultisamplePixelBufferAccess		stencilBuffer;
58};
59
60struct Program
61{
62	Program (const VertexShader* vertexShader_, const FragmentShader* fragmentShader_, const GeometryShader* geometryShader_ = DE_NULL)
63		: vertexShader		(vertexShader_)
64		, fragmentShader	(fragmentShader_)
65		, geometryShader	(geometryShader_)
66	{
67	}
68
69	const VertexShader*			vertexShader;
70	const FragmentShader*		fragmentShader;
71	const GeometryShader*		geometryShader;
72};
73
74struct DrawIndices
75{
76						DrawIndices		(const deUint32*, int baseVertex = 0);
77						DrawIndices		(const deUint16*, int baseVertex = 0);
78						DrawIndices		(const deUint8*, int baseVertex = 0);
79						DrawIndices		(const void* ptr, IndexType type, int baseVertex = 0);
80
81	const void* const	indices;
82	const IndexType		indexType;
83	const int			baseVertex;
84};
85
86class PrimitiveList
87{
88public:
89							PrimitiveList		(PrimitiveType primitiveType, int numElements, const int firstElement);		// !< primitive list for drawArrays-like call
90							PrimitiveList		(PrimitiveType primitiveType, int numElements, const DrawIndices& indices);	// !< primitive list for drawElements-like call
91
92	size_t					getIndex			(size_t elementNdx) const;
93	bool					isRestartIndex		(size_t elementNdx, deUint32 restartIndex) const;
94
95	inline size_t			getNumElements		(void) const	{ return m_numElements;		}
96	inline PrimitiveType	getPrimitiveType	(void) const	{ return m_primitiveType;	}
97	inline IndexType		getIndexType		(void) const	{ return m_indexType;		}
98
99private:
100	const PrimitiveType		m_primitiveType;
101	const size_t			m_numElements;
102	const void* const		m_indices;			// !< if indices is NULL, indices is interpreted as [first (== baseVertex) + 0, first + 1, first + 2, ...]
103	const IndexType			m_indexType;
104	const int				m_baseVertex;
105};
106
107class DrawCommand
108{
109public:
110	DrawCommand (const RenderState& state_, const RenderTarget& renderTarget_, const Program& program_, int numVertexAttribs_, const VertexAttrib* vertexAttribs_, const PrimitiveList& primitives_)
111		: state				(state_)
112		, renderTarget		(renderTarget_)
113		, program			(program_)
114		, numVertexAttribs	(numVertexAttribs_)
115		, vertexAttribs		(vertexAttribs_)
116		, primitives		(primitives_)
117	{
118	}
119
120	const RenderState&			state;
121	const RenderTarget&			renderTarget;
122	const Program&				program;
123
124	const int					numVertexAttribs;
125	const VertexAttrib* const	vertexAttribs;
126
127	const PrimitiveList&		primitives;
128};
129
130class Renderer
131{
132public:
133					Renderer		(void);
134					~Renderer		(void);
135
136	void			draw			(const DrawCommand& command) const;
137	void			drawInstanced	(const DrawCommand& command, int numInstances) const;
138};
139
140} // rr
141
142#endif // _RRRENDERER_HPP
143