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 <[email protected]> Reviewed-by: Alyssa Rosenzweig <[email protected]> --- Changes in v2: * Add Alyssa's R-b --- .../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 b21f054c0318..f20d7bafe1e8 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 2f7ab8d53164..990f9fcb10c5 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -989,6 +989,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 @@ -1202,22 +1252,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.20.1 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
