Standalone uniforms cache
[platform/core/uifw/dali-adaptor.git] / dali / internal / graphics / gles-impl / gles-graphics-program.h
1 #ifndef DALI_GRAPHICS_GLES_PROGRAM_H
2 #define DALI_GRAPHICS_GLES_PROGRAM_H
3
4 /*
5  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  */
19
20 // EXTERNAL INCLUDES
21 #include <dali/graphics-api/graphics-program-create-info.h>
22 #include <dali/graphics-api/graphics-program.h>
23
24 // INTERNAL INCLUDES
25 #include "gles-graphics-resource.h"
26
27 namespace Dali::Graphics::GLES
28 {
29 class Reflection;
30
31 /**
32  * @brief Program implementation
33  *
34  * Program implementation is owned only by the PipelineCache
35  *
36  * Like pipeline, it's created and managed by the PipelineCache
37  */
38 class ProgramImpl
39 {
40 public:
41   /**
42    * @brief Constructor
43    *
44    * @param[in] createInfo  Valid create info structure
45    * @param[in] controller Valid reference to the controller object
46    */
47   ProgramImpl(const Graphics::ProgramCreateInfo& createInfo, Graphics::EglGraphicsController& controller);
48
49   /**
50    * @brief Destructor
51    */
52   ~ProgramImpl();
53
54   /**
55    * @brief Destroys GL resources associated with the Program
56    *
57    * @return True on success
58    */
59   bool Destroy();
60
61   /**
62    * @brief Creates GL resource for this Program
63    *
64    * @return True on success
65    */
66   bool Create();
67
68   /**
69    * @brief Returns GL program id
70    *
71    * @return GL program id
72    */
73   [[nodiscard]] uint32_t GetGlProgram() const;
74
75   /**
76    * @brief Increases ref count
77    *
78    * @return new refcount
79    */
80   uint32_t Retain();
81
82   /**
83    * @brief Decreases ref count
84    *
85    * @return New refcount
86    */
87   uint32_t Release();
88
89   /**
90    * @brief Returns reflection
91    *
92    * @return Valid reflection associated with the Program
93    */
94   [[nodiscard]] const GLES::Reflection& GetReflection() const;
95
96   /**
97    * @brief Returns controller
98    *
99    * @return Valid Controller object
100    */
101   [[nodiscard]] EglGraphicsController& GetController() const;
102
103   /**
104    * @brief Returns create info structure
105    *
106    * @return Reference to valid create info structure
107    */
108   [[nodiscard]] const ProgramCreateInfo& GetCreateInfo() const;
109
110   /**
111    * @brief Returns parameter value specified by parameterId
112    *
113    * This function can be used as a backdoor into the implementation
114    * used to retrieve internal data.
115    *
116    * @param[in] parameterId Integer parameter id
117    * @param[out] out Pointer to write to
118    *
119    * @return True on success
120    */
121   bool GetParameter(uint32_t parameterId, void* out);
122
123   /**
124    * @brief Updates standalone uniforms
125    *
126    * Updates standalone uniforms (issues the GL calls) and
127    * updates internal uniform cache
128    *
129    * @param[in] ptr Valid pointer to the uniform block memory
130    */
131   void UpdateStandaloneUniformBlock(const char* ptr);
132
133   /**
134    * @brief Builds standalone uniform cache
135    *
136    * This function allocates cache memory and
137    * gathers a list of GL functions per uniform type.
138    */
139   void BuildStandaloneUniformCache();
140
141 private:
142   friend class Program;
143
144   struct Impl;
145   std::unique_ptr<Impl> mImpl;
146 };
147
148 ///////////////////////////////////////////////////////////////
149
150 /**
151  * @brief Wrapper for the pipeline implementation
152  *
153  * This object is returned back to the client-side
154  */
155 class Program : public Graphics::Program
156 {
157 public:
158   /**
159    * @brief Constructor
160    *
161    * @param[in] impl Pointer to valid implementation
162    */
163   explicit Program(ProgramImpl* impl)
164   : mProgram(impl)
165   {
166     mProgram->Retain();
167   }
168
169   /**
170    * @brief Destructor
171    */
172   ~Program() override;
173
174   /**
175    * @brief Returns reference to the Reflection object
176
177    * @return Reflection
178    */
179   [[nodiscard]] const GLES::Reflection& GetReflection() const;
180
181   /**
182    * @brief Retrieves internal program implementation
183    *
184    * @return Valid pointer to the ProgramImpl object
185    */
186   [[nodiscard]] ProgramImpl* GetImplementation() const
187   {
188     return mProgram;
189   }
190
191   /**
192    * @brief Returns controller
193    *
194    * @return controller
195    */
196   [[nodiscard]] EglGraphicsController& GetController() const;
197
198   /**
199    * @brief Returns create info structure
200    *
201    * @return create info structure
202    */
203   [[nodiscard]] const ProgramCreateInfo& GetCreateInfo() const;
204
205   bool operator==(const GLES::Program& program) const
206   {
207     return (program.mProgram == mProgram);
208   }
209
210   bool operator==(const GLES::ProgramImpl* programImpl) const
211   {
212     return (programImpl == mProgram);
213   }
214
215   bool operator!=(const GLES::Program& program) const
216   {
217     return (program.mProgram != mProgram);
218   }
219
220   /**
221    * @brief Run by UniquePtr to discard resource
222    */
223   void DiscardResource();
224
225   /**
226    * @brief Destroying GL resources
227    *
228    * This function is kept for compatibility with Resource<> class
229    * so can the object can be use with templated functions.
230    */
231   void DestroyResource()
232   {
233     // nothing to do here
234   }
235
236 private:
237   ProgramImpl* mProgram{nullptr};
238 };
239 } // namespace Dali::Graphics::GLES
240
241 #endif //DALI_GRAPHICS_GLES_PROGRAM_H