Add Default Uniform : uActorColor
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-geometry.cpp
index d825af3..e12f37b 100644 (file)
@@ -19,8 +19,6 @@
 
 // INTERNAL INCLUDES
 #include <dali/internal/common/buffer-index.h>
-#include <dali/internal/render/gl-resources/context.h>
-#include <dali/internal/render/gl-resources/gpu-buffer.h>
 #include <dali/internal/render/renderers/render-vertex-buffer.h>
 #include <dali/internal/render/shaders/program.h>
 
@@ -42,20 +40,17 @@ Geometry::Geometry()
 
 Geometry::~Geometry() = default;
 
-void Geometry::GlContextCreated(Context& context)
-{
-}
-
-void Geometry::GlContextDestroyed()
-{
-}
-
 void Geometry::AddVertexBuffer(Render::VertexBuffer* vertexBuffer)
 {
   mVertexBuffers.PushBack(vertexBuffer);
   mAttributesChanged = true;
 }
 
+const Vector<Render::VertexBuffer*>& Geometry::GetVertexBuffers() const
+{
+  return mVertexBuffers;
+}
+
 void Geometry::SetIndexBuffer(Dali::Vector<uint16_t>& indices)
 {
   mIndices.Swap(indices);
@@ -77,36 +72,13 @@ void Geometry::RemoveVertexBuffer(const Render::VertexBuffer* vertexBuffer)
   }
 }
 
-void Geometry::GetAttributeLocationFromProgram(Vector<GLint>& attributeLocation, Program& program, BufferIndex bufferIndex) const
-{
-  attributeLocation.Clear();
-
-  for(auto&& vertexBuffer : mVertexBuffers)
-  {
-    const uint32_t attributeCount = vertexBuffer->GetAttributeCount();
-    for(uint32_t j = 0; j < attributeCount; ++j)
-    {
-      auto     attributeName = vertexBuffer->GetAttributeName(j);
-      uint32_t index         = program.RegisterCustomAttribute(attributeName);
-      GLint    location      = program.GetCustomAttributeLocation(index);
-
-      if(-1 == location)
-      {
-        DALI_LOG_WARNING("Attribute not found in the shader: %s\n", attributeName.GetCString());
-      }
-
-      attributeLocation.PushBack(location);
-    }
-  }
-}
-
 void Geometry::OnRenderFinished()
 {
   mHasBeenUpdated    = false;
   mAttributesChanged = false;
 }
 
-void Geometry::Upload(Context& context)
+void Geometry::Upload(Graphics::Controller& graphicsController)
 {
   if(!mHasBeenUpdated)
   {
@@ -121,11 +93,11 @@ void Geometry::Upload(Context& context)
       {
         if(mIndexBuffer == nullptr)
         {
-          mIndexBuffer = new GpuBuffer(context);
+          mIndexBuffer = new GpuBuffer(graphicsController, 0 | Graphics::BufferUsage::INDEX_BUFFER);
         }
 
         uint32_t bufferSize = static_cast<uint32_t>(sizeof(uint16_t) * mIndices.Size());
-        mIndexBuffer->UpdateDataBuffer(context, bufferSize, &mIndices[0], GpuBuffer::STATIC_DRAW, GpuBuffer::ELEMENT_ARRAY_BUFFER);
+        mIndexBuffer->UpdateDataBuffer(graphicsController, bufferSize, &mIndices[0]);
       }
 
       mIndicesChanged = false;
@@ -133,7 +105,7 @@ void Geometry::Upload(Context& context)
 
     for(auto&& buffer : mVertexBuffers)
     {
-      if(!buffer->Update(context))
+      if(!buffer->Update(graphicsController))
       {
         //Vertex buffer is not ready ( Size, data or format has not been specified yet )
         return;
@@ -144,22 +116,40 @@ void Geometry::Upload(Context& context)
   }
 }
 
-void Geometry::Draw(
-  Context&       context,
-  BufferIndex    bufferIndex,
-  Vector<GLint>& attributeLocation,
-  uint32_t       elementBufferOffset,
-  uint32_t       elementBufferCount)
+bool Geometry::Draw(
+  Graphics::Controller&    graphicsController,
+  Graphics::CommandBuffer& commandBuffer,
+  uint32_t                 elementBufferOffset,
+  uint32_t                 elementBufferCount)
 {
   //Bind buffers to attribute locations
-  uint32_t       base              = 0u;
-  const uint32_t vertexBufferCount = static_cast<uint32_t>(mVertexBuffers.Count());
+  const auto vertexBufferCount = static_cast<uint32_t>(mVertexBuffers.Count());
+
+  std::vector<const Graphics::Buffer*> buffers;
+  std::vector<uint32_t>                offsets;
+
   for(uint32_t i = 0; i < vertexBufferCount; ++i)
   {
-    mVertexBuffers[i]->BindBuffer(context, GpuBuffer::ARRAY_BUFFER);
-    base += mVertexBuffers[i]->EnableVertexAttributes(context, attributeLocation, base);
+    const GpuBuffer* gpuBuffer = mVertexBuffers[i]->GetGpuBuffer();
+    if(gpuBuffer)
+    {
+      const Graphics::Buffer* buffer = gpuBuffer->GetGraphicsObject();
+
+      if(buffer)
+      {
+        buffers.push_back(buffer);
+        offsets.push_back(0u);
+      }
+    }
+    //@todo Figure out why this is being drawn without geometry having been uploaded
+  }
+  if(buffers.empty())
+  {
+    return false;
   }
 
+  commandBuffer.BindVertexBuffers(0, buffers, offsets);
+
   uint32_t numIndices(0u);
   intptr_t firstIndexOffset(0u);
   if(mIndexBuffer)
@@ -169,7 +159,7 @@ void Geometry::Draw(
     if(elementBufferOffset != 0u)
     {
       elementBufferOffset = (elementBufferOffset >= numIndices) ? numIndices - 1 : elementBufferOffset;
-      firstIndexOffset    = elementBufferOffset * sizeof(GLushort);
+      firstIndexOffset    = intptr_t(elementBufferOffset * sizeof(uint16_t));
       numIndices -= elementBufferOffset;
     }
 
@@ -179,75 +169,76 @@ void Geometry::Draw(
     }
   }
 
-  GLenum geometryGLType(GL_NONE);
+  //Draw call
+  if(mIndexBuffer && mGeometryType != Dali::Geometry::POINTS)
+  {
+    //Indexed draw call
+    const Graphics::Buffer* ibo = mIndexBuffer->GetGraphicsObject();
+    if(ibo)
+    {
+      commandBuffer.BindIndexBuffer(*ibo, 0, Graphics::Format::R16_UINT);
+    }
+
+    commandBuffer.DrawIndexed(numIndices, 1, firstIndexOffset, 0, 0);
+  }
+  else
+  {
+    // Un-indexed draw call
+    uint32_t numVertices(0u);
+    if(vertexBufferCount > 0)
+    {
+      // truncated, no value loss happening in practice
+      numVertices = static_cast<uint32_t>(mVertexBuffers[0]->GetElementCount());
+    }
+
+    commandBuffer.Draw(numVertices, 1, 0, 0);
+  }
+  return true;
+}
+
+Graphics::PrimitiveTopology Geometry::GetTopology() const
+{
+  Graphics::PrimitiveTopology topology = Graphics::PrimitiveTopology::TRIANGLE_LIST;
+
   switch(mGeometryType)
   {
     case Dali::Geometry::TRIANGLES:
     {
-      geometryGLType = GL_TRIANGLES;
+      topology = Graphics::PrimitiveTopology::TRIANGLE_LIST;
       break;
     }
     case Dali::Geometry::LINES:
     {
-      geometryGLType = GL_LINES;
+      topology = Graphics::PrimitiveTopology::LINE_LIST;
       break;
     }
     case Dali::Geometry::POINTS:
     {
-      geometryGLType = GL_POINTS;
+      topology = Graphics::PrimitiveTopology::POINT_LIST;
       break;
     }
     case Dali::Geometry::TRIANGLE_STRIP:
     {
-      geometryGLType = GL_TRIANGLE_STRIP;
+      topology = Graphics::PrimitiveTopology::TRIANGLE_STRIP;
       break;
     }
     case Dali::Geometry::TRIANGLE_FAN:
     {
-      geometryGLType = GL_TRIANGLE_FAN;
+      topology = Graphics::PrimitiveTopology::TRIANGLE_FAN;
       break;
     }
     case Dali::Geometry::LINE_LOOP:
     {
-      geometryGLType = GL_LINE_LOOP;
+      topology = Graphics::PrimitiveTopology::LINE_LOOP;
       break;
     }
     case Dali::Geometry::LINE_STRIP:
     {
-      geometryGLType = GL_LINE_STRIP;
+      topology = Graphics::PrimitiveTopology::LINE_STRIP;
       break;
     }
   }
-
-  //Draw call
-  if(mIndexBuffer && geometryGLType != GL_POINTS)
-  {
-    //Indexed draw call
-    mIndexBuffer->Bind(context, GpuBuffer::ELEMENT_ARRAY_BUFFER);
-    // numIndices truncated, no value loss happening in practice
-    context.DrawElements(geometryGLType, static_cast<GLsizei>(numIndices), GL_UNSIGNED_SHORT, reinterpret_cast<void*>(firstIndexOffset));
-  }
-  else
-  {
-    //Unindex draw call
-    GLsizei numVertices(0u);
-    if(vertexBufferCount > 0)
-    {
-      // truncated, no value loss happening in practice
-      numVertices = static_cast<GLsizei>(mVertexBuffers[0]->GetElementCount());
-    }
-
-    context.DrawArrays(geometryGLType, 0, numVertices);
-  }
-
-  //Disable attributes
-  for(auto&& attribute : attributeLocation)
-  {
-    if(attribute != -1)
-    {
-      context.DisableVertexAttributeArray(static_cast<GLuint>(attribute));
-    }
-  }
+  return topology;
 }
 
 } // namespace Render