[PATCH 1/4] etnaviv: extend etna_resource with an addressing mode
Lucas Stach
l.stach at pengutronix.de
Mon Jan 21 09:03:32 UTC 2019
Hi Christian,
first of all, thanks for figuring this out. This is really nice
to finally know how it works.
Am Montag, den 21.01.2019, 07:49 +0100 schrieb Christian Gmeiner:
> Defines how sampler (and pixel pipes) needs to access the data
> represented with a resource. The used default is mode is
> ETNA_ADDRESSING_MODE_TILED.
Do you see any reason why we need a separate property for this? IMHO
etna_resource is already a bit too fat and from this set of patches I
can't see why we can't infer the addressing mode from the layout. Do
you have something specific in mind, that I don't see right now?
Regards,
Lucas
>
> > Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
> ---
> src/gallium/drivers/etnaviv/etnaviv_resource.c | 17 +++++++++++------
> src/gallium/drivers/etnaviv/etnaviv_resource.h | 9 ++++++++-
> src/gallium/drivers/etnaviv/etnaviv_texture.c | 1 +
> src/gallium/drivers/etnaviv/etnaviv_transfer.c | 3 ++-
> 4 files changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c
> index c0091288030..9a7ebf3064e 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c
> @@ -188,7 +188,8 @@ static bool is_rs_align(struct etna_screen *screen,
> /* Create a new resource object, using the given template info */
> struct pipe_resource *
> etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout,
> - uint64_t modifier, const struct pipe_resource *templat)
> + enum etna_resource_addressing_mode mode, uint64_t modifier,
> + const struct pipe_resource *templat)
> {
> struct etna_screen *screen = etna_screen(pscreen);
> struct etna_resource *rsc;
> @@ -280,6 +281,7 @@ etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout,
> rsc->base.nr_samples = nr_samples;
> rsc->layout = layout;
> rsc->halign = halign;
> + rsc->addressing_mode = mode;
>
> pipe_reference_init(&rsc->base.reference, 1);
> list_inithead(&rsc->list);
> @@ -316,12 +318,14 @@ etna_resource_create(struct pipe_screen *pscreen,
> {
> struct etna_screen *screen = etna_screen(pscreen);
>
> - /* Figure out what tiling to use -- for now, assume that texture cannot be linear.
> - * there is a capability LINEAR_TEXTURE_SUPPORT (supported on gc880 and
> - * gc2000 at least), but not sure how it works.
> + /* Figure out what tiling and address mode to use -- for now, assume that
> + * texture cannot be linear. there is a capability LINEAR_TEXTURE_SUPPORT
> + * (supported on gc880 and gc2000 at least), but not sure how it works.
> * Buffers always have LINEAR layout.
> */
> unsigned layout = ETNA_LAYOUT_LINEAR;
> + enum etna_resource_addressing_mode mode = ETNA_ADDRESSING_MODE_TILED;
> +
> if (etna_resource_sampler_only(templat)) {
> /* The buffer is only used for texturing, so create something
> * directly compatible with the sampler. Such a buffer can
> @@ -364,7 +368,7 @@ etna_resource_create(struct pipe_screen *pscreen,
> layout = ETNA_LAYOUT_LINEAR;
>
> /* modifier is only used for scanout surfaces, so safe to use LINEAR here */
> - return etna_resource_alloc(pscreen, layout, DRM_FORMAT_MOD_LINEAR, templat);
> + return etna_resource_alloc(pscreen, layout, mode, DRM_FORMAT_MOD_LINEAR, templat);
> }
>
> enum modifier_priority {
> @@ -445,7 +449,7 @@ etna_resource_create_modifiers(struct pipe_screen *pscreen,
> tmpl.bind |= PIPE_BIND_SCANOUT;
>
> return etna_resource_alloc(pscreen, modifier_to_layout(modifier),
> - modifier, &tmpl);
> + ETNA_ADDRESSING_MODE_TILED, modifier, &tmpl);
> }
>
> static void
> @@ -518,6 +522,7 @@ etna_resource_from_handle(struct pipe_screen *pscreen,
> rsc->seqno = 1;
> rsc->layout = modifier_to_layout(handle->modifier);
> rsc->halign = TEXTURE_HALIGN_FOUR;
> + rsc->addressing_mode = ETNA_ADDRESSING_MODE_TILED;
>
>
> level->width = tmpl->width0;
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.h b/src/gallium/drivers/etnaviv/etnaviv_resource.h
> index 11ccf8f7bcb..75aa80b3d7a 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_resource.h
> +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.h
> @@ -49,6 +49,11 @@ struct etna_resource_level {
> bool ts_valid;
> };
>
> +enum etna_resource_addressing_mode {
> + ETNA_ADDRESSING_MODE_TILED = 0,
> + ETNA_ADDRESSING_MODE_LINEAR,
> +};
> +
> /* status of queued up but not flushed reads and write operations.
> * In _transfer_map() we need to know if queued up rendering needs
> * to be flushed to preserve the order of cpu and gpu access. */
> @@ -66,6 +71,7 @@ struct etna_resource {
> /* only lod 0 used for non-texture buffers */
> /* Layout for surface (tiled, multitiled, split tiled, ...) */
> enum etna_surface_layout layout;
> + enum etna_resource_addressing_mode addressing_mode;
> /* Horizontal alignment for texture unit (TEXTURE_HALIGN_*) */
> unsigned halign;
> struct etna_bo *bo; /* Surface video memory */
> @@ -155,7 +161,8 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen,
>
> struct pipe_resource *
> etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout,
> - uint64_t modifier, const struct pipe_resource *templat);
> + enum etna_resource_addressing_mode mode, uint64_t modifier,
> + const struct pipe_resource *templat);
>
> void
> etna_resource_screen_init(struct pipe_screen *pscreen);
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_texture.c b/src/gallium/drivers/etnaviv/etnaviv_texture.c
> index 72ef00bcb26..3993e31cec1 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_texture.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_texture.c
> @@ -203,6 +203,7 @@ etna_texture_handle_incompatible(struct pipe_context *pctx, struct pipe_resource
> PIPE_BIND_BLENDABLE);
> res->texture =
> etna_resource_alloc(pctx->screen, ETNA_LAYOUT_TILED,
> + ETNA_ADDRESSING_MODE_TILED,
> DRM_FORMAT_MOD_LINEAR, &templat);
> }
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c
> index 30ae3bfc39d..0294697af28 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c
> @@ -208,7 +208,8 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc,
> templ.bind = PIPE_BIND_RENDER_TARGET;
>
> trans->rsc = etna_resource_alloc(pctx->screen, ETNA_LAYOUT_LINEAR,
> - DRM_FORMAT_MOD_LINEAR, &templ);
> + ETNA_ADDRESSING_MODE_TILED, DRM_FORMAT_MOD_LINEAR,
> + &templ);
> if (!trans->rsc) {
> slab_free(&ctx->transfer_pool, trans);
> return NULL;
More information about the etnaviv
mailing list