r300g: fix MSAA resolve to an untiled texture
RB3D_DEBUG_CTL doesn't help, so I resolve to a tiled temporary texture and then blitting it to the destination one, which we also do in other situations.
This commit is contained in:
@@ -626,7 +626,9 @@ static boolean r300_is_simple_msaa_resolve(const struct pipe_blit_info *info)
|
|||||||
info->src.box.x == 0 &&
|
info->src.box.x == 0 &&
|
||||||
info->src.box.y == 0 &&
|
info->src.box.y == 0 &&
|
||||||
info->src.box.width == dst_width &&
|
info->src.box.width == dst_width &&
|
||||||
info->src.box.height == dst_height;
|
info->src.box.height == dst_height &&
|
||||||
|
(r300_resource(info->dst.resource)->tex.microtile != RADEON_LAYOUT_LINEAR ||
|
||||||
|
r300_resource(info->dst.resource)->tex.macrotile[info->dst.level] != RADEON_LAYOUT_LINEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void r300_simple_msaa_resolve(struct pipe_context *pipe,
|
static void r300_simple_msaa_resolve(struct pipe_context *pipe,
|
||||||
@@ -704,6 +706,7 @@ static void r300_msaa_resolve(struct pipe_context *pipe,
|
|||||||
templ.depth0 = 1;
|
templ.depth0 = 1;
|
||||||
templ.array_size = 1;
|
templ.array_size = 1;
|
||||||
templ.usage = PIPE_USAGE_STATIC;
|
templ.usage = PIPE_USAGE_STATIC;
|
||||||
|
templ.flags = R300_RESOURCE_FORCE_MICROTILING;
|
||||||
|
|
||||||
tmp = screen->resource_create(screen, &templ);
|
tmp = screen->resource_create(screen, &templ);
|
||||||
|
|
||||||
|
@@ -28,7 +28,8 @@
|
|||||||
#define R300_MAX_TEXTURE_LEVELS 13
|
#define R300_MAX_TEXTURE_LEVELS 13
|
||||||
#define R300_MAX_DRAW_VBO_SIZE (1024 * 1024)
|
#define R300_MAX_DRAW_VBO_SIZE (1024 * 1024)
|
||||||
|
|
||||||
#define R300_RESOURCE_FLAG_TRANSFER PIPE_RESOURCE_FLAG_DRV_PRIV
|
#define R300_RESOURCE_FLAG_TRANSFER (PIPE_RESOURCE_FLAG_DRV_PRIV << 0)
|
||||||
|
#define R300_RESOURCE_FORCE_MICROTILING (PIPE_RESOURCE_FLAG_DRV_PRIV << 1)
|
||||||
|
|
||||||
#define R300_INVALID_FORMAT 0xffff
|
#define R300_INVALID_FORMAT 0xffff
|
||||||
|
|
||||||
|
@@ -416,6 +416,8 @@ static void r300_setup_tiling(struct r300_screen *screen,
|
|||||||
boolean rv350_mode = screen->caps.family >= CHIP_R350;
|
boolean rv350_mode = screen->caps.family >= CHIP_R350;
|
||||||
boolean is_zb = util_format_is_depth_or_stencil(format);
|
boolean is_zb = util_format_is_depth_or_stencil(format);
|
||||||
boolean dbg_no_tiling = SCREEN_DBG_ON(screen, DBG_NO_TILING);
|
boolean dbg_no_tiling = SCREEN_DBG_ON(screen, DBG_NO_TILING);
|
||||||
|
boolean force_microtiling =
|
||||||
|
(tex->b.b.flags & R300_RESOURCE_FORCE_MICROTILING) != 0;
|
||||||
|
|
||||||
if (tex->b.b.nr_samples > 1) {
|
if (tex->b.b.nr_samples > 1) {
|
||||||
tex->tex.microtile = RADEON_LAYOUT_TILED;
|
tex->tex.microtile = RADEON_LAYOUT_TILED;
|
||||||
@@ -431,7 +433,8 @@ static void r300_setup_tiling(struct r300_screen *screen,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If height == 1, disable microtiling except for zbuffer. */
|
/* If height == 1, disable microtiling except for zbuffer. */
|
||||||
if (!is_zb && (tex->b.b.height0 == 1 || dbg_no_tiling)) {
|
if (!force_microtiling && !is_zb &&
|
||||||
|
(tex->b.b.height0 == 1 || dbg_no_tiling)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user