diff --git a/src/gallium/drivers/v3d/v3d_resource.c b/src/gallium/drivers/v3d/v3d_resource.c index e34185c432f..1b583bab5c5 100644 --- a/src/gallium/drivers/v3d/v3d_resource.c +++ b/src/gallium/drivers/v3d/v3d_resource.c @@ -573,8 +573,8 @@ v3d_get_dimension_mpad(uint32_t dimension, uint32_t level, uint32_t block_dimens } static void -v3d_setup_slices(struct v3d_resource *rsc, uint32_t winsys_stride, - bool uif_top) +v3d_setup_slices(struct v3d_screen *screen, struct v3d_resource *rsc, + uint32_t winsys_stride, bool uif_top) { struct pipe_resource *prsc = &rsc->base; uint32_t width = prsc->width0; @@ -695,6 +695,20 @@ v3d_setup_slices(struct v3d_resource *rsc, uint32_t winsys_stride, slice->stride = winsys_stride; else slice->stride = level_width * rsc->cpp; + +#if USE_V3D_SIMULATOR + /* Ensure stride alignment matches the one required by the GPU + * that drives the display. + */ + if (slice->tiling == V3D_TILING_RASTER && + prsc->target == PIPE_TEXTURE_2D && + uif_top && !msaa) { + slice->stride = + align(slice->stride, + v3d_simulator_get_raster_stride_align(screen->fd)); + } +#endif + slice->padded_height = level_height; slice->size = level_height * slice->stride; @@ -842,7 +856,7 @@ v3d_resource_create_with_modifiers(struct pipe_screen *pscreen, rsc->internal_format = prsc->format; - v3d_setup_slices(rsc, 0, tmpl->bind & PIPE_BIND_SHARED); + v3d_setup_slices(screen, rsc, 0, tmpl->bind & PIPE_BIND_SHARED); if (screen->ro && (tmpl->bind & PIPE_BIND_SCANOUT)) { assert(!rsc->tiled); @@ -958,7 +972,7 @@ v3d_resource_from_handle(struct pipe_screen *pscreen, rsc->internal_format = prsc->format; - v3d_setup_slices(rsc, whandle->stride, true); + v3d_setup_slices(screen, rsc, whandle->stride, true); v3d_debug_resource_layout(rsc, "import"); if (whandle->offset != 0) {