panfrost: Port uniform/UBO logic to Valhall
Use Valhall descriptors, and report sizes so we can accurately inform the hardware of sizes. Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16035>
This commit is contained in:
parent
d7b3532553
commit
cf02a1a555
|
@ -1363,7 +1363,9 @@ panfrost_emit_ubo(void *base, unsigned index, mali_ptr address, size_t size)
|
||||||
static mali_ptr
|
static mali_ptr
|
||||||
panfrost_emit_const_buf(struct panfrost_batch *batch,
|
panfrost_emit_const_buf(struct panfrost_batch *batch,
|
||||||
enum pipe_shader_type stage,
|
enum pipe_shader_type stage,
|
||||||
mali_ptr *push_constants)
|
unsigned *buffer_count,
|
||||||
|
mali_ptr *push_constants,
|
||||||
|
unsigned *pushed_words)
|
||||||
{
|
{
|
||||||
struct panfrost_context *ctx = batch->ctx;
|
struct panfrost_context *ctx = batch->ctx;
|
||||||
struct panfrost_shader_variants *all = ctx->shader[stage];
|
struct panfrost_shader_variants *all = ctx->shader[stage];
|
||||||
|
@ -1386,44 +1388,43 @@ panfrost_emit_const_buf(struct panfrost_batch *batch,
|
||||||
struct panfrost_shader_state *shader = panfrost_get_shader_state(ctx, stage);
|
struct panfrost_shader_state *shader = panfrost_get_shader_state(ctx, stage);
|
||||||
unsigned ubo_count = shader->info.ubo_count - (sys_size ? 1 : 0);
|
unsigned ubo_count = shader->info.ubo_count - (sys_size ? 1 : 0);
|
||||||
unsigned sysval_ubo = sys_size ? ubo_count : ~0;
|
unsigned sysval_ubo = sys_size ? ubo_count : ~0;
|
||||||
|
struct panfrost_ptr ubos = { 0 };
|
||||||
|
|
||||||
struct panfrost_ptr ubos =
|
#if PAN_ARCH >= 9
|
||||||
pan_pool_alloc_desc_array(&batch->pool.base,
|
ubos = pan_pool_alloc_desc_array(&batch->pool.base,
|
||||||
ubo_count + 1,
|
ubo_count + 1,
|
||||||
UNIFORM_BUFFER);
|
BUFFER);
|
||||||
|
#else
|
||||||
|
ubos = pan_pool_alloc_desc_array(&batch->pool.base,
|
||||||
|
ubo_count + 1,
|
||||||
|
UNIFORM_BUFFER);
|
||||||
|
#endif
|
||||||
|
|
||||||
uint64_t *ubo_ptr = (uint64_t *) ubos.cpu;
|
if (buffer_count)
|
||||||
|
*buffer_count = ubo_count + (sys_size ? 1 : 0);
|
||||||
|
|
||||||
/* Upload sysval as a final UBO */
|
/* Upload sysval as a final UBO */
|
||||||
|
|
||||||
if (sys_size) {
|
if (sys_size)
|
||||||
pan_pack(ubo_ptr + ubo_count, UNIFORM_BUFFER, cfg) {
|
panfrost_emit_ubo(ubos.cpu, ubo_count, transfer.gpu, sys_size);
|
||||||
cfg.entries = DIV_ROUND_UP(sys_size, 16);
|
|
||||||
cfg.pointer = transfer.gpu;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The rest are honest-to-goodness UBOs */
|
/* The rest are honest-to-goodness UBOs */
|
||||||
|
|
||||||
u_foreach_bit(ubo, ss->info.ubo_mask & buf->enabled_mask) {
|
u_foreach_bit(ubo, ss->info.ubo_mask & buf->enabled_mask) {
|
||||||
size_t usz = buf->cb[ubo].buffer_size;
|
size_t usz = buf->cb[ubo].buffer_size;
|
||||||
|
mali_ptr address = 0;
|
||||||
|
|
||||||
if (usz == 0) {
|
if (usz > 0) {
|
||||||
ubo_ptr[ubo] = 0;
|
address = panfrost_map_constant_buffer_gpu(batch,
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Issue (57) for the ARB_uniform_buffer_object spec says that
|
|
||||||
* the buffer can be larger than the uniform data inside it,
|
|
||||||
* so clamp ubo size to what hardware supports. */
|
|
||||||
|
|
||||||
pan_pack(ubo_ptr + ubo, UNIFORM_BUFFER, cfg) {
|
|
||||||
cfg.entries = MIN2(DIV_ROUND_UP(usz, 16), 1 << 12);
|
|
||||||
cfg.pointer = panfrost_map_constant_buffer_gpu(batch,
|
|
||||||
stage, buf, ubo);
|
stage, buf, ubo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
panfrost_emit_ubo(ubos.cpu, ubo, address, usz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pushed_words)
|
||||||
|
*pushed_words = ss->info.push.count;
|
||||||
|
|
||||||
if (ss->info.push.count == 0)
|
if (ss->info.push.count == 0)
|
||||||
return ubos.gpu;
|
return ubos.gpu;
|
||||||
|
|
||||||
|
@ -2952,7 +2953,7 @@ panfrost_update_shader_state(struct panfrost_batch *batch,
|
||||||
|
|
||||||
if ((dirty & ss->dirty_shader) || (dirty_3d & ss->dirty_3d)) {
|
if ((dirty & ss->dirty_shader) || (dirty_3d & ss->dirty_3d)) {
|
||||||
batch->uniform_buffers[st] = panfrost_emit_const_buf(batch, st,
|
batch->uniform_buffers[st] = panfrost_emit_const_buf(batch, st,
|
||||||
&batch->push_uniforms[st]);
|
NULL, &batch->push_uniforms[st], NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PAN_ARCH <= 7
|
#if PAN_ARCH <= 7
|
||||||
|
|
Loading…
Reference in New Issue