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 //! Viewport Orientation of renderer this will be compared against 67 enum ViewportOrientation 68 { 69 VIEWPORTORIENTATION_LOWER_LEFT = 0, //<! Corresponds to GL 70 VIEWPORTORIENTATION_UPPER_LEFT, //<! Corresponds to Vulkan 71 72 VIEWPORTORIENTATION_LAST 73 }; 74 75 struct RasterizationState 76 { RasterizationStaterr::RasterizationState77 RasterizationState (void) 78 : winding (WINDING_CCW) 79 , horizontalFill (FILL_LEFT) 80 , verticalFill (FILL_BOTTOM) 81 , viewportOrientation (VIEWPORTORIENTATION_LAST) 82 { 83 } 84 85 Winding winding; 86 HorizontalFill horizontalFill; 87 VerticalFill verticalFill; 88 ViewportOrientation viewportOrientation; 89 }; 90 91 enum TestFunc 92 { 93 TESTFUNC_NEVER = 0, 94 TESTFUNC_ALWAYS, 95 TESTFUNC_LESS, 96 TESTFUNC_LEQUAL, 97 TESTFUNC_GREATER, 98 TESTFUNC_GEQUAL, 99 TESTFUNC_EQUAL, 100 TESTFUNC_NOTEQUAL, 101 102 TESTFUNC_LAST 103 }; 104 105 enum StencilOp 106 { 107 STENCILOP_KEEP = 0, 108 STENCILOP_ZERO, 109 STENCILOP_REPLACE, 110 STENCILOP_INCR, //!< Increment with saturation. 111 STENCILOP_DECR, //!< Decrement with saturation. 112 STENCILOP_INCR_WRAP, 113 STENCILOP_DECR_WRAP, 114 STENCILOP_INVERT, 115 116 STENCILOP_LAST 117 }; 118 119 enum BlendMode 120 { 121 BLENDMODE_NONE = 0, //!< No blending. 122 BLENDMODE_STANDARD, //!< Standard blending. 123 BLENDMODE_ADVANCED, //!< Advanced blending mode, as defined in GL_KHR_blend_equation_advanced. 124 125 BLENDMODE_LAST 126 }; 127 128 enum BlendEquation 129 { 130 BLENDEQUATION_ADD = 0, 131 BLENDEQUATION_SUBTRACT, 132 BLENDEQUATION_REVERSE_SUBTRACT, 133 BLENDEQUATION_MIN, 134 BLENDEQUATION_MAX, 135 136 BLENDEQUATION_LAST 137 }; 138 139 enum BlendEquationAdvanced 140 { 141 BLENDEQUATION_ADVANCED_MULTIPLY = 0, 142 BLENDEQUATION_ADVANCED_SCREEN, 143 BLENDEQUATION_ADVANCED_OVERLAY, 144 BLENDEQUATION_ADVANCED_DARKEN, 145 BLENDEQUATION_ADVANCED_LIGHTEN, 146 BLENDEQUATION_ADVANCED_COLORDODGE, 147 BLENDEQUATION_ADVANCED_COLORBURN, 148 BLENDEQUATION_ADVANCED_HARDLIGHT, 149 BLENDEQUATION_ADVANCED_SOFTLIGHT, 150 BLENDEQUATION_ADVANCED_DIFFERENCE, 151 BLENDEQUATION_ADVANCED_EXCLUSION, 152 BLENDEQUATION_ADVANCED_HSL_HUE, 153 BLENDEQUATION_ADVANCED_HSL_SATURATION, 154 BLENDEQUATION_ADVANCED_HSL_COLOR, 155 BLENDEQUATION_ADVANCED_HSL_LUMINOSITY, 156 157 BLENDEQUATION_ADVANCED_LAST 158 }; 159 160 enum BlendFunc 161 { 162 BLENDFUNC_ZERO = 0, 163 BLENDFUNC_ONE, 164 BLENDFUNC_SRC_COLOR, 165 BLENDFUNC_ONE_MINUS_SRC_COLOR, 166 BLENDFUNC_DST_COLOR, 167 BLENDFUNC_ONE_MINUS_DST_COLOR, 168 BLENDFUNC_SRC_ALPHA, 169 BLENDFUNC_ONE_MINUS_SRC_ALPHA, 170 BLENDFUNC_DST_ALPHA, 171 BLENDFUNC_ONE_MINUS_DST_ALPHA, 172 BLENDFUNC_CONSTANT_COLOR, 173 BLENDFUNC_ONE_MINUS_CONSTANT_COLOR, 174 BLENDFUNC_CONSTANT_ALPHA, 175 BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA, 176 BLENDFUNC_SRC_ALPHA_SATURATE, 177 BLENDFUNC_SRC1_COLOR, 178 BLENDFUNC_ONE_MINUS_SRC1_COLOR, 179 BLENDFUNC_SRC1_ALPHA, 180 BLENDFUNC_ONE_MINUS_SRC1_ALPHA, 181 182 BLENDFUNC_LAST 183 }; 184 185 struct StencilState 186 { 187 TestFunc func; 188 int ref; 189 deUint32 compMask; 190 StencilOp sFail; 191 StencilOp dpFail; 192 StencilOp dpPass; 193 deUint32 writeMask; 194 StencilStaterr::StencilState195 StencilState (void) 196 : func (TESTFUNC_ALWAYS) 197 , ref (0) 198 , compMask (~0U) 199 , sFail (STENCILOP_KEEP) 200 , dpFail (STENCILOP_KEEP) 201 , dpPass (STENCILOP_KEEP) 202 , writeMask (~0U) 203 { 204 } 205 }; 206 207 struct BlendState 208 { 209 BlendEquation equation; 210 BlendFunc srcFunc; 211 BlendFunc dstFunc; 212 BlendStaterr::BlendState213 BlendState (void) 214 : equation (BLENDEQUATION_ADD) 215 , srcFunc (BLENDFUNC_ONE) 216 , dstFunc (BLENDFUNC_ZERO) 217 { 218 } 219 }; 220 221 struct WindowRectangle 222 { 223 int left; 224 int bottom; 225 int width; 226 int height; 227 WindowRectanglerr::WindowRectangle228 WindowRectangle (int left_, int bottom_, int width_, int height_) 229 : left (left_) 230 , bottom (bottom_) 231 , width (width_) 232 , height (height_) 233 { 234 } 235 }; 236 237 struct FragmentOperationState 238 { 239 // Variables corresponding to GL state variables. 240 241 bool scissorTestEnabled; 242 WindowRectangle scissorRectangle; 243 244 bool stencilTestEnabled; 245 StencilState stencilStates[2]; //!< Indexed with FACETYPE_FRONT and FACETYPE_BACK. 246 247 bool depthTestEnabled; 248 TestFunc depthFunc; 249 bool depthMask; 250 251 bool depthBoundsTestEnabled; 252 float minDepthBound; 253 float maxDepthBound; 254 255 BlendMode blendMode; 256 257 // Standard blending state 258 BlendState blendRGBState; 259 BlendState blendAState; 260 tcu::Vec4 blendColor; //!< Components should be in range [0, 1]. 261 262 BlendEquationAdvanced blendEquationAdvaced; 263 264 bool sRGBEnabled; 265 266 bool depthClampEnabled; 267 268 bool polygonOffsetEnabled; 269 float polygonOffsetFactor; 270 float polygonOffsetUnits; 271 272 tcu::BVec4 colorMask; 273 274 // Variables not corresponding to configurable GL state, but other GL variables. 275 276 int numStencilBits; 277 FragmentOperationStaterr::FragmentOperationState278 FragmentOperationState (void) 279 : scissorTestEnabled (false) 280 , scissorRectangle (0, 0, 1, 1) 281 282 , stencilTestEnabled (false) 283 // \note stencilStates[] members get default-constructed. 284 285 , depthTestEnabled (false) 286 , depthFunc (TESTFUNC_LESS) 287 , depthMask (true) 288 289 , depthBoundsTestEnabled(false) 290 , minDepthBound (0.0f) 291 , maxDepthBound (1.0f) 292 293 , blendMode (BLENDMODE_NONE) 294 , blendRGBState () 295 , blendAState () 296 , blendColor (0.0f) 297 , blendEquationAdvaced (BLENDEQUATION_ADVANCED_LAST) 298 299 , sRGBEnabled (true) 300 301 , depthClampEnabled (false) 302 303 , polygonOffsetEnabled (false) 304 , polygonOffsetFactor (0.0f) 305 , polygonOffsetUnits (0.0f) 306 307 , colorMask (true) 308 309 , numStencilBits (8) 310 { 311 } 312 }; 313 314 struct PointState 315 { 316 float pointSize; 317 PointStaterr::PointState318 PointState (void) 319 : pointSize(1.0f) 320 { 321 } 322 }; 323 324 struct LineState 325 { 326 float lineWidth; 327 LineStaterr::LineState328 LineState (void) 329 : lineWidth(1.0f) 330 { 331 } 332 }; 333 334 335 struct ViewportState 336 { 337 WindowRectangle rect; 338 float zn; 339 float zf; 340 ViewportStaterr::ViewportState341 explicit ViewportState (const WindowRectangle& rect_) 342 : rect (rect_) 343 , zn (0.0f) 344 , zf (1.0f) 345 { 346 } 347 ViewportStaterr::ViewportState348 explicit ViewportState (const rr::MultisampleConstPixelBufferAccess& multisampleBuffer) 349 : rect (0, 0, multisampleBuffer.raw().getHeight(), multisampleBuffer.raw().getDepth()) 350 , zn (0.0f) 351 , zf (1.0f) 352 { 353 } 354 }; 355 356 struct RestartState 357 { 358 bool enabled; 359 deUint32 restartIndex; 360 RestartStaterr::RestartState361 RestartState (void) 362 : enabled (false) 363 , restartIndex (0xFFFFFFFFul) 364 { 365 } 366 }; 367 368 //! Rasterizer configuration 369 struct RenderState 370 { RenderStaterr::RenderState371 explicit RenderState (const ViewportState& viewport_, const int subpixelBits_, ViewportOrientation viewportOrientation_ = VIEWPORTORIENTATION_LOWER_LEFT) 372 : cullMode (CULLMODE_NONE) 373 , provokingVertexConvention (PROVOKINGVERTEX_LAST) 374 , viewport (viewport_) 375 , viewportOrientation (viewportOrientation_) 376 , subpixelBits (subpixelBits_) 377 { 378 rasterization.viewportOrientation = viewportOrientation; 379 } 380 381 enum 382 { 383 DEFAULT_SUBPIXEL_BITS = 8 384 }; 385 386 CullMode cullMode; 387 ProvokingVertex provokingVertexConvention; 388 RasterizationState rasterization; 389 FragmentOperationState fragOps; 390 PointState point; 391 ViewportState viewport; 392 LineState line; 393 RestartState restart; 394 ViewportOrientation viewportOrientation; 395 const int subpixelBits; 396 }; 397 398 } // rr 399 400 #endif // _RRRENDERSTATE_HPP 401