r600g: check if hardware blits are possible bevore enabling tilling
authorChristian König <deathsimple@vodafone.de>
Sun, 9 Jan 2011 12:18:48 +0000 (13:18 +0100)
committerChristian König <deathsimple@vodafone.de>
Sun, 9 Jan 2011 12:18:48 +0000 (13:18 +0100)
src/gallium/drivers/r600/r600_texture.c

index 6add92e6d4ca7917bf8d161fcb91f1ef67684997..1f4f453c091b81fd7b547bd57d9765b18d8d5731 100644 (file)
@@ -321,6 +321,48 @@ r600_texture_create_object(struct pipe_screen *screen,
        return rtex;
 }
 
+/* Figure out whether u_blitter will fallback to a transfer operation.
+ * If so, don't use a staging resource.
+ */
+static boolean permit_hardware_blit(struct pipe_screen *screen,
+                                       const struct pipe_resource *res)
+{
+       unsigned bind;
+
+       if (util_format_is_depth_or_stencil(res->format))
+               bind = PIPE_BIND_DEPTH_STENCIL;
+       else
+               bind = PIPE_BIND_RENDER_TARGET;
+
+       /* See r600_resource_copy_region: there is something wrong
+        * with depth resource copies at the moment so avoid them for
+        * now.
+        */
+       if (util_format_get_component_bits(res->format,
+                               UTIL_FORMAT_COLORSPACE_ZS,
+                               0) != 0)
+               return FALSE;
+
+       if (!screen->is_format_supported(screen,
+                               res->format,
+                               res->target,
+                               res->nr_samples,
+                               bind, 0))
+               return FALSE;
+
+       if (!screen->is_format_supported(screen,
+                               res->format,
+                               res->target,
+                               res->nr_samples,
+                               PIPE_BIND_SAMPLER_VIEW, 0))
+               return FALSE;
+
+       if (res->usage == PIPE_USAGE_STREAM)
+               return FALSE;
+
+       return TRUE;
+}
+
 struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
                                                const struct pipe_resource *templ)
 {
@@ -332,7 +374,7 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
        if (force_tiling == -1)
                force_tiling = debug_get_bool_option("R600_FORCE_TILING", FALSE);
 
-       if (force_tiling) {
+       if (force_tiling && permit_hardware_blit(screen, templ)) {
                if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) &&
                    !(templ->bind & PIPE_BIND_SCANOUT)) {
                        array_mode = V_038000_ARRAY_2D_TILED_THIN1;
@@ -485,46 +527,6 @@ static INLINE unsigned u_box_volume( const struct pipe_box *box )
        return box->width * box->depth * box->height;
 };
 
-
-/* Figure out whether u_blitter will fallback to a transfer operation.
- * If so, don't use a staging resource.
- */
-static boolean permit_hardware_blit(struct pipe_screen *screen,
-                                       struct pipe_resource *res)
-{
-       unsigned bind;
-
-       if (util_format_is_depth_or_stencil(res->format))
-               bind = PIPE_BIND_DEPTH_STENCIL;
-       else
-               bind = PIPE_BIND_RENDER_TARGET;
-
-       /* See r600_resource_copy_region: there is something wrong
-        * with depth resource copies at the moment so avoid them for
-        * now.
-        */
-       if (util_format_get_component_bits(res->format,
-                               UTIL_FORMAT_COLORSPACE_ZS,
-                               0) != 0)
-               return FALSE;
-
-       if (!screen->is_format_supported(screen,
-                               res->format,
-                               res->target,
-                               res->nr_samples,
-                               bind, 0))
-               return FALSE;
-
-       if (!screen->is_format_supported(screen,
-                               res->format,
-                               res->target,
-                               res->nr_samples,
-                               PIPE_BIND_SAMPLER_VIEW, 0))
-               return FALSE;
-
-       return TRUE;
-}
-
 struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
                                                struct pipe_resource *texture,
                                                unsigned level,
@@ -562,8 +564,7 @@ struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
                use_staging_texture = TRUE;
 
        if (!permit_hardware_blit(ctx->screen, texture) ||
-               (texture->flags & R600_RESOURCE_FLAG_TRANSFER) ||
-               (texture->usage == PIPE_USAGE_STREAM))
+               (texture->flags & R600_RESOURCE_FLAG_TRANSFER))
                use_staging_texture = FALSE;
 
        trans = CALLOC_STRUCT(r600_transfer);
@@ -795,7 +796,7 @@ static unsigned r600_get_swizzle_combined(const unsigned char *swizzle_format,
 
 /* texture format translate */
 uint32_t r600_translate_texformat(enum pipe_format format,
-                                 const unsigned char *swizzle_view, 
+                                 const unsigned char *swizzle_view,
                                  uint32_t *word4_p, uint32_t *yuv_format_p)
 {
        uint32_t result = 0, word4 = 0, yuv_format = 0;
@@ -849,7 +850,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
                        break;
                }
                goto out_unknown; /* TODO */
-               
+
        case UTIL_FORMAT_COLORSPACE_SRGB:
                word4 |= S_038010_FORCE_DEGAMMA(1);
                if (format == PIPE_FORMAT_L8A8_SRGB || format == PIPE_FORMAT_L8_SRGB)
@@ -865,7 +866,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
                static int r600_enable_s3tc = -1;
 
                if (r600_enable_s3tc == -1)
-                       r600_enable_s3tc = 
+                       r600_enable_s3tc =
                                debug_get_bool_option("R600_ENABLE_S3TC", FALSE);
 
                if (!r600_enable_s3tc)
@@ -888,7 +889,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
        }
 
 
-       for (i = 0; i < desc->nr_channels; i++) {       
+       for (i = 0; i < desc->nr_channels; i++) {
                if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
                        word4 |= sign_bit[i];
                }
@@ -902,7 +903,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
        for (i = 1; i < desc->nr_channels; i++) {
                uniform = uniform && desc->channel[0].size == desc->channel[i].size;
        }
-       
+
        /* Non-uniform formats. */
        if (!uniform) {
                switch(desc->nr_channels) {
@@ -1020,7 +1021,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
                                goto out_word4;
                        }
                }
-               
+
        }
 out_word4:
        if (word4_p)