r300g: don't render if everything is culled by scissoring

Otherwise a CS is refused by kernel 2.6.31 (and maybe all later
versions, not sure).
This commit is contained in:
Marek Olšák 2009-12-05 20:39:11 +01:00 committed by Corbin Simpson
parent e1380cae88
commit 0748764351
3 changed files with 29 additions and 0 deletions

View file

@ -101,6 +101,9 @@ struct r300_sampler_state {
struct r300_scissor_regs {
uint32_t top_left; /* R300_SC_SCISSORS_TL: 0x43e0 */
uint32_t bottom_right; /* R300_SC_SCISSORS_BR: 0x43e4 */
/* Whether everything is culled by scissoring. */
boolean empty_area;
};
struct r300_scissor_state {

View file

@ -70,6 +70,12 @@ uint32_t r300_translate_primitive(unsigned prim)
}
}
static boolean r300_nothing_to_draw(struct r300_context *r300)
{
return r300->rs_state->rs.scissor &&
r300->scissor_state->scissor.empty_area;
}
static void r300_emit_draw_arrays(struct r300_context *r300,
unsigned mode,
unsigned count)
@ -173,10 +179,15 @@ boolean r300_draw_range_elements(struct pipe_context* pipe,
return FALSE;
}
if (count > 65535) {
return FALSE;
}
if (r300_nothing_to_draw(r300)) {
return TRUE;
}
r300_update_derived_state(r300);
if (!r300_setup_vertex_buffers(r300)) {
@ -218,6 +229,10 @@ boolean r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
return FALSE;
}
if (r300_nothing_to_draw(r300)) {
return TRUE;
}
r300_update_derived_state(r300);
if (!r300_setup_vertex_buffers(r300)) {
@ -251,6 +266,10 @@ boolean r300_swtcl_draw_arrays(struct pipe_context* pipe,
return FALSE;
}
if (r300_nothing_to_draw(r300)) {
return TRUE;
}
for (i = 0; i < r300->vertex_buffer_count; i++) {
void* buf = pipe_buffer_map(pipe->screen,
r300->vertex_buffer[i].buffer,
@ -292,6 +311,10 @@ boolean r300_swtcl_draw_range_elements(struct pipe_context* pipe,
return FALSE;
}
if (r300_nothing_to_draw(r300)) {
return TRUE;
}
for (i = 0; i < r300->vertex_buffer_count; i++) {
void* buf = pipe_buffer_map(pipe->screen,
r300->vertex_buffer[i].buffer,

View file

@ -309,6 +309,9 @@ static void r300_set_scissor_regs(const struct pipe_scissor_state* state,
(((state->maxx - 1) + 1440) << R300_SCISSORS_X_SHIFT) |
(((state->maxy - 1) + 1440) << R300_SCISSORS_Y_SHIFT);
}
scissor->empty_area = state->minx >= state->maxx ||
state->miny >= state->maxy;
}
static void