diff options
author | Marek Olšák <[email protected]> | 2012-10-12 06:04:01 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-10-12 15:23:27 +0200 |
commit | 7997b3c97c898c8467afff98458b9a9e52173092 (patch) | |
tree | bcfc1b203300301ad57dda5c59fa2968ee372e99 | |
parent | 1b921acd5fa84a498857afcf6c2a404028cf0fb7 (diff) |
r600g: implement MSAA resolving for 8-bit and 16-bit integer formats
by changing the format to NORM.
-rw-r--r-- | src/gallium/auxiliary/util/u_blitter.c | 5 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_blitter.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_blit.c | 44 |
3 files changed, 46 insertions, 6 deletions
diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index 4ad7a6be4eb..1072a0e9a74 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -1704,7 +1704,8 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, struct pipe_resource *src, unsigned src_layer, unsigned sample_mask, - void *custom_blend) + void *custom_blend, + enum pipe_format format) { struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; struct pipe_context *pipe = ctx->base.pipe; @@ -1724,7 +1725,7 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, pipe->set_sample_mask(pipe, sample_mask); memset(&surf_tmpl, 0, sizeof(surf_tmpl)); - surf_tmpl.format = dst->format; + surf_tmpl.format = format; surf_tmpl.u.tex.level = dst_level; surf_tmpl.u.tex.first_layer = dst_layer; surf_tmpl.u.tex.last_layer = dst_layer; diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h index 40636c61619..4f7146701b1 100644 --- a/src/gallium/auxiliary/util/u_blitter.h +++ b/src/gallium/auxiliary/util/u_blitter.h @@ -344,7 +344,8 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, struct pipe_resource *src, unsigned src_layer, unsigned sampled_mask, - void *custom_blend); + void *custom_blend, + enum pipe_format format); /* The functions below should be used to save currently bound constant state * objects inside a driver. The objects are automatically restored at the end diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index 102b3808ca2..8597b8dfcf7 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -574,6 +574,42 @@ static void r600_resource_copy_region(struct pipe_context *ctx, pipe_sampler_view_reference(&src_view, NULL); } +/* For MSAA integer resolving to work, we change the format to NORM using this function. */ +static enum pipe_format int_to_norm_format(enum pipe_format format) +{ + switch (format) { +#define REPLACE_FORMAT_SIGN(format,sign) \ + case PIPE_FORMAT_##format##_##sign##INT: \ + return PIPE_FORMAT_##format##_##sign##NORM +#define REPLACE_FORMAT(format) \ + REPLACE_FORMAT_SIGN(format, U); \ + REPLACE_FORMAT_SIGN(format, S) + + REPLACE_FORMAT_SIGN(B10G10R10A2, U); + REPLACE_FORMAT(R8); + REPLACE_FORMAT(R8G8); + REPLACE_FORMAT(R8G8B8); + REPLACE_FORMAT(R8G8B8A8); + REPLACE_FORMAT(A8); + REPLACE_FORMAT(I8); + REPLACE_FORMAT(L8); + REPLACE_FORMAT(L8A8); + REPLACE_FORMAT(R16); + REPLACE_FORMAT(R16G16); + REPLACE_FORMAT(R16G16B16); + REPLACE_FORMAT(R16G16B16A16); + REPLACE_FORMAT(A16); + REPLACE_FORMAT(I16); + REPLACE_FORMAT(L16); + REPLACE_FORMAT(L16A16); + +#undef REPLACE_FORMAT +#undef REPLACE_FORMAT_SIGN + default: + return format; + } +} + static void r600_msaa_color_resolve(struct pipe_context *ctx, const struct pipe_blit_info *info) { @@ -595,7 +631,8 @@ static void r600_msaa_color_resolve(struct pipe_context *ctx, info->dst.resource, info->dst.level, info->dst.box.z, info->src.resource, info->src.box.z, - sample_mask, rctx->custom_blend_resolve); + sample_mask, rctx->custom_blend_resolve, + int_to_norm_format(info->dst.format)); r600_blitter_end(ctx); return; } @@ -620,7 +657,8 @@ static void r600_msaa_color_resolve(struct pipe_context *ctx, util_blitter_custom_resolve_color(rctx->blitter, tmp, 0, 0, info->src.resource, info->src.box.z, - sample_mask, rctx->custom_blend_resolve); + sample_mask, rctx->custom_blend_resolve, + int_to_norm_format(tmp->format)); r600_blitter_end(ctx); /* blit */ @@ -645,7 +683,7 @@ static void r600_blit(struct pipe_context *ctx, if (info->src.resource->nr_samples > 1 && info->dst.resource->nr_samples <= 1 && !util_format_is_depth_or_stencil(info->src.resource->format) && - !util_format_is_pure_integer(info->src.resource->format)) { + !util_format_is_pure_integer(int_to_norm_format(info->src.resource->format))) { r600_msaa_color_resolve(ctx, info); return; } |