Skip duplicated vertex binding
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-geometry.h
index 7ac3e75..2f04c97 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef DALI_INTERNAL_SCENE_GRAPH_RENDER_GEOMETRY_H
-#define DALI_INTERNAL_SCENE_GRAPH_RENDER_GEOMETRY_H
+#ifndef DALI_INTERNAL_RENDER_GEOMETRY_H
+#define DALI_INTERNAL_RENDER_GEOMETRY_H
 
 /*
- * Copyright (c) 2015 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.
  * limitations under the License.
  */
 
-#include <dali/public-api/common/dali-vector.h>
+// INTERNAL INCLUDES
 #include <dali/devel-api/common/owner-container.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/integration-api/gl-abstraction.h>
-#include <dali/internal/update/rendering/scene-graph-geometry.h>
+#include <dali/public-api/common/dali-vector.h>
+#include <dali/public-api/rendering/geometry.h>
 
 namespace Dali
 {
 namespace Internal
 {
-class Context;
 class Program;
 class GpuBuffer;
 
 namespace Render
 {
-class PropertyBuffer;
-}
-
-namespace SceneGraph
-{
+class VertexBuffer;
 
 /**
  * This class encapsulates the GPU buffers. It is used to upload vertex data
  * to it's GPU buffers, to bind all the buffers and to setup/teardown vertex attribute
  * bindings
  */
-class RenderGeometry
+class Geometry
 {
 public:
+  using Type      = Dali::Geometry::Type;
+  using IndexType = Dali::Graphics::Format;
+
+  using Uint16ContainerType = Dali::Vector<uint16_t>;
+  using Uint32ContainerType = Dali::Vector<uint32_t>;
+
+  Geometry();
 
-  typedef SceneGraph::Geometry::GeometryType GeometryType;
-  /**
-   * Constructor. Creates a render geometry object with no GPU buffers.
-   * @param[in] center The center of the geometry
-   * @param[in] geometryType The geometry type
-   * @param[in] requiresDepthTest True if geometry requires depth testing, false otherwise
-   */
-  RenderGeometry( GeometryType geometryType, bool requiresDepthTest );
   /**
    * Destructor
    */
-  ~RenderGeometry();
+  ~Geometry();
 
   /**
-   * Called on Gl Context created
+   * Adds a property buffer to the geometry
+   * @param[in] dataProvider The VertexBuffer data provider
    */
-  void GlContextCreated( Context& context );
+  void AddVertexBuffer(Render::VertexBuffer* vertexBuffer);
 
   /**
-   * Called on Gl Context destroyed.
+   * Set the data for the index buffer to be used by the geometry
+   * @param[in] indices A vector containing the indices
    */
-  void GlContextDestroyed();
+  void SetIndexBuffer(Uint16ContainerType& indices);
 
   /**
-   * Adds a property buffer to the geometry
-   * @param[in] dataProvider The PropertyBuffer data provider
-   * @param[in] isIndexBuffer True if the property buffer is intended to be used as an index buffer
+   * Set the data for the index buffer to be used by the geometry
+   * @param[in] indices A vector containing the indices
    */
-  void AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer, bool isIndexBuffer );
+  void SetIndexBuffer(Uint32ContainerType& indices);
 
   /**
-   * Removes a PropertyBuffer from the geometry
-   * @param[in] propertyBuffer The property buffer to be removed
+   * Removes a VertexBuffer from the geometry
+   * @param[in] vertexBuffer The property buffer to be removed
    */
-  void RemovePropertyBuffer(  const Render::PropertyBuffer* propertyBuffer );
+  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,10 +94,10 @@ public:
   void OnRenderFinished();
 
   /**
-   * Chack if the attributes for the geometry have changed
+   * 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;
   }
@@ -112,57 +106,60 @@ public:
    * Sets the geometry type
    * @param[in] type The new geometry type
    */
-  void SetGeometryType( GeometryType type )
+  void SetType(Type type)
   {
     mGeometryType = type;
   }
 
   /**
-   * Sets if the geometry requires depth testing
-   * @param[in] requiresDepthTest True if depth testing is required, false otherwise
+   * @return the topology of this geometry
    */
-  void SetRequiresDepthTest( bool requiresDepthTest )
-  {
-    mRequiresDepthTest = requiresDepthTest;
-  }
+  [[nodiscard]] Graphics::PrimitiveTopology GetTopology() const;
 
   /**
-   * Check if geometry requires depth testing
-   * @return True if depth testing is required, false otherwise
+   * Upload the geometry if it has changed
    */
-  bool RequiresDepthTest() const
-  {
-    return mRequiresDepthTest;
-  }
+  void Upload(Graphics::Controller& graphicsController);
 
   /**
-   * Upload the geometry if it has changed, 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
    */
-  void UploadAndDraw(Context& context,
-                     BufferIndex bufferIndex,
-                     Vector<GLint>& attributeLocation );
+  bool Draw(Graphics::Controller&    graphicsController,
+            Graphics::CommandBuffer& commandBuffer,
+            uint32_t                 elementBufferOffset,
+            uint32_t                 elementBufferCount);
 
-private:
+  /**
+   * @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
+   */
+  bool BindVertexAttributes(Graphics::CommandBuffer& commandBuffer);
 
-  // PropertyBuffers
-  Render::PropertyBuffer* mIndexBuffer;
-  Vector<Render::PropertyBuffer*> mVertexBuffers;
+private:
+  // VertexBuffers
+  Vector<Render::VertexBuffer*> mVertexBuffers;
 
-  GeometryType  mGeometryType;
+  Uint16ContainerType     mIndices;
+  OwnerPointer<GpuBuffer> mIndexBuffer;
+  IndexType               mIndexType;
+  Type                    mGeometryType;
 
   // Booleans
-  bool mRequiresDepthTest : 1;
+  bool mIndicesChanged : 1;
   bool mHasBeenUpdated : 1;
   bool mAttributesChanged : 1;
-
 };
 
-} // namespace SceneGraph
+} // namespace Render
 } // namespace Internal
 } // namespace Dali
 
-#endif // DALI_INTERNAL_SCENE_GRAPH_SAMPLER_DATA_PROVIDER_H
+#endif // DALI_INTERNAL_RENDER_GEOMETRY_H