r300g: clear can be killed by render condition

Fixes piglit:
- NV_conditional_render/clear
This commit is contained in:
Marek Olšák 2011-05-29 06:12:22 +02:00
parent aae56150f5
commit 76056510bc
3 changed files with 35 additions and 7 deletions

View file

@ -30,14 +30,24 @@
enum r300_blitter_op /* bitmask */
{
R300_CLEAR = 1,
R300_CLEAR_SURFACE = 2,
R300_COPY = 4
R300_STOP_QUERY = 1,
R300_SAVE_TEXTURES = 2,
R300_SAVE_FRAMEBUFFER = 4,
R300_IGNORE_RENDER_COND = 8,
R300_CLEAR = R300_STOP_QUERY,
R300_CLEAR_SURFACE = R300_STOP_QUERY | R300_SAVE_FRAMEBUFFER,
R300_COPY = R300_STOP_QUERY | R300_SAVE_FRAMEBUFFER |
R300_SAVE_TEXTURES | R300_IGNORE_RENDER_COND,
R300_DECOMPRESS = R300_STOP_QUERY | R300_IGNORE_RENDER_COND,
};
static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op op)
{
if (r300->query_current) {
if ((op & R300_STOP_QUERY) && r300->query_current) {
r300->blitter_saved_query = r300->query_current;
r300_stop_query(r300);
}
@ -57,11 +67,11 @@ static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op o
util_blitter_save_vertex_buffers(r300->blitter, r300->vbuf_mgr->nr_vertex_buffers,
r300->vbuf_mgr->vertex_buffer);
if (op & (R300_CLEAR_SURFACE | R300_COPY)) {
if (op & R300_SAVE_FRAMEBUFFER) {
util_blitter_save_framebuffer(r300->blitter, r300->fb_state.state);
}
if (op & R300_COPY) {
if (op & R300_SAVE_TEXTURES) {
struct r300_textures_state* state =
(struct r300_textures_state*)r300->textures_state.state;
@ -73,6 +83,14 @@ static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op o
r300->blitter, state->sampler_view_count,
(struct pipe_sampler_view**)state->sampler_views);
}
if (op & R300_IGNORE_RENDER_COND) {
/* Save the flag. */
r300->blitter_saved_skip_rendering = r300->skip_rendering+1;
r300->skip_rendering = FALSE;
} else {
r300->blitter_saved_skip_rendering = 0;
}
}
static void r300_blitter_end(struct r300_context *r300)
@ -81,6 +99,11 @@ static void r300_blitter_end(struct r300_context *r300)
r300_resume_query(r300, r300->blitter_saved_query);
r300->blitter_saved_query = NULL;
}
if (r300->blitter_saved_skip_rendering) {
/* Restore the flag. */
r300->skip_rendering = r300->blitter_saved_skip_rendering-1;
}
}
static uint32_t r300_depth_clear_cb_value(enum pipe_format format,
@ -374,7 +397,7 @@ void r300_decompress_zmask(struct r300_context *r300)
r300->zmask_decompress = TRUE;
r300_mark_atom_dirty(r300, &r300->hyperz_state);
r300_blitter_begin(r300, R300_CLEAR);
r300_blitter_begin(r300, R300_DECOMPRESS);
util_blitter_clear_depth_custom(r300->blitter, fb->width, fb->height, 0,
r300->dsa_decompress_zmask);
r300_blitter_end(r300);

View file

@ -584,6 +584,8 @@ struct r300_context {
uint32_t zbuffer_bpp;
/* Whether rendering is conditional and should be skipped. */
boolean skip_rendering;
/* The flag above saved by blitter. */
unsigned char blitter_saved_skip_rendering;
/* Point sprites texcoord index, 1 bit per texcoord */
int sprite_coord_enable;
/* Whether two-sided color selection is enabled (AKA light_twoside). */

View file

@ -1200,6 +1200,9 @@ static void r300_blitter_draw_rectangle(struct blitter_context *blitter,
const float zeros[4] = {0, 0, 0, 0};
CS_LOCALS(r300);
if (r300->skip_rendering)
return;
r300->context.set_vertex_buffers(&r300->context, 0, NULL);
if (type == UTIL_BLITTER_ATTRIB_TEXCOORD)