1#ifndef _RRRENDERSTATE_HPP
2#define _RRRENDERSTATE_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 render state.
24 *//*--------------------------------------------------------------------*/
25
26#include "rrDefs.hpp"
27#include "rrMultisamplePixelBufferAccess.hpp"
28#include "tcuTexture.hpp"
29
30namespace rr
31{
32
33//! Horizontal fill rule
34enum HorizontalFill
35{
36	FILL_LEFT,
37	FILL_RIGHT
38};
39
40//! Vertical fill rule
41enum VerticalFill
42{
43	FILL_TOP,
44	FILL_BOTTOM,
45};
46
47//! Winding mode
48enum Winding
49{
50	WINDING_CCW = 0,	//!< Counter-clockwise winding
51	WINDING_CW,			//!< Clockwise winding
52
53	WINDING_LAST
54};
55
56//! Triangle cull mode
57enum CullMode
58{
59	CULLMODE_NONE,
60	CULLMODE_BACK,
61	CULLMODE_FRONT,
62
63	CULLMODE_LAST
64};
65
66struct RasterizationState
67{
68	RasterizationState (void)
69		: winding			(WINDING_CCW)
70		, horizontalFill	(FILL_LEFT)
71		, verticalFill		(FILL_BOTTOM)
72	{
73	}
74
75	Winding			winding;
76	HorizontalFill	horizontalFill;
77	VerticalFill	verticalFill;
78};
79
80enum TestFunc
81{
82	TESTFUNC_NEVER = 0,
83	TESTFUNC_ALWAYS,
84	TESTFUNC_LESS,
85	TESTFUNC_LEQUAL,
86	TESTFUNC_GREATER,
87	TESTFUNC_GEQUAL,
88	TESTFUNC_EQUAL,
89	TESTFUNC_NOTEQUAL,
90
91	TESTFUNC_LAST
92};
93
94enum StencilOp
95{
96	STENCILOP_KEEP = 0,
97	STENCILOP_ZERO,
98	STENCILOP_REPLACE,
99	STENCILOP_INCR, //!< Increment with saturation.
100	STENCILOP_DECR, //!< Decrement with saturation.
101	STENCILOP_INCR_WRAP,
102	STENCILOP_DECR_WRAP,
103	STENCILOP_INVERT,
104
105	STENCILOP_LAST
106};
107
108enum BlendMode
109{
110	BLENDMODE_NONE = 0,		//!< No blending.
111	BLENDMODE_STANDARD,		//!< Standard blending.
112	BLENDMODE_ADVANCED,		//!< Advanced blending mode, as defined in GL_KHR_blend_equation_advanced.
113
114	BLENDMODE_LAST
115};
116
117enum BlendEquation
118{
119	BLENDEQUATION_ADD = 0,
120	BLENDEQUATION_SUBTRACT,
121	BLENDEQUATION_REVERSE_SUBTRACT,
122	BLENDEQUATION_MIN,
123	BLENDEQUATION_MAX,
124
125	BLENDEQUATION_LAST
126};
127
128enum BlendEquationAdvanced
129{
130	BLENDEQUATION_ADVANCED_MULTIPLY = 0,
131	BLENDEQUATION_ADVANCED_SCREEN,
132	BLENDEQUATION_ADVANCED_OVERLAY,
133	BLENDEQUATION_ADVANCED_DARKEN,
134	BLENDEQUATION_ADVANCED_LIGHTEN,
135	BLENDEQUATION_ADVANCED_COLORDODGE,
136	BLENDEQUATION_ADVANCED_COLORBURN,
137	BLENDEQUATION_ADVANCED_HARDLIGHT,
138	BLENDEQUATION_ADVANCED_SOFTLIGHT,
139	BLENDEQUATION_ADVANCED_DIFFERENCE,
140	BLENDEQUATION_ADVANCED_EXCLUSION,
141	BLENDEQUATION_ADVANCED_HSL_HUE,
142	BLENDEQUATION_ADVANCED_HSL_SATURATION,
143	BLENDEQUATION_ADVANCED_HSL_COLOR,
144	BLENDEQUATION_ADVANCED_HSL_LUMINOSITY,
145
146	BLENDEQUATION_ADVANCED_LAST
147};
148
149enum BlendFunc
150{
151	BLENDFUNC_ZERO = 0,
152	BLENDFUNC_ONE,
153	BLENDFUNC_SRC_COLOR,
154	BLENDFUNC_ONE_MINUS_SRC_COLOR,
155	BLENDFUNC_DST_COLOR,
156	BLENDFUNC_ONE_MINUS_DST_COLOR,
157	BLENDFUNC_SRC_ALPHA,
158	BLENDFUNC_ONE_MINUS_SRC_ALPHA,
159	BLENDFUNC_DST_ALPHA,
160	BLENDFUNC_ONE_MINUS_DST_ALPHA,
161	BLENDFUNC_CONSTANT_COLOR,
162	BLENDFUNC_ONE_MINUS_CONSTANT_COLOR,
163	BLENDFUNC_CONSTANT_ALPHA,
164	BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA,
165	BLENDFUNC_SRC_ALPHA_SATURATE,
166	BLENDFUNC_SRC1_COLOR,
167	BLENDFUNC_ONE_MINUS_SRC1_COLOR,
168	BLENDFUNC_SRC1_ALPHA,
169	BLENDFUNC_ONE_MINUS_SRC1_ALPHA,
170
171	BLENDFUNC_LAST
172};
173
174struct StencilState
175{
176	TestFunc	func;
177	int			ref;
178	deUint32	compMask;
179	StencilOp	sFail;
180	StencilOp	dpFail;
181	StencilOp	dpPass;
182	deUint32	writeMask;
183
184	StencilState (void)
185		: func		(TESTFUNC_ALWAYS)
186		, ref		(0)
187		, compMask	(~0U)
188		, sFail		(STENCILOP_KEEP)
189		, dpFail	(STENCILOP_KEEP)
190		, dpPass	(STENCILOP_KEEP)
191		, writeMask	(~0U)
192	{
193	}
194};
195
196struct BlendState
197{
198	BlendEquation	equation;
199	BlendFunc		srcFunc;
200	BlendFunc		dstFunc;
201
202	BlendState (void)
203		: equation	(BLENDEQUATION_ADD)
204		, srcFunc	(BLENDFUNC_ONE)
205		, dstFunc	(BLENDFUNC_ZERO)
206	{
207	}
208};
209
210struct WindowRectangle
211{
212	int left;
213	int bottom;
214	int width;
215	int height;
216
217	WindowRectangle (int left_, int bottom_, int width_, int height_)
218		: left		(left_)
219		, bottom	(bottom_)
220		, width		(width_)
221		, height	(height_)
222	{
223	}
224};
225
226struct FragmentOperationState
227{
228	// Variables corresponding to GL state variables.
229
230	bool						scissorTestEnabled;
231	WindowRectangle				scissorRectangle;
232
233	bool						stencilTestEnabled;
234	StencilState				stencilStates[2];	//!< Indexed with FACETYPE_FRONT and FACETYPE_BACK.
235
236	bool						depthTestEnabled;
237	TestFunc					depthFunc;
238	bool						depthMask;
239
240	BlendMode					blendMode;
241
242	// Standard blending state
243	BlendState					blendRGBState;
244	BlendState					blendAState;
245	tcu::Vec4					blendColor;			//!< Components should be in range [0, 1].
246
247	BlendEquationAdvanced		blendEquationAdvaced;
248
249	bool						sRGBEnabled;
250
251	bool						depthClampEnabled;
252
253	bool						polygonOffsetEnabled;
254	float						polygonOffsetFactor;
255	float						polygonOffsetUnits;
256
257	tcu::BVec4					colorMask;
258
259	// Variables not corresponding to configurable GL state, but other GL variables.
260
261	int							numStencilBits;
262
263	FragmentOperationState (void)
264		: scissorTestEnabled	(false)
265		, scissorRectangle		(0, 0, 1, 1)
266
267		, stencilTestEnabled	(false)
268		// \note stencilStates[] members get default-constructed.
269
270		, depthTestEnabled		(false)
271		, depthFunc				(TESTFUNC_LESS)
272		, depthMask				(true)
273
274		, blendMode				(BLENDMODE_NONE)
275		, blendRGBState			()
276		, blendAState			()
277		, blendColor			(0.0f)
278		, blendEquationAdvaced	(BLENDEQUATION_ADVANCED_LAST)
279
280		, sRGBEnabled			(true)
281
282		, depthClampEnabled		(false)
283
284		, polygonOffsetEnabled	(false)
285		, polygonOffsetFactor	(0.0f)
286		, polygonOffsetUnits	(0.0f)
287
288		, colorMask				(true)
289
290		, numStencilBits		(8)
291	{
292	}
293};
294
295struct PointState
296{
297	float	pointSize;
298
299	PointState (void)
300		: pointSize(1.0f)
301	{
302	}
303};
304
305struct LineState
306{
307	float	lineWidth;
308
309	LineState (void)
310		: lineWidth(1.0f)
311	{
312	}
313};
314
315
316struct ViewportState
317{
318	WindowRectangle	rect;
319	float			zn;
320	float			zf;
321
322	explicit ViewportState (const WindowRectangle& rect_)
323		: rect	(rect_)
324		, zn	(0.0f)
325		, zf	(1.0f)
326	{
327	}
328
329	explicit ViewportState (const rr::MultisampleConstPixelBufferAccess& multisampleBuffer)
330		: rect	(0, 0, multisampleBuffer.raw().getHeight(), multisampleBuffer.raw().getDepth())
331		, zn	(0.0f)
332		, zf	(1.0f)
333	{
334	}
335};
336
337struct RestartState
338{
339	bool		enabled;
340	deUint32	restartIndex;
341
342	RestartState (void)
343		: enabled		(false)
344		, restartIndex	(0xFFFFFFFFul)
345	{
346	}
347};
348
349struct RenderState
350{
351	explicit RenderState (const ViewportState& viewport_)
352		: cullMode					(CULLMODE_NONE)
353		, provokingVertexConvention	(PROVOKINGVERTEX_LAST)
354		, viewport					(viewport_)
355	{
356	}
357
358	CullMode					cullMode;
359	ProvokingVertex				provokingVertexConvention;
360	RasterizationState			rasterization;
361	FragmentOperationState		fragOps;
362	PointState					point;
363	ViewportState				viewport;
364	LineState					line;
365	RestartState				restart;
366};
367
368} // rr
369
370#endif // _RRRENDERSTATE_HPP
371