Configurable sampling per custom texture in material shaders

This commit is contained in:
RaveYard 2023-08-25 08:23:24 +02:00 committed by Magnus Norddahl
commit 97eaa46b69
9 changed files with 117 additions and 27 deletions

View file

@ -85,7 +85,7 @@ void VkSamplerManager::ResetHWSamplers()
void VkSamplerManager::CreateHWSamplers()
{
int filter = sysCallbacks.DisableTextureFilter && sysCallbacks.DisableTextureFilter()? 0 : gl_texture_filter;
int filter = sysCallbacks.DisableTextureFilter && sysCallbacks.DisableTextureFilter() ? 0 : gl_texture_filter;
for (int i = CLAMP_NONE; i <= CLAMP_XY; i++)
{
@ -137,15 +137,40 @@ void VkSamplerManager::CreateHWSamplers()
.MaxLod(0.25f)
.DebugName("VkSamplerManager.mSamplers")
.Create(fb->GetDevice());
mOverrideSamplers[int(MaterialLayerSampling::NearestMipLinear)] = SamplerBuilder()
.MagFilter(VK_FILTER_NEAREST)
.MinFilter(VK_FILTER_LINEAR)
.AddressMode(VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_SAMPLER_ADDRESS_MODE_REPEAT)
.MipmapMode(VK_SAMPLER_MIPMAP_MODE_LINEAR)
.MaxLod(100.0f)
.Anisotropy(gl_texture_filter_anisotropic)
.Create(fb->GetDevice());
mOverrideSamplers[int(MaterialLayerSampling::LinearMipLinear)] = SamplerBuilder()
.MagFilter(VK_FILTER_LINEAR)
.MinFilter(VK_FILTER_LINEAR)
.AddressMode(VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_SAMPLER_ADDRESS_MODE_REPEAT)
.MipmapMode(VK_SAMPLER_MIPMAP_MODE_LINEAR)
.MaxLod(100.0f)
.Anisotropy(gl_texture_filter_anisotropic)
.Create(fb->GetDevice());
}
void VkSamplerManager::DeleteHWSamplers()
{
for (auto& sampler : mSamplers)
auto deleteSamplers = [&](auto& samplers)
{
if (sampler)
fb->GetCommands()->DrawDeleteList->Add(std::move(sampler));
}
for (auto& sampler : samplers)
{
if (sampler)
fb->GetCommands()->DrawDeleteList->Add(std::move(sampler));
}
};
deleteSamplers(mSamplers);
deleteSamplers(mOverrideSamplers);
}
VulkanSampler* VkSamplerManager::Get(PPFilterMode filter, PPWrapMode wrap)

View file

@ -16,9 +16,16 @@ public:
void ResetHWSamplers();
VulkanSampler *Get(int no) const { return mSamplers[no].get(); }
VulkanSampler* Get(PPFilterMode filter, PPWrapMode wrap);
inline VulkanSampler* Get(int no) const { return mSamplers[no].get(); }
inline VulkanSampler* Get(MaterialLayerSampling filterOverride, int no) const
{
if (filterOverride == MaterialLayerSampling::Default)
return Get(no);
return mOverrideSamplers[int(filterOverride)].get();
}
std::unique_ptr<VulkanSampler> ShadowmapSampler;
std::unique_ptr<VulkanSampler> LightmapSampler;
@ -30,5 +37,6 @@ private:
VulkanRenderDevice* fb = nullptr;
std::array<std::unique_ptr<VulkanSampler>, NUMSAMPLERS> mSamplers;
std::array<std::unique_ptr<VulkanSampler>, 2> mOverrideSamplers;
std::array<std::unique_ptr<VulkanSampler>, 4> mPPSamplers;
};

View file

@ -350,13 +350,13 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state)
descriptor->SetDebugName("VkHardwareTexture.mDescriptorSets");
VulkanSampler* sampler = fb->GetSamplerManager()->Get(clampmode);
auto* sampler = fb->GetSamplerManager()->Get(clampmode);
WriteDescriptors update;
MaterialLayerInfo *layer;
auto systex = static_cast<VkHardwareTexture*>(GetLayer(0, state.mTranslation, &layer));
auto systeximage = systex->GetImage(layer->layerTexture, state.mTranslation, layer->scaleFlags);
update.AddCombinedImageSampler(descriptor.get(), 0, systeximage->View.get(), sampler, systeximage->Layout);
update.AddCombinedImageSampler(descriptor.get(), 0, systeximage->View.get(), fb->GetSamplerManager()->Get(GetLayerFilter(0), clampmode), systeximage->Layout);
if (!(layer->scaleFlags & CTF_Indexed))
{
@ -364,7 +364,7 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state)
{
auto syslayer = static_cast<VkHardwareTexture*>(GetLayer(i, 0, &layer));
auto syslayerimage = syslayer->GetImage(layer->layerTexture, 0, layer->scaleFlags);
update.AddCombinedImageSampler(descriptor.get(), i, syslayerimage->View.get(), sampler, syslayerimage->Layout);
update.AddCombinedImageSampler(descriptor.get(), i, syslayerimage->View.get(), fb->GetSamplerManager()->Get(GetLayerFilter(i), clampmode), syslayerimage->Layout);
}
}
else
@ -373,7 +373,7 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state)
{
auto syslayer = static_cast<VkHardwareTexture*>(GetLayer(i, translation, &layer));
auto syslayerimage = syslayer->GetImage(layer->layerTexture, 0, layer->scaleFlags);
update.AddCombinedImageSampler(descriptor.get(), i, syslayerimage->View.get(), sampler, syslayerimage->Layout);
update.AddCombinedImageSampler(descriptor.get(), i, syslayerimage->View.get(), fb->GetSamplerManager()->Get(GetLayerFilter(i), clampmode), syslayerimage->Layout);
}
numLayers = 3;
}