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