diff options
author | Marek Olšák <[email protected]> | 2013-11-21 15:41:36 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2013-12-03 19:39:13 +0100 |
commit | 6b919b1b2d296f7d7410c2291b7e0332d7bef1a0 (patch) | |
tree | 38ad55fa40a9954919f97d41c11d8e6a4d0807bc /src/gallium/drivers | |
parent | 1a02bb71ddbf7312a84ac1693f562cca191a7d42 (diff) |
gallium/util: implement layered framebuffer clear in u_blitter
All bound layers (from first_layer to last_layer) should be cleared.
This uses a vertex shader which outputs gl_Layer = gl_InstanceID, so each
instance goes to a different layer. By rendering a quad and setting
the instance count to the number of layers, it will trivially clear all
layers.
This requires AMD_vertex_shader_layer (or PIPE_CAP_TGSI_VS_LAYER), which only
radeonsi supports at the moment. r600 could do this too. Standard DX11
hardware will have to use a geometry shader though, which has higher overhead.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/ilo/ilo_blitter_pipe.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_blit.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_blit.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/r600_blit.c | 1 |
4 files changed, 4 insertions, 5 deletions
diff --git a/src/gallium/drivers/ilo/ilo_blitter_pipe.c b/src/gallium/drivers/ilo/ilo_blitter_pipe.c index b4dd3ad91c5..fa4f1582b7f 100644 --- a/src/gallium/drivers/ilo/ilo_blitter_pipe.c +++ b/src/gallium/drivers/ilo/ilo_blitter_pipe.c @@ -220,7 +220,7 @@ ilo_blitter_pipe_clear_fb(struct ilo_blitter *blitter, ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_CLEAR_FB, false); util_blitter_clear(blitter->pipe_blitter, - blitter->ilo->fb.state.width, blitter->ilo->fb.state.height, + blitter->ilo->fb.state.width, blitter->ilo->fb.state.height, 1, buffers, color, depth, stencil); ilo_blitter_pipe_end(blitter); diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index 4ec68ae6e1c..42410fe7dae 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -365,9 +365,7 @@ static void r300_clear(struct pipe_context* pipe, if (buffers) { /* Clear using the blitter. */ r300_blitter_begin(r300, R300_CLEAR); - util_blitter_clear(r300->blitter, - width, - height, + util_blitter_clear(r300->blitter, width, height, 1, buffers, color, depth, stencil); r300_blitter_end(r300); } else if (r300->zmask_clear.dirty || diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index fea33bccaa8..f33bb43b8c6 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -558,7 +558,7 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers, } r600_blitter_begin(ctx, R600_CLEAR); - util_blitter_clear(rctx->blitter, fb->width, fb->height, + util_blitter_clear(rctx->blitter, fb->width, fb->height, 1, buffers, color, depth, stencil); r600_blitter_end(ctx); diff --git a/src/gallium/drivers/radeonsi/r600_blit.c b/src/gallium/drivers/radeonsi/r600_blit.c index 851b80c5484..e525f7950b0 100644 --- a/src/gallium/drivers/radeonsi/r600_blit.c +++ b/src/gallium/drivers/radeonsi/r600_blit.c @@ -332,6 +332,7 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers, r600_blitter_begin(ctx, R600_CLEAR); util_blitter_clear(rctx->blitter, fb->width, fb->height, + util_framebuffer_get_num_layers(fb), buffers, color, depth, stencil); r600_blitter_end(ctx); } |