401 lines
7.9 KiB
C++
401 lines
7.9 KiB
C++
#ifndef _RRRENDERSTATE_HPP
|
|
#define _RRRENDERSTATE_HPP
|
|
/*-------------------------------------------------------------------------
|
|
* drawElements Quality Program Reference Renderer
|
|
* -----------------------------------------------
|
|
*
|
|
* Copyright 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*//*!
|
|
* \file
|
|
* \brief Reference renderer render state.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "rrDefs.hpp"
|
|
#include "rrMultisamplePixelBufferAccess.hpp"
|
|
#include "tcuTexture.hpp"
|
|
|
|
namespace rr
|
|
{
|
|
|
|
//! Horizontal fill rule
|
|
enum HorizontalFill
|
|
{
|
|
FILL_LEFT,
|
|
FILL_RIGHT
|
|
};
|
|
|
|
//! Vertical fill rule
|
|
enum VerticalFill
|
|
{
|
|
FILL_TOP,
|
|
FILL_BOTTOM,
|
|
};
|
|
|
|
//! Winding mode
|
|
enum Winding
|
|
{
|
|
WINDING_CCW = 0, //!< Counter-clockwise winding
|
|
WINDING_CW, //!< Clockwise winding
|
|
|
|
WINDING_LAST
|
|
};
|
|
|
|
//! Triangle cull mode
|
|
enum CullMode
|
|
{
|
|
CULLMODE_NONE,
|
|
CULLMODE_BACK,
|
|
CULLMODE_FRONT,
|
|
|
|
CULLMODE_LAST
|
|
};
|
|
|
|
//! Viewport Orientation of renderer this will be compared against
|
|
enum ViewportOrientation
|
|
{
|
|
VIEWPORTORIENTATION_LOWER_LEFT = 0, //<! Corresponds to GL
|
|
VIEWPORTORIENTATION_UPPER_LEFT, //<! Corresponds to Vulkan
|
|
|
|
VIEWPORTORIENTATION_LAST
|
|
};
|
|
|
|
struct RasterizationState
|
|
{
|
|
RasterizationState (void)
|
|
: winding (WINDING_CCW)
|
|
, horizontalFill (FILL_LEFT)
|
|
, verticalFill (FILL_BOTTOM)
|
|
, viewportOrientation (VIEWPORTORIENTATION_LAST)
|
|
{
|
|
}
|
|
|
|
Winding winding;
|
|
HorizontalFill horizontalFill;
|
|
VerticalFill verticalFill;
|
|
ViewportOrientation viewportOrientation;
|
|
};
|
|
|
|
enum TestFunc
|
|
{
|
|
TESTFUNC_NEVER = 0,
|
|
TESTFUNC_ALWAYS,
|
|
TESTFUNC_LESS,
|
|
TESTFUNC_LEQUAL,
|
|
TESTFUNC_GREATER,
|
|
TESTFUNC_GEQUAL,
|
|
TESTFUNC_EQUAL,
|
|
TESTFUNC_NOTEQUAL,
|
|
|
|
TESTFUNC_LAST
|
|
};
|
|
|
|
enum StencilOp
|
|
{
|
|
STENCILOP_KEEP = 0,
|
|
STENCILOP_ZERO,
|
|
STENCILOP_REPLACE,
|
|
STENCILOP_INCR, //!< Increment with saturation.
|
|
STENCILOP_DECR, //!< Decrement with saturation.
|
|
STENCILOP_INCR_WRAP,
|
|
STENCILOP_DECR_WRAP,
|
|
STENCILOP_INVERT,
|
|
|
|
STENCILOP_LAST
|
|
};
|
|
|
|
enum BlendMode
|
|
{
|
|
BLENDMODE_NONE = 0, //!< No blending.
|
|
BLENDMODE_STANDARD, //!< Standard blending.
|
|
BLENDMODE_ADVANCED, //!< Advanced blending mode, as defined in GL_KHR_blend_equation_advanced.
|
|
|
|
BLENDMODE_LAST
|
|
};
|
|
|
|
enum BlendEquation
|
|
{
|
|
BLENDEQUATION_ADD = 0,
|
|
BLENDEQUATION_SUBTRACT,
|
|
BLENDEQUATION_REVERSE_SUBTRACT,
|
|
BLENDEQUATION_MIN,
|
|
BLENDEQUATION_MAX,
|
|
|
|
BLENDEQUATION_LAST
|
|
};
|
|
|
|
enum BlendEquationAdvanced
|
|
{
|
|
BLENDEQUATION_ADVANCED_MULTIPLY = 0,
|
|
BLENDEQUATION_ADVANCED_SCREEN,
|
|
BLENDEQUATION_ADVANCED_OVERLAY,
|
|
BLENDEQUATION_ADVANCED_DARKEN,
|
|
BLENDEQUATION_ADVANCED_LIGHTEN,
|
|
BLENDEQUATION_ADVANCED_COLORDODGE,
|
|
BLENDEQUATION_ADVANCED_COLORBURN,
|
|
BLENDEQUATION_ADVANCED_HARDLIGHT,
|
|
BLENDEQUATION_ADVANCED_SOFTLIGHT,
|
|
BLENDEQUATION_ADVANCED_DIFFERENCE,
|
|
BLENDEQUATION_ADVANCED_EXCLUSION,
|
|
BLENDEQUATION_ADVANCED_HSL_HUE,
|
|
BLENDEQUATION_ADVANCED_HSL_SATURATION,
|
|
BLENDEQUATION_ADVANCED_HSL_COLOR,
|
|
BLENDEQUATION_ADVANCED_HSL_LUMINOSITY,
|
|
|
|
BLENDEQUATION_ADVANCED_LAST
|
|
};
|
|
|
|
enum BlendFunc
|
|
{
|
|
BLENDFUNC_ZERO = 0,
|
|
BLENDFUNC_ONE,
|
|
BLENDFUNC_SRC_COLOR,
|
|
BLENDFUNC_ONE_MINUS_SRC_COLOR,
|
|
BLENDFUNC_DST_COLOR,
|
|
BLENDFUNC_ONE_MINUS_DST_COLOR,
|
|
BLENDFUNC_SRC_ALPHA,
|
|
BLENDFUNC_ONE_MINUS_SRC_ALPHA,
|
|
BLENDFUNC_DST_ALPHA,
|
|
BLENDFUNC_ONE_MINUS_DST_ALPHA,
|
|
BLENDFUNC_CONSTANT_COLOR,
|
|
BLENDFUNC_ONE_MINUS_CONSTANT_COLOR,
|
|
BLENDFUNC_CONSTANT_ALPHA,
|
|
BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA,
|
|
BLENDFUNC_SRC_ALPHA_SATURATE,
|
|
BLENDFUNC_SRC1_COLOR,
|
|
BLENDFUNC_ONE_MINUS_SRC1_COLOR,
|
|
BLENDFUNC_SRC1_ALPHA,
|
|
BLENDFUNC_ONE_MINUS_SRC1_ALPHA,
|
|
|
|
BLENDFUNC_LAST
|
|
};
|
|
|
|
struct StencilState
|
|
{
|
|
TestFunc func;
|
|
int ref;
|
|
deUint32 compMask;
|
|
StencilOp sFail;
|
|
StencilOp dpFail;
|
|
StencilOp dpPass;
|
|
deUint32 writeMask;
|
|
|
|
StencilState (void)
|
|
: func (TESTFUNC_ALWAYS)
|
|
, ref (0)
|
|
, compMask (~0U)
|
|
, sFail (STENCILOP_KEEP)
|
|
, dpFail (STENCILOP_KEEP)
|
|
, dpPass (STENCILOP_KEEP)
|
|
, writeMask (~0U)
|
|
{
|
|
}
|
|
};
|
|
|
|
struct BlendState
|
|
{
|
|
BlendEquation equation;
|
|
BlendFunc srcFunc;
|
|
BlendFunc dstFunc;
|
|
|
|
BlendState (void)
|
|
: equation (BLENDEQUATION_ADD)
|
|
, srcFunc (BLENDFUNC_ONE)
|
|
, dstFunc (BLENDFUNC_ZERO)
|
|
{
|
|
}
|
|
};
|
|
|
|
struct WindowRectangle
|
|
{
|
|
int left;
|
|
int bottom;
|
|
int width;
|
|
int height;
|
|
|
|
WindowRectangle (int left_, int bottom_, int width_, int height_)
|
|
: left (left_)
|
|
, bottom (bottom_)
|
|
, width (width_)
|
|
, height (height_)
|
|
{
|
|
}
|
|
};
|
|
|
|
struct FragmentOperationState
|
|
{
|
|
// Variables corresponding to GL state variables.
|
|
|
|
bool scissorTestEnabled;
|
|
WindowRectangle scissorRectangle;
|
|
|
|
bool stencilTestEnabled;
|
|
StencilState stencilStates[2]; //!< Indexed with FACETYPE_FRONT and FACETYPE_BACK.
|
|
|
|
bool depthTestEnabled;
|
|
TestFunc depthFunc;
|
|
bool depthMask;
|
|
|
|
bool depthBoundsTestEnabled;
|
|
float minDepthBound;
|
|
float maxDepthBound;
|
|
|
|
BlendMode blendMode;
|
|
|
|
// Standard blending state
|
|
BlendState blendRGBState;
|
|
BlendState blendAState;
|
|
tcu::Vec4 blendColor; //!< Components should be in range [0, 1].
|
|
|
|
BlendEquationAdvanced blendEquationAdvaced;
|
|
|
|
bool sRGBEnabled;
|
|
|
|
bool depthClampEnabled;
|
|
|
|
bool polygonOffsetEnabled;
|
|
float polygonOffsetFactor;
|
|
float polygonOffsetUnits;
|
|
|
|
tcu::BVec4 colorMask;
|
|
|
|
// Variables not corresponding to configurable GL state, but other GL variables.
|
|
|
|
int numStencilBits;
|
|
|
|
FragmentOperationState (void)
|
|
: scissorTestEnabled (false)
|
|
, scissorRectangle (0, 0, 1, 1)
|
|
|
|
, stencilTestEnabled (false)
|
|
// \note stencilStates[] members get default-constructed.
|
|
|
|
, depthTestEnabled (false)
|
|
, depthFunc (TESTFUNC_LESS)
|
|
, depthMask (true)
|
|
|
|
, depthBoundsTestEnabled(false)
|
|
, minDepthBound (0.0f)
|
|
, maxDepthBound (1.0f)
|
|
|
|
, blendMode (BLENDMODE_NONE)
|
|
, blendRGBState ()
|
|
, blendAState ()
|
|
, blendColor (0.0f)
|
|
, blendEquationAdvaced (BLENDEQUATION_ADVANCED_LAST)
|
|
|
|
, sRGBEnabled (true)
|
|
|
|
, depthClampEnabled (false)
|
|
|
|
, polygonOffsetEnabled (false)
|
|
, polygonOffsetFactor (0.0f)
|
|
, polygonOffsetUnits (0.0f)
|
|
|
|
, colorMask (true)
|
|
|
|
, numStencilBits (8)
|
|
{
|
|
}
|
|
};
|
|
|
|
struct PointState
|
|
{
|
|
float pointSize;
|
|
|
|
PointState (void)
|
|
: pointSize(1.0f)
|
|
{
|
|
}
|
|
};
|
|
|
|
struct LineState
|
|
{
|
|
float lineWidth;
|
|
|
|
LineState (void)
|
|
: lineWidth(1.0f)
|
|
{
|
|
}
|
|
};
|
|
|
|
|
|
struct ViewportState
|
|
{
|
|
WindowRectangle rect;
|
|
float zn;
|
|
float zf;
|
|
|
|
explicit ViewportState (const WindowRectangle& rect_)
|
|
: rect (rect_)
|
|
, zn (0.0f)
|
|
, zf (1.0f)
|
|
{
|
|
}
|
|
|
|
explicit ViewportState (const rr::MultisampleConstPixelBufferAccess& multisampleBuffer)
|
|
: rect (0, 0, multisampleBuffer.raw().getHeight(), multisampleBuffer.raw().getDepth())
|
|
, zn (0.0f)
|
|
, zf (1.0f)
|
|
{
|
|
}
|
|
};
|
|
|
|
struct RestartState
|
|
{
|
|
bool enabled;
|
|
deUint32 restartIndex;
|
|
|
|
RestartState (void)
|
|
: enabled (false)
|
|
, restartIndex (0xFFFFFFFFul)
|
|
{
|
|
}
|
|
};
|
|
|
|
//! Rasterizer configuration
|
|
struct RenderState
|
|
{
|
|
explicit RenderState (const ViewportState& viewport_, const int subpixelBits_, ViewportOrientation viewportOrientation_ = VIEWPORTORIENTATION_LOWER_LEFT)
|
|
: cullMode (CULLMODE_NONE)
|
|
, provokingVertexConvention (PROVOKINGVERTEX_LAST)
|
|
, viewport (viewport_)
|
|
, viewportOrientation (viewportOrientation_)
|
|
, subpixelBits (subpixelBits_)
|
|
{
|
|
rasterization.viewportOrientation = viewportOrientation;
|
|
}
|
|
|
|
enum
|
|
{
|
|
DEFAULT_SUBPIXEL_BITS = 8
|
|
};
|
|
|
|
CullMode cullMode;
|
|
ProvokingVertex provokingVertexConvention;
|
|
RasterizationState rasterization;
|
|
FragmentOperationState fragOps;
|
|
PointState point;
|
|
ViewportState viewport;
|
|
LineState line;
|
|
RestartState restart;
|
|
ViewportOrientation viewportOrientation;
|
|
const int subpixelBits;
|
|
};
|
|
|
|
} // rr
|
|
|
|
#endif // _RRRENDERSTATE_HPP
|