2017-11-02 16:08 GMT+01:00 Wladimir J. van der Laan <laa...@gmail.com>: > HALIGN_FOUR/SIXTEEN has no meaning for compressed textures, and we can't > render to them anyway. So use the tightest possible packing. This > avoids bugs with non-power-of-two block sizes. > > Signed-off-by: Wladimir J. van der Laan <laa...@gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmei...@gmail.com> > --- > src/gallium/drivers/etnaviv/etnaviv_resource.c | 24 +++++++++++++++--------- > 1 file changed, 15 insertions(+), 9 deletions(-) > > This is important in the case of ASTC. Padding ASTC to width 4 or 16 > produces intermittent magenta blocks when using texture widths > not a multiple of those. > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c > b/src/gallium/drivers/etnaviv/etnaviv_resource.c > index d6cccd2..0a82807 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c > +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c > @@ -209,18 +209,24 @@ etna_resource_alloc(struct pipe_screen *pscreen, > unsigned layout, > return NULL; > } > > - /* If we have the TEXTURE_HALIGN feature, we can always align to the > - * resolve engine's width. If not, we must not align resources used > - * only for textures. */ > - bool rs_align = VIV_FEATURE(screen, chipMinorFeatures1, TEXTURE_HALIGN) || > - !etna_resource_sampler_only(templat); > - > /* Determine needed padding (alignment of height/width) */ > unsigned paddingX = 0, paddingY = 0; > unsigned halign = TEXTURE_HALIGN_FOUR; > - etna_layout_multiple(layout, screen->specs.pixel_pipes, rs_align, > &paddingX, > - &paddingY, &halign); > - assert(paddingX && paddingY); > + if (!util_format_is_compressed(templat->format)) { > + /* If we have the TEXTURE_HALIGN feature, we can always align to the > + * resolve engine's width. If not, we must not align resources used > + * only for textures. */ > + bool rs_align = VIV_FEATURE(screen, chipMinorFeatures1, > TEXTURE_HALIGN) || > + !etna_resource_sampler_only(templat); > + etna_layout_multiple(layout, screen->specs.pixel_pipes, rs_align, > &paddingX, > + &paddingY, &halign); > + assert(paddingX && paddingY); > + } else { > + /* Compressed textures are padded to their block size, but we don't > have > + * to do anything special for that. */ > + paddingX = 1; > + paddingY = 1; > + } > > if (templat->target != PIPE_BUFFER) > etna_adjust_rs_align(screen->specs.pixel_pipes, NULL, &paddingY); > -- > 2.7.4 > > -- greets -- Christian Gmeiner, MSc https://christian-gmeiner.info _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev