gallium: allow choosing which colorbuffers to clear
Required for glClearBuffer, which only clears one colorbuffer attachment. Example: If the first colorbuffer is float and the second one is int: pipe->clear(pipe, PIPE_CLEAR_COLOR0, float_clear_color, ...); pipe->clear(pipe, PIPE_CLEAR_COLOR1, int_clear_color, ...); This doesn't need any driver changes yet, because all drivers just use: if (flags & PIPE_CLEAR_COLOR) .. The drivers which support GL 3.0 will have to implement it properly though.
This commit is contained in:
@@ -138,7 +138,7 @@ pp_jimenezmlaa_run(struct pp_queue_t *ppq, struct pipe_resource *in,
|
|||||||
pp_filter_set_fb(p);
|
pp_filter_set_fb(p);
|
||||||
pp_filter_misc_state(p);
|
pp_filter_misc_state(p);
|
||||||
cso_set_depth_stencil_alpha(p->cso, &mstencil);
|
cso_set_depth_stencil_alpha(p->cso, &mstencil);
|
||||||
p->pipe->clear(p->pipe, PIPE_CLEAR_STENCIL | PIPE_CLEAR_COLOR,
|
p->pipe->clear(p->pipe, PIPE_CLEAR_STENCIL | PIPE_CLEAR_COLOR0,
|
||||||
&p->clear_color, 0, 0);
|
&p->clear_color, 0, 0);
|
||||||
|
|
||||||
cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 0, &p->sampler_point);
|
cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 0, &p->sampler_point);
|
||||||
|
@@ -309,5 +309,5 @@ void
|
|||||||
pp_filter_set_clear_fb(struct pp_program *p)
|
pp_filter_set_clear_fb(struct pp_program *p)
|
||||||
{
|
{
|
||||||
cso_set_framebuffer(p->cso, &p->framebuffer);
|
cso_set_framebuffer(p->cso, &p->framebuffer);
|
||||||
p->pipe->clear(p->pipe, PIPE_CLEAR_COLOR, &p->clear_color, 0, 0);
|
p->pipe->clear(p->pipe, PIPE_CLEAR_COLOR0, &p->clear_color, 0, 0);
|
||||||
}
|
}
|
||||||
|
@@ -42,9 +42,10 @@ util_clear(struct pipe_context *pipe,
|
|||||||
struct pipe_framebuffer_state *framebuffer, unsigned buffers,
|
struct pipe_framebuffer_state *framebuffer, unsigned buffers,
|
||||||
const union pipe_color_union *color, double depth, unsigned stencil)
|
const union pipe_color_union *color, double depth, unsigned stencil)
|
||||||
{
|
{
|
||||||
if (buffers & PIPE_CLEAR_COLOR) {
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for (i = 0; i < framebuffer->nr_cbufs; i++) {
|
for (i = 0; i < framebuffer->nr_cbufs; i++) {
|
||||||
|
if (buffers & (PIPE_CLEAR_COLOR0 << i)) {
|
||||||
struct pipe_surface *ps = framebuffer->cbufs[i];
|
struct pipe_surface *ps = framebuffer->cbufs[i];
|
||||||
pipe->clear_render_target(pipe, ps, color, 0, 0, ps->width, ps->height);
|
pipe->clear_render_target(pipe, ps, color, 0, 0, ps->width, ps->height);
|
||||||
}
|
}
|
||||||
|
@@ -130,7 +130,7 @@ static boolean r300_cbzb_clear_allowed(struct r300_context *r300,
|
|||||||
(struct pipe_framebuffer_state*)r300->fb_state.state;
|
(struct pipe_framebuffer_state*)r300->fb_state.state;
|
||||||
|
|
||||||
/* Only color clear allowed, and only one colorbuffer. */
|
/* Only color clear allowed, and only one colorbuffer. */
|
||||||
if (clear_buffers != PIPE_CLEAR_COLOR || fb->nr_cbufs != 1)
|
if ((clear_buffers & ~PIPE_CLEAR_COLOR) != 0 || fb->nr_cbufs != 1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return r300_surface(fb->cbufs[0])->cbzb_allowed;
|
return r300_surface(fb->cbufs[0])->cbzb_allowed;
|
||||||
|
@@ -188,11 +188,22 @@ enum pipe_texture_target {
|
|||||||
/**
|
/**
|
||||||
* Clear buffer bits
|
* Clear buffer bits
|
||||||
*/
|
*/
|
||||||
|
#define PIPE_CLEAR_DEPTH (1 << 0)
|
||||||
|
#define PIPE_CLEAR_STENCIL (1 << 1)
|
||||||
|
#define PIPE_CLEAR_COLOR0 (1 << 2)
|
||||||
|
#define PIPE_CLEAR_COLOR1 (1 << 3)
|
||||||
|
#define PIPE_CLEAR_COLOR2 (1 << 4)
|
||||||
|
#define PIPE_CLEAR_COLOR3 (1 << 5)
|
||||||
|
#define PIPE_CLEAR_COLOR4 (1 << 6)
|
||||||
|
#define PIPE_CLEAR_COLOR5 (1 << 7)
|
||||||
|
#define PIPE_CLEAR_COLOR6 (1 << 8)
|
||||||
|
#define PIPE_CLEAR_COLOR7 (1 << 9)
|
||||||
|
/** Combined flags */
|
||||||
/** All color buffers currently bound */
|
/** All color buffers currently bound */
|
||||||
#define PIPE_CLEAR_COLOR (1 << 0)
|
#define PIPE_CLEAR_COLOR (PIPE_CLEAR_COLOR0 | PIPE_CLEAR_COLOR1 | \
|
||||||
#define PIPE_CLEAR_DEPTH (1 << 1)
|
PIPE_CLEAR_COLOR2 | PIPE_CLEAR_COLOR3 | \
|
||||||
#define PIPE_CLEAR_STENCIL (1 << 2)
|
PIPE_CLEAR_COLOR4 | PIPE_CLEAR_COLOR5 | \
|
||||||
/** Depth/stencil combined */
|
PIPE_CLEAR_COLOR6 | PIPE_CLEAR_COLOR7)
|
||||||
#define PIPE_CLEAR_DEPTHSTENCIL (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)
|
#define PIPE_CLEAR_DEPTHSTENCIL (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -97,7 +97,7 @@ void vegaClear(VGint x, VGint y,
|
|||||||
clear_color.f[1] = ctx->state.vg.clear_color[1];
|
clear_color.f[1] = ctx->state.vg.clear_color[1];
|
||||||
clear_color.f[2] = ctx->state.vg.clear_color[2];
|
clear_color.f[2] = ctx->state.vg.clear_color[2];
|
||||||
clear_color.f[3] = ctx->state.vg.clear_color[3];
|
clear_color.f[3] = ctx->state.vg.clear_color[3];
|
||||||
ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL,
|
ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_COLOR0 | PIPE_CLEAR_DEPTHSTENCIL,
|
||||||
&clear_color, 1., 0);
|
&clear_color, 1., 0);
|
||||||
} else if (renderer_clear_begin(ctx->renderer)) {
|
} else if (renderer_clear_begin(ctx->renderer)) {
|
||||||
/* XXX verify coord round-off */
|
/* XXX verify coord round-off */
|
||||||
|
Reference in New Issue
Block a user