panfrost: Explain and include compute FBD
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 31 Jul 2019 21:22:37 +0000 (14:22 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 1 Aug 2019 23:23:03 +0000 (16:23 -0700)
Squint at it hard enough and you realize it's the beginning of an
SFBD... I guess...

A compute shader with register spilling would be able to confirm this,
but we would expect to see the first field | 1 and an address splattered
later, setting up TLS.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_compute.c

index 61b3085cac04abb6b6ea5848413d49d69e3e4612..34d27904b3f2b85996005c69d588a15a3fce5aaf 100644 (file)
@@ -70,6 +70,23 @@ panfrost_launch_grid(struct pipe_context *pipe,
         /* TODO: Stub */
         struct midgard_payload_vertex_tiler *payload = &ctx->payloads[PIPE_SHADER_COMPUTE];
 
+        /* Compute jobs have a "compute FBD". It's not a real framebuffer
+         * descriptor - there is no framebuffer - but it takes the place of
+         * one. As far as I can tell, it's actually the beginning of a
+         * single-render-target framebuffer descriptor with almost everything
+         * zeroed out.
+         */
+        struct mali_compute_fbd compute_fbd = {
+                .unknown1 = {
+                        0, 0x1F, 0, 0, 0, 0, 0, 0
+                }
+        };
+
+        payload->postfix.framebuffer =
+                panfrost_upload_transient(ctx, &compute_fbd, sizeof(compute_fbd));
+
+        /* Upload the payload */
+
         struct panfrost_transfer transfer = panfrost_allocate_transient(ctx, sizeof(job) + sizeof(*payload));
         memcpy(transfer.cpu, &job, sizeof(job));
         memcpy(transfer.cpu + sizeof(job), payload, sizeof(*payload));