void PrintRenderInstruction( const SceneGraph::RenderInstruction& instruction, BufferIndex index )
{
- const char* target = (0 != instruction.mOffscreenTextureId) ? "FrameBuffer" : "Screen";
+ const char* target = (nullptr != instruction.mFrameBuffer) ? "FrameBuffer" : "Screen";
std::stringstream debugStream;
debugStream << "Rendering to " << target << ", View: " << *(instruction.GetViewMatrix(index)) << " Projection: " << *(instruction.GetProjectionMatrix(index));
mClearColor(),
mIsViewportSet( false ),
mIsClearColorSet( false ),
- mOffscreenTextureId( 0 ),
mFrameBuffer( 0 ),
mCamera( 0 ),
mNextFreeRenderList( 0 )
}
void RenderInstruction::Reset( Camera* camera,
- unsigned int offscreenTextureId,
Render::FrameBuffer* frameBuffer,
const Viewport* viewport,
const Vector4* clearColor )
mIsViewportSet = NULL != viewport;
mClearColor = clearColor ? *clearColor : Color::BLACK;
mIsClearColorSet = NULL != clearColor;
- mOffscreenTextureId = offscreenTextureId;
mRenderTracker = NULL;
mNextFreeRenderList = 0;
mFrameBuffer = frameBuffer;
* @param[in] clearColor A pointer to a color to clear with, or NULL if no clear is required.
*/
void Reset( Camera* camera,
- unsigned int offscreenId,
Render::FrameBuffer* frameBuffer,
const Viewport* viewport,
const Vector4* clearColor );
bool mIsViewportSet:1; ///< Flag to determine whether the viewport is set
bool mIsClearColorSet:1; ///< Flag to determine whether the clearColor is set
- unsigned int mOffscreenTextureId; ///< Optional offscreen target
Render::FrameBuffer* mFrameBuffer;
private: // Data
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->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 || instruction.mFrameBuffer != NULL ) )
{
// This will create a sync object every frame this render tracker
RenderTask& renderTask = **iter;
// Off screen only.
- if( ( ( 0 == renderTask.GetFrameBufferId() ) && ( renderTask.GetFrameBuffer() == 0 ) ) ||
- ( !renderTask.ReadyToRender( updateBufferIndex ) ) )
+ if( ( renderTask.GetFrameBuffer() == 0 ) || ( !renderTask.ReadyToRender( updateBufferIndex ) ) )
{
// Skip to next task.
continue;
RenderTask& renderTask = **iter;
// On screen only.
- if( ( 0 != renderTask.GetFrameBufferId() ) ||
- ( renderTask.GetFrameBuffer() != 0 ) ||
- ( !renderTask.ReadyToRender( updateBufferIndex ) ) )
+ if( ( renderTask.GetFrameBuffer() != 0 ) || ( !renderTask.ReadyToRender( updateBufferIndex ) ) )
{
// Skip to next task.
continue;
mCamera = camera;
}
-void RenderTask::SetFrameBufferId( unsigned int resourceId, bool isNativeFBO )
-{
- // note that we might already have a RenderTracker
- mTargetIsNativeFramebuffer = isNativeFBO;
- mFrameBufferResourceId = resourceId;
-}
-
-unsigned int RenderTask::GetFrameBufferId() const
-{
- return mFrameBufferResourceId;
-}
-
void RenderTask::SetFrameBuffer( Render::FrameBuffer* frameBuffer )
{
mFrameBuffer = frameBuffer;
mState = RENDER_ONCE_WAITING_FOR_RESOURCES;
mWaitingToRender = true;
mNotifyTrigger = false;
- // need at least on other render on the FBO
- mResourceManager->SetFrameBufferBeenRenderedTo( mFrameBufferResourceId, false );
}
mFrameCounter = 0u;
}
mCamera->Update( updateBufferIndex, *mCameraNode );
-
- TASK_LOG_FMT(Debug::General, " =T (FBO ID:%d) FC:%d\n", mFrameBufferResourceId , mFrameCounter );
return true;
}
{
// resourcesFinished tells us that this render task will render to its FBO
mResourcesFinished = resourcesFinished;
- if( mResourcesFinished )
- {
- mResourceManager->SetFrameBufferBeenRenderedTo( mFrameBufferResourceId, true );
- }
}
// Called every frame regardless of whether render was required.
{
mWaitingToRender = true;
mNotifyTrigger = false;
- if( mFrameBufferResourceId > 0 )
- {
- if( mTargetIsNativeFramebuffer )
- {
- if( mRenderSyncTracker && mRenderSyncTracker->IsSynced() )
- {
- mWaitingToRender = false;
- mNotifyTrigger = true;
- }
- }
- else if( mResourceManager->HasFrameBufferBeenRenderedTo( mFrameBufferResourceId ) )
- {
- mWaitingToRender = false;
- mNotifyTrigger = true;
- }
- }
- else if( mFrameBuffer )
+ if( mFrameBuffer )
{
if( !mRenderSyncTracker || (mRenderSyncTracker && mRenderSyncTracker->IsSynced() ))
{
bool viewportSet = QueryViewport( updateBufferIndex, viewport );
instruction.Reset( mCamera,
- GetFrameBufferId(),
GetFrameBuffer(),
viewportSet ? &viewport : NULL,
mClearEnabled ? &GetClearColor( updateBufferIndex ) : NULL );
mSourceNode( NULL ),
mCameraNode( NULL ),
mCamera( NULL ),
- mFrameBufferResourceId( 0 ),
mFrameBuffer(0),
mResourcesFinished( false ),
mWaitingToRender( false ),
mRefreshRate( Dali::RenderTask::DEFAULT_REFRESH_RATE ),
mFrameCounter( 0u ),
mRenderedOnceCounter( 0u ),
- mTargetIsNativeFramebuffer( false ),
mRequiresSync( false )
{
}
Node* mSourceNode;
Node* mCameraNode;
SceneGraph::Camera* mCamera;
- unsigned int mFrameBufferResourceId;
Render::FrameBuffer* mFrameBuffer;
bool mResourcesFinished:1; ///< True if all resources were available when the render-task was processed
unsigned int mFrameCounter; ///< counter for rendering every N frames
unsigned int mRenderedOnceCounter; ///< Incremented whenever state changes to RENDERED_ONCE_AND_NOTIFIED
- bool mTargetIsNativeFramebuffer; ///< Tells if our target is a native framebuffer
bool mRequiresSync; ///< Whether sync is needed to track the render
};
// Messages for RenderTask
-
-inline void SetFrameBufferIdMessage( EventThreadServices& eventThreadServices, RenderTask& task, unsigned int resourceId, bool isNativeFBO )
-{
- typedef MessageValue2< RenderTask, unsigned int, bool > LocalType;
-
- // Reserve some memory inside the message queue
- unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
-
- // Construct message in the message queue memory; note that delete should not be called on the return value
- new (slot) LocalType( &task, &RenderTask::SetFrameBufferId, resourceId, isNativeFBO );
-}
-
inline void SetFrameBufferMessage( EventThreadServices& eventThreadServices, RenderTask& task, Render::FrameBuffer* frameBuffer )
{
typedef MessageValue1< RenderTask, Render::FrameBuffer*> LocalType;