2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <dali/internal/render/renderers/render-geometry.h>
19 #include <dali/internal/common/buffer-index.h>
20 #include <dali/internal/update/common/scene-graph-property-buffer.h>
21 #include <dali/internal/update/rendering/scene-graph-geometry.h>
22 #include <dali/internal/render/data-providers/render-data-provider.h>
23 #include <dali/internal/render/gl-resources/context.h>
24 #include <dali/internal/render/gl-resources/gpu-buffer.h>
25 #include <dali/internal/render/shaders/program.h>
34 RenderGeometry::RenderGeometry( const GeometryDataProvider& geometryDataProvider )
35 : mGeometryDataProvider( geometryDataProvider ),
36 mHasBeenUpdated(false),
37 mAttributesChanged(true)
41 RenderGeometry::~RenderGeometry()
45 void RenderGeometry::GlContextCreated( Context& context )
49 void RenderGeometry::GlContextDestroyed()
53 void RenderGeometry::AddPropertyBuffer( const PropertyBufferDataProvider* dataProvider, GpuBuffer::Target gpuBufferTarget, GpuBuffer::Usage gpuBufferUsage )
55 if( gpuBufferTarget == GpuBuffer::ELEMENT_ARRAY_BUFFER )
57 RenderPropertyBuffer* renderPropertyBuffer = new RenderPropertyBuffer( *dataProvider, gpuBufferTarget, gpuBufferUsage );
58 mIndexBuffer = renderPropertyBuffer;
60 else if( gpuBufferTarget == GpuBuffer::ARRAY_BUFFER )
62 RenderPropertyBuffer* renderPropertyBuffer = new RenderPropertyBuffer( *dataProvider, gpuBufferTarget, gpuBufferUsage );
63 mVertexBuffers.PushBack( renderPropertyBuffer );
64 mAttributesChanged = true;
68 void RenderGeometry::RemovePropertyBuffer( const PropertyBufferDataProvider* dataProvider )
70 if( dataProvider == &mIndexBuffer->GetDataProvider() )
76 for( RenderPropertyBufferIter iter( mVertexBuffers.Begin() ); iter != mVertexBuffers.End(); ++iter )
78 if( dataProvider == &(*iter)->GetDataProvider() )
80 //This will delete the gpu buffer associated to the RenderPropertyBuffer if there is one
81 mVertexBuffers.Remove( iter );
82 mAttributesChanged = true;
89 void RenderGeometry::GetAttributeLocationFromProgram( Vector<GLint>& attributeLocation, Program& program, BufferIndex bufferIndex ) const
91 attributeLocation.Clear();
93 for( size_t i(0); i< mVertexBuffers.Size(); ++i )
95 unsigned int attributeCount = mVertexBuffers[i]->GetDataProvider().GetAttributeCount( bufferIndex );
96 for( unsigned int j = 0; j < attributeCount; ++j )
98 const std::string& attributeName = mVertexBuffers[i]->GetDataProvider().GetAttributeName( bufferIndex, j );
99 unsigned int index = program.RegisterCustomAttribute( attributeName );
100 GLint location = program.GetCustomAttributeLocation( index );
104 DALI_LOG_WARNING( "Attribute not found in the shader: %s\n", attributeName.c_str() );
107 attributeLocation.PushBack( location );
112 void RenderGeometry::OnRenderFinished()
114 mHasBeenUpdated = false;
115 mAttributesChanged = false;
118 void RenderGeometry::UploadAndDraw(
120 BufferIndex bufferIndex,
121 Vector<GLint>& attributeLocation )
123 if( !mHasBeenUpdated )
128 mIndexBuffer->Update( context, bufferIndex );
130 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
132 mVertexBuffers[i]->Update( context, bufferIndex );
134 mHasBeenUpdated = true;
137 //Bind buffers to attribute locations
138 unsigned int base = 0;
139 for( unsigned int i = 0; i < mVertexBuffers.Count(); ++i )
141 mVertexBuffers[i]->BindBuffer( context );
142 base += mVertexBuffers[i]->EnableVertexAttributes( context, bufferIndex, attributeLocation, base );
147 mIndexBuffer->BindBuffer( context );
151 unsigned int numIndices(0u);
154 const PropertyBufferDataProvider& indexBuffer = mIndexBuffer->GetDataProvider();
155 numIndices = mIndexBuffer->GetDataProvider().GetDataSize(bufferIndex) / indexBuffer.GetElementSize(bufferIndex);
159 GeometryDataProvider::GeometryType type = mGeometryDataProvider.GetGeometryType( bufferIndex );
162 case Dali::Geometry::TRIANGLES:
166 context.DrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);
170 const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
171 unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
172 context.DrawArrays( GL_TRIANGLES, 0, numVertices );
176 case Dali::Geometry::LINES:
180 context.DrawElements(GL_LINES, numIndices, GL_UNSIGNED_SHORT, 0);
184 const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
185 unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
186 context.DrawArrays( GL_LINES, 0, numVertices );
190 case Dali::Geometry::POINTS:
192 const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
193 unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
194 context.DrawArrays(GL_POINTS, 0, numVertices );
197 case Dali::Geometry::TRIANGLE_STRIP:
201 context.DrawElements(GL_TRIANGLE_STRIP, numIndices, GL_UNSIGNED_SHORT, 0);
205 const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
206 unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
207 context.DrawArrays(GL_TRIANGLE_STRIP, 0, numVertices );
211 case Dali::Geometry::TRIANGLE_FAN:
215 context.DrawElements(GL_TRIANGLE_FAN, numIndices, GL_UNSIGNED_SHORT, 0);
219 const PropertyBufferDataProvider& firstVertexBuffer = mVertexBuffers[0]->GetDataProvider();
220 unsigned int numVertices = firstVertexBuffer.GetElementCount( bufferIndex );
221 context.DrawArrays(GL_TRIANGLE_FAN, 0, numVertices );
227 DALI_ASSERT_ALWAYS( 0 && "Geometry type not supported (yet)" );
233 for( unsigned int i = 0; i < attributeLocation.Count(); ++i )
235 if( attributeLocation[i] != -1 )
237 context.DisableVertexAttributeArray( attributeLocation[i] );
242 } // namespace SceneGraph
243 } // namespace Internal