summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2012-07-27 21:44:17 +0200
committerMarek Olšák <maraeo@gmail.com>2012-08-04 13:53:07 +0200
commitef1bf6d69e99d9a12557a09eccaf4f2b6c628997 (patch)
tree294ae7cef0f3ad1eb29f6505be8ec4ac41563e22
parent88426780479743036993a0fcd112232d2792690a (diff)
gallium/u_blitter: add ability to blit only depth or only stencil
Reviewed-by: Brian Paul <brianp@vmware.com>
-rw-r--r--src/gallium/auxiliary/util/u_blitter.c26
-rw-r--r--src/gallium/auxiliary/util/u_blitter.h3
-rw-r--r--src/gallium/drivers/r300/r300_blit.c2
3 files changed, 17 insertions, 14 deletions
diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
index c5dc515432f..83238ecefdd 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -992,7 +992,8 @@ void util_blitter_copy_texture(struct blitter_context *blitter,
/* Copy. */
util_blitter_copy_texture_view(blitter, dst_view, dstx, dsty, src_view,
- srcbox, src->width0, src->height0);
+ srcbox, src->width0, src->height0,
+ PIPE_MASK_RGBAZS);
pipe_surface_reference(&dst_view, NULL);
pipe_sampler_view_reference(&src_view, NULL);
@@ -1003,7 +1004,8 @@ void util_blitter_copy_texture_view(struct blitter_context *blitter,
unsigned dstx, unsigned dsty,
struct pipe_sampler_view *src,
const struct pipe_box *srcbox,
- unsigned src_width0, unsigned src_height0)
+ unsigned src_width0, unsigned src_height0,
+ unsigned mask)
{
struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
struct pipe_context *pipe = ctx->base.pipe;
@@ -1011,19 +1013,19 @@ void util_blitter_copy_texture_view(struct blitter_context *blitter,
enum pipe_texture_target src_target = src->texture->target;
unsigned width = srcbox->width;
unsigned height = srcbox->height;
- boolean is_stencil, is_depth;
+ boolean blit_stencil, blit_depth;
const struct util_format_description *src_desc =
util_format_description(src->format);
- is_depth = util_format_has_depth(src_desc);
- is_stencil = util_format_has_stencil(src_desc);
+ blit_depth = util_format_has_depth(src_desc) && (mask & PIPE_MASK_Z);
+ blit_stencil = util_format_has_stencil(src_desc) && (mask & PIPE_MASK_S);
/* If you want a fallback for stencil copies,
* use util_blitter_copy_texture. */
- if (is_stencil && !ctx->has_stencil_export) {
- is_stencil = FALSE;
+ if (blit_stencil && !ctx->has_stencil_export) {
+ blit_stencil = FALSE;
- if (!is_depth)
+ if (!blit_depth)
return;
}
@@ -1047,15 +1049,15 @@ void util_blitter_copy_texture_view(struct blitter_context *blitter,
fb_state.width = dst->width;
fb_state.height = dst->height;
- if (is_depth || is_stencil) {
+ if (blit_depth || blit_stencil) {
pipe->bind_blend_state(pipe, ctx->blend_keep_color);
- if (is_depth && is_stencil) {
+ if (blit_depth && blit_stencil) {
pipe->bind_depth_stencil_alpha_state(pipe,
ctx->dsa_write_depth_stencil);
pipe->bind_fs_state(pipe,
blitter_get_fs_texfetch_depthstencil(ctx, src_target));
- } else if (is_depth) {
+ } else if (blit_depth) {
pipe->bind_depth_stencil_alpha_state(pipe,
ctx->dsa_write_depth_keep_stencil);
pipe->bind_fs_state(pipe,
@@ -1080,7 +1082,7 @@ void util_blitter_copy_texture_view(struct blitter_context *blitter,
fb_state.zsbuf = 0;
}
- if (is_depth && is_stencil) {
+ if (blit_depth && blit_stencil) {
/* Setup two samplers, one for depth and the other one for stencil. */
struct pipe_sampler_view templ;
struct pipe_sampler_view *views[2];
diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h
index 2632f3ad0dc..725d81c6735 100644
--- a/src/gallium/auxiliary/util/u_blitter.h
+++ b/src/gallium/auxiliary/util/u_blitter.h
@@ -216,7 +216,8 @@ void util_blitter_copy_texture_view(struct blitter_context *blitter,
unsigned dstx, unsigned dsty,
struct pipe_sampler_view *src,
const struct pipe_box *srcbox,
- unsigned src_width0, unsigned src_height0);
+ unsigned src_width0, unsigned src_height0,
+ unsigned mask);
/**
* Helper function to initialize a view for copy_texture_view.
diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c
index 8d82bb920f6..0bfafd93398 100644
--- a/src/gallium/drivers/r300/r300_blit.c
+++ b/src/gallium/drivers/r300/r300_blit.c
@@ -579,7 +579,7 @@ static void r300_resource_copy_region(struct pipe_context *pipe,
r300_blitter_begin(r300, R300_COPY);
util_blitter_copy_texture_view(r300->blitter, dst_view, dstx, dsty,
src_view, src_box,
- src_width0, src_height0);
+ src_width0, src_height0, PIPE_MASK_RGBAZS);
r300_blitter_end(r300);
pipe_surface_reference(&dst_view, NULL);