r300g: set the minimum texture stride to 64 bytes on RS600, RS690, and RS740
authorMarek Olšák <maraeo@gmail.com>
Thu, 3 Jun 2010 01:42:03 +0000 (03:42 +0200)
committerMarek Olšák <maraeo@gmail.com>
Thu, 3 Jun 2010 01:46:34 +0000 (03:46 +0200)
I hope I've done it right. No way to test it here...

src/gallium/drivers/r300/r300_texture.c

index 4e5dc5568f8a5939ea64148211523ab4d8e0789c..4823755fb7a5eb013a4944ecb69885c33ca71d36 100644 (file)
@@ -696,7 +696,7 @@ static boolean r300_texture_macro_switch(struct r300_texture *tex,
 unsigned r300_texture_get_stride(struct r300_screen* screen,
                                  struct r300_texture* tex, unsigned level)
 {
-    unsigned tile_width, width;
+    unsigned tile_width, width, stride;
 
     if (tex->stride_override)
         return tex->stride_override;
@@ -715,7 +715,19 @@ unsigned r300_texture_get_stride(struct r300_screen* screen,
                                                 tex->mip_macrotile[level]);
         width = align(width, tile_width);
 
-        return util_format_get_stride(tex->b.b.format, width);
+        stride = util_format_get_stride(tex->b.b.format, width);
+
+        /* Some IGPs need a minimum stride of 64 bytes, hmm...
+         * This doesn't seem to apply to tiled textures, according to r300c. */
+        if (!tex->microtile && !tex->mip_macrotile[level] &&
+            (screen->caps.family == CHIP_FAMILY_RS600 ||
+             screen->caps.family == CHIP_FAMILY_RS690 ||
+             screen->caps.family == CHIP_FAMILY_RS740)) {
+            return stride < 64 ? 64 : stride;
+        }
+
+        /* The alignment to 32 bytes is sort of implied by the layout... */
+        return stride;
     } else {
         return align(util_format_get_stride(tex->b.b.format, width), 32);
     }