Merge "Remove old pipeline caches" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-texture.h
1 #ifndef DALI_INTERNAL_RENDER_TEXTURE_H
2 #define DALI_INTERNAL_RENDER_TEXTURE_H
3
4 /*
5  * Copyright (c) 2023 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 <cstdint> // uint16_t, uint32_t
22 #include <string>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/images/image-operations.h> // Dali::ImageDimensions
26 #include <dali/public-api/rendering/sampler.h>
27 #include <dali/public-api/rendering/texture.h>
28
29 #include <dali/graphics-api/graphics-controller.h>
30 #include <dali/graphics-api/graphics-texture-create-info.h>
31 #include <dali/graphics-api/graphics-texture.h>
32 #include <dali/graphics-api/graphics-types.h>
33 #include <dali/internal/event/rendering/texture-impl.h>
34 #include <dali/internal/render/renderers/render-sampler.h>
35
36 namespace Dali
37 {
38 namespace Internal
39 {
40 namespace Render
41 {
42 struct Sampler;
43
44 class Texture
45 {
46 public:
47   using Type = Dali::TextureType::Type;
48
49   /**
50    * Factory method to return a new texture accessed by key.
51    */
52   static TextureKey NewKey(Type type, Pixel::Format format, ImageDimensions size);
53
54   /**
55    * Factory method to return a new texture accessed by key.
56    */
57   static TextureKey NewKey(NativeImageInterfacePtr nativeImageInterface);
58
59   /**
60    * Constructor
61    * @param[in] type The type of the texture
62    * @param[in] format The format of the pixel data
63    * @param[in] size The size of the texture
64    */
65   Texture(Type type, Pixel::Format format, ImageDimensions size);
66
67   /**
68    * Constructor from native image
69    * @param[in] nativeImageInterface The native image
70    */
71   explicit Texture(NativeImageInterfacePtr nativeImageInterface);
72
73   /**
74    * Destructor
75    */
76   ~Texture();
77
78   /**
79    * Deletes the texture from it's global memory pool
80    */
81   void operator delete(void* ptr);
82
83   static Texture* Get(TextureKey::KeyType);
84
85   /**
86    * Get the key of the given renderer in the associated memory pool.
87    * @param[in] renderer the given renderer
88    * @return The key in the associated memory pool.
89    */
90   static TextureKey GetKey(const Render::Texture& renderer);
91
92   /**
93    * Get the key of the given renderer in the associated memory pool.
94    * @param[in] renderer the given renderer
95    * @return The key in the associated memory pool, or -1 if not
96    * found.
97    */
98   static TextureKey GetKey(Render::Texture* renderer);
99
100   /**
101    * Stores the graphics controller for use when required.
102    *
103    * @param[in] graphicsController The graphics controller to use
104    */
105   void Initialize(Graphics::Controller& graphicsController);
106
107   /**
108    * Create the texture without a buffer
109    * @param[in] usage How texture will be used
110    */
111   void Create(Graphics::TextureUsageFlags usage);
112
113   /**
114    * Create a texture with a buffer if non-null
115    * @param[in] usage How texture will be used
116    * @param[in] buffer Buffer to copy
117    */
118   void CreateWithData(Graphics::TextureUsageFlags usage, uint8_t* buffer, uint32_t bufferSize);
119
120   /**
121    * Deletes the texture from the GPU
122    */
123   void Destroy();
124
125   /**
126    * Uploads data to the texture.
127    * @param[in] pixelData A pixel data object
128    * @param[in] params Upload parameters. See UploadParams
129    */
130   void Upload(PixelDataPtr pixelData, const Internal::Texture::UploadParams& params);
131
132   /**
133    * Auto generates mipmaps for the texture
134    */
135   void GenerateMipmaps();
136
137   /**
138    * Retrieve whether the texture has an alpha channel
139    * @return True if the texture has alpha channel, false otherwise
140    */
141   [[nodiscard]] bool HasAlphaChannel() const;
142
143   /**
144    * Get the graphics object associated with this texture
145    */
146   [[nodiscard]] Graphics::Texture* GetGraphicsObject() const;
147
148   /**
149    * Get the type of the texture
150    * @return Type of the texture
151    */
152   [[nodiscard]] Type GetType() const
153   {
154     return mType;
155   }
156
157   /**
158    * Check if the texture is a native image
159    * @return if the texture is a native image
160    */
161   [[nodiscard]] bool IsNativeImage() const
162   {
163     return static_cast<bool>(mNativeImage);
164   }
165
166   /**
167    * Called from RenderManager to notify the texture that current rendering pass has finished.
168    */
169   void OnRenderFinished();
170
171   /**
172    * Set the updated flag.
173    * @param[in] updated The updated flag
174    */
175   void SetUpdated(bool updated)
176   {
177     mUpdated = updated;
178   }
179
180   /**
181    * Check if the texture is updated
182    * @return True if the texture is updated
183    */
184   [[nodiscard]] bool Updated()
185   {
186     if(mUpdated || IsNativeImage())
187     {
188       return true;
189     }
190     return false;
191   }
192
193 private:
194   /**
195    * Helper method to apply a sampler to the texture
196    * @param[in] sampler The sampler
197    */
198   void ApplySampler(Render::Sampler* sampler);
199
200 private:
201   Graphics::Controller*                  mGraphicsController;
202   Graphics::UniquePtr<Graphics::Texture> mGraphicsTexture;
203
204   NativeImageInterfacePtr mNativeImage; ///< Pointer to native image
205   Render::Sampler         mSampler;     ///< The current sampler state
206
207   Pixel::Format mPixelFormat;  ///< Pixel format of the texture
208   uint16_t      mWidth;        ///< Width of the texture
209   uint16_t      mHeight;       ///< Height of the texture
210   Type          mType : 3;     ///< Type of the texture
211   bool          mHasAlpha : 1; ///< Whether the format has an alpha channel
212   bool          mUpdated : 1;  ///< Whether the texture is updated
213 };
214
215 } // namespace Render
216
217 } // namespace Internal
218
219 } // namespace Dali
220
221 #endif //  DALI_INTERNAL_RENDER_TEXTURE_H