2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <dali/graphics/vulkan/vulkan-resource-cache.h>
20 #include <dali/graphics/vulkan/vulkan-buffer.h>
21 #include <dali/graphics/vulkan/vulkan-image.h>
22 #include <dali/graphics/vulkan/vulkan-pipeline.h>
23 #include <dali/graphics/vulkan/vulkan-shader.h>
24 #include <dali/graphics/vulkan/vulkan-descriptor-set.h>
25 #include <dali/graphics/vulkan/vulkan-framebuffer.h>
36 ResourceCache& ResourceCache::AddBuffer( BufferRef buffer )
38 mBuffers.push_back( buffer );
42 ResourceCache& ResourceCache::AddImage( ImageRef image )
44 mImages.push_back( image );
48 ResourceCache& ResourceCache::AddPipeline( PipelineRef pipeline )
50 mPipelines.push_back( pipeline );
54 ResourceCache& ResourceCache::AddShader( ShaderRef shader )
56 mShaders.push_back( shader );
60 ResourceCache& ResourceCache::AddCommandPool( CommandPoolRef pool )
62 mCommandPools.push_back( pool );
66 ResourceCache& ResourceCache::AddDescriptorPool( DescriptorPoolRef pool )
68 mDescriptorPools.push_back( pool );
72 ResourceCache& ResourceCache::AddFramebuffer( FramebufferRef framebuffer )
74 mFramebuffers.push_back( framebuffer );
78 ResourceCache& ResourceCache::AddSampler( SamplerRef sampler )
80 mSamplers.push_back(sampler);
84 PipelineRef ResourceCache::FindPipeline( vk::Pipeline pipeline )
86 auto iterator = std::find_if(mPipelines.begin(),
88 [&](const PipelineRef entry) { return &*entry == pipeline; });
90 return iterator == mPipelines.end() ? PipelineRef() : PipelineRef(&**iterator);
93 ShaderRef ResourceCache::FindShader( vk::ShaderModule shaderModule )
95 auto iterator = std::find_if(mShaders.begin(),
97 [&](const ShaderRef entry) { return &*entry == shaderModule; });
99 return iterator == mShaders.end() ? ShaderRef() : ShaderRef(&**iterator);
102 CommandPoolRef ResourceCache::FindCommandPool( vk::CommandPool commandPool )
104 auto iterator = std::find_if(mCommandPools.begin(),
106 [&](const CommandPoolRef entry) { return &*entry == commandPool; });
108 return iterator == mCommandPools.end() ? CommandPoolRef() : CommandPoolRef(&**iterator);
111 DescriptorPoolRef ResourceCache::FindDescriptorPool( vk::DescriptorPool descriptorPool )
113 auto iterator = std::find_if(mDescriptorPools.begin(),
114 mDescriptorPools.end(),
115 [&](const DescriptorPoolRef entry) { return &*entry == descriptorPool; });
117 return iterator == mDescriptorPools.end() ? DescriptorPoolRef() : DescriptorPoolRef(&**iterator);
120 FramebufferRef ResourceCache::FindFramebuffer( vk::Framebuffer framebuffer )
122 auto iterator = std::find_if(mFramebuffers.begin(),
124 [&](const FramebufferRef entry) { return &*entry == framebuffer; });
126 return iterator == mFramebuffers.end() ? FramebufferRef() : FramebufferRef(&**iterator);
129 SamplerRef ResourceCache::FindSampler( vk::Sampler sampler )
131 auto iterator = std::find_if(mSamplers.begin(),
133 [&](const SamplerRef entry) { return &*entry == sampler; });
135 return iterator == mSamplers.end() ? SamplerRef() : SamplerRef(&**iterator);
138 BufferRef ResourceCache::FindBuffer( vk::Buffer buffer )
140 auto iterator = std::find_if(mBuffers.begin(),
142 [&](const BufferRef entry) { return &*entry == buffer; });
144 return iterator == mBuffers.end() ? BufferRef() : BufferRef(&**iterator);
147 ImageRef ResourceCache::FindImage( vk::Image image )
149 auto iterator = std::find_if(mImages.begin(),
151 [&](const ImageRef entry) { return &*entry == image; });
153 return iterator == mImages.end() ? ImageRef() : ImageRef(&**iterator);
156 ResourceCache& ResourceCache::RemoveBuffer( Buffer& buffer )
158 if( !mBuffers.empty() )
160 auto found = std::find_if(mBuffers.begin(),
162 [&](const BufferRef entry) { return &(*entry) == &buffer; });
164 std::iter_swap(found, std::prev(mBuffers.end()));
165 mBuffers.back().Reset();
171 ResourceCache& ResourceCache::RemoveImage( Image& image )
173 if( !mImages.empty() )
175 auto found = std::find_if(mImages.begin(),
177 [&](const ImageRef entry) { return &(*entry) == ℑ });
179 std::iter_swap(found, std::prev(mImages.end()));
180 mImages.back().Reset();
186 ResourceCache& ResourceCache::RemovePipeline( Pipeline &pipeline )
188 if( !mPipelines.empty() )
190 auto found = std::find_if(mPipelines.begin(),
192 [&](const PipelineRef entry) { return &(*entry) == &pipeline; });
194 std::iter_swap(found, std::prev(mPipelines.end()));
195 mPipelines.back().Reset();
196 mPipelines.pop_back();
201 ResourceCache& ResourceCache::RemoveShader( Shader& shader )
203 if( !mShaders.empty() )
205 auto iterator = std::find_if(mShaders.begin(),
207 [&](const ShaderRef entry) { return &*entry == &shader; });
209 std::iter_swap(iterator, std::prev(mShaders.end());
210 mShaders.back().Reset();
216 ResourceCache& ResourceCache::RemoveCommandPool( CommandPool& commandPool )
218 if( !mCommandPools.empty() )
220 auto iterator = std::find_if(mCommandPools.begin(),
222 [&](const CommandPoolRef entry) { return &*entry == &commandPool; });
224 std::iter_swap(iterator, std::prev(mCommandPools.end()));
225 mCommandPools.back().Reset();
226 mCommandPools.pop_back();
231 ResourceCache& ResourceCache::RemoveDescriptorPool( std::unique_ptr<DescriptorPool> descriptorPool )
233 if( !mDescriptorPools.empty() )
235 auto iterator = std::find_if(mDescriptorPools.begin(),
236 mDescriptorPools.end(),
237 [&](const DescriptorPoolRef entry) { return &*entry == &*descriptorPool; });
239 std::iter_swap(iterator, std::prev(mDescriptorPools.end()));
240 mDescriptorPools.back().Reset();
241 mDescriptorPools.pop_back();
246 ResourceCache& ResourceCache::RemoveFramebuffer( Framebuffer &framebuffer )
248 if( !mFramebuffers.empty() )
250 auto iterator = std::find_if(mFramebuffers.begin(),
252 [&](const FramebufferRef entry) { return &*entry == &framebuffer; });
254 std::iter_swap(iterator, std::prev(mFramebuffers.end()));
255 mFramebuffers.back().Reset();
256 mFramebuffers.pop_back();
261 ResourceCache& ResourceCache::RemoveSampler( Sampler &sampler )
263 if( !mSamplers.empty() )
265 auto iterator = std::find_if(mSamplers.begin(),
267 [&](const SamplerRef entry) { return &*entry == &sampler; });
269 std::iter_swap(iterator, std::prev(mSamplers.end()));
270 mSamplers.back().Reset();
271 mSamplers.pop_back();
277 } //namespace Graphics