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