• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * © Copyright2018-2019 Alyssa Rosenzweig
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  *
23  */
24 
25 
26 #ifndef PAN_RESOURCE_H
27 #define PAN_RESOURCE_H
28 
29 #include "pan_screen.h"
30 #include "pan_minmax_cache.h"
31 #include "pan_texture.h"
32 #include "drm-uapi/drm.h"
33 #include "util/u_range.h"
34 
35 #define LAYOUT_CONVERT_THRESHOLD 8
36 #define PAN_MAX_BATCHES 32
37 
38 #define PAN_BIND_SHARED_MASK (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | \
39                               PIPE_BIND_SHARED)
40 
41 struct panfrost_resource {
42         struct pipe_resource base;
43         struct {
44                 struct pipe_scissor_state extent;
45                 struct {
46                         bool enable;
47                         unsigned stride;
48                         unsigned size;
49                         BITSET_WORD *data;
50                 } tile_map;
51         } damage;
52 
53         struct {
54                 /** Number of batches accessing this resource. Used to check if
55                  * a resource is in use. */
56                 _Atomic unsigned nr_users;
57 
58                 /** Number of batches writing this resource. Note that only one
59                  * batch per context may write a resource, so this is the
60                  * number of contexts that have an active writer. */
61                 _Atomic unsigned nr_writers;
62         } track;
63 
64         struct renderonly_scanout *scanout;
65 
66         struct panfrost_resource *separate_stencil;
67 
68         struct util_range valid_buffer_range;
69 
70         /* Description of the resource layout */
71         struct pan_image image;
72 
73         struct {
74                 /* Is the checksum for this image valid? Implicitly refers to
75                  * the first slice; we only checksum non-mipmapped 2D images */
76                 bool crc;
77 
78                 /* Has anything been written to this slice? */
79                 BITSET_DECLARE(data, MAX_MIP_LEVELS);
80         } valid;
81 
82         /* Whether the modifier can be changed */
83         bool modifier_constant;
84 
85         /* Used to decide when to convert to another modifier */
86         uint16_t modifier_updates;
87 
88         /* Do all pixels have the same stencil value? */
89         bool constant_stencil;
90 
91         /* The stencil value if constant_stencil is set */
92         uint8_t stencil_value;
93 
94         /* Cached min/max values for index buffers */
95         struct panfrost_minmax_cache *index_cache;
96 };
97 
98 static inline struct panfrost_resource *
pan_resource(struct pipe_resource * p)99 pan_resource(struct pipe_resource *p)
100 {
101         return (struct panfrost_resource *)p;
102 }
103 
104 struct panfrost_transfer {
105         struct pipe_transfer base;
106         void *map;
107         struct {
108                 struct pipe_resource *rsrc;
109                 struct pipe_box box;
110         } staging;
111 };
112 
113 static inline struct panfrost_transfer *
pan_transfer(struct pipe_transfer * p)114 pan_transfer(struct pipe_transfer *p)
115 {
116         return (struct panfrost_transfer *)p;
117 }
118 
119 void panfrost_resource_screen_init(struct pipe_screen *screen);
120 
121 void panfrost_resource_screen_destroy(struct pipe_screen *screen);
122 
123 void panfrost_resource_context_init(struct pipe_context *pctx);
124 
125 /* Blitting */
126 
127 void
128 panfrost_blitter_save(struct panfrost_context *ctx, bool render_cond);
129 
130 void
131 panfrost_blit(struct pipe_context *pipe,
132               const struct pipe_blit_info *info);
133 
134 void
135 panfrost_resource_set_damage_region(struct pipe_screen *screen,
136                                     struct pipe_resource *res,
137                                     unsigned int nrects,
138                                     const struct pipe_box *rects);
139 
140 static inline enum mali_texture_dimension
panfrost_translate_texture_dimension(enum pipe_texture_target t)141 panfrost_translate_texture_dimension(enum pipe_texture_target t) {
142         switch (t)
143         {
144         case PIPE_BUFFER:
145         case PIPE_TEXTURE_1D:
146         case PIPE_TEXTURE_1D_ARRAY:
147                 return MALI_TEXTURE_DIMENSION_1D;
148 
149         case PIPE_TEXTURE_2D:
150         case PIPE_TEXTURE_2D_ARRAY:
151         case PIPE_TEXTURE_RECT:
152                 return MALI_TEXTURE_DIMENSION_2D;
153 
154         case PIPE_TEXTURE_3D:
155                 return MALI_TEXTURE_DIMENSION_3D;
156 
157         case PIPE_TEXTURE_CUBE:
158         case PIPE_TEXTURE_CUBE_ARRAY:
159                 return MALI_TEXTURE_DIMENSION_CUBE;
160 
161         default:
162                 unreachable("Unknown target");
163         }
164 }
165 
166 void
167 pan_resource_modifier_convert(struct panfrost_context *ctx,
168                               struct panfrost_resource *rsrc,
169                               uint64_t modifier, const char *reason);
170 
171 void
172 pan_legalize_afbc_format(struct panfrost_context *ctx,
173                          struct panfrost_resource *rsrc,
174                          enum pipe_format format);
175 
176 #endif /* PAN_RESOURCE_H */
177