#include "etnaviv_tiling.h"
#include "pipe/p_state.h"
#include "util/list.h"
+#include "util/set.h"
+#include "util/u_helpers.h"
+struct etna_context;
struct pipe_screen;
+struct util_dynarray;
struct etna_resource_level {
unsigned width, padded_width; /* in pixels */
unsigned height, padded_height; /* in samples */
+ unsigned depth;
unsigned offset; /* offset into memory area */
uint32_t stride; /* row stride */
uint32_t layer_stride; /* layer stride */
uint32_t ts_size;
uint32_t clear_value; /* clear value of resource level (mainly for TS) */
bool ts_valid;
+ uint8_t ts_mode;
+ int8_t ts_compress_fmt; /* COLOR_COMPRESSION_FORMAT_* (-1 = disable) */
+
+ /* keep track if we have done some per block patching */
+ bool patched;
+ struct util_dynarray *patch_offsets;
};
/* status of queued up but not flushed reads and write operations.
struct etna_resource_level levels[ETNA_NUM_LOD];
- /* When we are rendering to a texture, we need a differently tiled resource */
+ /* for when TE doesn't support the base layout */
struct pipe_resource *texture;
+ /* for when PE doesn't support the base layout */
+ struct pipe_resource *render;
enum etna_resource_status status;
- /* resources accessed by queued but not flushed draws are tracked
- * in the used_resources list. */
- struct list_head list;
- struct etna_context *pending_ctx;
+ struct set *pending_ctx;
};
/* returns TRUE if a is newer than b */
return (int)(a->seqno - b->seqno) < 0;
}
+/* returns TRUE if a resource has a TS, and it is valid for at least one level */
+bool
+etna_resource_has_valid_ts(struct etna_resource *res);
+
/* returns TRUE if the resource needs a resolve to itself */
static inline bool
etna_resource_needs_flush(struct etna_resource *res)
{
- return (int)(res->seqno - res->flush_seqno) > 0;
+ return etna_resource_has_valid_ts(res) && ((int)(res->seqno - res->flush_seqno) > 0);
}
/* is the resource only used on the sampler? */
return (struct etna_resource *)p;
}
+enum etna_resource_status
+etna_resource_get_status(struct etna_context *ctx, struct etna_resource *rsc);
+
void
etna_resource_used(struct etna_context *ctx, struct pipe_resource *prsc,
enum etna_resource_status status);
-void
-etna_resource_wait(struct pipe_context *ctx, struct etna_resource *rsc);
-
static inline void
resource_read(struct etna_context *ctx, struct pipe_resource *prsc)
{
struct pipe_resource *
etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout,
- const struct pipe_resource *templat);
+ uint64_t modifier, const struct pipe_resource *templat);
void
etna_resource_screen_init(struct pipe_screen *pscreen);