From b95530bef23826d3d6ca2e2e2d0ad2d74e572a47 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 6 Mar 2020 09:09:03 +0100 Subject: [PATCH] panfrost: Move panfrost_emit_vertex_data() to pan_cmdstream.c Move panfrost_emit_vertex_data() to pan_cmdstream.c where other emit functions live, and adjust the prototype for consistency. Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/panfrost/Makefile.sources | 1 - src/gallium/drivers/panfrost/meson.build | 1 - src/gallium/drivers/panfrost/pan_attributes.c | 131 -------------------------- src/gallium/drivers/panfrost/pan_cmdstream.c | 108 +++++++++++++++++++++ src/gallium/drivers/panfrost/pan_cmdstream.h | 4 + src/gallium/drivers/panfrost/pan_context.c | 2 +- src/gallium/drivers/panfrost/pan_context.h | 3 - 7 files changed, 113 insertions(+), 137 deletions(-) delete mode 100644 src/gallium/drivers/panfrost/pan_attributes.c diff --git a/src/gallium/drivers/panfrost/Makefile.sources b/src/gallium/drivers/panfrost/Makefile.sources index 835f225..78bd155 100644 --- a/src/gallium/drivers/panfrost/Makefile.sources +++ b/src/gallium/drivers/panfrost/Makefile.sources @@ -20,7 +20,6 @@ C_SOURCES := \ pan_context.c \ pan_context.h \ pan_fragment.c \ - pan_attributes.c \ pan_job.c \ pan_job.h \ pan_mfbd.c \ diff --git a/src/gallium/drivers/panfrost/meson.build b/src/gallium/drivers/panfrost/meson.build index 6505cba..eb5d627 100644 --- a/src/gallium/drivers/panfrost/meson.build +++ b/src/gallium/drivers/panfrost/meson.build @@ -41,7 +41,6 @@ files_panfrost = files( 'pan_cmdstream.c', 'pan_compute.c', 'pan_fragment.c', - 'pan_attributes.c', 'pan_scoreboard.c', 'pan_sfbd.c', 'pan_mfbd.c', diff --git a/src/gallium/drivers/panfrost/pan_attributes.c b/src/gallium/drivers/panfrost/pan_attributes.c deleted file mode 100644 index 31bdd2c..0000000 --- a/src/gallium/drivers/panfrost/pan_attributes.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2018-2019 Alyssa Rosenzweig - * Copyright (C) 2019 Collabora, Ltd. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#include "pan_bo.h" -#include "pan_context.h" - -void -panfrost_emit_vertex_data(struct panfrost_batch *batch) -{ - struct panfrost_context *ctx = batch->ctx; - struct panfrost_vertex_state *so = ctx->vertex; - - /* Staged mali_attr, and index into them. i =/= k, depending on the - * vertex buffer mask and instancing. Twice as much room is allocated, - * for a worst case of NPOT_DIVIDEs which take up extra slot */ - union mali_attr attrs[PIPE_MAX_ATTRIBS * 2]; - unsigned k = 0; - - for (unsigned i = 0; i < so->num_elements; ++i) { - /* We map a mali_attr to be 1:1 with the mali_attr_meta, which - * means duplicating some vertex buffers (who cares? aside from - * maybe some caching implications but I somehow doubt that - * matters) */ - - struct pipe_vertex_element *elem = &so->pipe[i]; - unsigned vbi = elem->vertex_buffer_index; - - /* The exception to 1:1 mapping is that we can have multiple - * entries (NPOT divisors), so we fixup anyways */ - - so->hw[i].index = k; - - if (!(ctx->vb_mask & (1 << vbi))) continue; - - struct pipe_vertex_buffer *buf = &ctx->vertex_buffers[vbi]; - struct panfrost_resource *rsrc = (struct panfrost_resource *) (buf->buffer.resource); - - if (!rsrc) continue; - - /* Align to 64 bytes by masking off the lower bits. This - * will be adjusted back when we fixup the src_offset in - * mali_attr_meta */ - - mali_ptr raw_addr = rsrc->bo->gpu + buf->buffer_offset; - mali_ptr addr = raw_addr & ~63; - unsigned chopped_addr = raw_addr - addr; - - /* Add a dependency of the batch on the vertex buffer */ - panfrost_batch_add_bo(batch, rsrc->bo, - PAN_BO_ACCESS_SHARED | - PAN_BO_ACCESS_READ | - PAN_BO_ACCESS_VERTEX_TILER); - - /* Set common fields */ - attrs[k].elements = addr; - attrs[k].stride = buf->stride; - - /* Since we advanced the base pointer, we shrink the buffer - * size */ - attrs[k].size = rsrc->base.width0 - buf->buffer_offset; - - /* We need to add the extra size we masked off (for - * correctness) so the data doesn't get clamped away */ - attrs[k].size += chopped_addr; - - /* For non-instancing make sure we initialize */ - attrs[k].shift = attrs[k].extra_flags = 0; - - /* Instancing uses a dramatically different code path than - * linear, so dispatch for the actual emission now that the - * common code is finished */ - - unsigned divisor = elem->instance_divisor; - - if (divisor && ctx->instance_count == 1) { - /* Silly corner case where there's a divisor(=1) but - * there's no legitimate instancing. So we want *every* - * attribute to be the same. So set stride to zero so - * we don't go anywhere. */ - - attrs[k].size = attrs[k].stride + chopped_addr; - attrs[k].stride = 0; - attrs[k++].elements |= MALI_ATTR_LINEAR; - } else if (ctx->instance_count <= 1) { - /* Normal, non-instanced attributes */ - attrs[k++].elements |= MALI_ATTR_LINEAR; - } else { - unsigned instance_shift = batch->ctx->payloads[PIPE_SHADER_FRAGMENT].instance_shift; - unsigned instance_odd = batch->ctx->payloads[PIPE_SHADER_FRAGMENT].instance_odd; - - k += panfrost_vertex_instanced(batch->ctx->padded_count, - instance_shift, instance_odd, divisor, &attrs[k]); - } - } - - /* Add special gl_VertexID/gl_InstanceID buffers */ - - panfrost_vertex_id(ctx->padded_count, &attrs[k]); - so->hw[PAN_VERTEX_ID].index = k++; - panfrost_instance_id(ctx->padded_count, &attrs[k]); - so->hw[PAN_INSTANCE_ID].index = k++; - - /* Upload whatever we emitted and go */ - - ctx->payloads[PIPE_SHADER_VERTEX].postfix.attributes = - panfrost_upload_transient(batch, attrs, k * sizeof(union mali_attr)); -} - - diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index a481636..d49bdd9 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -1207,6 +1207,114 @@ panfrost_emit_vertex_attr_meta(struct panfrost_batch *batch, } void +panfrost_emit_vertex_data(struct panfrost_batch *batch, + struct midgard_payload_vertex_tiler *vp) +{ + struct panfrost_context *ctx = batch->ctx; + struct panfrost_vertex_state *so = ctx->vertex; + + /* Staged mali_attr, and index into them. i =/= k, depending on the + * vertex buffer mask and instancing. Twice as much room is allocated, + * for a worst case of NPOT_DIVIDEs which take up extra slot */ + union mali_attr attrs[PIPE_MAX_ATTRIBS * 2]; + unsigned k = 0; + + for (unsigned i = 0; i < so->num_elements; ++i) { + /* We map a mali_attr to be 1:1 with the mali_attr_meta, which + * means duplicating some vertex buffers (who cares? aside from + * maybe some caching implications but I somehow doubt that + * matters) */ + + struct pipe_vertex_element *elem = &so->pipe[i]; + unsigned vbi = elem->vertex_buffer_index; + + /* The exception to 1:1 mapping is that we can have multiple + * entries (NPOT divisors), so we fixup anyways */ + + so->hw[i].index = k; + + if (!(ctx->vb_mask & (1 << vbi))) + continue; + + struct pipe_vertex_buffer *buf = &ctx->vertex_buffers[vbi]; + struct panfrost_resource *rsrc; + + rsrc = pan_resource(buf->buffer.resource); + if (!rsrc) + continue; + + /* Align to 64 bytes by masking off the lower bits. This + * will be adjusted back when we fixup the src_offset in + * mali_attr_meta */ + + mali_ptr raw_addr = rsrc->bo->gpu + buf->buffer_offset; + mali_ptr addr = raw_addr & ~63; + unsigned chopped_addr = raw_addr - addr; + + /* Add a dependency of the batch on the vertex buffer */ + panfrost_batch_add_bo(batch, rsrc->bo, + PAN_BO_ACCESS_SHARED | + PAN_BO_ACCESS_READ | + PAN_BO_ACCESS_VERTEX_TILER); + + /* Set common fields */ + attrs[k].elements = addr; + attrs[k].stride = buf->stride; + + /* Since we advanced the base pointer, we shrink the buffer + * size */ + attrs[k].size = rsrc->base.width0 - buf->buffer_offset; + + /* We need to add the extra size we masked off (for + * correctness) so the data doesn't get clamped away */ + attrs[k].size += chopped_addr; + + /* For non-instancing make sure we initialize */ + attrs[k].shift = attrs[k].extra_flags = 0; + + /* Instancing uses a dramatically different code path than + * linear, so dispatch for the actual emission now that the + * common code is finished */ + + unsigned divisor = elem->instance_divisor; + + if (divisor && ctx->instance_count == 1) { + /* Silly corner case where there's a divisor(=1) but + * there's no legitimate instancing. So we want *every* + * attribute to be the same. So set stride to zero so + * we don't go anywhere. */ + + attrs[k].size = attrs[k].stride + chopped_addr; + attrs[k].stride = 0; + attrs[k++].elements |= MALI_ATTR_LINEAR; + } else if (ctx->instance_count <= 1) { + /* Normal, non-instanced attributes */ + attrs[k++].elements |= MALI_ATTR_LINEAR; + } else { + unsigned instance_shift = vp->instance_shift; + unsigned instance_odd = vp->instance_odd; + + k += panfrost_vertex_instanced(ctx->padded_count, + instance_shift, + instance_odd, + divisor, &attrs[k]); + } + } + + /* Add special gl_VertexID/gl_InstanceID buffers */ + + panfrost_vertex_id(ctx->padded_count, &attrs[k]); + so->hw[PAN_VERTEX_ID].index = k++; + panfrost_instance_id(ctx->padded_count, &attrs[k]); + so->hw[PAN_INSTANCE_ID].index = k++; + + /* Upload whatever we emitted and go */ + + vp->postfix.attributes = panfrost_upload_transient(batch, attrs, + k * sizeof(*attrs)); +} + +void panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch, struct midgard_payload_vertex_tiler *vp, struct midgard_payload_vertex_tiler *tp) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.h b/src/gallium/drivers/panfrost/pan_cmdstream.h index 0d35de7..4574750 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.h +++ b/src/gallium/drivers/panfrost/pan_cmdstream.h @@ -90,6 +90,10 @@ panfrost_emit_vertex_attr_meta(struct panfrost_batch *batch, struct midgard_payload_vertex_tiler *vp); void +panfrost_emit_vertex_data(struct panfrost_batch *batch, + struct midgard_payload_vertex_tiler *vp); + +void panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch, struct midgard_payload_vertex_tiler *vp, struct midgard_payload_vertex_tiler *tp); diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index f09c0ed..d938e43 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -445,7 +445,7 @@ panfrost_draw_vbo( 1, 1, 1); /* Emit all sort of descriptors. */ - panfrost_emit_vertex_data(batch); + panfrost_emit_vertex_data(batch, &ctx->payloads[PIPE_SHADER_VERTEX]); panfrost_emit_varying_descriptor(ctx, ctx->padded_count * ctx->instance_count); diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h index cc8d0eb..3139309 100644 --- a/src/gallium/drivers/panfrost/pan_context.h +++ b/src/gallium/drivers/panfrost/pan_context.h @@ -332,9 +332,6 @@ panfrost_ubo_count(struct panfrost_context *ctx, enum pipe_shader_type stage); mali_ptr panfrost_vertex_buffer_address(struct panfrost_context *ctx, unsigned i); -void -panfrost_emit_vertex_data(struct panfrost_batch *batch); - /* Compute */ void -- 2.7.4