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 <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
This commit is contained in:
Alyssa Rosenzweig
2019-11-21 08:42:28 -05:00
committed by Tomeu Vizoso
parent deaebc82a7
commit 4e07e7b232
3 changed files with 42 additions and 1 deletions
+27 -1
View File
@@ -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);
}
+14
View File
@@ -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;
+1
View File
@@ -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) \