57 lines
2.3 KiB
C++
57 lines
2.3 KiB
C++
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
|
|
|
#if GRAPHICS_API_VULKAN
|
|
|
|
#include "GPUSamplerVulkan.h"
|
|
#include "RenderToolsVulkan.h"
|
|
|
|
bool GPUSamplerVulkan::OnInit()
|
|
{
|
|
VkSamplerCreateInfo createInfo;
|
|
RenderToolsVulkan::ZeroStruct(createInfo, VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO);
|
|
createInfo.magFilter = RenderToolsVulkan::ToVulkanMagFilterMode(_desc.Filter);
|
|
createInfo.minFilter = RenderToolsVulkan::ToVulkanMinFilterMode(_desc.Filter);
|
|
createInfo.mipmapMode = RenderToolsVulkan::ToVulkanMipFilterMode(_desc.Filter);
|
|
const bool supportsMirrorClampToEdge = GPUDeviceVulkan::OptionalDeviceExtensions.HasMirrorClampToEdge;
|
|
createInfo.addressModeU = RenderToolsVulkan::ToVulkanWrapMode(_desc.AddressU, supportsMirrorClampToEdge);
|
|
createInfo.addressModeV = RenderToolsVulkan::ToVulkanWrapMode(_desc.AddressV, supportsMirrorClampToEdge);
|
|
createInfo.addressModeW = RenderToolsVulkan::ToVulkanWrapMode(_desc.AddressW, supportsMirrorClampToEdge);
|
|
createInfo.mipLodBias = _desc.MipBias;
|
|
createInfo.anisotropyEnable = _desc.Filter == GPUSamplerFilter::Anisotropic ? VK_TRUE : VK_FALSE;
|
|
createInfo.maxAnisotropy = (float)_desc.MaxAnisotropy;
|
|
createInfo.compareEnable = _desc.ComparisonFunction != GPUSamplerCompareFunction::Never ? VK_TRUE : VK_FALSE;
|
|
createInfo.compareOp = RenderToolsVulkan::ToVulkanSamplerCompareFunction(_desc.ComparisonFunction);
|
|
createInfo.minLod = _desc.MinMipLevel;
|
|
createInfo.maxLod = _desc.MaxMipLevel;
|
|
switch (_desc.BorderColor)
|
|
{
|
|
case GPUSamplerBorderColor::TransparentBlack:
|
|
createInfo.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
|
break;
|
|
case GPUSamplerBorderColor::OpaqueBlack:
|
|
createInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
|
|
break;
|
|
case GPUSamplerBorderColor::OpaqueWhite:
|
|
createInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
|
break;
|
|
default:
|
|
return true;
|
|
}
|
|
VALIDATE_VULKAN_RESULT(vkCreateSampler(_device->Device, &createInfo, nullptr, &Sampler));
|
|
return false;
|
|
}
|
|
|
|
void GPUSamplerVulkan::OnReleaseGPU()
|
|
{
|
|
if (Sampler != VK_NULL_HANDLE)
|
|
{
|
|
_device->DeferredDeletionQueue.EnqueueResource(DeferredDeletionQueueVulkan::Buffer, Sampler);
|
|
Sampler = VK_NULL_HANDLE;
|
|
}
|
|
|
|
// Base
|
|
GPUSampler::OnReleaseGPU();
|
|
}
|
|
|
|
#endif
|