r300g: port over last parts of oq support.
Add support for begin/end in each CS so we don't get any other processes rendering in between. TODO: blame other parts of driver for this not working like Z.
This commit is contained in:
parent
47791697ab
commit
51d1cf55da
|
@ -175,6 +175,8 @@ struct r300_query {
|
||||||
unsigned offset;
|
unsigned offset;
|
||||||
/* if we've flushed the query */
|
/* if we've flushed the query */
|
||||||
boolean flushed;
|
boolean flushed;
|
||||||
|
/* if begin has been emitted */
|
||||||
|
boolean begin_emitted;
|
||||||
/* Linked list members. */
|
/* Linked list members. */
|
||||||
struct r300_query* prev;
|
struct r300_query* prev;
|
||||||
struct r300_query* next;
|
struct r300_query* next;
|
||||||
|
|
|
@ -340,6 +340,7 @@ void r300_emit_query_start(struct r300_context *r300)
|
||||||
}
|
}
|
||||||
OUT_CS_REG(R300_ZB_ZPASS_DATA, 0);
|
OUT_CS_REG(R300_ZB_ZPASS_DATA, 0);
|
||||||
END_CS;
|
END_CS;
|
||||||
|
query->begin_emitted = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -429,10 +430,16 @@ static void rv530_emit_query_double(struct r300_context *r300,
|
||||||
END_CS;
|
END_CS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void r300_emit_query_end(struct r300_context* r300,
|
void r300_emit_query_end(struct r300_context* r300)
|
||||||
struct r300_query* query)
|
|
||||||
{
|
{
|
||||||
struct r300_capabilities *caps = r300_screen(r300->context.screen)->caps;
|
struct r300_capabilities *caps = r300_screen(r300->context.screen)->caps;
|
||||||
|
struct r300_query *query = r300->query_current;
|
||||||
|
|
||||||
|
if (!query)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (query->begin_emitted == FALSE)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!r300->winsys->add_buffer(r300->winsys, r300->oqbo,
|
if (!r300->winsys->add_buffer(r300->winsys, r300->oqbo,
|
||||||
0, RADEON_GEM_DOMAIN_GTT)) {
|
0, RADEON_GEM_DOMAIN_GTT)) {
|
||||||
|
|
|
@ -58,8 +58,7 @@ void r300_emit_fb_state(struct r300_context* r300,
|
||||||
|
|
||||||
void r300_emit_query_begin(struct r300_context* r300,
|
void r300_emit_query_begin(struct r300_context* r300,
|
||||||
struct r300_query* query);
|
struct r300_query* query);
|
||||||
void r300_emit_query_end(struct r300_context* r300,
|
void r300_emit_query_end(struct r300_context* r300);
|
||||||
struct r300_query* query);
|
|
||||||
|
|
||||||
void r300_emit_rs_state(struct r300_context* r300, struct r300_rs_state* rs);
|
void r300_emit_rs_state(struct r300_context* r300, struct r300_rs_state* rs);
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,8 @@ static void r300_flush(struct pipe_context* pipe,
|
||||||
draw_flush(r300->draw);
|
draw_flush(r300->draw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r300_emit_query_end(r300);
|
||||||
|
|
||||||
if (r300->dirty_hw) {
|
if (r300->dirty_hw) {
|
||||||
FLUSH_CS;
|
FLUSH_CS;
|
||||||
r300_emit_invariant_state(r300);
|
r300_emit_invariant_state(r300);
|
||||||
|
|
|
@ -91,11 +91,8 @@ static void r300_end_query(struct pipe_context* pipe,
|
||||||
struct pipe_query* query)
|
struct pipe_query* query)
|
||||||
{
|
{
|
||||||
struct r300_context* r300 = r300_context(pipe);
|
struct r300_context* r300 = r300_context(pipe);
|
||||||
struct r300_query* q = (struct r300_query*)query;
|
|
||||||
|
|
||||||
r300_emit_dirty_state(r300);
|
|
||||||
r300_emit_query_end(r300, q);
|
|
||||||
|
|
||||||
|
r300_emit_query_end(r300);
|
||||||
r300->query_current = NULL;
|
r300->query_current = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue