panfrost: Add rt formats to shader state
authorIcecream95 <ixn@keemail.me>
Mon, 6 Jul 2020 07:40:05 +0000 (19:40 +1200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 13 Jul 2020 13:35:10 +0000 (13:35 +0000)
load_output lowering will depend on the framebuffer formats.

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5755>

src/gallium/drivers/panfrost/pan_assemble.c
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_context.h
src/panfrost/util/pan_ir.h

index 37c9c69..d398d21 100644 (file)
@@ -165,6 +165,8 @@ panfrost_shader_compile(struct panfrost_context *ctx,
                 .alpha_ref = state->alpha_state.ref_value
         };
 
+        memcpy(program.rt_formats, state->rt_formats, sizeof(program.rt_formats));
+
         if (dev->quirks & IS_BIFROST) {
                 bifrost_compile_shader_nir(s, &program, dev->gpu_id);
         } else {
index d55cbd0..7c438f6 100644 (file)
@@ -777,6 +777,16 @@ panfrost_bind_shader_state(
                 if (type == PIPE_SHADER_FRAGMENT) {
                         v->alpha_state = ctx->depth_stencil->alpha;
 
+                        struct pipe_framebuffer_state *fb = &ctx->pipe_framebuffer;
+                        for (unsigned i = 0; i < fb->nr_cbufs; ++i) {
+                                enum pipe_format fmt = PIPE_FORMAT_R8G8B8A8_UNORM;
+
+                                if ((fb->nr_cbufs > i) && fb->cbufs[i])
+                                        fmt = fb->cbufs[i]->format;
+
+                                v->rt_formats[i] = fmt;
+                        }
+
                         /* Point sprites are TODO on Bifrost */
                         if (ctx->rasterizer && !(dev->quirks & IS_BIFROST)) {
                                 v->point_sprite_mask = ctx->rasterizer->base.sprite_coord_enable;
index adf4ada..2feb08f 100644 (file)
@@ -224,6 +224,8 @@ struct panfrost_shader_state {
 
         unsigned first_tag;
         struct panfrost_bo *bo;
+
+        enum pipe_format rt_formats[8];
 };
 
 /* A collection of varyings (the CSO) */
index aa0eb79..99a8e5b 100644 (file)
@@ -110,6 +110,9 @@ typedef struct {
 
         /* IN: For a fragment shader with a lowered alpha test, the ref value */
         float alpha_ref;
+
+        /* IN: Render target formats for output load/store lowering */
+        enum pipe_format rt_formats[8];
 } panfrost_program;
 
 typedef struct pan_block {