[GPU] Honor force_bc_w_to_max: force sampler border color alpha to 1.0
Co-authored-by: Herman S. <429230+has207@users.noreply.github.com>
This commit is contained in:
committed by
Radosław Gliński
parent
084f14ec41
commit
d0dd989238
@@ -765,6 +765,7 @@ D3D12TextureCache::SamplerParameters D3D12TextureCache::GetSamplerParameters(
|
||||
xenos::ClampModeUsesBorder(parameters.clamp_y) ||
|
||||
xenos::ClampModeUsesBorder(parameters.clamp_z)) {
|
||||
parameters.border_color = fetch.border_color;
|
||||
parameters.force_bc_w_to_max = fetch.force_bc_w_to_max;
|
||||
} else {
|
||||
parameters.border_color = xenos::BorderColor::k_ABGR_Black;
|
||||
}
|
||||
@@ -891,6 +892,9 @@ void D3D12TextureCache::WriteSampler(SamplerParameters parameters,
|
||||
desc.BorderColor[3] = 0.0f;
|
||||
break;
|
||||
}
|
||||
if (parameters.force_bc_w_to_max) {
|
||||
desc.BorderColor[3] = 1.0f;
|
||||
}
|
||||
desc.MinLOD = float(parameters.mip_min_level);
|
||||
if (parameters.mip_base_map) {
|
||||
// "It is undefined whether LOD clamping based on MinLOD and MaxLOD Sampler
|
||||
|
||||
@@ -59,6 +59,9 @@ class D3D12TextureCache final : public TextureCache {
|
||||
xenos::AnisoFilter aniso_filter : 3; // 17
|
||||
uint32_t mip_min_level : 4; // 21
|
||||
uint32_t mip_base_map : 1; // 22
|
||||
// Force the border color alpha to 1.0 (only meaningful with a border
|
||||
// clamp mode).
|
||||
uint32_t force_bc_w_to_max : 1; // 23
|
||||
// Maximum mip level is in the texture resource itself, but mip_base_map
|
||||
// can be used to limit fetching to mip_min_level.
|
||||
};
|
||||
|
||||
@@ -668,6 +668,7 @@ VulkanTextureCache::SamplerParameters VulkanTextureCache::GetSamplerParameters(
|
||||
xenos::ClampModeUsesBorder(parameters.clamp_y) ||
|
||||
xenos::ClampModeUsesBorder(parameters.clamp_z)) {
|
||||
parameters.border_color = fetch.border_color;
|
||||
parameters.force_bc_w_to_max = fetch.force_bc_w_to_max;
|
||||
} else {
|
||||
parameters.border_color = xenos::BorderColor::k_ABGR_Black;
|
||||
}
|
||||
@@ -889,18 +890,23 @@ VkSampler VulkanTextureCache::UseSampler(SamplerParameters parameters,
|
||||
color[1] = 0.5f;
|
||||
color[2] = 0.5f;
|
||||
}
|
||||
color[3] = 0.0f;
|
||||
color[3] = parameters.force_bc_w_to_max ? 1.0f : 0.0f;
|
||||
custom_border_color.format = VK_FORMAT_UNDEFINED;
|
||||
custom_border_color.pNext = sampler_create_info.pNext;
|
||||
sampler_create_info.pNext = &custom_border_color;
|
||||
sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_CUSTOM_EXT;
|
||||
} else {
|
||||
sampler_create_info.borderColor =
|
||||
VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
||||
parameters.force_bc_w_to_max
|
||||
? VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK
|
||||
: VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
||||
sampler_create_info.borderColor =
|
||||
parameters.force_bc_w_to_max
|
||||
? VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK
|
||||
: VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
||||
break;
|
||||
}
|
||||
VkSampler vulkan_sampler;
|
||||
|
||||
@@ -44,6 +44,9 @@ class VulkanTextureCache final : public TextureCache {
|
||||
xenos::AnisoFilter aniso_filter : 3; // 17
|
||||
uint32_t mip_min_level : 4; // 21
|
||||
uint32_t mip_base_map : 1; // 22
|
||||
// Force the border color alpha to 1.0 (only meaningful with a border
|
||||
// clamp mode).
|
||||
uint32_t force_bc_w_to_max : 1; // 23
|
||||
// Maximum mip level is in the texture resource itself, but mip_base_map
|
||||
// can be used to limit fetching to mip_min_level.
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user