diff options
author | Vasily Khoruzhick <anarsoul@gmail.com> | 2020-01-11 22:23:36 -0800 |
---|---|---|
committer | Vasily Khoruzhick <anarsoul@gmail.com> | 2020-01-13 22:50:36 -0800 |
commit | 55b0aa436e9b4bd33938535d51ebdc21a7aa11ca (patch) | |
tree | e775143202e32e7e0c6efc55c7cdbc0b46debfbf /src/gallium/drivers/lima/lima_texture.c | |
parent | a9bd0668d50e17fbe61542a9c6ad723d7fd55ed7 (diff) |
lima: add new findings to texture descriptor
Lower 8 bits of unknown_1_3 seems to be min_lod,
rest of 4 bits + miplevels are max_lod and min_mipfilter seems to be
lod bias. All are in fixed format with 4 bit integer and 4 bit fraction,
lod_bias also has sign bit.
Blob also seems to do some magic with lod_bias if min filter is nearest --
it adds 0.5 to lod_bias in this case. Same story when all filters are
nearest and mipmapping is enabled, but in this case it subtracts 1/16
from lod_bias.
Fixes 134 dEQP tests in dEQP-GLES2.functional.texture.*
Reviewed-by: Qiang Yu <yuq825@gmail.com>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3359>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3359>
Diffstat (limited to 'src/gallium/drivers/lima/lima_texture.c')
-rw-r--r-- | src/gallium/drivers/lima/lima_texture.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/gallium/drivers/lima/lima_texture.c b/src/gallium/drivers/lima/lima_texture.c index b5a6103093c..7f2f81266b6 100644 --- a/src/gallium/drivers/lima/lima_texture.c +++ b/src/gallium/drivers/lima/lima_texture.c @@ -118,9 +118,12 @@ lima_update_tex_desc(struct lima_context *ctx, struct lima_sampler_state *sample struct lima_sampler_view *texture, void *pdesc, unsigned desc_size) { + /* unit is 1/16 since lod_bias is in fixed format */ + int lod_bias_delta = 0; lima_tex_desc *desc = pdesc; unsigned first_level; unsigned last_level; + float max_lod; memset(desc, 0, desc_size); @@ -144,18 +147,22 @@ lima_update_tex_desc(struct lima_context *ctx, struct lima_sampler_state *sample if (last_level - first_level >= LIMA_MAX_MIP_LEVELS) last_level = first_level + LIMA_MAX_MIP_LEVELS - 1; - desc->miplevels = (last_level - first_level); + desc->min_lod = lima_float_to_fixed8(sampler->base.min_lod); + max_lod = MIN2(sampler->base.max_lod, sampler->base.min_lod + + (last_level - first_level)); + desc->max_lod = lima_float_to_fixed8(max_lod); + desc->lod_bias = lima_float_to_fixed8(sampler->base.lod_bias); switch (sampler->base.min_mip_filter) { case PIPE_TEX_MIPFILTER_LINEAR: - desc->min_mipfilter_1 = 0; desc->min_mipfilter_2 = 3; break; case PIPE_TEX_MIPFILTER_NEAREST: - desc->min_mipfilter_1 = 0x1ff; desc->min_mipfilter_2 = 0; break; case PIPE_TEX_MIPFILTER_NONE: + desc->max_lod = desc->min_lod; + break; default: break; } @@ -177,6 +184,7 @@ lima_update_tex_desc(struct lima_context *ctx, struct lima_sampler_state *sample break; case PIPE_TEX_FILTER_NEAREST: default: + lod_bias_delta = 8; desc->min_img_filter_nearest = 1; break; } @@ -215,6 +223,13 @@ lima_update_tex_desc(struct lima_context *ctx, struct lima_sampler_state *sample break; } + if (desc->min_img_filter_nearest && desc->mag_img_filter_nearest && + desc->min_mipfilter_2 == 0 && + (desc->min_lod != desc->max_lod)) + lod_bias_delta = -1; + + desc->lod_bias += lod_bias_delta; + lima_texture_desc_set_res(ctx, desc, texture->base.texture, first_level, last_level); } |