1 #ifndef DALI_EGL_GRAPHICS_CONTROLLER_H
2 #define DALI_EGL_GRAPHICS_CONTROLLER_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.
21 #include <dali/graphics-api/graphics-controller.h>
25 #include <dali/internal/graphics/common/graphics-interface.h>
26 #include "gles-context.h"
27 #include "gles-graphics-buffer.h"
28 #include "gles-graphics-command-buffer.h"
29 #include "gles-graphics-framebuffer.h"
30 #include "gles-graphics-pipeline-cache.h"
31 #include "gles-graphics-pipeline.h"
32 #include "gles-graphics-reflection.h"
33 #include "gles-graphics-sampler.h"
34 #include "gles-graphics-shader.h"
35 #include "gles-graphics-texture.h"
36 #include "gles-graphics-types.h"
37 #include "gles2-graphics-memory.h"
44 class GlSyncAbstraction;
45 class GlContextHelperAbstraction;
46 } // namespace Integration
57 * EGL Implementation of the graphics controller.
59 * Temporarily holds the old GL abstractions whilst dali-core is migrated to the new API.
61 DALI_IMPORT_API class EglGraphicsController : public Graphics::Controller
65 * @brief Deault constructor
67 EglGraphicsController() = default;
72 ~EglGraphicsController() override;
75 * Initialize the GLES abstraction. This can be called from the main thread.
77 void InitializeGLES(Integration::GlAbstraction& glAbstraction);
80 * Initialize with a reference to the GL abstractions.
82 * Note, this is now executed in the render thread, after core initialization
84 void Initialize(Integration::GlSyncAbstraction& glSyncAbstraction,
85 Integration::GlContextHelperAbstraction& glContextHelperAbstraction,
86 Internal::Adaptor::GraphicsInterface& graphicsInterface);
88 Integration::GlAbstraction& GetGlAbstraction() override;
89 Integration::GlSyncAbstraction& GetGlSyncAbstraction() override;
90 Integration::GlContextHelperAbstraction& GetGlContextHelperAbstraction() override;
93 * @copydoc Dali::Graphics::SubmitCommandBuffers()
95 void SubmitCommandBuffers(const SubmitInfo& submitInfo) override;
98 * @copydoc Dali::Graphics::PresentRenderTarget()
100 void PresentRenderTarget(RenderTarget* renderTarget) override
105 * @copydoc Dali::Graphics::WaitIdle()
107 void WaitIdle() override
112 * @copydoc Dali::Graphics::Pause()
114 void Pause() override
119 * @copydoc Dali::Graphics::Resume()
121 void Resume() override
126 * @copydoc Dali::Graphics::Shutdown()
128 void Shutdown() override
130 mIsShuttingDown = true;
134 * @copydoc Dali::Graphics::Destroy()
136 void Destroy() override
143 * @copydoc Dali::Graphics::UpdateTextures()
145 void UpdateTextures(const std::vector<TextureUpdateInfo>& updateInfoList,
146 const std::vector<TextureUpdateSourceInfo>& sourceList) override;
149 * @copydoc Dali::Graphics::EnableDepthStencilBuffer()
151 bool EnableDepthStencilBuffer(bool enableDepth, bool enableStencil) override
157 * @copydoc Dali::Graphics::RunGarbageCollector()
159 void RunGarbageCollector(size_t numberOfDiscardedRenderers) override
164 * @copydoc Dali::Graphics::DiscardUnusedResources()
166 void DiscardUnusedResources() override
171 * @copydoc Dali::Graphics::IsDiscardQueueEmpty()
173 bool IsDiscardQueueEmpty() override
179 * @copydoc Dali::Graphics::IsDrawOnResumeRequired()
181 bool IsDrawOnResumeRequired() override
187 * @copydoc Dali::Graphics::CreateBuffer()
189 Graphics::UniquePtr<Buffer> CreateBuffer(const BufferCreateInfo& bufferCreateInfo, Graphics::UniquePtr<Buffer>&& oldBuffer) override;
192 * @copydoc Dali::Graphics::CreateCommandBuffer()
194 Graphics::UniquePtr<CommandBuffer> CreateCommandBuffer(const CommandBufferCreateInfo& commandBufferCreateInfo, Graphics::UniquePtr<CommandBuffer>&& oldCommandBuffer) override;
197 * @copydoc Dali::Graphics::CreateRenderPass()
199 Graphics::UniquePtr<RenderPass> CreateRenderPass(const RenderPassCreateInfo& renderPassCreateInfo, Graphics::UniquePtr<RenderPass>&& oldRenderPass) override;
202 * @copydoc Dali::Graphics::CreateTexture()
204 Graphics::UniquePtr<Texture> CreateTexture(const TextureCreateInfo& textureCreateInfo, Graphics::UniquePtr<Texture>&& oldTexture) override;
207 * @copydoc Dali::Graphics::CreateFramebuffer()
209 Graphics::UniquePtr<Framebuffer> CreateFramebuffer(const FramebufferCreateInfo& framebufferCreateInfo, Graphics::UniquePtr<Framebuffer>&& oldFramebuffer) override;
212 * @copydoc Dali::Graphics::CreatePipeline()
214 Graphics::UniquePtr<Pipeline> CreatePipeline(const PipelineCreateInfo& pipelineCreateInfo, Graphics::UniquePtr<Pipeline>&& oldPipeline) override;
217 * @copydoc Dali::Graphics::CreateProgram()
219 Graphics::UniquePtr<Program> CreateProgram(const ProgramCreateInfo& programCreateInfo, UniquePtr<Program>&& oldProgram) override;
222 * @copydoc Dali::Graphics::CreateShader()
224 Graphics::UniquePtr<Shader> CreateShader(const ShaderCreateInfo& shaderCreateInfo, Graphics::UniquePtr<Shader>&& oldShader) override;
227 * @copydoc Dali::Graphics::CreateSampler()
229 Graphics::UniquePtr<Sampler> CreateSampler(const SamplerCreateInfo& samplerCreateInfo, Graphics::UniquePtr<Sampler>&& oldSampler) override;
232 * @copydoc Dali::Graphics::CreateRenderTarget()
234 Graphics::UniquePtr<RenderTarget> CreateRenderTarget(const RenderTargetCreateInfo& renderTargetCreateInfo, Graphics::UniquePtr<RenderTarget>&& oldRenderTarget) override;
237 * @copydoc Dali::Graphics::MapBufferRange()
239 Graphics::UniquePtr<Memory> MapBufferRange(const MapBufferInfo& mapInfo) override;
242 * @copydoc Dali::Graphics::MapTextureRange()
244 Graphics::UniquePtr<Memory> MapTextureRange(const MapTextureInfo& mapInfo) override
250 * @copydoc Dali::Graphics::UnmapMemory()
252 void UnmapMemory(Graphics::UniquePtr<Memory> memory) override
256 * @copydoc Dali::Graphics::GetTextureMemoryRequirements()
258 MemoryRequirements GetTextureMemoryRequirements(Texture& texture) const override
264 * @copydoc Dali::Graphics::GetBufferMemoryRequirements()
266 MemoryRequirements GetBufferMemoryRequirements(Buffer& buffer) const override
272 * @copydoc Dali::Graphics::GetTextureProperties()
274 const TextureProperties& GetTextureProperties(const Texture& texture) override
276 // for compiler not to moan
277 static TextureProperties dummy{};
282 * @copydoc Dali::Graphics::Controller::GetPipelineReflection()
285 [[nodiscard]] const Reflection& GetProgramReflection(const Graphics::Program& program) override;
288 * @copydoc Dali::Graphics::PipelineEquals()
290 [[nodiscard]] bool PipelineEquals(const Pipeline& pipeline0, const Pipeline& pipeline1) const override
295 [[nodiscard]] Integration::GlAbstraction* GetGL() const
301 return mGlAbstraction;
304 [[nodiscard]] Internal::Adaptor::GraphicsInterface* GetGraphicsInterface() const
310 void AddTexture(GLES::Texture& texture);
313 * @brief Adds buffer to the creation queue
316 void AddBuffer(GLES::Buffer& buffer);
319 * @brief Adds framebuffer to the creation queue
322 void AddFramebuffer(GLES::Framebuffer& framebuffer);
325 * @brief Pushes Bufer to the discard queue
327 * Function is called from the UniquePtr custom deleter.
329 * @param[in] texture Pointer to the texture
331 void DiscardResource(GLES::Texture* texture)
333 mDiscardTextureQueue.push(texture);
337 * @brief Pushes Buffer to the discard queue
339 * Function is called from the UniquePtr custom deleter.
341 * @param[in] buffer Pointer to the buffer object
343 void DiscardResource(GLES::Buffer* buffer)
345 mDiscardBufferQueue.push(buffer);
349 * @brief Pushes framebuffer to the discard queue
351 * Function is called from the UniquePtr custom deleter.
353 * @param[in] framebuffer Pointer to the framebuffer object
355 void DiscardResource(GLES::Framebuffer* framebuffer)
357 mDiscardFramebufferQueue.push(framebuffer);
361 * @brief Pushes Program to the discard queue
363 * Function is called from the UniquePtr custom deleter.
365 * @param[in] program Pointer to the program
367 void DiscardResource(GLES::Program* program)
369 mDiscardProgramQueue.push(program);
373 * @brief Pushes Shader to the discard queue
375 * Function is called from the UniquePtr custom deleter.
377 * @param[in] program Pointer to the Shader
379 void DiscardResource(GLES::Shader* shader)
381 mDiscardShaderQueue.push(shader);
385 * @brief Pushes CommandBuffer to the discard queue
387 * Function is called from the UniquePtr custom deleter.
389 * @param[in] program Pointer to the CommandBuffer
391 void DiscardResource(GLES::CommandBuffer* commandBuffer)
393 mDiscardCommandBufferQueue.push(commandBuffer);
397 * @brief Pushes Sampler to the discard queue
399 * Function is called from the UniquePtr custom deleter.
401 * @param[in] program Pointer to the Sampler
403 void DiscardResource(GLES::Sampler* sampler)
405 mDiscardSamplerQueue.push(sampler);
409 * @brief Pushes Pipeline to the discard queue
411 * Function is called from the UniquePtr custom deleter.
413 * @param[in] program Pointer to the pipeline
415 void DiscardResource(GLES::Pipeline* pipeline)
417 mDiscardPipelineQueue.push(pipeline);
421 * @brief Flushes all pending updates
423 * Function flushes all pending resource constructions,
424 * executes command buffers and empties discard queues.
428 mGraphics->ActivateResourceContext();
431 ProcessCreateQueues();
434 ProcessTextureUpdateQueue();
436 // Process main command queue
437 ProcessCommandQueues();
440 ProcessDiscardQueues();
442 // Flush pipeline cache to remove unused pipelines
445 mPipelineCache->FlushCache();
449 // Test update to tick controller, usually it will run own thread
450 void ProcessDiscardQueues();
453 * @brief Processes a create queue for type specified
455 * @param[in,out] queue Reference to the create queue
458 void ProcessCreateQueue(T& queue)
460 while(!queue.empty())
462 auto* object = queue.front();
465 // Initialize texture
466 if(!object->InitializeResource())
468 // TODO: handle error
474 * @brief Processes a create queue for type specified
476 * @param[in,out] queue Reference to the create queue
478 template<class U, class T>
479 void ProcessDiscardQueue(T& queue)
481 while(!queue.empty())
483 auto* object = queue.front();
486 object->DestroyResource();
489 auto* clbk = object->GetCreateInfo().allocationCallbacks;
496 clbk->freeCallback(object, clbk->userData);
507 * @brief Processes all resource create queues
509 void ProcessCreateQueues();
512 * @brief Process command queues and buffers
514 void ProcessCommandQueues();
517 * @brief Executes all pending texture updates
519 void ProcessTextureUpdateQueue();
522 * @brief Returns program custom parameter
524 * This function can be used as a backdoor in order to retrieve
525 * certain data out of implementation
527 * @param[in] program Valid Program object
528 * @param parameterId Integer id of parameter
529 * @param outData Output data
530 * @return True if parameter retrieved
532 bool GetProgramParameter(Graphics::Program& program, uint32_t parameterId, void* outData) override;
535 * @brief Returns pipeline cache object
537 * @return Valid pipeline cache object
539 [[nodiscard]] GLES::PipelineCache& GetPipelineCache() const;
542 * @brief Returns runtime supported GLES version
544 * @return GLES version enum
546 GLES::GLESVersion GetGLESVersion() const
548 // TODO: return proper version but for now we can
550 return GLES::GLESVersion::GLES_20;
553 bool IsShuttingDown() const
555 return mIsShuttingDown;
558 void ProcessCommandBuffer(GLES::CommandBuffer& commandBuffer);
561 Integration::GlAbstraction* mGlAbstraction{nullptr};
562 Integration::GlSyncAbstraction* mGlSyncAbstraction{nullptr};
563 Integration::GlContextHelperAbstraction* mGlContextHelperAbstraction{nullptr};
565 Internal::Adaptor::GraphicsInterface* mGraphics{nullptr};
567 std::queue<GLES::Texture*> mCreateTextureQueue; ///< Create queue for texture resource
568 std::queue<GLES::Texture*> mDiscardTextureQueue; ///< Discard queue for texture resource
570 std::queue<GLES::Buffer*> mCreateBufferQueue; ///< Create queue for buffer resource
571 std::queue<GLES::Buffer*> mDiscardBufferQueue; ///< Discard queue for buffer resource
573 std::queue<GLES::Program*> mDiscardProgramQueue; ///< Discard queue for program resource
574 std::queue<GLES::Pipeline*> mDiscardPipelineQueue; ///< Discard queue of pipelines
575 std::queue<GLES::Shader*> mDiscardShaderQueue; ///< Discard queue of shaders
576 std::queue<GLES::Sampler*> mDiscardSamplerQueue; ///< Discard queue of samplers
577 std::queue<GLES::CommandBuffer*> mDiscardCommandBufferQueue; ///< Discard queue of command buffers
578 std::queue<GLES::Framebuffer*> mCreateFramebufferQueue; ///< Create queue for framebuffer resource
579 std::queue<GLES::Framebuffer*> mDiscardFramebufferQueue; ///< Discard queue for framebuffer resource
581 std::queue<GLES::CommandBuffer*> mCommandQueue; ///< we may have more in the future
583 using TextureUpdateRequest = std::pair<TextureUpdateInfo, TextureUpdateSourceInfo>;
584 std::queue<TextureUpdateRequest> mTextureUpdateRequests;
586 std::unique_ptr<GLES::Context> mContext{nullptr}; ///< Context object handling command buffers execution
588 std::unique_ptr<GLES::PipelineCache> mPipelineCache{nullptr}; ///< Internal pipeline cache
590 bool mIsShuttingDown{false}; ///< Indicates whether the controller is shutting down
592 // todo: to be removed after renderpass
593 const Graphics::Framebuffer* currentFramebuffer{nullptr};
596 } // namespace Graphics
600 #endif //DALI_EGL_GRAPHICS_CONTROLLER_H