diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 3e5a543918e..4dee0bc4b1c 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -2823,6 +2823,21 @@ iris_create_surface(struct pipe_context *ctx, &res->surf, view, &isl_surf, view, &offset_B, &tile_x_el, &tile_y_el); + + /* On Broadwell, HALIGN and VALIGN are specified in pixels and are + * hard-coded to align to exactly the block size of the compressed + * texture. This means that, when reinterpreted as a non-compressed + * texture, the tile offsets may be anything. + * + * We need them to be multiples of 4 to be usable in RENDER_SURFACE_STATE, + * so force the state tracker to take fallback paths if they're not. + */ +#if GFX_VER == 8 + if (tile_x_el % 4 != 0 || tile_y_el % 4 != 0) { + ok = false; + } +#endif + if (!ok) { free(surf); return NULL;