/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
#include <dali/internal/render/common/render-tracker.h>
#include <dali/internal/render/common/render-instruction-container.h>
#include <dali/internal/render/common/render-instruction.h>
-#include <dali/internal/render/data-providers/uniform-name-cache.h>
#include <dali/internal/render/gl-resources/context.h>
#include <dali/internal/render/gl-resources/frame-buffer-texture.h>
#include <dali/internal/render/gl-resources/texture-cache.h>
Impl( Integration::GlAbstraction& glAbstraction,
Integration::GlSyncAbstraction& glSyncAbstraction,
LockedResourceQueue& textureUploadedQ,
- TextureUploadedDispatcher& postProcessDispatcher )
+ TextureUploadedDispatcher& postProcessDispatcher,
+ GeometryBatcher& geometryBatcher )
: context( glAbstraction ),
glSyncAbstraction( glSyncAbstraction ),
renderQueue(),
renderersAdded( false ),
firstRenderCompleted( false ),
defaultShader( NULL ),
- programController( glAbstraction )
+ programController( glAbstraction ),
+ geometryBatcher( geometryBatcher )
{
}
Integration::GlSyncAbstraction& glSyncAbstraction; ///< GL sync abstraction
RenderQueue renderQueue; ///< A message queue for receiving messages from the update-thread.
TextureCache textureCache; ///< Cache for all GL textures
- Render::UniformNameCache uniformNameCache; ///< Cache to provide unique indices for uniforms
LockedResourceQueue& textureUploadedQueue; ///< A queue for requesting resource post processing in update thread
// Render instructions describe what should be rendered during RenderManager::Render()
bool firstRenderCompleted; ///< False until the first render is done
Shader* defaultShader; ///< Default shader to use
ProgramController programController; ///< Owner of the GL programs
+
+ SceneGraph::GeometryBatcher& geometryBatcher; ///< Instance of geometry batcher
};
RenderManager* RenderManager::New( Integration::GlAbstraction& glAbstraction,
Integration::GlSyncAbstraction& glSyncAbstraction,
+ SceneGraph::GeometryBatcher& geometryBatcher,
LockedResourceQueue& textureUploadedQ )
{
RenderManager* manager = new RenderManager;
- manager->mImpl = new Impl( glAbstraction, glSyncAbstraction, textureUploadedQ, *manager );
+ manager->mImpl = new Impl( glAbstraction, glSyncAbstraction, textureUploadedQ, *manager, geometryBatcher );
return manager;
}
RenderManager::~RenderManager()
{
- for ( TextureOwnerIter iter = mImpl->textureContainer.Begin(); iter != mImpl->textureContainer.End(); ++iter )
- {
- (*iter)->Destroy( mImpl->context );
- }
-
- for ( FrameBufferOwnerIter iter = mImpl->frameBufferContainer.Begin(); iter != mImpl->frameBufferContainer.End(); ++iter )
- {
- (*iter)->Destroy( mImpl->context );
- }
-
delete mImpl;
}
// inform texture cache
mImpl->textureCache.GlContextDestroyed(); // Clears gl texture ids
+ //Inform textures
+ for( TextureOwnerIter iter = mImpl->textureContainer.Begin(); iter != mImpl->textureContainer.End(); ++iter )
+ {
+ (*iter)->GlContextDestroyed();
+ }
+
+ //Inform framebuffers
+ for( FrameBufferOwnerIter iter = mImpl->frameBufferContainer.Begin(); iter != mImpl->frameBufferContainer.End(); ++iter )
+ {
+ (*iter)->GlContextDestroyed();
+ }
+
// inform renderers
RendererOwnerContainer::Iterator end = mImpl->rendererContainer.End();
RendererOwnerContainer::Iterator iter = mImpl->rendererContainer.Begin();
void RenderManager::AddRenderer( Render::Renderer* renderer )
{
// Initialize the renderer as we are now in render thread
- renderer->Initialize( mImpl->context, mImpl->textureCache, mImpl->uniformNameCache );
+ renderer->Initialize( mImpl->context, mImpl->textureCache );
mImpl->rendererContainer.PushBack( renderer );
}
}
-void RenderManager::UploadTexture( Render::NewTexture* texture, Vector<unsigned char>& buffer, const NewTexture::UploadParams& params )
+void RenderManager::UploadTexture( Render::NewTexture* texture, PixelDataPtr pixelData, const NewTexture::UploadParams& params )
{
- texture->Upload( mImpl->context, buffer, params );
+ texture->Upload( mImpl->context, pixelData, params );
}
void RenderManager::GenerateMipmaps( Render::NewTexture* texture )
void RenderManager::SetGeometryType( Render::Geometry* geometry, unsigned int geometryType )
{
- geometry->SetGeometryType( Render::Geometry::GeometryType(geometryType) );
+ geometry->SetType( Render::Geometry::Type(geometryType) );
}
void RenderManager::AddRenderTracker( Render::RenderTracker* renderTracker )
FrameBufferTexture* offscreen = NULL;
- if ( instruction.mOffscreenTextureId != 0 )
- {
- offscreen = mImpl->textureCache.GetFramebuffer( instruction.mOffscreenTextureId );
- DALI_ASSERT_DEBUG( NULL != offscreen );
-
- if( NULL != offscreen &&
- offscreen->Prepare() )
- {
- // Check whether a viewport is specified, otherwise the full surface size is used
- if ( instruction.mIsViewportSet )
- {
- // For glViewport the lower-left corner is (0,0)
- const int y = ( offscreen->GetHeight() - instruction.mViewport.height ) - instruction.mViewport.y;
- viewportRect.Set( instruction.mViewport.x, y, instruction.mViewport.width, instruction.mViewport.height );
- }
- else
- {
- viewportRect.Set( 0, 0, offscreen->GetWidth(), offscreen->GetHeight() );
- }
- }
- else
- {
- // Offscreen is NULL or could not be prepared.
- return;
- }
- }
- else if( instruction.mFrameBuffer != 0 )
+ if( instruction.mFrameBuffer != 0 )
{
instruction.mFrameBuffer->Bind( mImpl->context );
if ( instruction.mIsViewportSet )
mImpl->context,
mImpl->textureCache,
defaultShader,
+ mImpl->geometryBatcher,
mImpl->renderBufferIndex );
- if(instruction.mOffscreenTextureId != 0)
- {
- GLenum attachments[] = { GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT };
- mImpl->context.InvalidateFramebuffer(GL_FRAMEBUFFER, 2, attachments);
- }
-
- if( instruction.mRenderTracker && offscreen != NULL )
+ if( instruction.mRenderTracker && ( offscreen != NULL || instruction.mFrameBuffer != NULL ) )
{
// This will create a sync object every frame this render tracker
// is alive (though it should be now be created only for