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:
committed by
Tomeu Vizoso
parent
deaebc82a7
commit
4e07e7b232
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) \
|
||||
|
||||
Reference in New Issue
Block a user