sampler.cpp

cross platform rendering playground

src/backend/vulkan/sampler.cpp

2.07 KB
#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