64 lines
2.2 KiB
C++
64 lines
2.2 KiB
C++
#include "sampler.h"
|
|
#include "core/device/device.h"
|
|
|
|
void SamplerManager::init(DeviceManager *deviceManager)
|
|
{
|
|
_deviceManager = deviceManager;
|
|
|
|
VkSamplerCreateInfo sampl{.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO};
|
|
|
|
// Sensible, cross-vendor defaults
|
|
sampl.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
|
sampl.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
|
sampl.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
|
sampl.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
|
|
sampl.minLod = 0.0f;
|
|
sampl.maxLod = VK_LOD_CLAMP_NONE;
|
|
sampl.mipLodBias = 0.0f;
|
|
sampl.anisotropyEnable = VK_FALSE; // set true + maxAnisotropy if feature enabled
|
|
sampl.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
|
|
sampl.unnormalizedCoordinates = VK_FALSE;
|
|
|
|
// Nearest defaults
|
|
sampl.magFilter = VK_FILTER_NEAREST;
|
|
sampl.minFilter = VK_FILTER_NEAREST;
|
|
vkCreateSampler(_deviceManager->device(), &sampl, nullptr, &_defaultSamplerNearest);
|
|
|
|
// Linear defaults
|
|
sampl.magFilter = VK_FILTER_LINEAR;
|
|
sampl.minFilter = VK_FILTER_LINEAR;
|
|
vkCreateSampler(_deviceManager->device(), &sampl, nullptr, &_defaultSamplerLinear);
|
|
|
|
// Shadow linear clamp sampler (border=white)
|
|
VkSamplerCreateInfo sh = sampl;
|
|
sh.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
|
|
sh.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
|
|
sh.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
|
|
sh.compareEnable = VK_FALSE; // manual PCF
|
|
sh.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
|
vkCreateSampler(_deviceManager->device(), &sh, nullptr, &_shadowLinearClamp);
|
|
|
|
}
|
|
|
|
void SamplerManager::cleanup()
|
|
{
|
|
if (!_deviceManager) return;
|
|
|
|
if (_defaultSamplerNearest)
|
|
{
|
|
vkDestroySampler(_deviceManager->device(), _defaultSamplerNearest, nullptr);
|
|
_defaultSamplerNearest = VK_NULL_HANDLE;
|
|
}
|
|
if (_defaultSamplerLinear)
|
|
{
|
|
vkDestroySampler(_deviceManager->device(), _defaultSamplerLinear, nullptr);
|
|
_defaultSamplerLinear = VK_NULL_HANDLE;
|
|
}
|
|
|
|
if (_shadowLinearClamp)
|
|
{
|
|
vkDestroySampler(_deviceManager->device(), _shadowLinearClamp, nullptr);
|
|
_shadowLinearClamp = VK_NULL_HANDLE;
|
|
}
|
|
}
|