fix property buffer gl initialization 23/51323/2
authorLee Morgan <Lee.morgan@partner.samsung.com>
Fri, 6 Nov 2015 12:59:15 +0000 (12:59 +0000)
committerLee Morgan <Lee.morgan@partner.samsung.com>
Mon, 9 Nov 2015 13:16:45 +0000 (13:16 +0000)
Change-Id: I08f045b9afbc0256ee995cba231e741a79c6deaf

dali/internal/render/gl-resources/gpu-buffer.cpp
dali/internal/render/gl-resources/gpu-buffer.h
dali/internal/render/renderers/render-geometry.cpp
dali/internal/render/renderers/render-image-renderer.cpp
dali/internal/render/renderers/render-property-buffer.cpp

index a18cbe2..f17269f 100644 (file)
@@ -29,34 +29,6 @@ namespace Internal
 
 namespace
 {
-/**
- * Helper to get our type enum as GL enum
- * @param type to convert
- * @return the corresponding GL enum or -1
- */
-inline GLenum TypeAsGlEnum( GpuBuffer::Target type )
-{
-  GLenum retval( -1 );
-  switch( type )
-  {
-    case GpuBuffer::ARRAY_BUFFER :
-    {
-      retval = GL_ARRAY_BUFFER;
-      break;
-    }
-    case GpuBuffer::ELEMENT_ARRAY_BUFFER :
-    {
-      retval = GL_ELEMENT_ARRAY_BUFFER;
-      break;
-    }
-    case GpuBuffer::TRANSFORM_FEEDBACK_BUFFER :
-    {
-      retval = GL_TRANSFORM_FEEDBACK_BUFFER;
-      break;
-    }
-  }
-  return retval;
-}
 
 /**
  * Helper to get our drawmode enum as GL enum
@@ -113,7 +85,7 @@ GpuBuffer::~GpuBuffer()
  * Creates or updates the buffer data depending on whether it
  * already exists or not.
  */
-void GpuBuffer::UpdateDataBuffer(GLsizeiptr size,const GLvoid *data, Usage usage)
+void GpuBuffer::UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usage, Target target)
 {
   DALI_ASSERT_DEBUG( size > 0 );
   mSize = size;
@@ -124,8 +96,30 @@ void GpuBuffer::UpdateDataBuffer(GLsizeiptr size,const GLvoid *data, Usage usage
     DALI_ASSERT_DEBUG(mBufferId);
   }
 
+  GLenum glTargetEnum = GL_ARRAY_BUFFER;
+
+  if(ELEMENT_ARRAY_BUFFER == target)
+  {
+    glTargetEnum = GL_ELEMENT_ARRAY_BUFFER;
+  }
+  else if(TRANSFORM_FEEDBACK_BUFFER == target)
+  {
+    glTargetEnum = GL_TRANSFORM_FEEDBACK_BUFFER;
+  }
+
   // make sure the buffer is bound, don't perform any checks because size may be zero
-  mContext.BindArrayBuffer( mBufferId );
+  if(ARRAY_BUFFER == target)
+  {
+    mContext.BindArrayBuffer( mBufferId );
+  }
+  else if(ELEMENT_ARRAY_BUFFER == target)
+  {
+    mContext.BindElementArrayBuffer( mBufferId );
+  }
+  else if(TRANSFORM_FEEDBACK_BUFFER == target)
+  {
+    mContext.BindTransformFeedbackBuffer( mBufferId );
+  }
 
   // if the buffer has already been created, just update the data providing it fits
   if (mBufferCreated )
@@ -133,20 +127,20 @@ void GpuBuffer::UpdateDataBuffer(GLsizeiptr size,const GLvoid *data, Usage usage
     // if the data will fit in the existing buffer, just update it
     if (size <= mCapacity )
     {
-      mContext.BufferSubData( GL_ARRAY_BUFFER, 0, size, data );
+      mContext.BufferSubData( glTargetEnum, 0, size, data );
     }
     else
     {
       // create a new buffer of the larger size,
       // gl should automatically deallocate the old buffer
-      mContext.BufferData( GL_ARRAY_BUFFER, size, data, ModeAsGlEnum( usage ) );
+      mContext.BufferData( glTargetEnum, size, data, ModeAsGlEnum( usage ) );
       mCapacity = size;
     }
   }
   else
   {
     // create the buffer
-    mContext.BufferData( GL_ARRAY_BUFFER, size, data, ModeAsGlEnum( usage ) );
+    mContext.BufferData( glTargetEnum, size, data, ModeAsGlEnum( usage ) );
     mBufferCreated = true;
     mCapacity = size;
   }
@@ -162,10 +156,14 @@ void GpuBuffer::Bind(Target target) const
   {
     mContext.BindArrayBuffer(mBufferId);
   }
-  else
+  else if (target == ELEMENT_ARRAY_BUFFER)
   {
     mContext.BindElementArrayBuffer(mBufferId);
   }
+  else if (target == TRANSFORM_FEEDBACK_BUFFER)
+  {
+    mContext.BindTransformFeedbackBuffer(mBufferId);
+  }
 }
 
 bool GpuBuffer::BufferIsValid() const
index 3c97171..7c32719 100644 (file)
@@ -80,8 +80,9 @@ public:
    * @param size Specifies the size in bytes of the buffer object's new data store.
    * @param data pointer to the data to load
    * @param usage How the buffer will be used
+   * @param target The target buffer to update
    */
-  void UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usage);
+  void UpdateDataBuffer(GLsizeiptr size, const GLvoid *data, Usage usage, Target target);
 
   /**
    * Bind the buffer object to the target
index 5a3961f..2b84cdb 100644 (file)
@@ -120,7 +120,7 @@ void RenderGeometry::UploadAndDraw(
 {
   if( !mHasBeenUpdated )
   {
-    //Update buffers
+    // Update buffers
     if( mIndexBuffer )
     {
       if(!mIndexBuffer->Update( context, true ) )
@@ -129,6 +129,7 @@ void RenderGeometry::UploadAndDraw(
         return;
       }
     }
+
     for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
     {
       if( !mVertexBuffers[i]->Update( context, false ) )
@@ -137,6 +138,7 @@ void RenderGeometry::UploadAndDraw(
         return;
       }
     }
+
     mHasBeenUpdated = true;
   }
 
index 8089ea7..47c128b 100644 (file)
@@ -237,7 +237,7 @@ bool ImageRenderer::CheckResources()
     return false;
   }
 
-  Integration::ResourceId shaderTextureId =  mShader->GetTextureIdToRender() ;
+  Integration::ResourceId shaderTextureId =  mShader->GetTextureIdToRender();
 
   if( shaderTextureId &&  mTextureCache->GetTexture( shaderTextureId ) == NULL )
   {
@@ -392,7 +392,7 @@ void ImageRenderer::UpdateVertexBuffer( Context& context, GLsizeiptr size, const
   // update
   if ( mVertexBuffer )
   {
-    mVertexBuffer->UpdateDataBuffer( size, data, GpuBuffer::DYNAMIC_DRAW);
+    mVertexBuffer->UpdateDataBuffer( size, data, GpuBuffer::DYNAMIC_DRAW, GpuBuffer::ARRAY_BUFFER);
   }
 }
 
@@ -411,7 +411,7 @@ void ImageRenderer::UpdateIndexBuffer( Context& context, GLsizeiptr size, const
   // update
   if ( mIndexBuffer )
   {
-    mIndexBuffer->UpdateDataBuffer(size,data,GpuBuffer::STATIC_DRAW);
+    mIndexBuffer->UpdateDataBuffer(size,data,GpuBuffer::STATIC_DRAW, GpuBuffer::ELEMENT_ARRAY_BUFFER);
   }
 }
 
index d4fe418..df617d5 100644 (file)
@@ -165,7 +165,14 @@ bool PropertyBuffer::Update( Context& context, bool isIndexBuffer )
         data = &(ushortData[0]);
       }
 
-      mGpuBuffer->UpdateDataBuffer( GetDataSize(), data, GpuBuffer::STATIC_DRAW );
+      GpuBuffer::Target target = GpuBuffer::ARRAY_BUFFER;
+      if(isIndexBuffer)
+      {
+        target = GpuBuffer::ELEMENT_ARRAY_BUFFER;
+      }
+
+      mGpuBuffer->UpdateDataBuffer( GetDataSize(), data, GpuBuffer::STATIC_DRAW, target );
+
     }
 
     mDataChanged = false;