Skip duplicated vertex binding
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-geometry.h
index a5cb51d..2f04c97 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_RENDER_GEOMETRY_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@
 
 // INTERNAL INCLUDES
 #include <dali/devel-api/common/owner-container.h>
-#include <dali/integration-api/gl-abstraction.h>
-#include <dali/integration-api/gl-defines.h>
+#include <dali/graphics-api/graphics-controller.h>
+#include <dali/graphics-api/graphics-types.h>
 #include <dali/internal/common/buffer-index.h>
 #include <dali/internal/common/owner-pointer.h>
 #include <dali/public-api/common/dali-vector.h>
@@ -30,7 +30,6 @@ namespace Dali
 {
 namespace Internal
 {
-class Context;
 class Program;
 class GpuBuffer;
 
@@ -46,7 +45,11 @@ class VertexBuffer;
 class Geometry
 {
 public:
-  using Type = Dali::Geometry::Type;
+  using Type      = Dali::Geometry::Type;
+  using IndexType = Dali::Graphics::Format;
+
+  using Uint16ContainerType = Dali::Vector<uint16_t>;
+  using Uint32ContainerType = Dali::Vector<uint32_t>;
 
   Geometry();
 
@@ -56,16 +59,6 @@ public:
   ~Geometry();
 
   /**
-   * Called on Gl Context created
-   */
-  void GlContextCreated(Context& context);
-
-  /**
-   * Called on Gl Context destroyed.
-   */
-  void GlContextDestroyed();
-
-  /**
    * Adds a property buffer to the geometry
    * @param[in] dataProvider The VertexBuffer data provider
    */
@@ -75,7 +68,13 @@ public:
    * Set the data for the index buffer to be used by the geometry
    * @param[in] indices A vector containing the indices
    */
-  void SetIndexBuffer(Dali::Vector<uint16_t>& indices);
+  void SetIndexBuffer(Uint16ContainerType& indices);
+
+  /**
+   * Set the data for the index buffer to be used by the geometry
+   * @param[in] indices A vector containing the indices
+   */
+  void SetIndexBuffer(Uint32ContainerType& indices);
 
   /**
    * Removes a VertexBuffer from the geometry
@@ -84,12 +83,10 @@ public:
   void RemoveVertexBuffer(const Render::VertexBuffer* vertexBuffer);
 
   /**
-   * Gets the attribute locations on the shader for the attributes defined in the geometry RenderBuffers
-   * @param[out] attributeLocation The vector where the attributes locations will be stored
-   * @param[in] program The program
-   * @param[in] bufferIndex The current buffer index
+   * Get the vertex buffers
+   * @return the list of vertex buffers
    */
-  void GetAttributeLocationFromProgram(Vector<GLint>& attributeLocation, Program& program, BufferIndex bufferIndex) const;
+  [[nodiscard]] const Vector<Render::VertexBuffer*>& GetVertexBuffers() const;
 
   /**
    * Called from RenderManager to notify the geometry that current rendering pass has finished.
@@ -100,7 +97,7 @@ public:
    * Check if the attributes for the geometry have changed
    * @return True if vertex buffers have been added or removed since last frame, false otherwise
    */
-  bool AttributesChanged() const
+  [[maybe_unused]] [[nodiscard]] bool AttributesChanged() const
   {
     return mAttributesChanged;
   }
@@ -115,31 +112,44 @@ public:
   }
 
   /**
+   * @return the topology of this geometry
+   */
+  [[nodiscard]] Graphics::PrimitiveTopology GetTopology() const;
+
+  /**
    * Upload the geometry if it has changed
-   * @param[in] context The GL context
    */
-  void Upload(Context& context);
+  void Upload(Graphics::Controller& graphicsController);
 
   /**
-   * Set up the attributes and perform the Draw call corresponding to the geometry type
-   * @param[in] context The GL context
-   * @param[in] bufferIndex The current buffer index
-   * @param[in] attributeLocation The location for the attributes in the shader
+   * Set up the attributes and perform the Draw call corresponding to the geometry type.
+   *
+   * @param[in] graphicsController The graphics controller
+   * @param[in,out] commandBuffer The current command buffer queue
    * @param[in] elementBufferOffset The index of first element to draw if index buffer bound
    * @param[in] elementBufferCount Number of elements to draw if index buffer bound, uses whole buffer when 0
+   * @return true if the draw command was issued, false otherwise
+   */
+  bool Draw(Graphics::Controller&    graphicsController,
+            Graphics::CommandBuffer& commandBuffer,
+            uint32_t                 elementBufferOffset,
+            uint32_t                 elementBufferCount);
+
+  /**
+   * @brief Set up the attributes bind commaneds
+   *
+   * @param[in,out] commandBuffer The current command buffer queue
+   * @return true if the bind command was issued, false otherwise
    */
-  void Draw(Context&       context,
-            BufferIndex    bufferIndex,
-            Vector<GLint>& attributeLocation,
-            uint32_t       elementBufferOffset,
-            uint32_t       elementBufferCount);
+  bool BindVertexAttributes(Graphics::CommandBuffer& commandBuffer);
 
 private:
   // VertexBuffers
   Vector<Render::VertexBuffer*> mVertexBuffers;
 
-  Dali::Vector<uint16_t>  mIndices;
+  Uint16ContainerType     mIndices;
   OwnerPointer<GpuBuffer> mIndexBuffer;
+  IndexType               mIndexType;
   Type                    mGeometryType;
 
   // Booleans