From 68df13f3cebe8f0fb95d437ade1ae0192e816a9e Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 24 Aug 2021 02:16:59 -0400 Subject: [PATCH] crocus: copy views before adjusting The current code overwrote the original view which meant if we had to reemit a surface the second emit would be wrong. This fixes cubemaps on gm45 and maybe some issues with 3D textures elsewhere. Fixes: f3630548f1da ("crocus: initial gallium driver for Intel gfx 4-7") Part-of: (cherry picked from commit 63138c42c5631ecf5d3c8eb3e39e33cac91df4f1) Conflicts: src/gallium/drivers/crocus/crocus_state.c --- .pick_status.json | 2 +- src/gallium/drivers/crocus/crocus_state.c | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 3f388f93627..6330cf1ec50 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -184,7 +184,7 @@ "description": "crocus: copy views before adjusting", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "f3630548f1da904ec6c63b43ece7e68afdb8867e" }, diff --git a/src/gallium/drivers/crocus/crocus_state.c b/src/gallium/drivers/crocus/crocus_state.c index 07f72c3609e..9924923ad89 100644 --- a/src/gallium/drivers/crocus/crocus_state.c +++ b/src/gallium/drivers/crocus/crocus_state.c @@ -4939,7 +4939,7 @@ emit_surface_state(struct crocus_batch *batch, struct crocus_resource *res, const struct isl_surf *in_surf, bool adjust_surf, - struct isl_view *view, + struct isl_view *in_view, bool writeable, enum isl_aux_usage aux_usage, bool blend_enable, @@ -4956,23 +4956,24 @@ emit_surface_state(struct crocus_batch *batch, reloc |= RELOC_WRITE; struct isl_surf surf = *in_surf; + struct isl_view view = *in_view; if (adjust_surf) { - if (res->base.b.target == PIPE_TEXTURE_3D && view->array_len == 1) { + if (res->base.b.target == PIPE_TEXTURE_3D && view.array_len == 1) { isl_surf_get_image_surf(isl_dev, in_surf, - view->base_level, 0, - view->base_array_layer, + view.base_level, 0, + view.base_array_layer, &surf, &offset, &tile_x_sa, &tile_y_sa); - view->base_array_layer = 0; - view->base_level = 0; + view.base_array_layer = 0; + view.base_level = 0; } else if (res->base.b.target == PIPE_TEXTURE_CUBE && devinfo->ver == 4) { isl_surf_get_image_surf(isl_dev, in_surf, - view->base_level, view->base_array_layer, + view.base_level, view.base_array_layer, 0, &surf, &offset, &tile_x_sa, &tile_y_sa); - view->base_array_layer = 0; - view->base_level = 0; + view.base_array_layer = 0; + view.base_level = 0; } else if (res->base.b.target == PIPE_TEXTURE_1D_ARRAY) surf.dim = ISL_SURF_DIM_2D; } @@ -4991,7 +4992,7 @@ emit_surface_state(struct crocus_batch *batch, isl_surf_fill_state(isl_dev, surf_state, .surf = &surf, - .view = view, + .view = &view, .address = crocus_state_reloc(batch, addr_offset + isl_dev->ss.addr_offset, res->bo, offset, reloc),