blob: 5420916d8dfaa7259ac9e57f1ffadae16f1cdb77 [file] [log] [blame]
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +00001/*
2 * Copyright 2018-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
Boris Brezillon154cb722019-09-14 09:58:55 +020025#include "pan_bo.h"
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +000026#include "pan_context.h"
Alyssa Rosenzweig0a9fa4b2020-04-06 19:44:58 -040027#include "pan_cmdstream.h"
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +000028#include "pan_util.h"
Tomeu Vizoso46e42462020-04-08 15:58:42 +020029#include "panfrost-quirks.h"
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +000030
31static struct mali_rt_format
32panfrost_mfbd_format(struct pipe_surface *surf)
33{
34 /* Explode details on the format */
35
36 const struct util_format_description *desc =
Alyssa Rosenzweig5cfb4242019-06-25 08:51:48 -070037 util_format_description(surf->format);
38
39 /* The swizzle for rendering is inverted from texturing */
40
41 unsigned char swizzle[4];
42 panfrost_invert_swizzle(desc->swizzle, swizzle);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +000043
Alyssa Rosenzweig4b137da2019-06-17 16:19:33 -070044 /* Fill in accordingly, defaulting to 8-bit UNORM */
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +000045
46 struct mali_rt_format fmt = {
47 .unk1 = 0x4000000,
48 .unk2 = 0x1,
49 .nr_channels = MALI_POSITIVE(desc->nr_channels),
Alyssa Rosenzweigd5079512019-06-17 15:53:09 -070050 .unk3 = 0x4,
Alyssa Rosenzweig2c479932020-07-21 18:51:07 -040051 .flags = 0x2,
Alyssa Rosenzweig5cfb4242019-06-25 08:51:48 -070052 .swizzle = panfrost_translate_swizzle_4(swizzle),
Alyssa Rosenzweigb78e04c2019-08-14 16:01:38 -070053 .no_preload = true
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +000054 };
55
Alyssa Rosenzweig4b137da2019-06-17 16:19:33 -070056 if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
57 fmt.flags |= MALI_MFBD_FORMAT_SRGB;
58
Alyssa Rosenzweigced132d2019-07-05 06:26:48 -070059 /* sRGB handled as a dedicated flag */
60 enum pipe_format linearized = util_format_linear(surf->format);
61
62 /* If RGB, we're good to go */
63 if (util_format_is_unorm8(desc))
64 return fmt;
65
Alyssa Rosenzweig31f5a432019-05-02 02:27:04 +000066 /* Set flags for alternative formats */
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -070067
Alyssa Rosenzweigced132d2019-07-05 06:26:48 -070068 switch (linearized) {
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -070069 case PIPE_FORMAT_B5G6R5_UNORM:
70 fmt.unk1 = 0x14000000;
71 fmt.nr_channels = MALI_POSITIVE(2);
72 fmt.unk3 |= 0x1;
73 break;
Alyssa Rosenzweig31f5a432019-05-02 02:27:04 +000074
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -070075 case PIPE_FORMAT_A4B4G4R4_UNORM:
76 case PIPE_FORMAT_B4G4R4A4_UNORM:
Icecream9596300122020-06-20 18:53:33 +120077 case PIPE_FORMAT_R4G4B4A4_UNORM:
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -070078 fmt.unk1 = 0x10000000;
79 fmt.unk3 = 0x5;
80 fmt.nr_channels = MALI_POSITIVE(1);
81 break;
Alyssa Rosenzweig21c863a2019-07-01 09:44:40 -070082
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -070083 case PIPE_FORMAT_R10G10B10A2_UNORM:
84 case PIPE_FORMAT_B10G10R10A2_UNORM:
85 case PIPE_FORMAT_R10G10B10X2_UNORM:
86 case PIPE_FORMAT_B10G10R10X2_UNORM:
87 fmt.unk1 = 0x08000000;
88 fmt.unk3 = 0x6;
89 fmt.nr_channels = MALI_POSITIVE(1);
90 break;
Alyssa Rosenzweig21c863a2019-07-01 09:44:40 -070091
Alyssa Rosenzweig6be9e092020-05-15 20:33:06 -040092 case PIPE_FORMAT_B5G5R5A1_UNORM:
Icecream9596300122020-06-20 18:53:33 +120093 case PIPE_FORMAT_R5G5B5A1_UNORM:
Alyssa Rosenzweig6be9e092020-05-15 20:33:06 -040094 case PIPE_FORMAT_B5G5R5X1_UNORM:
95 fmt.unk1 = 0x18000000;
96 fmt.unk3 = 0x7;
97 fmt.nr_channels = MALI_POSITIVE(2);
98 break;
99
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700100 /* Generic 8-bit */
101 case PIPE_FORMAT_R8_UINT:
102 case PIPE_FORMAT_R8_SINT:
103 fmt.unk1 = 0x80000000;
104 fmt.unk3 = 0x0;
105 fmt.nr_channels = MALI_POSITIVE(1);
106 break;
Alyssa Rosenzweigc0c709a2019-07-05 15:59:22 -0700107
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700108 /* Generic 32-bit */
109 case PIPE_FORMAT_R11G11B10_FLOAT:
110 case PIPE_FORMAT_R8G8B8A8_UINT:
111 case PIPE_FORMAT_R8G8B8A8_SINT:
112 case PIPE_FORMAT_R16G16_FLOAT:
113 case PIPE_FORMAT_R16G16_UINT:
114 case PIPE_FORMAT_R16G16_SINT:
115 case PIPE_FORMAT_R32_FLOAT:
116 case PIPE_FORMAT_R32_UINT:
117 case PIPE_FORMAT_R32_SINT:
118 case PIPE_FORMAT_R10G10B10A2_UINT:
119 fmt.unk1 = 0x88000000;
120 fmt.unk3 = 0x0;
121 fmt.nr_channels = MALI_POSITIVE(4);
122 break;
Alyssa Rosenzweig21c863a2019-07-01 09:44:40 -0700123
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700124 /* Generic 16-bit */
125 case PIPE_FORMAT_R8G8_UINT:
126 case PIPE_FORMAT_R8G8_SINT:
127 case PIPE_FORMAT_R16_FLOAT:
128 case PIPE_FORMAT_R16_UINT:
129 case PIPE_FORMAT_R16_SINT:
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700130 fmt.unk1 = 0x84000000;
131 fmt.unk3 = 0x0;
132 fmt.nr_channels = MALI_POSITIVE(2);
133 break;
Alyssa Rosenzweig21c863a2019-07-01 09:44:40 -0700134
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700135 /* Generic 64-bit */
136 case PIPE_FORMAT_R32G32_FLOAT:
137 case PIPE_FORMAT_R32G32_SINT:
138 case PIPE_FORMAT_R32G32_UINT:
139 case PIPE_FORMAT_R16G16B16A16_FLOAT:
140 case PIPE_FORMAT_R16G16B16A16_SINT:
141 case PIPE_FORMAT_R16G16B16A16_UINT:
142 fmt.unk1 = 0x8c000000;
143 fmt.unk3 = 0x1;
144 fmt.nr_channels = MALI_POSITIVE(2);
145 break;
Alyssa Rosenzweigc2ee9372019-07-03 12:34:32 -0700146
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700147 /* Generic 128-bit */
148 case PIPE_FORMAT_R32G32B32A32_FLOAT:
149 case PIPE_FORMAT_R32G32B32A32_SINT:
150 case PIPE_FORMAT_R32G32B32A32_UINT:
151 fmt.unk1 = 0x90000000;
152 fmt.unk3 = 0x1;
153 fmt.nr_channels = MALI_POSITIVE(4);
154 break;
Alyssa Rosenzweigced132d2019-07-05 06:26:48 -0700155
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700156 default:
157 unreachable("Invalid format rendering");
Alyssa Rosenzweig31f5a432019-05-02 02:27:04 +0000158 }
159
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000160 return fmt;
161}
162
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000163
164static void
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000165panfrost_mfbd_clear(
Boris Brezillon2c526992019-09-05 21:41:26 +0200166 struct panfrost_batch *batch,
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500167 struct mali_framebuffer *fb,
168 struct mali_framebuffer_extra *fbx,
169 struct mali_render_target *rts,
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700170 unsigned rt_count)
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000171{
Alyssa Rosenzweig81a31912020-04-06 19:45:30 -0400172 struct panfrost_context *ctx = batch->ctx;
173 struct pipe_context *gallium = (struct pipe_context *) ctx;
174 struct panfrost_device *dev = pan_device(gallium->screen);
175
Alyssa Rosenzweig8e4e4672019-07-01 11:49:06 -0700176 for (unsigned i = 0; i < rt_count; ++i) {
Boris Brezillon2c526992019-09-05 21:41:26 +0200177 if (!(batch->clear & (PIPE_CLEAR_COLOR0 << i)))
Alyssa Rosenzweig8e4e4672019-07-01 11:49:06 -0700178 continue;
179
Boris Brezillon2c526992019-09-05 21:41:26 +0200180 rts[i].clear_color_1 = batch->clear_color[i][0];
181 rts[i].clear_color_2 = batch->clear_color[i][1];
182 rts[i].clear_color_3 = batch->clear_color[i][2];
183 rts[i].clear_color_4 = batch->clear_color[i][3];
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000184 }
185
Boris Brezillon2c526992019-09-05 21:41:26 +0200186 if (batch->clear & PIPE_CLEAR_DEPTH) {
187 fb->clear_depth = batch->clear_depth;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000188 }
189
Boris Brezillon2c526992019-09-05 21:41:26 +0200190 if (batch->clear & PIPE_CLEAR_STENCIL) {
191 fb->clear_stencil = batch->clear_stencil;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000192 }
Alyssa Rosenzweig81a31912020-04-06 19:45:30 -0400193
194 if (dev->quirks & IS_BIFROST) {
195 fbx->clear_color_1 = batch->clear_color[0][0];
196 fbx->clear_color_2 = 0xc0000000 | (fbx->clear_color_1 & 0xffff); /* WTF? */
197 }
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000198}
199
200static void
201panfrost_mfbd_set_cbuf(
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500202 struct mali_render_target *rt,
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700203 struct pipe_surface *surf)
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000204{
205 struct panfrost_resource *rsrc = pan_resource(surf->texture);
Alyssa Rosenzweigf5124892020-05-26 18:20:56 -0400206 struct panfrost_device *dev = pan_device(surf->context->screen);
207 bool is_bifrost = dev->quirks & IS_BIFROST;
Alyssa Rosenzweigd4aed002019-06-12 15:23:19 -0700208
209 unsigned level = surf->u.tex.level;
Alyssa Rosenzweig65bc56b2019-06-21 17:23:49 -0700210 unsigned first_layer = surf->u.tex.first_layer;
Alyssa Rosenzweig64b7bd32019-06-21 17:39:02 -0700211 assert(surf->u.tex.last_layer == first_layer);
Boris Brezillonaa5bc352019-07-02 11:37:40 +0200212 int stride = rsrc->slices[level].stride;
Alyssa Rosenzweig65bc56b2019-06-21 17:23:49 -0700213
Alyssa Rosenzweigb75427c2020-07-21 18:54:18 -0400214 /* Only set layer_stride for layered MSAA rendering */
Alyssa Rosenzweig211cc252020-06-30 16:49:52 -0400215
Alyssa Rosenzweigb75427c2020-07-21 18:54:18 -0400216 unsigned nr_samples = surf->texture->nr_samples;
Alyssa Rosenzweig211cc252020-06-30 16:49:52 -0400217 unsigned layer_stride = (nr_samples > 1) ? rsrc->slices[level].size0 : 0;
218
Alyssa Rosenzweig41c06de2020-06-30 16:43:32 -0400219 mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000220
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000221 rt->format = panfrost_mfbd_format(surf);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000222
Alyssa Rosenzweigbb577052020-07-03 12:04:53 -0400223 if (layer_stride)
Alyssa Rosenzweig2c479932020-07-21 18:51:07 -0400224 rt->format.msaa = MALI_MSAA_LAYERED;
225 else if (surf->nr_samples)
226 rt->format.msaa = MALI_MSAA_AVERAGE;
227 else
228 rt->format.msaa = MALI_MSAA_SINGLE;
Alyssa Rosenzweigbb577052020-07-03 12:04:53 -0400229
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400230 /* Now, we set the modifier specific pieces */
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000231
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400232 if (rsrc->modifier == DRM_FORMAT_MOD_LINEAR) {
Alyssa Rosenzweigf5124892020-05-26 18:20:56 -0400233 if (is_bifrost) {
234 rt->format.unk4 = 0x1;
235 } else {
Alyssa Rosenzweigc9bdba22020-08-11 21:00:47 -0400236 rt->format.block = MALI_BLOCK_FORMAT_LINEAR;
Alyssa Rosenzweigf5124892020-05-26 18:20:56 -0400237 }
238
Alyssa Rosenzweig65bc56b2019-06-21 17:23:49 -0700239 rt->framebuffer = base;
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000240 rt->framebuffer_stride = stride / 16;
Alyssa Rosenzweig211cc252020-06-30 16:49:52 -0400241 rt->layer_stride = layer_stride;
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400242 } else if (rsrc->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED) {
Alyssa Rosenzweigf5124892020-05-26 18:20:56 -0400243 if (is_bifrost) {
244 rt->format.unk3 |= 0x8;
245 } else {
Boris Brezillon76096c72020-09-03 17:26:49 +0200246 rt->format.block = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED;
Alyssa Rosenzweigf5124892020-05-26 18:20:56 -0400247 }
248
Alyssa Rosenzweig65bc56b2019-06-21 17:23:49 -0700249 rt->framebuffer = base;
Alyssa Rosenzweig01e1eec2019-06-17 15:56:48 -0700250 rt->framebuffer_stride = stride;
Alyssa Rosenzweig211cc252020-06-30 16:49:52 -0400251 rt->layer_stride = layer_stride;
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400252 } else if (drm_is_afbc(rsrc->modifier)) {
Alyssa Rosenzweigc9bdba22020-08-11 21:00:47 -0400253 rt->format.block = MALI_BLOCK_FORMAT_AFBC;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000254
Boris Brezillonaa5bc352019-07-02 11:37:40 +0200255 unsigned header_size = rsrc->slices[level].header_size;
Alyssa Rosenzweig3609b502019-06-21 14:54:44 -0700256
257 rt->framebuffer = base + header_size;
Alyssa Rosenzweig211cc252020-06-30 16:49:52 -0400258 rt->layer_stride = layer_stride;
Alyssa Rosenzweig3609b502019-06-21 14:54:44 -0700259 rt->afbc.metadata = base;
260 rt->afbc.stride = 0;
Icecream9599446c92020-06-02 14:14:12 +1200261 rt->afbc.flags = MALI_AFBC_FLAGS;
262
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400263 if (rsrc->modifier & AFBC_FORMAT_MOD_YTR)
264 rt->afbc.flags |= MALI_AFBC_YTR;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000265
Alyssa Rosenzweigd6099492019-07-15 15:35:30 -0700266 /* TODO: The blob sets this to something nonzero, but it's not
267 * clear what/how to calculate/if it matters */
268 rt->framebuffer_stride = 0;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000269 } else {
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400270 unreachable("Invalid mod");
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000271 }
272}
273
274static void
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000275panfrost_mfbd_set_zsbuf(
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500276 struct mali_framebuffer *fb,
277 struct mali_framebuffer_extra *fbx,
Alyssa Rosenzweiga2d0ea92019-07-10 10:10:31 -0700278 struct pipe_surface *surf)
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000279{
Alyssa Rosenzweig76e871d2020-05-26 18:19:19 -0400280 struct panfrost_device *dev = pan_device(surf->context->screen);
281 bool is_bifrost = dev->quirks & IS_BIFROST;
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000282 struct panfrost_resource *rsrc = pan_resource(surf->texture);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000283
Alyssa Rosenzweigb75427c2020-07-21 18:54:18 -0400284 unsigned nr_samples = surf->texture->nr_samples;
Alyssa Rosenzweig64734c02020-07-15 12:02:32 -0400285 nr_samples = MAX2(nr_samples, 1);
286
287 fbx->zs_samples = MALI_POSITIVE(nr_samples);
288
Alyssa Rosenzweigd4aed002019-06-12 15:23:19 -0700289 unsigned level = surf->u.tex.level;
Alyssa Rosenzweigef008492020-01-03 14:15:28 -0500290 unsigned first_layer = surf->u.tex.first_layer;
291 assert(surf->u.tex.last_layer == first_layer);
Alyssa Rosenzweigd4aed002019-06-12 15:23:19 -0700292
Alyssa Rosenzweig41c06de2020-06-30 16:43:32 -0400293 mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
Alyssa Rosenzweigd4aed002019-06-12 15:23:19 -0700294
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400295 if (drm_is_afbc(rsrc->modifier)) {
Alyssa Rosenzweig507e2972019-07-10 14:50:48 -0700296 /* The only Z/S format we can compress is Z24S8 or variants
Marek Olšák8c9b9aa2019-12-03 20:38:14 -0500297 * thereof (handled by the gallium frontend) */
Alyssa Rosenzweig1aaf68d2019-07-15 07:10:31 -0700298 assert(panfrost_is_z24s8_variant(surf->format));
Alyssa Rosenzweig507e2972019-07-10 14:50:48 -0700299
Boris Brezillonaa5bc352019-07-02 11:37:40 +0200300 unsigned header_size = rsrc->slices[level].header_size;
Alyssa Rosenzweig3609b502019-06-21 14:54:44 -0700301
Alyssa Rosenzweig528e1322020-07-03 13:17:35 -0400302 fb->mfbd_flags |= MALI_MFBD_EXTRA | MALI_MFBD_DEPTH_WRITE;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000303
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500304 fbx->flags_hi |= MALI_EXTRA_PRESENT;
305 fbx->flags_lo |= MALI_EXTRA_ZS | 0x1; /* unknown */
Alyssa Rosenzweigc9bdba22020-08-11 21:00:47 -0400306 fbx->zs_block = MALI_BLOCK_FORMAT_AFBC;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000307
Alyssa Rosenzweig3609b502019-06-21 14:54:44 -0700308 fbx->ds_afbc.depth_stencil = base + header_size;
309 fbx->ds_afbc.depth_stencil_afbc_metadata = base;
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000310 fbx->ds_afbc.depth_stencil_afbc_stride = 0;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000311
Icecream959ac106d2020-06-02 14:13:03 +1200312 fbx->ds_afbc.flags = MALI_AFBC_FLAGS;
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000313 fbx->ds_afbc.padding = 0x1000;
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400314 } else {
315 assert(rsrc->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED || rsrc->modifier == DRM_FORMAT_MOD_LINEAR);
Alyssa Rosenzweig507e2972019-07-10 14:50:48 -0700316 /* TODO: Z32F(S8) support, which is always linear */
317
Boris Brezillonaa5bc352019-07-02 11:37:40 +0200318 int stride = rsrc->slices[level].stride;
Alyssa Rosenzweigd4aed002019-06-12 15:23:19 -0700319
Alyssa Rosenzweig3b7aeb22020-07-03 12:04:36 -0400320 unsigned layer_stride = (nr_samples > 1) ? rsrc->slices[level].size0 : 0;
321
Alyssa Rosenzweig528e1322020-07-03 13:17:35 -0400322 fb->mfbd_flags |= MALI_MFBD_EXTRA | MALI_MFBD_DEPTH_WRITE;
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500323 fbx->flags_hi |= MALI_EXTRA_PRESENT;
324 fbx->flags_lo |= MALI_EXTRA_ZS;
Alyssa Rosenzweig9bf60242019-03-12 22:49:33 +0000325
Alyssa Rosenzweigef008492020-01-03 14:15:28 -0500326 fbx->ds_linear.depth = base;
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500327
Alyssa Rosenzweig965537df2020-07-22 10:23:50 -0400328 if (rsrc->modifier == DRM_FORMAT_MOD_LINEAR) {
Alyssa Rosenzweigc9bdba22020-08-11 21:00:47 -0400329 fbx->zs_block = MALI_BLOCK_FORMAT_LINEAR;
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500330 fbx->ds_linear.depth_stride = stride / 16;
Alyssa Rosenzweig3b7aeb22020-07-03 12:04:36 -0400331 fbx->ds_linear.depth_layer_stride = layer_stride;
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500332 } else {
Alyssa Rosenzweig76e871d2020-05-26 18:19:19 -0400333 if (is_bifrost) {
Alyssa Rosenzweigc9bdba22020-08-11 21:00:47 -0400334 /* XXX: Bifrost fields are different here */
335 fbx->zs_block = 1;
Alyssa Rosenzweige061bf02020-07-15 11:57:35 -0400336 fbx->flags_hi |= 0x440;
Alyssa Rosenzweig76e871d2020-05-26 18:19:19 -0400337 fbx->flags_lo |= 0x1;
338 } else {
Boris Brezillon76096c72020-09-03 17:26:49 +0200339 fbx->zs_block = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED;
Alyssa Rosenzweig76e871d2020-05-26 18:19:19 -0400340 }
341
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500342 fbx->ds_linear.depth_stride = stride;
Alyssa Rosenzweig3b7aeb22020-07-03 12:04:36 -0400343 fbx->ds_linear.depth_layer_stride = layer_stride;
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500344 }
Alyssa Rosenzweig1aaf68d2019-07-15 07:10:31 -0700345
346 if (panfrost_is_z24s8_variant(surf->format)) {
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500347 fbx->flags_lo |= 0x1;
Alyssa Rosenzweig676b9332019-07-17 15:49:42 -0700348 } else if (surf->format == PIPE_FORMAT_Z32_FLOAT) {
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500349 fbx->flags_lo |= 0xA;
Alyssa Rosenzweig676b9332019-07-17 15:49:42 -0700350 fb->mfbd_flags ^= 0x100;
351 fb->mfbd_flags |= 0x200;
352 } else if (surf->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) {
Alyssa Rosenzweige061bf02020-07-15 11:57:35 -0400353 fbx->flags_hi |= 0x40;
Alyssa Rosenzweig6bd9c4d2020-01-10 13:12:35 -0500354 fbx->flags_lo |= 0xA;
Alyssa Rosenzweig676b9332019-07-17 15:49:42 -0700355 fb->mfbd_flags ^= 0x100;
356 fb->mfbd_flags |= 0x201;
357
358 struct panfrost_resource *stencil = rsrc->separate_stencil;
359 struct panfrost_slice stencil_slice = stencil->slices[level];
Alyssa Rosenzweig3b7aeb22020-07-03 12:04:36 -0400360 unsigned stencil_layer_stride = (nr_samples > 1) ? stencil_slice.size0 : 0;
Alyssa Rosenzweig676b9332019-07-17 15:49:42 -0700361
Alyssa Rosenzweig41c06de2020-06-30 16:43:32 -0400362 fbx->ds_linear.stencil = panfrost_get_texture_address(stencil, level, first_layer, 0);
Alyssa Rosenzweig676b9332019-07-17 15:49:42 -0700363 fbx->ds_linear.stencil_stride = stencil_slice.stride;
Alyssa Rosenzweig3b7aeb22020-07-03 12:04:36 -0400364 fbx->ds_linear.stencil_layer_stride = stencil_layer_stride;
Alyssa Rosenzweig1aaf68d2019-07-15 07:10:31 -0700365 }
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000366 }
367}
368
369/* Helper for sequential uploads used for MFBD */
370
371#define UPLOAD(dest, offset, src, max) { \
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000372 size_t sz = sizeof(*src); \
373 memcpy(dest.cpu + offset, src, sz); \
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000374 assert((offset + sz) <= max); \
375 offset += sz; \
376}
377
378static mali_ptr
Boris Brezillonaa851a62019-09-01 10:30:39 +0200379panfrost_mfbd_upload(struct panfrost_batch *batch,
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500380 struct mali_framebuffer *fb,
381 struct mali_framebuffer_extra *fbx,
382 struct mali_render_target *rts,
Alyssa Rosenzweig6ed38432019-08-09 15:12:30 -0700383 unsigned rt_count)
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000384{
385 off_t offset = 0;
386
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000387 /* There may be extra data stuck in the middle */
Alyssa Rosenzweigac689462019-06-14 11:14:01 -0700388 bool has_extra = fb->mfbd_flags & MALI_MFBD_EXTRA;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000389
390 /* Compute total size for transfer */
391
392 size_t total_sz =
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500393 sizeof(struct mali_framebuffer) +
394 (has_extra ? sizeof(struct mali_framebuffer_extra) : 0) +
Icecream953ec252a2020-07-14 12:05:47 +1200395 sizeof(struct mali_render_target) * 8;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000396
397 struct panfrost_transfer m_f_trans =
Alyssa Rosenzweig373a2042020-08-17 14:27:57 -0400398 panfrost_pool_alloc_aligned(&batch->pool, total_sz, 64);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000399
400 /* Do the transfer */
401
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000402 UPLOAD(m_f_trans, offset, fb, total_sz);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000403
404 if (has_extra)
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000405 UPLOAD(m_f_trans, offset, fbx, total_sz);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000406
Icecream953ec252a2020-07-14 12:05:47 +1200407 for (unsigned c = 0; c < 8; ++c) {
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000408 UPLOAD(m_f_trans, offset, &rts[c], total_sz);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000409 }
410
Alyssa Rosenzweig79e474f2019-03-13 00:53:18 +0000411 /* Return pointer suitable for the fragment section */
Alyssa Rosenzweig6ed38432019-08-09 15:12:30 -0700412 unsigned tag =
413 MALI_MFBD |
Alyssa Rosenzweigf06e8f72019-08-21 12:06:50 -0700414 (has_extra ? MALI_MFBD_TAG_EXTRA : 0) |
Alyssa Rosenzweig6ed38432019-08-09 15:12:30 -0700415 (MALI_POSITIVE(rt_count) << 2);
416
417 return m_f_trans.gpu | tag;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000418}
419
420#undef UPLOAD
421
Alyssa Rosenzweiga0003c32020-07-09 17:35:24 -0400422/* Determines the # of bytes per pixel we need to reserve for a given format in
423 * the tilebuffer (compared to 128-bit budget, etc). Usually the same as the
424 * bytes per pixel of the format itself, but there are some special cases I
425 * don't understand. */
426
427static unsigned
428pan_bytes_per_pixel_tib(enum pipe_format format)
429{
430 const struct util_format_description *desc =
431 util_format_description(format);
432
433 if (util_format_is_unorm8(desc) || format == PIPE_FORMAT_B5G6R5_UNORM)
434 return 4;
435
436 return desc->block.bits / 8;
437}
438
Alyssa Rosenzweig6aa7f672020-05-14 19:53:33 -0400439/* Determines whether a framebuffer uses too much tilebuffer space (requiring
440 * us to scale up the tile at a performance penalty). This is conservative but
441 * afaict you get 128-bits per pixel normally */
442
Icecream95978f9632020-07-14 11:50:10 +1200443static unsigned
444pan_tib_size(struct panfrost_batch *batch)
Alyssa Rosenzweig6aa7f672020-05-14 19:53:33 -0400445{
446 unsigned size = 0;
447
448 for (int cb = 0; cb < batch->key.nr_cbufs; ++cb) {
449 struct pipe_surface *surf = batch->key.cbufs[cb];
450 assert(surf);
Alyssa Rosenzweiga0003c32020-07-09 17:35:24 -0400451 size += pan_bytes_per_pixel_tib(surf->format);
Alyssa Rosenzweig6aa7f672020-05-14 19:53:33 -0400452 }
453
Icecream95978f9632020-07-14 11:50:10 +1200454 return size;
455}
456
457static unsigned
458pan_tib_shift(struct panfrost_batch *batch)
459{
460 unsigned size = pan_tib_size(batch);
461
462 if (size > 128)
463 return 4;
464 else if (size > 64)
465 return 5;
466 else if (size > 32)
467 return 6;
468 else if (size > 16)
469 return 7;
470 else
471 return 8;
Alyssa Rosenzweig6aa7f672020-05-14 19:53:33 -0400472}
473
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500474static struct mali_framebuffer
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500475panfrost_emit_mfbd(struct panfrost_batch *batch, unsigned vertex_count)
476{
Alyssa Rosenzweig4f7fddb2019-12-09 11:02:15 -0500477 struct panfrost_context *ctx = batch->ctx;
478 struct pipe_context *gallium = (struct pipe_context *) ctx;
Alyssa Rosenzweigca8c6252020-03-23 18:44:21 -0400479 struct panfrost_device *dev = pan_device(gallium->screen);
Alyssa Rosenzweig4f7fddb2019-12-09 11:02:15 -0500480
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500481 unsigned width = batch->key.width;
482 unsigned height = batch->key.height;
483
Alyssa Rosenzweig0a9fa4b2020-04-06 19:44:58 -0400484 struct mali_framebuffer mfbd = {
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500485 .width1 = MALI_POSITIVE(width),
486 .height1 = MALI_POSITIVE(height),
487 .width2 = MALI_POSITIVE(width),
488 .height2 = MALI_POSITIVE(height),
489
Icecream95978f9632020-07-14 11:50:10 +1200490 /* Configures tib size */
491 .unk1 = (pan_tib_shift(batch) << 9) | 0x80,
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500492
Alyssa Rosenzweig9addb822020-07-14 17:08:54 -0400493 .rt_count_1 = MALI_POSITIVE(MAX2(batch->key.nr_cbufs, 1)),
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500494 .rt_count_2 = 4,
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500495 };
496
Alyssa Rosenzweig0a9fa4b2020-04-06 19:44:58 -0400497 if (dev->quirks & IS_BIFROST) {
498 mfbd.msaa.sample_locations = panfrost_emit_sample_locations(batch);
Boris Brezillonefce73d2020-09-08 10:11:26 +0200499 mfbd.tiler_meta = panfrost_batch_get_bifrost_tiler(batch, vertex_count);
Alyssa Rosenzweig0a9fa4b2020-04-06 19:44:58 -0400500 } else {
Boris Brezillon3a06fc32020-09-03 09:18:09 +0200501 struct mali_local_storage_packed lsp;
502
503 pan_pack(&lsp, LOCAL_STORAGE, ls) {
504 if (batch->stack_size) {
505 unsigned shift =
506 panfrost_get_stack_shift(batch->stack_size);
507 struct panfrost_bo *bo =
508 panfrost_batch_get_scratchpad(batch,
509 batch->stack_size,
510 dev->thread_tls_alloc,
511 dev->core_count);
512 ls.tls_size = shift;
513 ls.tls_base_pointer = bo->gpu;
514 }
515
516 ls.wls_instances = MALI_LOCAL_STORAGE_NO_WORKGROUP_MEM;
Alyssa Rosenzweigb41692c2020-08-17 12:30:49 -0400517 }
Boris Brezillon3a06fc32020-09-03 09:18:09 +0200518 mfbd.shared_memory = lsp;
Boris Brezillone8556982020-09-05 18:16:37 +0200519
520 struct mali_midgard_tiler_packed t;
521 panfrost_emit_midg_tiler(batch, &t, vertex_count);
522 mfbd.tiler = t;
Alyssa Rosenzweig0a9fa4b2020-04-06 19:44:58 -0400523 }
524
525 return mfbd;
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500526}
527
528void
529panfrost_attach_mfbd(struct panfrost_batch *batch, unsigned vertex_count)
530{
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500531 struct mali_framebuffer mfbd =
Alyssa Rosenzweigb0e915b2019-12-09 11:00:42 -0500532 panfrost_emit_mfbd(batch, vertex_count);
533
534 memcpy(batch->framebuffer.cpu, &mfbd, sizeof(mfbd));
535}
536
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000537/* Creates an MFBD for the FRAGMENT section of the bound framebuffer */
538
539mali_ptr
Boris Brezillonaa851a62019-09-01 10:30:39 +0200540panfrost_mfbd_fragment(struct panfrost_batch *batch, bool has_draws)
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000541{
Alyssa Rosenzweigaeb58012020-05-26 18:16:51 -0400542 struct panfrost_device *dev = pan_device(batch->ctx->base.screen);
543 bool is_bifrost = dev->quirks & IS_BIFROST;
544
Alyssa Rosenzweig6d9ee3e2020-02-10 08:51:37 -0500545 struct mali_framebuffer fb = panfrost_emit_mfbd(batch, has_draws);
546 struct mali_framebuffer_extra fbx = {0};
Icecream953ec252a2020-07-14 12:05:47 +1200547 struct mali_render_target rts[8] = {0};
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000548
Alyssa Rosenzweig0395b582019-07-18 12:43:39 -0700549 /* We always upload at least one dummy GL_NONE render target */
550
Boris Brezillonaa851a62019-09-01 10:30:39 +0200551 unsigned rt_descriptors = MAX2(batch->key.nr_cbufs, 1);
Alyssa Rosenzweig0395b582019-07-18 12:43:39 -0700552
553 fb.rt_count_1 = MALI_POSITIVE(rt_descriptors);
Alyssa Rosenzweigac689462019-06-14 11:14:01 -0700554 fb.mfbd_flags = 0x100;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000555
Alyssa Rosenzweiga0003c32020-07-09 17:35:24 -0400556 panfrost_mfbd_clear(batch, &fb, &fbx, rts, rt_descriptors);
Alyssa Rosenzweigf475b792019-07-18 11:09:19 -0700557
558 /* Upload either the render target or a dummy GL_NONE target */
559
Alyssa Rosenzweiga0003c32020-07-09 17:35:24 -0400560 unsigned offset = 0;
Icecream95978f9632020-07-14 11:50:10 +1200561 unsigned tib_shift = pan_tib_shift(batch);
Alyssa Rosenzweiga0003c32020-07-09 17:35:24 -0400562
Alyssa Rosenzweigf475b792019-07-18 11:09:19 -0700563 for (int cb = 0; cb < rt_descriptors; ++cb) {
Boris Brezillonaa851a62019-09-01 10:30:39 +0200564 struct pipe_surface *surf = batch->key.cbufs[cb];
Icecream95978f9632020-07-14 11:50:10 +1200565 unsigned rt_offset = offset << tib_shift;
Alyssa Rosenzweig227c3952019-07-18 10:59:59 -0700566
Alyssa Rosenzweig293f2512020-07-09 13:42:25 -0400567 if (surf && ((batch->clear | batch->draws) & (PIPE_CLEAR_COLOR0 << cb))) {
Alyssa Rosenzweigb75427c2020-07-21 18:54:18 -0400568 if (MAX2(surf->nr_samples, surf->texture->nr_samples) > 1)
Alyssa Rosenzweigbb577052020-07-03 12:04:53 -0400569 batch->requirements |= PAN_REQ_MSAA;
570
Alyssa Rosenzweigf475b792019-07-18 11:09:19 -0700571 panfrost_mfbd_set_cbuf(&rts[cb], surf);
Alyssa Rosenzweig227c3952019-07-18 10:59:59 -0700572
Alyssa Rosenzweiga0003c32020-07-09 17:35:24 -0400573 offset += pan_bytes_per_pixel_tib(surf->format);
Alyssa Rosenzweigf475b792019-07-18 11:09:19 -0700574 } else {
575 struct mali_rt_format null_rt = {
576 .unk1 = 0x4000000,
Alyssa Rosenzweigb78e04c2019-08-14 16:01:38 -0700577 .no_preload = true
Alyssa Rosenzweigf475b792019-07-18 11:09:19 -0700578 };
Alyssa Rosenzweig7647e562019-07-02 09:54:23 -0700579
Alyssa Rosenzweigaeb58012020-05-26 18:16:51 -0400580 if (is_bifrost) {
Alyssa Rosenzweig2c479932020-07-21 18:51:07 -0400581 null_rt.flags = 0x2;
Alyssa Rosenzweigaeb58012020-05-26 18:16:51 -0400582 null_rt.unk3 = 0x8;
583 }
584
Alyssa Rosenzweigf475b792019-07-18 11:09:19 -0700585 rts[cb].format = null_rt;
586 rts[cb].framebuffer = 0;
587 rts[cb].framebuffer_stride = 0;
588 }
Alyssa Rosenzweig0395b582019-07-18 12:43:39 -0700589
590 /* TODO: Break out the field */
Icecream95978f9632020-07-14 11:50:10 +1200591 rts[cb].format.unk1 |= rt_offset;
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000592 }
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000593
Icecream95978f9632020-07-14 11:50:10 +1200594 fb.rt_count_2 = MAX2(DIV_ROUND_UP(offset, 1 << (10 - tib_shift)), 1);
Alyssa Rosenzweiga0003c32020-07-09 17:35:24 -0400595
Alyssa Rosenzweig293f2512020-07-09 13:42:25 -0400596 if (batch->key.zsbuf && ((batch->clear | batch->draws) & PIPE_CLEAR_DEPTHSTENCIL)) {
Alyssa Rosenzweigb75427c2020-07-21 18:54:18 -0400597 if (MAX2(batch->key.zsbuf->nr_samples, batch->key.zsbuf->nr_samples) > 1)
598 batch->requirements |= PAN_REQ_MSAA;
599
Boris Brezillonaa851a62019-09-01 10:30:39 +0200600 panfrost_mfbd_set_zsbuf(&fb, &fbx, batch->key.zsbuf);
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000601 }
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000602
Alyssa Rosenzweig8c268902019-03-12 23:16:37 +0000603 /* When scanning out, the depth buffer is immediately invalidated, so
604 * we don't need to waste bandwidth writing it out. This can improve
Alyssa Rosenzweig82792ef2020-05-15 19:16:56 -0400605 * performance substantially (Z24X8_UNORM 1080p @ 60fps is 475 MB/s of
Alyssa Rosenzweig8c268902019-03-12 23:16:37 +0000606 * memory bandwidth!).
607 *
608 * The exception is ReadPixels, but this is not supported on GLES so we
609 * can safely ignore it. */
610
Boris Brezillone46d95d2019-09-01 10:54:38 +0200611 if (panfrost_batch_is_scanout(batch))
Boris Brezillon2c526992019-09-05 21:41:26 +0200612 batch->requirements &= ~PAN_REQ_DEPTH_WRITE;
Alyssa Rosenzweig8c268902019-03-12 23:16:37 +0000613
614 /* Actualize the requirements */
615
Boris Brezillon2c526992019-09-05 21:41:26 +0200616 if (batch->requirements & PAN_REQ_MSAA) {
Alyssa Rosenzweigc119c282019-03-12 22:41:11 +0000617 /* XXX */
618 fb.unk1 |= (1 << 4) | (1 << 1);
619 fb.rt_count_2 = 4;
620 }
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000621
Boris Brezillon2c526992019-09-05 21:41:26 +0200622 if (batch->requirements & PAN_REQ_DEPTH_WRITE)
Alyssa Rosenzweigac689462019-06-14 11:14:01 -0700623 fb.mfbd_flags |= MALI_MFBD_DEPTH_WRITE;
Alyssa Rosenzweig8c268902019-03-12 23:16:37 +0000624
Alyssa Rosenzweig3e6c6bb2019-06-24 07:08:52 -0700625 /* Checksumming only works with a single render target */
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000626
Boris Brezillonaa851a62019-09-01 10:30:39 +0200627 if (batch->key.nr_cbufs == 1) {
628 struct pipe_surface *surf = batch->key.cbufs[0];
Alyssa Rosenzweig3e6c6bb2019-06-24 07:08:52 -0700629 struct panfrost_resource *rsrc = pan_resource(surf->texture);
Alyssa Rosenzweig3e6c6bb2019-06-24 07:08:52 -0700630
Boris Brezillonaa5bc352019-07-02 11:37:40 +0200631 if (rsrc->checksummed) {
Alyssa Rosenzweig3e6c6bb2019-06-24 07:08:52 -0700632 unsigned level = surf->u.tex.level;
Boris Brezillonaa5bc352019-07-02 11:37:40 +0200633 struct panfrost_slice *slice = &rsrc->slices[level];
Alyssa Rosenzweig3e6c6bb2019-06-24 07:08:52 -0700634
Alyssa Rosenzweigac689462019-06-14 11:14:01 -0700635 fb.mfbd_flags |= MALI_MFBD_EXTRA;
Alyssa Rosenzweig3a8e5eb2020-05-21 19:53:34 -0400636 fbx.flags_hi |= MALI_EXTRA_PRESENT;
Alyssa Rosenzweig3e6c6bb2019-06-24 07:08:52 -0700637 fbx.checksum_stride = slice->checksum_stride;
Tomeu Vizoso4d581a42020-04-27 16:49:22 +0200638 if (slice->checksum_bo)
639 fbx.checksum = slice->checksum_bo->gpu;
640 else
641 fbx.checksum = rsrc->bo->gpu + slice->checksum_offset;
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000642 }
643 }
644
Boris Brezillonaa851a62019-09-01 10:30:39 +0200645 return panfrost_mfbd_upload(batch, &fb, &fbx, rts, rt_descriptors);
Alyssa Rosenzweig9dd84db2019-03-12 03:32:17 +0000646}