From 4e07e7b2326d742a9832d16ca03aa0e806bd8bff Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 21 Nov 2019 08:42:28 -0500 Subject: [PATCH] pan/midgard: Implement load_sampler_lod_paramaters_pan We can stuff this information in as parametrized system values, like we currently do texture size and SSBO addresses. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Tomeu Vizoso --- src/gallium/drivers/panfrost/pan_context.c | 28 +++++++++++++++++++++- src/panfrost/midgard/midgard_compile.c | 14 +++++++++++ src/panfrost/midgard/midgard_compile.h | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 08b208b703a..b1006f81ec9 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -761,6 +761,29 @@ static void panfrost_upload_ssbo_sysval( uniform->u[2] = sb.buffer_size; } +static void +panfrost_upload_sampler_sysval( + struct panfrost_context *ctx, + enum pipe_shader_type st, + unsigned sampler_index, + struct sysval_uniform *uniform) +{ + struct pipe_sampler_state *sampl = + &ctx->samplers[st][sampler_index]->base; + + uniform->f[0] = sampl->min_lod; + uniform->f[1] = sampl->max_lod; + uniform->f[2] = sampl->lod_bias; + + /* Even without any errata, Midgard represents "no mipmapping" as + * fixing the LOD with the clamps; keep behaviour consistent. c.f. + * panfrost_create_sampler_state which also explains our choice of + * epsilon value (again to keep behaviour consistent) */ + + if (sampl->min_mip_filter == PIPE_TEX_MIPFILTER_NONE) + uniform->f[1] = uniform->f[0] + (1.0/256.0); +} + static void panfrost_upload_num_work_groups_sysval(struct panfrost_context *ctx, struct sysval_uniform *uniform) { @@ -796,7 +819,10 @@ static void panfrost_upload_sysvals(struct panfrost_context *ctx, void *buf, case PAN_SYSVAL_NUM_WORK_GROUPS: panfrost_upload_num_work_groups_sysval(ctx, &uniforms[i]); break; - + case PAN_SYSVAL_SAMPLER: + panfrost_upload_sampler_sysval(ctx, st, PAN_SYSVAL_ID(sysval), + &uniforms[i]); + break; default: assert(0); } diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 731485fbc2e..cf7d15a0f9f 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -345,6 +345,17 @@ midgard_sysval_for_ssbo(nir_intrinsic_instr *instr) return PAN_SYSVAL(SSBO, uindex); } +static int +midgard_sysval_for_sampler(nir_intrinsic_instr *instr) +{ + /* TODO: indirect samplers !!! */ + nir_src index = instr->src[0]; + assert(nir_src_is_const(index)); + uint32_t uindex = nir_src_as_uint(index); + + return PAN_SYSVAL(SAMPLER, uindex); +} + static int midgard_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr) { @@ -358,6 +369,8 @@ midgard_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr) case nir_intrinsic_load_ssbo: case nir_intrinsic_store_ssbo: return midgard_sysval_for_ssbo(instr); + case nir_intrinsic_load_sampler_lod_parameters_pan: + return midgard_sysval_for_sampler(instr); default: return ~0; } @@ -1591,6 +1604,7 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) case nir_intrinsic_load_viewport_scale: case nir_intrinsic_load_viewport_offset: case nir_intrinsic_load_num_work_groups: + case nir_intrinsic_load_sampler_lod_parameters_pan: emit_sysval_read(ctx, &instr->instr, ~0, 3); break; diff --git a/src/panfrost/midgard/midgard_compile.h b/src/panfrost/midgard/midgard_compile.h index 045837a7b5d..ffdaa89d129 100644 --- a/src/panfrost/midgard/midgard_compile.h +++ b/src/panfrost/midgard/midgard_compile.h @@ -47,6 +47,7 @@ enum { PAN_SYSVAL_TEXTURE_SIZE = 3, PAN_SYSVAL_SSBO = 4, PAN_SYSVAL_NUM_WORK_GROUPS = 5, + PAN_SYSVAL_SAMPLER = 7, } pan_sysval; #define PAN_TXS_SYSVAL_ID(texidx, dim, is_array) \ -- 2.30.2