panfrost: Use pack for draw descriptor
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 25 Aug 2020 18:59:30 +0000 (14:59 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 28 Aug 2020 14:53:53 +0000 (14:53 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6476>

src/gallium/drivers/panfrost/pan_cmdstream.c
src/gallium/drivers/panfrost/pan_cmdstream.h
src/gallium/drivers/panfrost/pan_context.c

index 229394599b735e96d41e3c579f6ff19b43fd85c5..9f5ad3a0599f8941c7c4735e62de0303e8d18d10 100644 (file)
@@ -1806,9 +1806,9 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
 void
 panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch,
                                 struct mali_vertex_tiler_prefix *vertex_prefix,
-                                struct mali_vertex_tiler_postfix *vertex_postfix,
+                                struct mali_draw_packed *vertex_draw,
                                 struct mali_vertex_tiler_prefix *tiler_prefix,
-                                struct mali_vertex_tiler_postfix *tiler_postfix,
+                                struct mali_draw_packed *tiler_draw,
                                 union midgard_primitive_size *primitive_size)
 {
         struct panfrost_context *ctx = batch->ctx;
@@ -1823,24 +1823,24 @@ panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch,
 
         if (device->quirks & IS_BIFROST) {
                 bifrost_vertex.prefix = *vertex_prefix;
-                bifrost_vertex.postfix = *vertex_postfix;
+                memcpy(&bifrost_vertex.postfix, vertex_draw, MALI_DRAW_LENGTH);
                 vp = &bifrost_vertex;
                 vp_size = sizeof(bifrost_vertex);
 
                 bifrost_tiler.prefix = *tiler_prefix;
                 bifrost_tiler.tiler.primitive_size = *primitive_size;
                 bifrost_tiler.tiler.tiler_meta = panfrost_batch_get_tiler_meta(batch, ~0);
-                bifrost_tiler.postfix = *tiler_postfix;
+                memcpy(&bifrost_tiler.postfix, tiler_draw, MALI_DRAW_LENGTH);
                 tp = &bifrost_tiler;
                 tp_size = sizeof(bifrost_tiler);
         } else {
                 midgard_vertex.prefix = *vertex_prefix;
-                midgard_vertex.postfix = *vertex_postfix;
+                memcpy(&midgard_vertex.postfix, vertex_draw, MALI_DRAW_LENGTH);
                 vp = &midgard_vertex;
                 vp_size = sizeof(midgard_vertex);
 
                 midgard_tiler.prefix = *tiler_prefix;
-                midgard_tiler.postfix = *tiler_postfix;
+                memcpy(&midgard_tiler.postfix, tiler_draw, MALI_DRAW_LENGTH);
                 midgard_tiler.primitive_size = *primitive_size;
                 tp = &midgard_tiler;
                 tp_size = sizeof(midgard_tiler);
index 371188d818eb78f74af4f51a5fc22d00f8ababd7..f722faf04dd7e1733de61fcec16c0076439ac338 100644 (file)
@@ -88,9 +88,9 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
 void
 panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch,
                                 struct mali_vertex_tiler_prefix *vertex_prefix,
-                                struct mali_vertex_tiler_postfix *vertex_postfix,
+                                struct mali_draw_packed *vertex_draw,
                                 struct mali_vertex_tiler_prefix *tiler_prefix,
-                                struct mali_vertex_tiler_postfix *tiler_postfix,
+                                struct mali_draw_packed *tiler_draw,
                                 union midgard_primitive_size *primitive_size);
 
 void
index 58f08fae0eaf18821ad55e360207cf24628cd5c9..53c5e11b43a7cb5aa414af810d1a927444536ca5 100644 (file)
@@ -249,6 +249,19 @@ panfrost_update_streamout_offsets(struct panfrost_context *ctx)
         }
 }
 
+static inline void
+pan_emit_draw_descs(struct panfrost_batch *batch,
+                struct MALI_DRAW *d, enum pipe_shader_type st)
+{
+        d->offset_start = batch->ctx->offset_start;
+        d->instances = batch->ctx->instance_count > 1 ?
+                batch->ctx->padded_count : 1;
+
+        d->uniform_buffers = panfrost_emit_const_buf(batch, st, &d->push_uniforms);
+        d->textures = panfrost_emit_texture_descriptors(batch, st);
+        d->samplers = panfrost_emit_sampler_descriptors(batch, st);
+}
+
 static void
 panfrost_draw_vbo(
         struct pipe_context *pipe,
@@ -301,38 +314,15 @@ panfrost_draw_vbo(
         ctx->active_prim = info->mode;
 
         struct mali_vertex_tiler_prefix vertex_prefix = { 0 }, tiler_prefix = { 0 };
-        struct mali_vertex_tiler_postfix vertex_postfix = { 0 }, tiler_postfix = { 0 };
+        struct mali_draw_packed vertex_postfix, tiler_postfix;
         union midgard_primitive_size primitive_size;
         unsigned vertex_count;
 
-        if (device->quirks & IS_BIFROST) {
-                vertex_postfix.gl_enables = 0x2;
-                tiler_postfix.gl_enables = 0x3;
-                vertex_postfix.shared_memory = panfrost_vt_emit_shared_memory(batch);
-        } else {
-                vertex_postfix.gl_enables = 0x6;
-                tiler_postfix.gl_enables = 0x7;
-                vertex_postfix.shared_memory = panfrost_batch_reserve_framebuffer(batch);
-        }
-
-        tiler_postfix.shared_memory = vertex_postfix.shared_memory;
-
-        if (ctx->occlusion_query) {
-                tiler_postfix.gl_enables |= MALI_OCCLUSION_QUERY;
-                tiler_postfix.occlusion_counter = ctx->occlusion_query->bo->gpu;
-                panfrost_batch_add_bo(ctx->batch, ctx->occlusion_query->bo,
-                                      PAN_BO_ACCESS_SHARED |
-                                      PAN_BO_ACCESS_RW |
-                                      PAN_BO_ACCESS_FRAGMENT);
-        }
+        mali_ptr shared_mem = (device->quirks & IS_BIFROST) ?
+                panfrost_vt_emit_shared_memory(batch) :
+                panfrost_batch_reserve_framebuffer(batch);
 
         struct pipe_rasterizer_state *rast = &ctx->rasterizer->base;
-        SET_BIT(tiler_postfix.gl_enables, MALI_FRONT_CCW_TOP,
-                rast->front_ccw);
-        SET_BIT(tiler_postfix.gl_enables, MALI_CULL_FACE_FRONT,
-                (rast->cull_face & PIPE_FACE_FRONT));
-        SET_BIT(tiler_postfix.gl_enables, MALI_CULL_FACE_BACK,
-                (rast->cull_face & PIPE_FACE_BACK));
         SET_BIT(tiler_prefix.unknown_draw, MALI_DRAW_FLATSHADE_FIRST,
                 rast->flatshade_first);
 
@@ -356,32 +346,24 @@ panfrost_draw_vbo(
 
                 /* Use the corresponding values */
                 vertex_count = max_index - min_index + 1;
-                tiler_postfix.offset_start = vertex_postfix.offset_start = min_index + info->index_bias;
+                ctx->offset_start = min_index + info->index_bias;
                 tiler_prefix.offset_bias_correction = -min_index;
                 tiler_prefix.index_count = MALI_POSITIVE(info->count);
                 draw_flags |= panfrost_translate_index_size(info->index_size);
         } else {
                 vertex_count = ctx->vertex_count;
-                tiler_postfix.offset_start = vertex_postfix.offset_start = info->start;
+                ctx->offset_start = info->start;
                 tiler_prefix.index_count = MALI_POSITIVE(ctx->vertex_count);
         }
 
         tiler_prefix.unknown_draw = draw_flags;
-        ctx->offset_start = vertex_postfix.offset_start;
 
         /* Encode the padded vertex count */
 
-        if (info->instance_count > 1) {
+        if (info->instance_count > 1)
                 ctx->padded_count = panfrost_padded_vertex_count(vertex_count);
-
-                unsigned shift = __builtin_ctz(ctx->padded_count);
-                unsigned k = ctx->padded_count >> (shift + 1);
-
-                tiler_postfix.instance_shift = vertex_postfix.instance_shift = shift;
-                tiler_postfix.instance_odd = vertex_postfix.instance_odd = k;
-        } else {
+        else
                 ctx->padded_count = vertex_count;
-        }
 
         panfrost_statistics_record(ctx, info);
 
@@ -390,33 +372,47 @@ panfrost_draw_vbo(
                                         1, 1, 1);
 
         /* Emit all sort of descriptors. */
-        mali_ptr push_vert = 0, push_frag = 0, attribs = 0;
         mali_ptr varyings = 0, vs_vary = 0, fs_vary = 0, pos = 0, psiz = 0;
 
-        vertex_postfix.attribute_meta = panfrost_emit_vertex_data(batch, &attribs);
-        vertex_postfix.attributes = attribs;
         panfrost_emit_varying_descriptor(batch,
                                          ctx->padded_count *
                                          ctx->instance_count,
                                          &vs_vary, &fs_vary, &varyings,
                                          &pos, &psiz);
-        vertex_postfix.varyings = varyings;
-        tiler_postfix.varyings = varyings;
-        vertex_postfix.varying_meta = vs_vary;
-        tiler_postfix.varying_meta = fs_vary;
-        tiler_postfix.position_varying = pos;
-        vertex_postfix.sampler_descriptor = panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_VERTEX);
-        tiler_postfix.sampler_descriptor = panfrost_emit_sampler_descriptors(batch, PIPE_SHADER_FRAGMENT);
-        vertex_postfix.textures = panfrost_emit_texture_descriptors(batch, PIPE_SHADER_VERTEX);
-        tiler_postfix.textures = panfrost_emit_texture_descriptors(batch, PIPE_SHADER_FRAGMENT);
-        vertex_postfix.uniform_buffers = panfrost_emit_const_buf(batch, PIPE_SHADER_VERTEX, &push_vert);
-        tiler_postfix.uniform_buffers = panfrost_emit_const_buf(batch, PIPE_SHADER_FRAGMENT, &push_frag);
-        vertex_postfix.uniforms = push_vert;
-        tiler_postfix.uniforms = push_frag;
-        tiler_postfix.viewport = panfrost_emit_viewport(batch);
-
-        vertex_postfix.shader = panfrost_emit_compute_shader_meta(batch, PIPE_SHADER_VERTEX);
-        tiler_postfix.shader = panfrost_emit_frag_shader_meta(batch);
+
+        pan_pack(&vertex_postfix, DRAW, cfg) {
+                cfg.unknown_1 = (device->quirks & IS_BIFROST) ? 0x2 : 0x6;
+                cfg.state = panfrost_emit_compute_shader_meta(batch, PIPE_SHADER_VERTEX);
+                cfg.attributes = panfrost_emit_vertex_data(batch, &cfg.attribute_buffers);
+                cfg.varyings = vs_vary;
+                cfg.varying_buffers = varyings;
+                cfg.shared = shared_mem;
+                pan_emit_draw_descs(batch, &cfg, PIPE_SHADER_VERTEX);
+        }
+
+        pan_pack(&tiler_postfix, DRAW, cfg) {
+                cfg.unknown_1 = (device->quirks & IS_BIFROST) ? 0x3 : 0x7;
+                cfg.front_face_ccw = rast->front_ccw;
+                cfg.cull_front_face = rast->cull_face & PIPE_FACE_FRONT;
+                cfg.cull_back_face = rast->cull_face & PIPE_FACE_BACK;
+                cfg.position = pos;
+                cfg.state = panfrost_emit_frag_shader_meta(batch);
+                cfg.viewport = panfrost_emit_viewport(batch);
+                cfg.varyings = fs_vary;
+                cfg.varying_buffers = varyings;
+                cfg.shared = shared_mem;
+
+                pan_emit_draw_descs(batch, &cfg, PIPE_SHADER_FRAGMENT);
+
+                if (ctx->occlusion_query) {
+                        cfg.occlusion_query = MALI_OCCLUSION_MODE_PREDICATE;
+                        cfg.occlusion = ctx->occlusion_query->bo->gpu;
+                        panfrost_batch_add_bo(ctx->batch, ctx->occlusion_query->bo,
+                                              PAN_BO_ACCESS_SHARED |
+                                              PAN_BO_ACCESS_RW |
+                                              PAN_BO_ACCESS_FRAGMENT);
+                }
+        }
 
         primitive_size.pointer = psiz;
         panfrost_vt_update_primitive_size(ctx, &tiler_prefix, &primitive_size);