#include <volk.h>
#include "backend/vulkan/debug.h"
#include "backend/vulkan/utils.h"
#include "backend/vulkan/vk_api.h"
#include "backend/vulkan/vk_conversion.h"
namespace rhi {
using namespace vk;
bool create_sampler(Device &device, SamplerDesc &desc, Sampler &sampler) {
VkSamplerCreateInfo sampler_info = {};
sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
sampler_info.addressModeU = vk::sampler_address_to_vk(desc.address);
sampler_info.addressModeV = vk::sampler_address_to_vk(desc.address);
sampler_info.addressModeW = vk::sampler_address_to_vk(desc.address);
sampler_info.magFilter = vk::sampler_filter_to_vk(desc.filter);
sampler_info.minFilter = vk::sampler_filter_to_vk(desc.filter);
sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
sampler_info.mipLodBias = 0.0f;
sampler_info.anisotropyEnable = desc.filter == SamplerFilter::ANISOTROPIC ? VK_TRUE : VK_FALSE;
sampler_info.maxAnisotropy = 16;
sampler_info.compareEnable = desc.comparison_func != SamplerComparisonFunc::NEVER ? VK_TRUE : VK_FALSE;
sampler_info.compareOp = vk::sampler_comparison_to_vk(desc.comparison_func);
sampler_info.minLod = 0.0f;
sampler_info.maxLod = desc.use_mips ? 16.0f : 0.0f;
sampler_info.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
sampler_info.unnormalizedCoordinates = VK_FALSE;
sampler_info.flags = {};
VkSampler vk_sampler;
VK_CHECK(vkCreateSampler(device.logical, &sampler_info, nullptr, &vk_sampler));
sampler._handle = vk_sampler;
if (!desc.name.empty()) {
VK_NAME_EX(device, vk_sampler, desc.name.c_str());
}
sampler.slot = write_sampler_descriptor(device, sampler);
return true;
}
u64 handle_id(Device &device, Sampler &sampler) {
(void)device;
return sampler.slot;
}
void destroy_sampler(Device &device, Sampler &sampler) {
if (sampler._handle != VK_NULL_HANDLE) {
vkDestroySampler(device.logical, sampler._handle, nullptr);
}
if (sampler.slot != UINT64_MAX) {
free_sampler_slot(sampler.slot);
}
sampler = {};
}
} // namespace rhi