summaryrefslogtreecommitdiffstats
path: root/src/intel/isl/isl.c
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2016-06-23 21:50:22 -0700
committerJason Ekstrand <[email protected]>2016-08-17 14:46:22 -0700
commitf6c75df083a65f2525fa366396c1ac8b7e6298eb (patch)
tree57d788929c8e32d780dfc6a04421591b75c7a162 /src/intel/isl/isl.c
parent7997f4f95b59a48a579d5f57a26a89dbcc5b2c7f (diff)
isl: Fix get_image_offset_sa_gen4_2d for multisample surfaces
The function takes a logical array layer but was assuming it was a physical array layer. While we'er here, we also make it not assert-fail on gen9 3-D surfaces. Signed-off-by: Jason Ekstrand <[email protected]> Reviewed-by: Topi Pohjolainen <[email protected]>
Diffstat (limited to 'src/intel/isl/isl.c')
-rw-r--r--src/intel/isl/isl.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
index 92658ec7af7..a713eeb37ad 100644
--- a/src/intel/isl/isl.c
+++ b/src/intel/isl/isl.c
@@ -1345,13 +1345,15 @@ isl_buffer_fill_state_s(const struct isl_device *dev, void *state,
*/
static void
get_image_offset_sa_gen4_2d(const struct isl_surf *surf,
- uint32_t level, uint32_t layer,
+ uint32_t level, uint32_t logical_array_layer,
uint32_t *x_offset_sa,
uint32_t *y_offset_sa)
{
assert(level < surf->levels);
- assert(layer < surf->phys_level0_sa.array_len);
- assert(surf->phys_level0_sa.depth == 1);
+ if (surf->dim == ISL_SURF_DIM_3D)
+ assert(logical_array_layer < surf->logical_level0_px.depth);
+ else
+ assert(logical_array_layer < surf->logical_level0_px.array_len);
const struct isl_extent3d image_align_sa =
isl_surf_get_image_alignment_sa(surf);
@@ -1359,8 +1361,11 @@ get_image_offset_sa_gen4_2d(const struct isl_surf *surf,
const uint32_t W0 = surf->phys_level0_sa.width;
const uint32_t H0 = surf->phys_level0_sa.height;
+ const uint32_t phys_layer = logical_array_layer *
+ (surf->msaa_layout == ISL_MSAA_LAYOUT_ARRAY ? surf->samples : 1);
+
uint32_t x = 0;
- uint32_t y = layer * isl_surf_get_array_pitch_sa_rows(surf);
+ uint32_t y = phys_layer * isl_surf_get_array_pitch_sa_rows(surf);
for (uint32_t l = 0; l < level; ++l) {
if (l == 1) {