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.gmei...@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; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev