1 #ifndef DALI_INTERNAL_PROGRAM_H
2 #define DALI_INTERNAL_PROGRAM_H
5 * Copyright (c) 2022 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 <cstdint> // int32_t, uint32_t
26 #include <dali/internal/common/const-string.h>
27 #include <dali/internal/common/shader-data.h>
28 #include <dali/public-api/common/vector-wrapper.h>
29 #include <dali/public-api/object/ref-object.h>
38 } // namespace Graphics
47 * A program contains a vertex & fragment shader.
48 * It interfaces to the implementation program and it's reflection.
53 using Hash = std::size_t;
56 * Indices of default uniforms
58 enum class DefaultUniformIndex
74 * Creates a new program, or returns a copy of an existing program in the program cache
75 * @param[in] cache where the programs are stored
76 * @param[in] shaderData A pointer to a data structure containing the program source
77 * and optionally precompiled binary. If the binary is empty the program bytecode
78 * is copied into it after compilation and linking)
79 * @param[in] gfxController Reference to valid graphics Controller object
80 * @return pointer to the program
82 static Program* New(ProgramCache& cache, Internal::ShaderDataPtr shaderData, Graphics::Controller& gfxController);
85 * Set the projection matrix that has currently been sent
86 * @param matrix to set
88 void SetProjectionMatrix(const Matrix* matrix)
90 mProjectionMatrix = matrix;
94 * Get the projection matrix that has currently been sent
95 * @return the matrix that is set
97 const Matrix* GetProjectionMatrix()
99 return mProjectionMatrix;
103 * Set the projection matrix that has currently been sent
104 * @param matrix to set
106 void SetViewMatrix(const Matrix* matrix)
108 mViewMatrix = matrix;
112 * Get the projection matrix that has currently been sent
113 * @return the matrix that is set
115 const Matrix* GetViewMatrix()
120 [[nodiscard]] Graphics::Program& GetGraphicsProgram() const
125 [[nodiscard]] Graphics::Program* GetGraphicsProgramPtr() const
127 return mGfxProgram.get();
130 void SetGraphicsProgram(Graphics::UniquePtr<Graphics::Program>&& program);
133 * Retrieves uniform data.
134 * The lookup tries to minimise string comparisons. Ideally, when the hashedName is known
135 * and there are no hash collisions in the reflection it's the most optimal case.
137 * @param name Name of uniform
138 * @param hashedName Hash value from name or 0 if unknown
139 * @param hashedNameNoArray Hash value from name without array index & trailing string, or 0 if unknown
140 * @param out Reference to output structure
142 * @return False when uniform is not found or due to hash collision the result is ambiguous
144 bool GetUniform(const std::string_view& name, Hash hashedName, Hash hashedNameNoArray, Graphics::UniformInfo& out) const;
147 * Retrieves default uniform
148 * @param[in] defaultUniformIndex index of the uniform
149 * @return Valid pointer to the UniformInfo object or nullptr
151 [[nodiscard]] const Graphics::UniformInfo* GetDefaultUniform(DefaultUniformIndex defaultUniformIndex) const;
153 private: // Implementation
155 * Constructor, private so no direct instantiation
156 * @param[in] cache where the programs are stored
157 * @param[in] shaderData A smart pointer to a data structure containing the program source and binary
158 * @param[in] gfxController Reference to Graphics Controller object
160 Program(ProgramCache& cache, Internal::ShaderDataPtr shaderData, Graphics::Controller& gfxController);
163 Program() = delete; ///< default constructor, not defined
164 Program(const Program&) = delete; ///< copy constructor, not defined
165 Program& operator=(const Program&) = delete; ///< assignment operator, not defined
168 * Destructor, non virtual as no virtual methods or inheritance
174 * Struct ReflectionUniformInfo
175 * Contains details of a single uniform buffer field and/or sampler.
177 struct ReflectionUniformInfo
180 bool hasCollision{false};
181 Graphics::UniformInfo uniformInfo{};
185 * Build optimized shader reflection of uniforms
186 * @param graphicsReflection The graphics reflection
188 void BuildReflection(const Graphics::Reflection& graphicsReflection);
191 * Struct UniformBlockMemoryRequirements
192 * Contains details of a uniform blocks memory requirements
194 struct UniformBlockMemoryRequirements
197 uint32_t totalSizeRequired;
201 * Retrieves uniform blocks requirements
203 * @return Reference to the valid UniformBlockMemoryRequirements struct
205 [[nodiscard]] const UniformBlockMemoryRequirements& GetUniformBlocksMemoryRequirements() const
207 return mUniformBlockRequirements;
211 ProgramCache& mCache; ///< The program cache
212 const Matrix* mProjectionMatrix; ///< currently set projection matrix
213 const Matrix* mViewMatrix; ///< currently set view matrix
215 Graphics::UniquePtr<Graphics::Program> mGfxProgram; ///< Gfx program
216 Graphics::Controller& mGfxController; /// < Gfx controller
217 Internal::ShaderDataPtr mProgramData; ///< Shader program source and binary (when compiled & linked or loaded)
219 // uniform value caching
220 Vector3 mSizeUniformCache; ///< Cache value for size uniform
222 using UniformReflectionContainer = std::vector<ReflectionUniformInfo>;
224 UniformReflectionContainer mReflection{}; ///< Contains reflection build per program
225 UniformReflectionContainer mReflectionDefaultUniforms{}; ///< Contains default uniforms
226 UniformBlockMemoryRequirements mUniformBlockRequirements{}; ///< Memory requirements for uniform blocks
229 } // namespace Internal
233 #endif // DALI_INTERNAL_PROGRAM_H