blob: 12f24c327fce77707dab10cfffbe7acbbf27318d [file]
/*
* Copyright (c) 2026 The Khronos Group Inc.
* Copyright (c) 2026 Valve Corporation
* Copyright (c) 2026 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <vulkan/vulkan_core.h>
#include "binding.h"
class VkLayerTest;
namespace vkt {
class Buffer;
namespace as {
class AccelerationStructureKHR;
}
class DescriptorHeap {
public:
static void AddDescriptorHeapRequirements(VkLayerTest& test);
static void AddUntypedDescriptorHeapRequirements(VkLayerTest &test);
DescriptorHeap(VkLayerTest& test);
void CreateResourceHeap(VkDeviceSize app_size, bool reserved_range_in_front = false);
void CreateSamplerHeap(VkDeviceSize app_size, bool reserved_range_in_front = false, bool use_embedded_samplers = false);
// Writes a descriptor at the internally maintained heap write offset.
// Heap write offset is first aligned according to descriptor type,
// then descriptor is written, finally heap write offset is incremented by descriptor size.
// Returns write offset.
VkDeviceSize WriteBufferDescriptor(const vkt::Buffer& buffer, VkDescriptorType desc_type);
VkDeviceSize WriteBufferDescriptor(VkDeviceAddressRangeKHR addr_range, VkDescriptorType desc_type);
VkDeviceSize WriteImageDescriptor(const vkt::Image& image, VkDescriptorType desc_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
VkImageLayout layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
VkDeviceSize WriteAccelerationStructureDescriptor(vkt::as::AccelerationStructureKHR& as);
VkDeviceSize WriteAccelerationStructureDescriptor(VkDeviceAddress as_addr);
VkDeviceSize WriteSamplerDescriptor(VkSamplerCreateInfo* sampler_create_info = nullptr);
// Write at supplied heap offset
// *Warning* Internally maintained heap write offset will not be touched at all,
// so this probably should not be used with the above functions.
VkDeviceSize WriteBufferDescriptorAtOffset(VkDeviceAddressRangeKHR addr_range, VkDescriptorType desc_type,
VkDeviceSize heap_offset);
VkDeviceSize WriteImageDescriptorAtOffset(const vkt::Image& image, VkDeviceSize heap_offset,
VkDescriptorType desc_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
VkImageLayout layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
VkDeviceSize WriteNullDescriptorAtOffset(VkDescriptorType desc_type, VkDeviceSize heap_offset);
VkDeviceSize AlignResource(VkDeviceSize offset);
VkDeviceSize AlignSampler(VkDeviceSize offset);
VkDeviceSize GetCurrentHeapWriteOffset() const { return heap_offset_; }
VkDeviceSize GetResourceHeapReservedRangeOffset() const;
VkDeviceSize GetSamplerHeapReservedRangeOffset() const;
void BindResourceHeap(vkt::CommandBuffer &cmd_buffer);
void BindSamplerHeap(vkt::CommandBuffer &cmd_buffer);
VkPhysicalDeviceDescriptorHeapPropertiesEXT heap_props = vku::InitStructHelper();
VkPhysicalDeviceDescriptorHeapTensorPropertiesARM tensor_heap_props = vku::InitStructHelper();
vkt::Buffer resource_heap_;
uint8_t* resource_heap_data_ = nullptr;
vkt::Buffer sampler_heap_;
uint8_t *sampler_heap_data_ = nullptr;
private:
VkDeviceSize WriteDescriptorAtOffset(VkDeviceAddressRangeKHR addr_range, VkDescriptorType desc_type, VkDeviceSize heap_offset);
VkDeviceSize WriteDescriptorAtOffset(const VkImageDescriptorInfoEXT* image_info, VkDescriptorType desc_type,
VkDeviceSize heap_offset);
VkLayerTest* test_ = nullptr;
bool resource_reserved_range_in_front_ = false;
bool sampler_reserved_range_in_front_ = false;
bool embedded_samplers = false;
VkDeviceSize heap_offset_ = 0;
VkDeviceSize sampler_heap_offset_ = 0;
};
} // namespace vkt