1 // Copyright 2019 The Amber Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/vulkan/sampler_descriptor.h"
16 
17 #include "src/vulkan/device.h"
18 #include "src/vulkan/resource.h"
19 
20 namespace amber {
21 namespace vulkan {
22 
SamplerDescriptor(amber::Sampler * sampler,DescriptorType type,Device * device,uint32_t desc_set,uint32_t binding)23 SamplerDescriptor::SamplerDescriptor(amber::Sampler* sampler,
24                                      DescriptorType type,
25                                      Device* device,
26                                      uint32_t desc_set,
27                                      uint32_t binding)
28     : Descriptor(type, device, desc_set, binding) {
29   AddAmberSampler(sampler);
30 }
31 
32 SamplerDescriptor::~SamplerDescriptor() = default;
33 
CreateResourceIfNeeded()34 Result SamplerDescriptor::CreateResourceIfNeeded() {
35   vulkan_samplers_.reserve(amber_samplers_.size());
36   for (const auto& sampler : amber_samplers_) {
37     vulkan_samplers_.emplace_back(MakeUnique<Sampler>(device_));
38     Result r = vulkan_samplers_.back()->CreateSampler(sampler);
39     if (!r.IsSuccess())
40       return r;
41   }
42 
43   return {};
44 }
45 
UpdateDescriptorSetIfNeeded(VkDescriptorSet descriptor_set)46 void SamplerDescriptor::UpdateDescriptorSetIfNeeded(
47     VkDescriptorSet descriptor_set) {
48   std::vector<VkDescriptorImageInfo> image_infos;
49 
50   for (auto& sampler : vulkan_samplers_) {
51     VkDescriptorImageInfo image_info = {sampler->GetVkSampler(), VK_NULL_HANDLE,
52                                         VK_IMAGE_LAYOUT_GENERAL};
53     image_infos.push_back(image_info);
54   }
55 
56   VkWriteDescriptorSet write = VkWriteDescriptorSet();
57   write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
58   write.dstSet = descriptor_set;
59   write.dstBinding = binding_;
60   write.dstArrayElement = 0;
61   write.descriptorCount = static_cast<uint32_t>(image_infos.size());
62   write.descriptorType = GetVkDescriptorType();
63   write.pImageInfo = image_infos.data();
64 
65   device_->GetPtrs()->vkUpdateDescriptorSets(device_->GetVkDevice(), 1, &write,
66                                              0, nullptr);
67 }
68 
69 }  // namespace vulkan
70 }  // namespace amber
71