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:
committed by
Corbin Simpson
parent
e1380cae88
commit
0748764351
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user