- // Clear the entire color, depth and stencil buffers for the default framebuffer.
- // It is important to clear all 3 buffers, for performance on deferred renderers like Mali
- // e.g. previously when the depth & stencil buffers were NOT cleared, it caused the DDK to exceed a "vertex count limit",
- // and then stall. That problem is only noticeable when rendering a large number of vertices per frame.
- mImpl->context.SetScissorTest( false );
- mImpl->context.ColorMask( true );
- mImpl->context.DepthMask( true );
- mImpl->context.StencilMask( 0xFF ); // 8 bit stencil mask, all 1's
- mImpl->context.Clear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, Context::FORCE_CLEAR );
+ // Upload the geometries
+ for( uint32_t i = 0; i < mImpl->sceneContainer.size(); ++i )
+ {
+ RenderInstructionContainer& instructions = mImpl->sceneContainer[i]->GetRenderInstructions();
+ for ( uint32_t j = 0; j < instructions.Count( mImpl->renderBufferIndex ); ++j )
+ {
+ RenderInstruction& instruction = instructions.At( mImpl->renderBufferIndex, j );
+
+ const Matrix* viewMatrix = instruction.GetViewMatrix( mImpl->renderBufferIndex );
+ const Matrix* projectionMatrix = instruction.GetProjectionMatrix( mImpl->renderBufferIndex );
+
+ DALI_ASSERT_DEBUG( viewMatrix );
+ DALI_ASSERT_DEBUG( projectionMatrix );
+
+ if( viewMatrix && projectionMatrix )
+ {
+ const RenderListContainer::SizeType renderListCount = instruction.RenderListCount();
+
+ // Iterate through each render list.
+ for( RenderListContainer::SizeType index = 0; index < renderListCount; ++index )
+ {
+ const RenderList* renderList = instruction.GetRenderList( index );
+
+ if( renderList && !renderList->IsEmpty() )
+ {
+ const std::size_t itemCount = renderList->Count();
+ for( uint32_t itemIndex = 0u; itemIndex < itemCount; ++itemIndex )
+ {
+ const RenderItem& item = renderList->GetItem( itemIndex );
+ if( DALI_LIKELY( item.mRenderer ) )
+ {
+ item.mRenderer->Upload( *mImpl->currentContext );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+void RenderManager::RenderScene( Integration::Scene& scene, bool renderToFbo )
+{
+ Internal::Scene& sceneInternal = GetImplementation( scene );
+ SceneGraph::Scene* sceneObject = sceneInternal.GetSceneObject();
+
+ uint32_t count = sceneObject->GetRenderInstructions().Count( mImpl->renderBufferIndex );
+
+ for( uint32_t i = 0; i < count; ++i )
+ {
+ RenderInstruction& instruction = sceneObject->GetRenderInstructions().At( mImpl->renderBufferIndex, i );
+
+ if ( ( renderToFbo && !instruction.mFrameBuffer ) || ( !renderToFbo && instruction.mFrameBuffer ) )
+ {
+ continue; // skip
+ }
+
+ Rect<int32_t> viewportRect;
+ Vector4 clearColor;
+
+ if ( instruction.mIsClearColorSet )
+ {
+ clearColor = instruction.mClearColor;
+ }
+ else
+ {
+ clearColor = Dali::RenderTask::DEFAULT_CLEAR_COLOR;
+ }
+
+ Rect<int32_t> surfaceRect = mImpl->defaultSurfaceRect;
+ Integration::DepthBufferAvailable depthBufferAvailable = mImpl->depthBufferAvailable;
+ Integration::StencilBufferAvailable stencilBufferAvailable = mImpl->stencilBufferAvailable;
+ int surfaceOrientation = mImpl->defaultSurfaceOrientation;
+
+ if ( instruction.mFrameBuffer )
+ {
+ // offscreen buffer
+ if ( mImpl->currentContext != &mImpl->context )
+ {
+ // Switch to shared context for off-screen buffer
+ mImpl->currentContext = &mImpl->context;
+
+ if ( mImpl->currentContext->IsSurfacelessContextSupported() )
+ {
+ mImpl->glContextHelperAbstraction.MakeSurfacelessContextCurrent();
+ }
+
+ // Clear the current cached program when the context is switched
+ mImpl->programController.ClearCurrentProgram();
+ }
+ }
+ else
+ {
+ if ( mImpl->currentContext->IsSurfacelessContextSupported() )
+ {
+ if ( mImpl->currentContext != sceneObject->GetContext() )
+ {
+ // Switch the correct context if rendering to a surface
+ mImpl->currentContext = sceneObject->GetContext();
+
+ // Clear the current cached program when the context is switched
+ mImpl->programController.ClearCurrentProgram();
+ }
+ }
+
+ surfaceRect = Rect<int32_t>( 0, 0, static_cast<int32_t>( scene.GetSize().width ), static_cast<int32_t>( scene.GetSize().height ) );
+ }
+
+ DALI_ASSERT_DEBUG( mImpl->currentContext->IsGlContextCreated() );