Home | History | Annotate | Download | only in referencerenderer
      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 
     30 namespace rr
     31 {
     32 
     33 //! Horizontal fill rule
     34 enum HorizontalFill
     35 {
     36 	FILL_LEFT,
     37 	FILL_RIGHT
     38 };
     39 
     40 //! Vertical fill rule
     41 enum VerticalFill
     42 {
     43 	FILL_TOP,
     44 	FILL_BOTTOM,
     45 };
     46 
     47 //! Winding mode
     48 enum Winding
     49 {
     50 	WINDING_CCW = 0,	//!< Counter-clockwise winding
     51 	WINDING_CW,			//!< Clockwise winding
     52 
     53 	WINDING_LAST
     54 };
     55 
     56 //! Triangle cull mode
     57 enum CullMode
     58 {
     59 	CULLMODE_NONE,
     60 	CULLMODE_BACK,
     61 	CULLMODE_FRONT,
     62 
     63 	CULLMODE_LAST
     64 };
     65 
     66 struct 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 
     80 enum 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 
     94 enum 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 
    108 enum 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 
    117 enum 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 
    128 enum 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 
    149 enum 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 
    174 struct 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 
    196 struct 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 
    210 struct 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 
    226 struct 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 
    295 struct PointState
    296 {
    297 	float	pointSize;
    298 
    299 	PointState (void)
    300 		: pointSize(1.0f)
    301 	{
    302 	}
    303 };
    304 
    305 struct LineState
    306 {
    307 	float	lineWidth;
    308 
    309 	LineState (void)
    310 		: lineWidth(1.0f)
    311 	{
    312 	}
    313 };
    314 
    315 
    316 struct 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 
    337 struct RestartState
    338 {
    339 	bool		enabled;
    340 	deUint32	restartIndex;
    341 
    342 	RestartState (void)
    343 		: enabled		(false)
    344 		, restartIndex	(0xFFFFFFFFul)
    345 	{
    346 	}
    347 };
    348 
    349 struct 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