etnaviv: extend etna_resource with an addressing mode
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. Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com> Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
This commit is contained in:
parent
d1d2bb8c07
commit
5b4a155d2b
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue