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.
This commit is contained in:
Marek Olšák
2013-11-21 15:41:36 +01:00
parent 1a02bb71dd
commit 6b919b1b2d
10 changed files with 110 additions and 30 deletions

View File

@@ -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 ||