Revert "[Tizen] Revert "Support multiple window rendering""
[platform/core/uifw/dali-core.git] / dali / internal / event / rendering / texture-set-impl.cpp
1 /*
2  * Copyright (c) 2019 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/texture-set-impl.h> // Dali::Internal::TextureSet
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/object/type-registry.h>
23 #include <dali/internal/update/manager/update-manager.h>
24 #include <dali/internal/update/rendering/scene-graph-texture-set.h>
25
26 namespace Dali
27 {
28 namespace Internal
29 {
30
31 TextureSetPtr TextureSet::New()
32 {
33   TextureSetPtr textureSet( new TextureSet() );
34   textureSet->Initialize();
35   return textureSet;
36 }
37
38 void TextureSet::SetTexture( uint32_t index, TexturePtr texture )
39 {
40   uint32_t textureCount = static_cast<uint32_t>( mTextures.size() );
41   if( index >= textureCount )
42   {
43     mTextures.resize(index + 1);
44
45     bool samplerExist = true;
46     if( mSamplers.size() < index + 1 )
47     {
48       mSamplers.resize( index + 1 );
49       samplerExist = false;
50     }
51
52     for( uint32_t i(textureCount); i<=index; ++i )
53     {
54       mTextures[i] = NULL;
55
56       if( !samplerExist )
57       {
58         mSamplers[i] = NULL;
59       }
60     }
61   }
62
63   mTextures[index]= texture;
64
65   Render::Texture* renderTexture(0);
66   if( texture )
67   {
68     renderTexture = texture->GetRenderObject();
69   }
70
71   SceneGraph::SetTextureMessage( mEventThreadServices, *mSceneObject, index, renderTexture );
72 }
73
74 Texture* TextureSet::GetTexture( uint32_t index ) const
75 {
76   Texture* result(0);
77   if( index < mTextures.size() )
78   {
79     result = mTextures[index].Get();
80   }
81   else
82   {
83     DALI_LOG_ERROR( "Error: Invalid index to TextureSet::GetTexture\n");
84   }
85
86   return result;
87 }
88
89 void TextureSet::SetSampler( uint32_t index, SamplerPtr sampler )
90 {
91   uint32_t samplerCount = static_cast<uint32_t>( mSamplers.size() );
92   if( samplerCount < index + 1  )
93   {
94     mSamplers.resize( index + 1 );
95     for( uint32_t i = samplerCount; i<=index; ++i )
96     {
97       mSamplers[i] = NULL;
98     }
99   }
100
101   mSamplers[index] = sampler;
102
103   Render::Sampler* renderSampler(0);
104   if( sampler )
105   {
106     renderSampler = sampler->GetSamplerRenderObject();
107   }
108
109   SceneGraph::SetSamplerMessage( mEventThreadServices, *mSceneObject, index, renderSampler );
110 }
111
112 Sampler* TextureSet::GetSampler( uint32_t index ) const
113 {
114   Sampler* result(0);
115   if( index < mSamplers.size() )
116   {
117     result = mSamplers[index].Get();
118   }
119   else
120   {
121     DALI_LOG_ERROR( "Error: Invalid index to TextureSet::GetSampler\n");
122   }
123
124   return result;
125 }
126
127 uint32_t TextureSet::GetTextureCount() const
128 {
129   return static_cast<uint32_t>( mTextures.size() );
130 }
131
132 const SceneGraph::TextureSet* TextureSet::GetTextureSetSceneObject() const
133 {
134   return mSceneObject;
135 }
136
137 TextureSet::TextureSet()
138 :mEventThreadServices( EventThreadServices::Get() ),
139  mSceneObject( NULL )
140 {
141 }
142
143 void TextureSet::Initialize()
144 {
145   SceneGraph::UpdateManager& updateManager = mEventThreadServices.GetUpdateManager();
146
147   mSceneObject = SceneGraph::TextureSet::New();
148   OwnerPointer< SceneGraph::TextureSet > transferOwnership( mSceneObject );
149   AddTextureSetMessage( updateManager, transferOwnership );
150 }
151
152 TextureSet::~TextureSet()
153 {
154   if( EventThreadServices::IsCoreRunning() )
155   {
156     SceneGraph::UpdateManager& updateManager = mEventThreadServices.GetUpdateManager();
157     RemoveTextureSetMessage( updateManager, *mSceneObject );
158   }
159 }
160
161 } // namespace Internal
162 } // namespace Dali