5 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <string> // std::string
25 #include <dali/public-api/object/handle.h> // Dali::Handle
26 #include <dali/public-api/object/property-index-ranges.h> // DEFAULT_DERIVED_HANDLE_PROPERTY_START_INDEX
29 * @brief DALI_COMPOSE_SHADER macro provides a convenient way to write shader source code.
31 * We normally use double quotation marks to write a string such as "Hello World".
32 * However many symbols are needed to add multiple lines of string.
33 * We don't need to write quotation marks using this macro at every line.
35 * [An example of double quotation marks usage]
37 * const string FRAGMENT_SHADER_SOURCE = \
40 * " gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
43 * [An example of DALI_COMPOSE_SHADER usage]
45 * const string VERTEX_SHADER_SOURCE = DALI_COMPOSE_SHADER (
48 * gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);
49 * vTexCoord = aTexCoord;
56 #define DALI_COMPOSE_SHADER(STR) #STR
61 * @addtogroup dali_core_rendering_effects
65 namespace Internal DALI_INTERNAL
71 * @brief Shaders allows custom vertex and color transformations in the GPU.
75 class DALI_CORE_API Shader : public Handle
79 * @brief Hints for rendering.
85 * @brief Enumeration for the hint value.
90 NONE = 0x00, ///< No hints @SINCE_1_1.45
91 OUTPUT_IS_TRANSPARENT = 0x01, ///< Might generate transparent alpha from opaque inputs @SINCE_1_1.45
92 MODIFIES_GEOMETRY = 0x02, ///< Might change position of vertices, this option disables any culling optimizations @SINCE_1_1.45
97 * @brief Enumeration for instances of properties belonging to the Shader class.
103 * @brief Enumeration for instances of properties belonging to the Shader class.
109 * @brief Name: "program", Type: MAP.
110 * @note The default value is empty.
111 * @note Format: {"vertex":"","fragment":"",hints:""}
114 PROGRAM = DEFAULT_OBJECT_PROPERTY_START_INDEX
119 * @brief Creates Shader.
122 * @param[in] vertexShader Vertex shader code for the effect.
123 * @param[in] fragmentShader Fragment Shader code for the effect.
124 * @param[in] hints Hints to define the geometry of the rendered object
125 * @return A handle to a shader effect
127 static Shader New(std::string_view vertexShader,
128 std::string_view fragmentShader,
129 Hint::Value hints = Hint::NONE);
132 * @brief Default constructor, creates an empty handle.
140 * This is non-virtual since derived Handle types must not contain data or virtual methods.
147 * @brief Copy constructor.
150 * @param[in] handle A handle to a Shader object
152 Shader(const Shader& handle);
155 * @brief Downcasts to a shader handle.
156 * If not, a shader the returned shader handle is left uninitialized.
159 * @param[in] handle Handle to an object
160 * @return Shader handle or an uninitialized handle
162 static Shader DownCast(BaseHandle handle);
165 * @brief Assignment operator, changes this handle to point at the same object.
168 * @param[in] handle Handle to an object
169 * @return Reference to the assigned object
171 Shader& operator=(const Shader& handle);
174 * @brief Move constructor.
177 * @param[in] rhs A reference to the moved handle
179 Shader(Shader&& rhs);
182 * @brief Move assignment operator.
185 * @param[in] rhs A reference to the moved handle
186 * @return A reference to this
188 Shader& operator=(Shader&& rhs);
191 * @brief Get shader preprocessor of shading language version.
192 * @note This can potentially block until GL has been initialized
193 * when the first time any DALi application is launched in the system.
195 * @return shader preprocessor string.
197 static std::string GetShaderVersionPrefix();
200 * @brief Get vertex shader preprocessor that includes shading language version.
201 * @note This can potentially block until GL has been initialized
202 * when the first time any DALi application is launched in the system.
204 * @return Vertex shader preprocessor string.
206 static std::string GetVertexShaderPrefix();
209 * @brief Get fragment shader preprocessor that includes shading language version.
210 * @note This can potentially block until GL has been initialized
211 * when the first time any DALi application is launched in the system.
213 * @return Fragment shader preprocessor string.
215 static std::string GetFragmentShaderPrefix();
219 * @brief This constructor is used by Dali New() methods.
220 * @note Not intended for application developers.
222 * @param[in] effect A pointer to a newly allocated Dali resource.
224 explicit DALI_INTERNAL Shader(Internal::Shader* effect);
232 #endif // DALI_SHADER_H