mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 07:08:04 +02:00
dzn: Support aniso-with-point-mip samplers
Also rework the sampler translation logic to take advantage of the fact that the D3D12 filter types are bitfields. No need to loop over a sparse enum space like we were doing. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22606>
This commit is contained in:
parent
4e2c5ba100
commit
31ced4c5ad
3 changed files with 38 additions and 42 deletions
|
|
@ -3245,7 +3245,7 @@ dzn_sampler_create(struct dzn_device *device,
|
||||||
/* TODO: have a sampler pool to allocate shader-invisible descs which we
|
/* TODO: have a sampler pool to allocate shader-invisible descs which we
|
||||||
* can copy to the desc_set when UpdateDescriptorSets() is called.
|
* can copy to the desc_set when UpdateDescriptorSets() is called.
|
||||||
*/
|
*/
|
||||||
sampler->desc.Filter = dzn_translate_sampler_filter(pCreateInfo);
|
sampler->desc.Filter = dzn_translate_sampler_filter(pdev, pCreateInfo);
|
||||||
sampler->desc.AddressU = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeU);
|
sampler->desc.AddressU = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeU);
|
||||||
sampler->desc.AddressV = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeV);
|
sampler->desc.AddressV = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeV);
|
||||||
sampler->desc.AddressW = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeW);
|
sampler->desc.AddressW = dzn_sampler_translate_addr_mode(pCreateInfo->addressModeW);
|
||||||
|
|
|
||||||
|
|
@ -1197,7 +1197,8 @@ struct dzn_sampler {
|
||||||
|
|
||||||
DXGI_FORMAT dzn_pipe_to_dxgi_format(enum pipe_format in);
|
DXGI_FORMAT dzn_pipe_to_dxgi_format(enum pipe_format in);
|
||||||
DXGI_FORMAT dzn_get_typeless_dxgi_format(DXGI_FORMAT in);
|
DXGI_FORMAT dzn_get_typeless_dxgi_format(DXGI_FORMAT in);
|
||||||
D3D12_FILTER dzn_translate_sampler_filter(const VkSamplerCreateInfo *create_info);
|
D3D12_FILTER dzn_translate_sampler_filter(const struct dzn_physical_device *pdev,
|
||||||
|
const VkSamplerCreateInfo *create_info);
|
||||||
D3D12_COMPARISON_FUNC dzn_translate_compare_op(VkCompareOp in);
|
D3D12_COMPARISON_FUNC dzn_translate_compare_op(VkCompareOp in);
|
||||||
void dzn_translate_viewport(D3D12_VIEWPORT *out, const VkViewport *in);
|
void dzn_translate_viewport(D3D12_VIEWPORT *out, const VkViewport *in);
|
||||||
void dzn_translate_rect(D3D12_RECT *out, const VkRect2D *in);
|
void dzn_translate_rect(D3D12_RECT *out, const VkRect2D *in);
|
||||||
|
|
|
||||||
|
|
@ -208,54 +208,49 @@ dzn_get_typeless_dxgi_format(DXGI_FORMAT in)
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dzn_sampler_filter_info {
|
static D3D12_FILTER_TYPE
|
||||||
VkFilter min, mag;
|
translate_filter_type(VkFilter type)
|
||||||
VkSamplerMipmapMode mipmap;
|
{
|
||||||
};
|
switch (type) {
|
||||||
|
case VK_FILTER_NEAREST: return D3D12_FILTER_TYPE_POINT;
|
||||||
#define FILTER(__min, __mag, __mipmap) \
|
case VK_FILTER_LINEAR: return D3D12_FILTER_TYPE_LINEAR;
|
||||||
{ \
|
default:
|
||||||
.min = VK_FILTER_ ## __min, \
|
assert(!"Unsupported filter mode");
|
||||||
.mag = VK_FILTER_ ## __mag, \
|
return D3D12_FILTER_TYPE_POINT;
|
||||||
.mipmap = VK_SAMPLER_MIPMAP_MODE_ ## __mipmap, \
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct dzn_sampler_filter_info filter_table[] = {
|
static D3D12_FILTER_TYPE
|
||||||
[D3D12_FILTER_MIN_MAG_MIP_POINT] = FILTER(NEAREST, NEAREST, NEAREST),
|
translate_mip_filter_type(VkSamplerMipmapMode type)
|
||||||
[D3D12_FILTER_MIN_MAG_POINT_MIP_LINEAR] = FILTER(NEAREST, NEAREST, LINEAR),
|
{
|
||||||
[D3D12_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT] = FILTER(NEAREST, LINEAR, NEAREST),
|
switch (type) {
|
||||||
[D3D12_FILTER_MIN_POINT_MAG_MIP_LINEAR] = FILTER(NEAREST, LINEAR, LINEAR),
|
case VK_SAMPLER_MIPMAP_MODE_NEAREST: return D3D12_FILTER_TYPE_POINT;
|
||||||
[D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT] = FILTER(LINEAR, NEAREST, NEAREST),
|
case VK_SAMPLER_MIPMAP_MODE_LINEAR: return D3D12_FILTER_TYPE_LINEAR;
|
||||||
[D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR] = FILTER(LINEAR, NEAREST, LINEAR),
|
default:
|
||||||
[D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT] = FILTER(LINEAR, LINEAR, NEAREST),
|
assert(!"Unsupported filter mode");
|
||||||
[D3D12_FILTER_MIN_MAG_MIP_LINEAR] = FILTER(LINEAR, LINEAR, LINEAR),
|
return D3D12_FILTER_TYPE_POINT;
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
D3D12_FILTER
|
D3D12_FILTER
|
||||||
dzn_translate_sampler_filter(const VkSamplerCreateInfo *create_info)
|
dzn_translate_sampler_filter(const struct dzn_physical_device *pdev,
|
||||||
|
const VkSamplerCreateInfo *create_info)
|
||||||
{
|
{
|
||||||
D3D12_FILTER filter = (D3D12_FILTER)0;
|
D3D12_FILTER_REDUCTION_TYPE reduction = create_info->compareEnable ?
|
||||||
|
D3D12_FILTER_REDUCTION_TYPE_COMPARISON : D3D12_FILTER_REDUCTION_TYPE_STANDARD;
|
||||||
|
|
||||||
if (!create_info->anisotropyEnable) {
|
if (create_info->anisotropyEnable) {
|
||||||
unsigned i;
|
if (create_info->mipmapMode == VK_SAMPLER_MIPMAP_MODE_NEAREST &&
|
||||||
for (i = 0; i < ARRAY_SIZE(filter_table); i++) {
|
pdev->options19.AnisoFilterWithPointMipSupported)
|
||||||
if (create_info->minFilter == filter_table[i].min &&
|
return D3D12_ENCODE_MIN_MAG_ANISOTROPIC_MIP_POINT_FILTER(reduction);
|
||||||
create_info->magFilter == filter_table[i].mag &&
|
return D3D12_ENCODE_ANISOTROPIC_FILTER(reduction);
|
||||||
create_info->mipmapMode == filter_table[i].mipmap) {
|
|
||||||
filter = (D3D12_FILTER)i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(i < ARRAY_SIZE(filter_table));
|
|
||||||
} else {
|
|
||||||
filter = D3D12_FILTER_ANISOTROPIC;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (create_info->compareEnable)
|
return D3D12_ENCODE_BASIC_FILTER(
|
||||||
filter = (D3D12_FILTER)(filter + D3D12_FILTER_COMPARISON_MIN_MAG_MIP_POINT);
|
translate_filter_type(create_info->minFilter),
|
||||||
|
translate_filter_type(create_info->magFilter),
|
||||||
return filter;
|
translate_mip_filter_type(create_info->mipmapMode),
|
||||||
|
reduction);
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12_COMPARISON_FUNC
|
D3D12_COMPARISON_FUNC
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue