summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBoris Brezillon <[email protected]>2019-06-14 10:41:17 +0200
committerAlyssa Rosenzweig <[email protected]>2019-06-18 06:36:07 -0700
commitc57f7d0f152f79cf9bba35e23d754518531aefdf (patch)
treeb3df56c7ea7403ca24de9fd0a3c2ca63d93f4b29 /src
parentbd49c8f0ebaed08b06feadcdb7dadf6b7b64f21f (diff)
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 <[email protected]> Reviewed-by: Alyssa Rosenzweig <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/panfrost/midgard/midgard_compile.h4
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c67
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);