5 * Copyright (c) 2024 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
27 #include <dali/public-api/object/property-value.h>
30 * @brief DALI_COMPOSE_SHADER macro provides a convenient way to write shader source code.
32 * We normally use double quotation marks to write a string such as "Hello World".
33 * However many symbols are needed to add multiple lines of string.
34 * We don't need to write quotation marks using this macro at every line.
36 * [An example of double quotation marks usage]
38 * const string FRAGMENT_SHADER_SOURCE = \
41 * " gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
44 * [An example of DALI_COMPOSE_SHADER usage]
46 * const string VERTEX_SHADER_SOURCE = DALI_COMPOSE_SHADER (
49 * gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);
50 * vTexCoord = aTexCoord;
57 #define DALI_COMPOSE_SHADER(STR) #STR
62 * @addtogroup dali_core_rendering_effects
66 namespace Internal DALI_INTERNAL
72 * @brief Shaders allows custom vertex and color transformations in the GPU.
76 class DALI_CORE_API Shader : public Handle
80 * @brief Hints for rendering.
86 * @brief Enumeration for the hint value.
91 NONE = 0x00, ///< No hints @SINCE_1_1.45
92 OUTPUT_IS_TRANSPARENT = 0x01, ///< Might generate transparent alpha from opaque inputs @SINCE_1_1.45
93 MODIFIES_GEOMETRY = 0x02, ///< Might change position of vertices, this option disables any culling optimizations @SINCE_1_1.45
98 * @brief Enumeration for instances of properties belonging to the Shader class.
104 * @brief Enumeration for instances of properties belonging to the Shader class.
110 * @brief Name: "program", Type: MAP or ARRAY.
111 * @note The default value is empty.
112 * @note It is Property::Map or Property::Array of the map.
113 * @note Format: {"renderPassTag":"", "vertex":"", "fragment":"", "hints":"", "name":""}
116 PROGRAM = DEFAULT_OBJECT_PROPERTY_START_INDEX,
121 * @brief Creates Shader.
124 * @param[in] vertexShader Vertex shader code for the effect.
125 * @param[in] fragmentShader Fragment Shader code for the effect.
126 * @param[in] hints Hints to define the geometry of the rendered object
127 * @param[in] shaderName The name of this shader. (optional)
128 * @return A handle to a shader effect
130 static Shader New(std::string_view vertexShader,
131 std::string_view fragmentShader,
132 Hint::Value hints = Hint::NONE,
133 std::string_view shaderName = "");
136 * @brief Creates Shader.
139 * @param[in] shaderMap Property::Map of shader data or Property::Array of Property::Map.
140 * Property::Map format is {"renderPassTag":"", "vertex":"", "fragment":"", "hints":""}
141 * shaderMap can be Property::Array of Property::Map for multi pass shading.
142 * @return A handle to a shader effect
144 static Shader New(Dali::Property::Value shaderMap);
147 * @brief Default constructor, creates an empty handle.
155 * This is non-virtual since derived Handle types must not contain data or virtual methods.
162 * @brief Copy constructor.
165 * @param[in] handle A handle to a Shader object
167 Shader(const Shader& handle);
170 * @brief Downcasts to a shader handle.
171 * If not, a shader the returned shader handle is left uninitialized.
174 * @param[in] handle Handle to an object
175 * @return Shader handle or an uninitialized handle
177 static Shader DownCast(BaseHandle handle);
180 * @brief Assignment operator, changes this handle to point at the same object.
183 * @param[in] handle Handle to an object
184 * @return Reference to the assigned object
186 Shader& operator=(const Shader& handle);
189 * @brief Move constructor.
192 * @param[in] rhs A reference to the moved handle
194 Shader(Shader&& rhs) noexcept;
197 * @brief Move assignment operator.
200 * @param[in] rhs A reference to the moved handle
201 * @return A reference to this
203 Shader& operator=(Shader&& rhs) noexcept;
206 * @brief Get the number of shading language version.
207 * @note This can potentially block until GL has been initialized
208 * when the first time any DALi application is launched in the system.
210 * @return shader languange version as integer.
212 static uint32_t GetShaderLanguageVersion();
215 * @brief Get shader preprocessor of shading language version.
216 * @note This can potentially block until GL has been initialized
217 * when the first time any DALi application is launched in the system.
219 * @return shader preprocessor string.
221 static std::string GetShaderVersionPrefix();
224 * @brief Get vertex shader preprocessor that includes shading language version.
225 * @note This can potentially block until GL has been initialized
226 * when the first time any DALi application is launched in the system.
228 * @return Vertex shader preprocessor string.
230 static std::string GetVertexShaderPrefix();
233 * @brief Get fragment shader preprocessor that includes shading language version.
234 * @note This can potentially block until GL has been initialized
235 * when the first time any DALi application is launched in the system.
237 * @return Fragment shader preprocessor string.
239 static std::string GetFragmentShaderPrefix();
243 * @brief This constructor is used by Dali New() methods.
244 * @note Not intended for application developers.
246 * @param[in] effect A pointer to a newly allocated Dali resource.
248 explicit DALI_INTERNAL Shader(Internal::Shader* effect);
256 #endif // DALI_SHADER_H