1 #ifndef DALI_INTERNAL_PROGRAM_H
2 #define DALI_INTERNAL_PROGRAM_H
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 <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.
54 * Indices of default uniforms
56 enum class DefaultUniformIndex
72 * Creates a new program, or returns a copy of an existing program in the program cache
73 * @param[in] cache where the programs are stored
74 * @param[in] shaderData A pointer to a data structure containing the program source
75 * and optionally precompiled binary. If the binary is empty the program bytecode
76 * is copied into it after compilation and linking)
77 * @param[in] gfxController Reference to valid graphics Controller object
78 * @return pointer to the program
80 static Program* New(ProgramCache& cache, Internal::ShaderDataPtr shaderData, Graphics::Controller& gfxController);
83 * Set the projection matrix that has currently been sent
84 * @param matrix to set
86 void SetProjectionMatrix(const Matrix* matrix)
88 mProjectionMatrix = matrix;
92 * Get the projection matrix that has currently been sent
93 * @return the matrix that is set
95 const Matrix* GetProjectionMatrix()
97 return mProjectionMatrix;
101 * Set the projection matrix that has currently been sent
102 * @param matrix to set
104 void SetViewMatrix(const Matrix* matrix)
106 mViewMatrix = matrix;
110 * Get the projection matrix that has currently been sent
111 * @return the matrix that is set
113 const Matrix* GetViewMatrix()
118 [[nodiscard]] Graphics::Program& GetGraphicsProgram() const
123 [[nodiscard]] Graphics::Program* GetGraphicsProgramPtr() const
125 return mGfxProgram.get();
128 void SetGraphicsProgram( Graphics::UniquePtr<Graphics::Program>&& program );
131 * Retrieves uniform data.
132 * The lookup tries to minimise string comparisons. Ideally, when the hashedName is known
133 * and there are no hash collisions in the reflection it's the most optimal case.
135 * @param name Name of uniform
136 * @param hashedName Hash value from name or 0 if unknown
137 * @param out Reference to output structure
139 * @return False when uniform is not found or due to hash collision the result is ambiguous
141 bool GetUniform(const std::string& name, size_t hashedName, Graphics::UniformInfo& out) const;
144 * Retrieves default uniform
145 * @param[in] defaultUniformIndex index of the uniform
146 * @return Valid pointer to the UniformInfo object or nullptr
148 [[nodiscard]] const Graphics::UniformInfo* GetDefaultUniform(DefaultUniformIndex defaultUniformIndex) const;
150 private: // Implementation
152 * Constructor, private so no direct instantiation
153 * @param[in] cache where the programs are stored
154 * @param[in] shaderData A smart pointer to a data structure containing the program source and binary
155 * @param[in] gfxController Reference to Graphics Controller object
157 Program(ProgramCache& cache, Internal::ShaderDataPtr shaderData, Graphics::Controller& gfxController);
160 Program() = delete; ///< default constructor, not defined
161 Program(const Program&) = delete; ///< copy constructor, not defined
162 Program& operator=(const Program&) = delete; ///< assignment operator, not defined
165 * Destructor, non virtual as no virtual methods or inheritance
171 * Struct ReflectionUniformInfo
172 * Contains details of a single uniform buffer field and/or sampler.
174 struct ReflectionUniformInfo
177 bool hasCollision{false};
178 Graphics::UniformInfo uniformInfo{};
182 * Build optimized shader reflection of uniforms
183 * @param graphicsReflection The graphics reflection
185 void BuildReflection(const Graphics::Reflection& graphicsReflection);
188 * Struct UniformBlockMemoryRequirements
189 * Contains details of a uniform blocks memory requirements
191 struct UniformBlockMemoryRequirements
194 uint32_t totalSizeRequired;
198 * Retrieves uniform blocks requirements
200 * @return Reference to the valid UniformBlockMemoryRequirements struct
202 [[nodiscard]] const UniformBlockMemoryRequirements& GetUniformBlocksMemoryRequirements() const
204 return mUniformBlockRequirements;
208 ProgramCache& mCache; ///< The program cache
209 const Matrix* mProjectionMatrix; ///< currently set projection matrix
210 const Matrix* mViewMatrix; ///< currently set view matrix
212 Graphics::UniquePtr<Graphics::Program> mGfxProgram; ///< Gfx program
213 Graphics::Controller& mGfxController; /// < Gfx controller
214 Internal::ShaderDataPtr mProgramData; ///< Shader program source and binary (when compiled & linked or loaded)
216 // uniform value caching
217 Vector3 mSizeUniformCache; ///< Cache value for size uniform
219 using UniformReflectionContainer = std::vector<ReflectionUniformInfo>;
221 UniformReflectionContainer mReflection{}; ///< Contains reflection build per program
222 UniformReflectionContainer mReflectionDefaultUniforms{}; ///< Contains default uniforms
223 UniformBlockMemoryRequirements mUniformBlockRequirements{}; ///< Memory requirements for uniform blocks
226 } // namespace Internal
230 #endif // DALI_INTERNAL_PROGRAM_H