#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"
+#define LAYOUT_CONVERT_THRESHOLD 8
+
struct panfrost_resource {
struct pipe_resource base;
struct {
- struct pipe_box biggest_rect;
struct pipe_scissor_state extent;
+ struct pan_rect *inverted_rects;
+ unsigned inverted_len;
} damage;
struct panfrost_bo *bo;
/* Distance from tree to tree */
unsigned cubemap_stride;
- /* Internal layout (tiled?) */
- enum mali_texture_layout layout;
+ /* DRM fourcc code: linear, 16x16 u-interleaved, AFBC */
+ uint64_t modifier;
+
+ /* Whether the modifier can be changed */
+ bool modifier_constant;
/* Is transaciton elimination enabled? */
bool checksummed;
+ /* Used to decide when to convert to another modifier */
+ uint16_t modifier_updates;
+
enum pipe_format internal_format;
/* Cached min/max values for index buffers */
struct panfrost_gtransfer {
struct pipe_transfer base;
void *map;
+ struct {
+ struct pipe_resource *rsrc;
+ struct pipe_box box;
+ } staging;
};
static inline struct panfrost_gtransfer *
mali_ptr
panfrost_get_texture_address(
struct panfrost_resource *rsrc,
- unsigned level, unsigned face);
+ unsigned level, unsigned face, unsigned sample);
void panfrost_resource_screen_init(struct pipe_screen *screen);
void panfrost_resource_context_init(struct pipe_context *pctx);
-void
-panfrost_resource_hint_layout(
- struct panfrost_device *dev,
- struct panfrost_resource *rsrc,
- enum mali_texture_layout layout,
- signed weight);
-
/* Blitting */
void
panfrost_blit_wallpaper(struct panfrost_context *ctx,
struct pipe_box *box);
-void
-panfrost_resource_reset_damage(struct panfrost_resource *pres);
-
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");
+ }
+}
-struct panfrost_bo *
-pan_bo_create(struct panfrost_device *dev, size_t size, uint32_t flags);
#endif /* PAN_RESOURCE_H */