From c57f7d0f152f79cf9bba35e23d754518531aefdf Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 14 Jun 2019 10:41:17 +0200 Subject: [PATCH] panfrost: Move sysval upload logic out of panfrost_emit_for_draw() We're about to add more sysval types, and panfrost_emit_for_draw() is big enough, so let's move the sysval upload logic in a separate function. We also add one sub-function per sysval type to keep the panfrost_upload_sysvals() small/readable. Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig --- .../panfrost/midgard/midgard_compile.h | 4 +- src/gallium/drivers/panfrost/pan_context.c | 67 ++++++++++++++----- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/panfrost/midgard/midgard_compile.h b/src/gallium/drivers/panfrost/midgard/midgard_compile.h index b21f054c031..f20d7bafe1e 100644 --- a/src/gallium/drivers/panfrost/midgard/midgard_compile.h +++ b/src/gallium/drivers/panfrost/midgard/midgard_compile.h @@ -34,7 +34,9 @@ /* Allow 2D of sysval IDs, while allowing nonparametric sysvals to equal * their class for equal comparison */ -#define PAN_SYSVAL(type, no) ((no << 16) | PAN_SYSVAL_##type) +#define PAN_SYSVAL(type, no) (((no) << 16) | PAN_SYSVAL_##type) +#define PAN_SYSVAL_TYPE(sysval) ((sysval) & 0xffff) +#define PAN_SYSVAL_ID(sysval) ((sysval) >> 16) /* Define some common types. We start at one for easy indexing of hash * tables internal to the compiler */ diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 7f5741da48e..6af10496c91 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -1008,6 +1008,56 @@ panfrost_upload_texture_descriptors(struct panfrost_context *ctx) } } +struct sysval_uniform { + union { + float f[4]; + int32_t i[4]; + uint32_t u[4]; + }; +}; + +static void panfrost_upload_viewport_scale_sysval(struct panfrost_context *ctx, + struct sysval_uniform *uniform) +{ + const struct pipe_viewport_state *vp = &ctx->pipe_viewport; + + uniform->f[0] = vp->scale[0]; + uniform->f[1] = vp->scale[1]; + uniform->f[2] = vp->scale[2]; +} + +static void panfrost_upload_viewport_offset_sysval(struct panfrost_context *ctx, + struct sysval_uniform *uniform) +{ + const struct pipe_viewport_state *vp = &ctx->pipe_viewport; + + uniform->f[0] = vp->translate[0]; + uniform->f[1] = vp->translate[1]; + uniform->f[2] = vp->translate[2]; +} + +static void panfrost_upload_sysvals(struct panfrost_context *ctx, void *buf, + struct panfrost_shader_state *ss, + enum pipe_shader_type st) +{ + struct sysval_uniform *uniforms = (void *)buf; + + for (unsigned i = 0; i < ss->sysval_count; ++i) { + int sysval = ss->sysval[i]; + + switch (PAN_SYSVAL_TYPE(sysval)) { + case PAN_SYSVAL_VIEWPORT_SCALE: + panfrost_upload_viewport_scale_sysval(ctx, &uniforms[i]); + break; + case PAN_SYSVAL_VIEWPORT_OFFSET: + panfrost_upload_viewport_offset_sysval(ctx, &uniforms[i]); + break; + default: + assert(0); + } + } +} + /* Go through dirty flags and actualise them in the cmdstream. */ void @@ -1231,22 +1281,7 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data) struct panfrost_transfer transfer = panfrost_allocate_transient(ctx, size); /* Upload sysvals requested by the shader */ - float *uniforms = (float *) transfer.cpu; - for (unsigned i = 0; i < ss->sysval_count; ++i) { - int sysval = ss->sysval[i]; - - if (sysval == PAN_SYSVAL_VIEWPORT_SCALE) { - uniforms[4*i + 0] = vp->scale[0]; - uniforms[4*i + 1] = vp->scale[1]; - uniforms[4*i + 2] = vp->scale[2]; - } else if (sysval == PAN_SYSVAL_VIEWPORT_OFFSET) { - uniforms[4*i + 0] = vp->translate[0]; - uniforms[4*i + 1] = vp->translate[1]; - uniforms[4*i + 2] = vp->translate[2]; - } else { - assert(0); - } - } + panfrost_upload_sysvals(ctx, transfer.cpu, ss, i); /* Upload uniforms */ memcpy(transfer.cpu + sys_size, buf->buffer, buf->size); -- 2.30.2