Configurable sampling per custom texture in material shaders
This commit is contained in:
parent
354b0f9257
commit
97eaa46b69
9 changed files with 117 additions and 27 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue