summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r600/r600_texture.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/r600/r600_texture.c')
-rw-r--r--src/gallium/drivers/r600/r600_texture.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
index ea017d3a6a1..b1dbf07dffa 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -494,10 +494,18 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
{
struct r600_screen *rscreen = (struct r600_screen*)screen;
struct radeon_surface surface;
- unsigned array_mode = 0;
+ const struct util_format_description *desc = util_format_description(templ->format);
+ unsigned array_mode;
int r;
- if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER)) {
+ /* Default tiling mode for staging textures. */
+ array_mode = V_038000_ARRAY_LINEAR_ALIGNED;
+
+ /* Tiling doesn't work with the 422 (SUBSAMPLED) formats. That's not an issue,
+ * because 422 formats are used for videos, which prefer linear buffers
+ * for fast uploads anyway. */
+ if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) &&
+ desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
if (!(templ->bind & PIPE_BIND_SCANOUT) &&
templ->usage != PIPE_USAGE_STAGING &&
templ->usage != PIPE_USAGE_STREAM) {
@@ -507,10 +515,6 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
}
}
- /* XXX tiling is broken for the 422 formats */
- if (util_format_description(templ->format)->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED)
- array_mode = V_038000_ARRAY_LINEAR_ALIGNED;
-
r = r600_init_surface(rscreen, &surface, templ, array_mode,
templ->flags & R600_RESOURCE_FLAG_FLUSHED_DEPTH);
if (r) {