float f[4];
int32_t i[4];
uint32_t u[4];
+ uint64_t du[2];
};
};
uniform->i[dim] = tex->texture->array_size;
}
+static void panfrost_upload_ssbo_sysval(
+ struct panfrost_context *ctx,
+ enum pipe_shader_type st,
+ unsigned ssbo_id,
+ struct sysval_uniform *uniform)
+{
+ assert(ctx->ssbo_mask[st] & (1 << ssbo_id));
+ struct pipe_shader_buffer sb = ctx->ssbo[st][ssbo_id];
+
+ /* Compute address */
+ struct panfrost_job *batch = panfrost_get_job_for_fbo(ctx);
+ struct panfrost_bo *bo = pan_resource(sb.buffer)->bo;
+
+ panfrost_job_add_bo(batch, bo);
+
+ /* Upload address and size as sysval */
+ uniform->du[0] = bo->gpu + sb.buffer_offset;
+ uniform->u[2] = sb.buffer_size;
+}
+
static void panfrost_upload_sysvals(struct panfrost_context *ctx, void *buf,
struct panfrost_shader_state *ss,
enum pipe_shader_type st)
panfrost_upload_txs_sysval(ctx, st, PAN_SYSVAL_ID(sysval),
&uniforms[i]);
break;
+ case PAN_SYSVAL_SSBO:
+ panfrost_upload_ssbo_sysval(ctx, st, PAN_SYSVAL_ID(sysval),
+ &uniforms[i]);
+ break;
default:
assert(0);
}
nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa, nir_src_for_ssa(sum));
}
+static int
+midgard_sysval_for_ssbo(nir_intrinsic_instr *instr)
+{
+ nir_src index = instr->src[0];
+ assert(nir_src_is_const(index));
+ uint32_t uindex = nir_src_as_uint(index);
+
+ return PAN_SYSVAL(SSBO, uindex);
+}
+
static int
midgard_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr)
{
return PAN_SYSVAL_VIEWPORT_SCALE;
case nir_intrinsic_load_viewport_offset:
return PAN_SYSVAL_VIEWPORT_OFFSET;
+ case nir_intrinsic_load_ssbo:
+ return midgard_sysval_for_ssbo(instr);
default:
return -1;
}
PAN_SYSVAL_VIEWPORT_SCALE = 1,
PAN_SYSVAL_VIEWPORT_OFFSET = 2,
PAN_SYSVAL_TEXTURE_SIZE = 3,
+ PAN_SYSVAL_SSBO = 4,
} pan_sysval;
#define PAN_TXS_SYSVAL_ID(texidx, dim, is_array) \