panfrost: Clamp shader->uniform_count
[mesa.git] / src / gallium / drivers / panfrost / pan_resource.h
index 2728c7f0aebb0f3b0a403c7bcaf0d69cb5b67fdf..009f13c0f86afe2e76962fe15ef6c934bf1fbae0 100644 (file)
 #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"
 
-/* Index buffer min/max cache. We need to caclculate the min/max for arbitrary
- * slices (start, start + count) of the index buffer at drawtime. As this can
- * be quite expensive, we cache. Conceptually, we just use a hash table mapping
- * the key (start, count) to the value (min, max). In practice, mesa's hash
- * table implementation is higher overhead than we would like and makes
- * handling memory usage a little complicated. So we use this data structure
- * instead. Searching is O(n) to the size, but the size is capped at the
- * PANFROST_MINMAX_SIZE constant (so this is a tradeoff between cache hit/miss
- * ratio and cache search speed). Note that keys are adjacent so we get cache
- * line alignment benefits. Insertion is O(1) and in-order until the cache
- * fills up, after that it evicts the oldest cached value in a ring facilitated
- * by index.
- */
-
-#define PANFROST_MINMAX_SIZE 64
-
-struct panfrost_minmax_cache {
-        uint64_t keys[PANFROST_MINMAX_SIZE];
-        uint64_t values[PANFROST_MINMAX_SIZE];
-        unsigned size;
-        unsigned index;
-};
+#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;
@@ -76,12 +58,18 @@ struct panfrost_resource {
         /* 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 */
@@ -97,6 +85,10 @@ pan_resource(struct pipe_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 *
@@ -108,19 +100,12 @@ pan_transfer(struct pipe_transfer *p)
 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 panfrost_screen *screen);
+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_screen *screen,
-                struct panfrost_resource *rsrc,
-                enum mali_texture_layout layout,
-                signed weight);
-
 /* Blitting */
 
 void
@@ -131,13 +116,37 @@ 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");
+        }
+}
+
+
 #endif /* PAN_RESOURCE_H */