panfrost: Use size0 when calculating the offset to a depth level
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 4 Feb 2020 09:31:28 +0000 (10:31 +0100)
committerTomeu Vizoso <tomeu.vizoso@collabora.com>
Tue, 4 Feb 2020 14:46:30 +0000 (15:46 +0100)
Previously, we were using cubemap_stride and sometimes overwriting other
BOs such as shaders.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3692>

src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_resource.c

index 585fefa70660ff8a78816a33a61a053a7cac0fd5..169e5956c2f3e5d937b5b30590cc133a468013e0 100644 (file)
@@ -589,9 +589,8 @@ panfrost_upload_tex(
                 for (unsigned l = first_level; l <= last_level; ++l) {
                         for (unsigned f = first_face; f <= last_face; ++f) {
                                 pointers_and_strides[idx++] =
-                                        panfrost_get_texture_address(rsrc, l, w*face_mult + f)
+                                        panfrost_get_texture_address(rsrc, l, w * face_mult + f)
                                                 + afbc_bit + view->astc_stretch;
-
                                 if (has_manual_stride) {
                                         pointers_and_strides[idx++] =
                                                 rsrc->slices[l].stride;
index aac1e8cf19d53c185c703507808aff9d0324d4cf..6d5c9ab5cbd2d39851005acccf9fde366f442aac 100644 (file)
@@ -555,6 +555,15 @@ panfrost_resource_destroy(struct pipe_screen *screen,
         ralloc_free(rsrc);
 }
 
+static unsigned
+panfrost_get_layer_stride(struct panfrost_resource *rsrc, unsigned level)
+{
+        if (rsrc->base.target == PIPE_TEXTURE_3D)
+                return rsrc->slices[level].size0;
+        else
+                return rsrc->cubemap_stride;
+}
+
 static void *
 panfrost_transfer_map(struct pipe_context *pctx,
                       struct pipe_resource *resource,
@@ -679,10 +688,7 @@ panfrost_transfer_map(struct pipe_context *pctx,
                 return transfer->map;
         } else {
                 transfer->base.stride = rsrc->slices[level].stride;
-                if (resource->target == PIPE_TEXTURE_3D)
-                        transfer->base.layer_stride = rsrc->slices[level].size0;
-                else
-                        transfer->base.layer_stride = rsrc->cubemap_stride;
+                transfer->base.layer_stride = panfrost_get_layer_stride(rsrc, level);
 
                 /* By mapping direct-write, we're implicitly already
                  * initialized (maybe), so be conservative */
@@ -830,7 +836,7 @@ panfrost_get_texture_address(
         unsigned level, unsigned face)
 {
         unsigned level_offset = rsrc->slices[level].offset;
-        unsigned face_offset = face * rsrc->cubemap_stride;
+        unsigned face_offset = face * panfrost_get_layer_stride(rsrc, level);
 
         return rsrc->bo->gpu + level_offset + face_offset;
 }