#ifndef PAN_RESOURCE_H
#define PAN_RESOURCE_H
-#include <panfrost-job.h>
+#include <midgard_pack.h>
#include "pan_screen.h"
-#include "pan_allocate.h"
+#include "pan_pool.h"
+#include "pan_minmax_cache.h"
+#include "pan_texture.h"
+#include "pan_partial_update.h"
#include "drm-uapi/drm.h"
+#include "util/u_range.h"
-/* Describes the memory layout of a BO */
+#define LAYOUT_CONVERT_THRESHOLD 8
-enum panfrost_memory_layout {
- PAN_LINEAR,
- PAN_TILED,
- PAN_AFBC
-};
-
-struct panfrost_slice {
- unsigned offset;
- unsigned stride;
-};
+struct panfrost_resource {
+ struct pipe_resource base;
+ struct {
+ struct pipe_scissor_state extent;
+ struct pan_rect *inverted_rects;
+ unsigned inverted_len;
+ } damage;
-struct panfrost_bo {
- struct panfrost_slice slices[MAX_MIP_LEVELS];
+ struct panfrost_bo *bo;
+ struct renderonly_scanout *scanout;
- /* Mapping for the entire object (all levels) */
- uint8_t *cpu;
+ struct panfrost_resource *separate_stencil;
- /* GPU address for the object */
- mali_ptr gpu;
+ struct util_range valid_buffer_range;
- /* Size of all entire trees */
- size_t size;
+ /* Description of the mip levels */
+ struct panfrost_slice slices[MAX_MIP_LEVELS];
/* Distance from tree to tree */
unsigned cubemap_stride;
- /* Set if this bo was imported rather than allocated */
- bool imported;
-
- /* Internal layout (tiled?) */
- enum panfrost_memory_layout layout;
-
- /* If AFBC is enabled for this resource, we lug around an AFBC
- * metadata buffer as well. The actual AFBC resource is also in
- * afbc_slab (only defined for AFBC) at position afbc_main_offset
- */
+ /* DRM fourcc code: linear, 16x16 u-interleaved, AFBC */
+ uint64_t modifier;
- struct panfrost_memory afbc_slab;
- int afbc_metadata_size;
+ /* Whether the modifier can be changed */
+ bool modifier_constant;
- /* If transaciton elimination is enabled, we have a dedicated
- * buffer for that as well. */
+ /* Is transaciton elimination enabled? */
+ bool checksummed;
- bool has_checksum;
- struct panfrost_memory checksum_slab;
- int checksum_stride;
+ /* Used to decide when to convert to another modifier */
+ uint16_t modifier_updates;
- int gem_handle;
-};
-
-struct panfrost_resource {
- struct pipe_resource base;
-
- struct panfrost_bo *bo;
- struct renderonly_scanout *scanout;
+ enum pipe_format internal_format;
- struct panfrost_resource *separate_stencil;
+ /* Cached min/max values for index buffers */
+ struct panfrost_minmax_cache *index_cache;
};
static inline struct panfrost_resource *
pan_resource(struct pipe_resource *p)
{
- return (struct panfrost_resource *)p;
+ return (struct panfrost_resource *)p;
}
struct panfrost_gtransfer {
struct pipe_transfer base;
void *map;
+ struct {
+ struct pipe_resource *rsrc;
+ struct pipe_box box;
+ } staging;
};
static inline struct panfrost_gtransfer *
pan_transfer(struct pipe_transfer *p)
{
- return (struct panfrost_gtransfer *)p;
+ return (struct panfrost_gtransfer *)p;
}
-void panfrost_resource_screen_init(struct panfrost_screen *screen);
+mali_ptr
+panfrost_get_texture_address(
+ struct panfrost_resource *rsrc,
+ unsigned level, unsigned face, unsigned sample);
+
+void panfrost_resource_screen_init(struct pipe_screen *screen);
void panfrost_resource_context_init(struct pipe_context *pctx);
+/* Blitting */
+
+void
+panfrost_blit(struct pipe_context *pipe,
+ const struct pipe_blit_info *info);
+
+void
+panfrost_blit_wallpaper(struct panfrost_context *ctx,
+ struct pipe_box *box);
+
+void
+panfrost_resource_set_damage_region(struct pipe_screen *screen,
+ struct pipe_resource *res,
+ unsigned int nrects,
+ const struct pipe_box *rects);
+
+static inline enum mali_texture_dimension
+panfrost_translate_texture_dimension(enum pipe_texture_target t) {
+ switch (t)
+ {
+ case PIPE_BUFFER:
+ case PIPE_TEXTURE_1D:
+ case PIPE_TEXTURE_1D_ARRAY:
+ return MALI_TEXTURE_DIMENSION_1D;
+
+ case PIPE_TEXTURE_2D:
+ case PIPE_TEXTURE_2D_ARRAY:
+ case PIPE_TEXTURE_RECT:
+ return MALI_TEXTURE_DIMENSION_2D;
+
+ case PIPE_TEXTURE_3D:
+ return MALI_TEXTURE_DIMENSION_3D;
+
+ case PIPE_TEXTURE_CUBE:
+ case PIPE_TEXTURE_CUBE_ARRAY:
+ return MALI_TEXTURE_DIMENSION_CUBE;
+
+ default:
+ unreachable("Unknown target");
+ }
+}
+
+
#endif /* PAN_RESOURCE_H */