diff options
author | Marek Olšák <[email protected]> | 2013-01-14 00:27:28 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2013-01-14 03:12:01 +0100 |
commit | 5330c5a248aa9dbb45cfde55d5488d982cedff7f (patch) | |
tree | b4c15112d70e8d5d65429e99a3f79dfb70b9a9f7 /src | |
parent | e102b665e60f7a8d2bb4ef2c5d313e22105ae22f (diff) |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/r300/r300_blit.c | 5 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_defines.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_texture_desc.c | 5 |
3 files changed, 10 insertions, 3 deletions
diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index 0490160aad8..f8d3b1fd1d1 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -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.y == 0 && 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, @@ -704,6 +706,7 @@ static void r300_msaa_resolve(struct pipe_context *pipe, templ.depth0 = 1; templ.array_size = 1; templ.usage = PIPE_USAGE_STATIC; + templ.flags = R300_RESOURCE_FORCE_MICROTILING; tmp = screen->resource_create(screen, &templ); diff --git a/src/gallium/drivers/r300/r300_defines.h b/src/gallium/drivers/r300/r300_defines.h index 30e9befad21..a2a1b791e67 100644 --- a/src/gallium/drivers/r300/r300_defines.h +++ b/src/gallium/drivers/r300/r300_defines.h @@ -28,7 +28,8 @@ #define R300_MAX_TEXTURE_LEVELS 13 #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 diff --git a/src/gallium/drivers/r300/r300_texture_desc.c b/src/gallium/drivers/r300/r300_texture_desc.c index e9623eea608..8928f73f7cf 100644 --- a/src/gallium/drivers/r300/r300_texture_desc.c +++ b/src/gallium/drivers/r300/r300_texture_desc.c @@ -416,6 +416,8 @@ static void r300_setup_tiling(struct r300_screen *screen, boolean rv350_mode = screen->caps.family >= CHIP_R350; boolean is_zb = util_format_is_depth_or_stencil(format); 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) { 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 (!is_zb && (tex->b.b.height0 == 1 || dbg_no_tiling)) { + if (!force_microtiling && !is_zb && + (tex->b.b.height0 == 1 || dbg_no_tiling)) { return; } |