Updated all header files to new format
[platform/core/uifw/dali-toolkit.git] / dali-scene-loader / public-api / renderer-state.h
1 #ifndef DALI_SCENE_LOADER_RENDERER_STATE_H
2 #define DALI_SCENE_LOADER_RENDERER_STATE_H
3 /*
4  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 // INTERAL INCLUDES
21 #include "dali-scene-loader/public-api/api.h"
22
23 // EXTERNAL INCLUDES
24 #include "dali/public-api/rendering/renderer.h"
25
26 namespace Dali
27 {
28 namespace SceneLoader
29 {
30 /*
31  * @brief Contains values for comparison functions used in depth and stencil testing.
32  * @note Relative order of members must match DepthFunction::Type and StencilFunction::Type.
33  */
34 struct DALI_SCENE_LOADER_API Comparison
35 {
36   enum Type
37   {
38     OMIT, // not specified; will not be set.
39     NEVER,
40     ALWAYS,
41     LESS,
42     GREATER,
43     EQUAL,
44     NOT_EQUAL,
45     LESS_EQUAL,
46     GREATER_EQUAL
47   };
48
49   Comparison() = delete;
50 };
51
52 /*
53  * @brief Determines the blend factor used.
54  * @note Relative order of members must match BlendFactor::Type.
55  */
56 struct DALI_SCENE_LOADER_API BlendFactor
57 {
58   enum Type
59   {
60     OMIT, // not specified - will not be updated
61     ZERO,
62     ONE, // default for source alpha
63     SRC_COLOR,
64     ONE_MINUS_SRC_COLOR,
65     SRC_ALPHA,           // default for source RGB
66     ONE_MINUS_SRC_ALPHA, // default for destination RGB and destination alpha
67     DST_ALPHA,
68     ONE_MINUS_DST_ALPHA,
69     DST_COLOR,
70     ONE_MINUS_DST_COLOR,
71     SRC_ALPHA_SATURATE,
72     CONSTANT_COLOR,
73     ONE_MINUS_CONSTANT_COLOR,
74     CONSTANT_ALPHA,
75     ONE_MINUS_CONSTANT_ALPHA,
76   };
77
78   BlendFactor() = delete;
79 };
80
81 /*
82  * @brief Determines which buffers shall the Renderer write into.
83  * @note Relative order of members must match RenderMode::Type.
84  */
85 struct DALI_SCENE_LOADER_API BufferMode
86 {
87   enum Type
88   {
89     OMIT,         ///< not specified - will not be updated
90     NONE,         ///< Don’t write to either color or stencil buffer (But will potentially render to depth buffer).
91     AUTO,         ///< Writes are managed by the Actor Clipping API. This is DALi's default.
92     COLOR,        ///< Ignore stencil properties.  Write to the color buffer.
93     STENCIL,      ///< Use the stencil properties. Do not write to the color buffer.
94     COLOR_STENCIL ///< Use the stencil properties AND Write to the color buffer.
95   };
96
97   BufferMode() = delete;
98 };
99
100 /*
101  * @brief Contains values and functionality for configuring Renderers.
102  */
103 namespace RendererState
104 {
105 using Type = uint32_t; // 8 bits reserved for flags, 4 * 4 bit for blend factors, 4 bits for depth function
106
107 enum DALI_SCENE_LOADER_API Value : Type
108 {
109   NONE = 0x0,
110
111   DEPTH_WRITE = 0x01,
112   DEPTH_TEST  = 0x02,
113
114   CULL_FRONT = 0x04,
115   CULL_BACK  = 0x08,
116
117   ALPHA_BLEND = 0x10,
118
119   DEPTH_FUNCTION_SHIFT = 6,
120   DEPTH_FUNCTION_BITS  = 4,
121   DEPTH_FUNCTION_MASK  = ((1 << DEPTH_FUNCTION_BITS) - 1) << DEPTH_FUNCTION_SHIFT,
122
123   BLEND_FACTOR_BASE_SHIFT = DEPTH_FUNCTION_SHIFT + DEPTH_FUNCTION_BITS,
124   BLEND_FACTOR_ITEM_BITS  = 4,
125   BLEND_FACTOR_ITEMS      = 4,
126   BLEND_FACTOR_BITS       = BLEND_FACTOR_ITEM_BITS * BLEND_FACTOR_ITEMS,
127   BLEND_FACTOR_MASK       = ((1 << BLEND_FACTOR_BITS) - 1) << BLEND_FACTOR_BASE_SHIFT,
128   BLEND_FACTOR_ITEM_MASK  = (1 << BLEND_FACTOR_ITEM_BITS) - 1, // after rshifting by BLEND_FACTOR_BASE_SHIFT
129
130   // Buffer mode is DALi's RenderMode, just to avoid too much conflation.
131   BUFFER_MODE_BITS  = 3u,
132   BUFFER_MODE_SHIFT = 32u - BUFFER_MODE_BITS, // from end
133   BUFFER_MODE_MASK  = ((1u << BUFFER_MODE_BITS) - 1u) << BUFFER_MODE_SHIFT,
134
135   DEFAULT = DEPTH_WRITE | DEPTH_TEST | CULL_BACK | (Comparison::LESS_EQUAL << DEPTH_FUNCTION_SHIFT),
136 };
137
138 /*
139  * @brief Encodes the given blend factors into a RenderMode value, maskable into other options,
140  *  passable into ApplyRenderMode().
141  */
142 inline DALI_SCENE_LOADER_API constexpr uint32_t FromBlendFactors(BlendFactor::Type srcRgb, BlendFactor::Type destRgb, BlendFactor::Type srcAlpha, BlendFactor::Type destAlpha)
143 {
144   return (srcRgb | (destRgb << BLEND_FACTOR_ITEM_BITS) | (srcAlpha << (BLEND_FACTOR_ITEM_BITS * 2)) |
145           (destAlpha << (BLEND_FACTOR_ITEM_BITS * 3)))
146          << BLEND_FACTOR_BASE_SHIFT;
147 }
148
149 /*
150  * @brief Applies the settings encoded in @a rendererState, to a @a renderer.
151  * @note Depth function is only set if not Comparison::OMIT.
152  * @note Blend factors are only set if not BlendFactor::OMIT.
153  * @note Buffer mode is only set is not BufferMode::OMIT.
154  */
155 DALI_SCENE_LOADER_API void Apply(Type rendererState, Renderer& renderer);
156
157 } // namespace RendererState
158
159 } // namespace SceneLoader
160 } // namespace Dali
161
162 #endif //DALI_SCENE_LOADER_RENDERER_STATE_H