From cf6cad3922f85127a29a8c1e49f980efcc5e9bac Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 31 Jul 2019 08:50:02 -0700 Subject: [PATCH] panfrost: Simplify filter_mode definition It's just a bit field containing some flags; there's no need for all the macro magic. Signed-off-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_context.c | 34 +++++++--------------- src/panfrost/include/panfrost-job.h | 18 ++++-------- src/panfrost/pandecode/decode.c | 17 +++++++---- 3 files changed, 28 insertions(+), 41 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 8c2953cc219..1915549f251 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -314,27 +314,6 @@ translate_tex_wrap(enum pipe_tex_wrap w) } } -static unsigned -translate_tex_filter(enum pipe_tex_filter f) -{ - switch (f) { - case PIPE_TEX_FILTER_NEAREST: - return MALI_NEAREST; - - case PIPE_TEX_FILTER_LINEAR: - return MALI_LINEAR; - - default: - unreachable("Invalid filter"); - } -} - -static unsigned -translate_mip_filter(enum pipe_tex_mipfilter f) -{ - return (f == PIPE_TEX_MIPFILTER_LINEAR) ? MALI_MIP_LINEAR : 0; -} - static unsigned panfrost_translate_compare_func(enum pipe_compare_func in) { @@ -1959,10 +1938,17 @@ panfrost_create_sampler_state( /* sampler_state corresponds to mali_sampler_descriptor, which we can generate entirely here */ + bool min_nearest = cso->min_img_filter == PIPE_TEX_FILTER_NEAREST; + bool mag_nearest = cso->mag_img_filter == PIPE_TEX_FILTER_NEAREST; + bool mip_linear = cso->min_mip_filter == PIPE_TEX_MIPFILTER_LINEAR; + + unsigned min_filter = min_nearest ? MALI_SAMP_MIN_NEAREST : 0; + unsigned mag_filter = mag_nearest ? MALI_SAMP_MAG_NEAREST : 0; + unsigned mip_filter = mip_linear ? + (MALI_SAMP_MIP_LINEAR_1 | MALI_SAMP_MIP_LINEAR_2) : 0; + struct mali_sampler_descriptor sampler_descriptor = { - .filter_mode = MALI_TEX_MIN(translate_tex_filter(cso->min_img_filter)) - | MALI_TEX_MAG(translate_tex_filter(cso->mag_img_filter)) - | translate_mip_filter(cso->min_mip_filter) + .filter_mode = min_filter | mag_filter | mip_filter | 0x20, .wrap_s = translate_tex_wrap(cso->wrap_s), diff --git a/src/panfrost/include/panfrost-job.h b/src/panfrost/include/panfrost-job.h index 5d038431cee..0b633b02c2f 100644 --- a/src/panfrost/include/panfrost-job.h +++ b/src/panfrost/include/panfrost-job.h @@ -1188,21 +1188,15 @@ struct mali_texture_descriptor { mali_ptr payload[MAX_MIP_LEVELS * MAX_CUBE_FACES * MAX_ELEMENTS]; } __attribute__((packed)); -/* Used as part of filter_mode */ +/* filter_mode */ -#define MALI_LINEAR 0 -#define MALI_NEAREST 1 -#define MALI_MIP_LINEAR (0x18) +#define MALI_SAMP_MAG_NEAREST (1 << 0) +#define MALI_SAMP_MIN_NEAREST (1 << 1) -/* Used to construct low bits of filter_mode */ +/* TODO: What do these bits mean individually? Only seen set together */ -#define MALI_TEX_MAG(mode) (((mode) & 1) << 0) -#define MALI_TEX_MIN(mode) (((mode) & 1) << 1) - -#define MALI_TEX_MAG_MASK (1) -#define MALI_TEX_MIN_MASK (2) - -#define MALI_FILTER_NAME(filter) (filter ? "MALI_NEAREST" : "MALI_LINEAR") +#define MALI_SAMP_MIP_LINEAR_1 (1 << 3) +#define MALI_SAMP_MIP_LINEAR_2 (1 << 4) /* Used for lod encoding. Thanks @urjaman for pointing out these routines can * be cleaned up a lot. */ diff --git a/src/panfrost/pandecode/decode.c b/src/panfrost/pandecode/decode.c index f8942b0ec18..a556776b38b 100644 --- a/src/panfrost/pandecode/decode.c +++ b/src/panfrost/pandecode/decode.c @@ -245,6 +245,15 @@ static const struct pandecode_flag_info mfbd_flag_info [] = { }; #undef FLAG_INFO +#define FLAG_INFO(flag) { MALI_SAMP_##flag, "MALI_SAMP_" #flag } +static const struct pandecode_flag_info sampler_flag_info [] = { + FLAG_INFO(MAG_NEAREST), + FLAG_INFO(MIN_NEAREST), + FLAG_INFO(MIP_LINEAR_1), + FLAG_INFO(MIP_LINEAR_2), + {} +}; +#undef FLAG_INFO extern char *replace_fragment; extern char *replace_vertex; @@ -1865,11 +1874,9 @@ pandecode_vertex_tiler_postfix_pre(const struct mali_vertex_tiler_postfix *p, pandecode_log("struct mali_sampler_descriptor sampler_descriptor_%"PRIx64"_%d_%d = {\n", d + sizeof(*s) * i, job_no, i); pandecode_indent++; - /* Only the lower two bits are understood right now; the rest we display as hex */ - pandecode_log(".filter_mode = MALI_TEX_MIN(%s) | MALI_TEX_MAG(%s) | 0x%" PRIx32",\n", - MALI_FILTER_NAME(s->filter_mode & MALI_TEX_MIN_MASK), - MALI_FILTER_NAME(s->filter_mode & MALI_TEX_MAG_MASK), - s->filter_mode & ~3); + pandecode_log(".filter_mode = "); + pandecode_log_decoded_flags(sampler_flag_info, s->filter_mode); + pandecode_log_cont(",\n"); pandecode_prop("min_lod = FIXED_16(%f)", DECODE_FIXED_16(s->min_lod)); pandecode_prop("max_lod = FIXED_16(%f)", DECODE_FIXED_16(s->max_lod)); -- 2.30.2