mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 22:10:11 +01:00
panfrost: Add support for TXS instructions
This patch adds support for nir_texop_txs instructions which are needed to support the OpenGL textureSize() function. This is also needed to support RECT texture sampling which is currently lowered to 2D sampling + a TXS() instruction by the nir_lower_tex() helper. Changes in v2: * Split options for the 1st and 2nd tex lowering passes Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
parent
5c17f84ae2
commit
c3558868da
3 changed files with 60 additions and 2 deletions
|
|
@ -313,6 +313,7 @@ static int sysval_for_instr(compiler_context *ctx, nir_instr *instr,
|
|||
{
|
||||
nir_intrinsic_instr *intr;
|
||||
nir_dest *dst = NULL;
|
||||
nir_tex_instr *tex;
|
||||
int sysval = -1;
|
||||
|
||||
switch (instr->type) {
|
||||
|
|
@ -321,6 +322,18 @@ static int sysval_for_instr(compiler_context *ctx, nir_instr *instr,
|
|||
sysval = midgard_nir_sysval_for_intrinsic(intr);
|
||||
dst = &intr->dest;
|
||||
break;
|
||||
case nir_instr_type_tex:
|
||||
tex = nir_instr_as_tex(instr);
|
||||
if (tex->op != nir_texop_txs)
|
||||
break;
|
||||
|
||||
sysval = PAN_SYSVAL(TEXTURE_SIZE,
|
||||
PAN_TXS_SYSVAL_ID(tex->texture_index,
|
||||
nir_tex_instr_dest_size(tex) -
|
||||
(tex->is_array ? 1 : 0),
|
||||
tex->is_array));
|
||||
dst = &tex->dest;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -411,12 +424,17 @@ optimise_nir(nir_shader *nir)
|
|||
NIR_PASS(progress, nir, midgard_nir_lower_fdot2);
|
||||
NIR_PASS(progress, nir, nir_lower_idiv);
|
||||
|
||||
nir_lower_tex_options lower_tex_options = {
|
||||
nir_lower_tex_options lower_tex_1st_pass_options = {
|
||||
.lower_rect = true,
|
||||
.lower_txp = ~0
|
||||
};
|
||||
|
||||
NIR_PASS(progress, nir, nir_lower_tex, &lower_tex_options);
|
||||
nir_lower_tex_options lower_tex_2nd_pass_options = {
|
||||
.lower_txs_lod = true,
|
||||
};
|
||||
|
||||
NIR_PASS(progress, nir, nir_lower_tex, &lower_tex_1st_pass_options);
|
||||
NIR_PASS(progress, nir, nir_lower_tex, &lower_tex_2nd_pass_options);
|
||||
|
||||
do {
|
||||
progress = false;
|
||||
|
|
@ -1523,6 +1541,9 @@ emit_tex(compiler_context *ctx, nir_tex_instr *instr)
|
|||
case nir_texop_txl:
|
||||
emit_texop_native(ctx, instr, TEXTURE_OP_LOD);
|
||||
break;
|
||||
case nir_texop_txs:
|
||||
emit_sysval_read(ctx, &instr->instr);
|
||||
break;
|
||||
default:
|
||||
unreachable("Unhanlded texture op");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,8 +44,16 @@
|
|||
enum {
|
||||
PAN_SYSVAL_VIEWPORT_SCALE = 1,
|
||||
PAN_SYSVAL_VIEWPORT_OFFSET = 2,
|
||||
PAN_SYSVAL_TEXTURE_SIZE = 3,
|
||||
} pan_sysval;
|
||||
|
||||
#define PAN_TXS_SYSVAL_ID(texidx, dim, is_array) \
|
||||
((texidx) | ((dim) << 7) | ((is_array) ? (1 << 9) : 0))
|
||||
|
||||
#define PAN_SYSVAL_ID_TO_TXS_TEX_IDX(id) ((id) & 0x7f)
|
||||
#define PAN_SYSVAL_ID_TO_TXS_DIM(id) (((id) >> 7) & 0x3)
|
||||
#define PAN_SYSVAL_ID_TO_TXS_IS_ARRAY(id) !!((id) & (1 << 9))
|
||||
|
||||
typedef struct {
|
||||
int work_register_count;
|
||||
int uniform_count;
|
||||
|
|
|
|||
|
|
@ -1036,6 +1036,31 @@ static void panfrost_upload_viewport_offset_sysval(struct panfrost_context *ctx,
|
|||
uniform->f[2] = vp->translate[2];
|
||||
}
|
||||
|
||||
static void panfrost_upload_txs_sysval(struct panfrost_context *ctx,
|
||||
enum pipe_shader_type st,
|
||||
unsigned int sysvalid,
|
||||
struct sysval_uniform *uniform)
|
||||
{
|
||||
unsigned texidx = PAN_SYSVAL_ID_TO_TXS_TEX_IDX(sysvalid);
|
||||
unsigned dim = PAN_SYSVAL_ID_TO_TXS_DIM(sysvalid);
|
||||
bool is_array = PAN_SYSVAL_ID_TO_TXS_IS_ARRAY(sysvalid);
|
||||
struct pipe_sampler_view *tex = &ctx->sampler_views[st][texidx]->base;
|
||||
|
||||
assert(dim);
|
||||
uniform->i[0] = u_minify(tex->texture->width0, tex->u.tex.first_level);
|
||||
|
||||
if (dim > 1)
|
||||
uniform->i[1] = u_minify(tex->texture->height0,
|
||||
tex->u.tex.first_level);
|
||||
|
||||
if (dim > 2)
|
||||
uniform->i[2] = u_minify(tex->texture->depth0,
|
||||
tex->u.tex.first_level);
|
||||
|
||||
if (is_array)
|
||||
uniform->i[dim] = tex->texture->array_size;
|
||||
}
|
||||
|
||||
static void panfrost_upload_sysvals(struct panfrost_context *ctx, void *buf,
|
||||
struct panfrost_shader_state *ss,
|
||||
enum pipe_shader_type st)
|
||||
|
|
@ -1052,6 +1077,10 @@ static void panfrost_upload_sysvals(struct panfrost_context *ctx, void *buf,
|
|||
case PAN_SYSVAL_VIEWPORT_OFFSET:
|
||||
panfrost_upload_viewport_offset_sysval(ctx, &uniforms[i]);
|
||||
break;
|
||||
case PAN_SYSVAL_TEXTURE_SIZE:
|
||||
panfrost_upload_txs_sysval(ctx, st, PAN_SYSVAL_ID(sysval),
|
||||
&uniforms[i]);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue