Remove RenderSurface from Core
[platform/core/uifw/dali-core.git] / dali / internal / event / rendering / frame-buffer-impl.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/event/rendering/frame-buffer-impl.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/update/manager/update-manager.h>
23 #include <dali/internal/render/renderers/render-frame-buffer.h>
24
25 namespace Dali
26 {
27 namespace Internal
28 {
29
30 FrameBufferPtr FrameBuffer::New( uint32_t width, uint32_t height, Mask attachments  )
31 {
32   FrameBufferPtr frameBuffer( new FrameBuffer( width, height, attachments ) );
33   frameBuffer->Initialize();
34   return frameBuffer;
35 }
36
37 Render::FrameBuffer* FrameBuffer::GetRenderObject() const
38 {
39   return mRenderObject;
40 }
41
42 FrameBuffer::FrameBuffer( uint32_t width, uint32_t height, Mask attachments )
43 : mEventThreadServices( EventThreadServices::Get() ),
44   mRenderObject( NULL ),
45   mColor{ nullptr },
46   mWidth( width ),
47   mHeight( height ),
48   mAttachments( attachments ),
49   mColorAttachmentCount( 0 )
50 {
51 }
52
53 void FrameBuffer::Initialize()
54 {
55    mRenderObject = new Render::FrameBuffer( mWidth, mHeight, mAttachments );
56
57   OwnerPointer< Render::FrameBuffer > transferOwnership( mRenderObject );
58   AddFrameBuffer( mEventThreadServices.GetUpdateManager(), transferOwnership );
59 }
60
61 void FrameBuffer::AttachColorTexture( TexturePtr texture, uint32_t mipmapLevel, uint32_t layer )
62 {
63   if( ( texture->GetWidth() / ( 1u << mipmapLevel ) != mWidth ) ||
64       ( texture->GetHeight() / ( 1u << mipmapLevel ) != mHeight ) )
65   {
66     DALI_LOG_ERROR( "Failed to attach color texture to FrameBuffer: Size mismatch \n" );
67   }
68   else if ( mColorAttachmentCount >= Dali::DevelFrameBuffer::MAX_COLOR_ATTACHMENTS )
69   {
70     DALI_LOG_ERROR( "Failed to attach color texture to FrameBuffer: Exceeded maximum supported color attachments.\n" );
71   }
72   else
73   {
74     mColor[mColorAttachmentCount] = texture;
75     ++mColorAttachmentCount;
76
77     AttachColorTextureToFrameBuffer( mEventThreadServices.GetUpdateManager(), *mRenderObject, texture->GetRenderObject(), mipmapLevel, layer );
78   }
79 }
80
81 Texture* FrameBuffer::GetColorTexture(uint8_t index) const
82 {
83   return ( index >= mColorAttachmentCount ) ? nullptr : mColor[index].Get();
84 }
85
86 void FrameBuffer::SetSize( uint32_t width, uint32_t height )
87 {
88   mWidth = width;
89   mHeight = height;
90 }
91
92 FrameBuffer::~FrameBuffer()
93 {
94   if( EventThreadServices::IsCoreRunning() && mRenderObject )
95   {
96     RemoveFrameBuffer( mEventThreadServices.GetUpdateManager(), *mRenderObject );
97   }
98 }
99
100
101 } // namespace Internal
102 } // namespace Dali