1 /*
2  * Copyright (C) 2008 VMware, Inc.
3  * Copyright (C) 2014 Broadcom
4  * Copyright (C) 2018-2019 Alyssa Rosenzweig
5  * Copyright (C) 2019-2020 Collabora, Ltd.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11  * and/or sell copies of the Software, and to permit persons to whom the
12  * Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the next
15  * paragraph) shall be included in all copies or substantial portions of the
16  * Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24  * SOFTWARE.
25  *
26  */
27 
28 #ifndef __PAN_TEXTURE_H
29 #define __PAN_TEXTURE_H
30 
31 #include "genxml/gen_macros.h"
32 
33 #include <stdbool.h>
34 #include "drm-uapi/drm_fourcc.h"
35 #include "util/format/u_format.h"
36 #include "compiler/shader_enums.h"
37 #include "genxml/gen_macros.h"
38 #include "pan_bo.h"
39 #include "pan_device.h"
40 #include "pan_util.h"
41 #include "pan_format.h"
42 
43 #define PAN_MODIFIER_COUNT 4
44 extern uint64_t pan_best_modifiers[PAN_MODIFIER_COUNT];
45 
46 struct pan_image_slice_layout {
47         unsigned offset;
48         unsigned line_stride;
49         unsigned row_stride;
50         unsigned surface_stride;
51 
52         struct {
53                 /* Size of the AFBC header preceding each slice */
54                 unsigned header_size;
55 
56                 /* Size of the AFBC body */
57                 unsigned body_size;
58 
59                 /* Stride between two rows of AFBC headers */
60                 unsigned row_stride;
61 
62                 /* Stride between AFBC headers of two consecutive surfaces.
63                  * For 3D textures, this must be set to header size since
64                  * AFBC headers are allocated together, for 2D arrays this
65                  * should be set to size0, since AFBC headers are placed at
66                  * the beginning of each layer
67                  */
68                 unsigned surface_stride;
69         } afbc;
70 
71         /* If checksumming is enabled following the slice, what
72          * is its offset/stride? */
73         struct {
74                 unsigned offset;
75                 unsigned stride;
76                 unsigned size;
77         } crc;
78 
79         unsigned size;
80 };
81 
82 enum pan_image_crc_mode {
83       PAN_IMAGE_CRC_NONE,
84       PAN_IMAGE_CRC_INBAND,
85       PAN_IMAGE_CRC_OOB,
86 };
87 
88 struct pan_image_layout {
89         uint64_t modifier;
90         enum pipe_format format;
91         unsigned width, height, depth;
92         unsigned nr_samples;
93         enum mali_texture_dimension dim;
94         unsigned nr_slices;
95         struct pan_image_slice_layout slices[MAX_MIP_LEVELS];
96         unsigned array_size;
97         unsigned array_stride;
98         unsigned data_size;
99 
100         enum pan_image_crc_mode crc_mode;
101         /* crc_size != 0 only if crc_mode == OOB otherwise CRC words are
102          * counted in data_size */
103         unsigned crc_size;
104 };
105 
106 struct pan_image_mem {
107         struct panfrost_bo *bo;
108         unsigned offset;
109 };
110 
111 struct pan_image {
112         struct pan_image_mem data;
113         struct pan_image_mem crc;
114         struct pan_image_layout layout;
115 };
116 
117 struct pan_image_view {
118         /* Format, dimension and sample count of the view might differ from
119          * those of the image (2D view of a 3D image surface for instance).
120          */
121         enum pipe_format format;
122         enum mali_texture_dimension dim;
123         unsigned first_level, last_level;
124         unsigned first_layer, last_layer;
125         unsigned char swizzle[4];
126         const struct pan_image *image;
127 
128         /* If EXT_multisampled_render_to_texture is used, this may be
129          * greater than image->layout.nr_samples. */
130         unsigned nr_samples;
131 
132         /* Only valid if dim == 1D, needed to implement buffer views */
133         struct {
134                 unsigned offset;
135                 unsigned size;
136         } buf;
137 };
138 
139 unsigned
140 panfrost_compute_checksum_size(
141         struct pan_image_slice_layout *slice,
142         unsigned width,
143         unsigned height);
144 
145 /* AFBC */
146 
147 bool
148 panfrost_format_supports_afbc(const struct panfrost_device *dev,
149                 enum pipe_format format);
150 
151 enum pipe_format
152 panfrost_afbc_format(const struct panfrost_device *dev, enum pipe_format format);
153 
154 #define AFBC_HEADER_BYTES_PER_TILE 16
155 
156 unsigned
157 panfrost_afbc_header_size(unsigned width, unsigned height);
158 
159 bool
160 panfrost_afbc_can_ytr(enum pipe_format format);
161 
162 unsigned
163 panfrost_block_dim(uint64_t modifier, bool width, unsigned plane);
164 
165 #ifdef PAN_ARCH
166 unsigned
167 GENX(panfrost_estimate_texture_payload_size)(const struct pan_image_view *iview);
168 
169 void
170 GENX(panfrost_new_texture)(const struct panfrost_device *dev,
171                            const struct pan_image_view *iview,
172                            void *out,
173                            const struct panfrost_ptr *payload);
174 #endif
175 
176 unsigned
177 panfrost_get_layer_stride(const struct pan_image_layout *layout,
178                           unsigned level);
179 
180 unsigned
181 panfrost_texture_offset(const struct pan_image_layout *layout,
182                         unsigned level, unsigned array_idx,
183                         unsigned surface_idx);
184 
185 struct pan_pool;
186 struct pan_scoreboard;
187 
188 /* DRM modifier helper */
189 
190 #define drm_is_afbc(mod) \
191         ((mod >> 52) == (DRM_FORMAT_MOD_ARM_TYPE_AFBC | \
192                 (DRM_FORMAT_MOD_VENDOR_ARM << 4)))
193 
194 struct pan_image_explicit_layout {
195         unsigned offset;
196         unsigned line_stride;
197 };
198 
199 bool
200 pan_image_layout_init(const struct panfrost_device *dev,
201                       struct pan_image_layout *layout,
202                       uint64_t modifier,
203                       enum pipe_format format,
204                       enum mali_texture_dimension dim,
205                       unsigned width, unsigned height, unsigned depth,
206                       unsigned array_size, unsigned nr_samples,
207                       unsigned nr_slices,
208                       enum pan_image_crc_mode crc_mode,
209                       const struct pan_image_explicit_layout *explicit_layout);
210 
211 struct pan_surface {
212         union {
213                 mali_ptr data;
214                 struct {
215                         mali_ptr header;
216                         mali_ptr body;
217                 } afbc;
218         };
219 };
220 
221 void
222 pan_iview_get_surface(const struct pan_image_view *iview,
223                       unsigned level, unsigned layer, unsigned sample,
224                       struct pan_surface *surf);
225 
226 #endif
227