浏览代码

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.
tags/mesa_7_7_rc1
Dave Airlie 16 年前
父节点
当前提交
51d1cf55da

+ 2
- 0
src/gallium/drivers/r300/r300_context.h 查看文件

@@ -175,6 +175,8 @@ struct r300_query {
unsigned offset;
/* if we've flushed the query */
boolean flushed;
/* if begin has been emitted */
boolean begin_emitted;
/* Linked list members. */
struct r300_query* prev;
struct r300_query* next;

+ 9
- 2
src/gallium/drivers/r300/r300_emit.c 查看文件

@@ -340,6 +340,7 @@ void r300_emit_query_start(struct r300_context *r300)
}
OUT_CS_REG(R300_ZB_ZPASS_DATA, 0);
END_CS;
query->begin_emitted = TRUE;
}


@@ -429,10 +430,16 @@ static void rv530_emit_query_double(struct r300_context *r300,
END_CS;
}

void r300_emit_query_end(struct r300_context* r300,
struct r300_query* query)
void r300_emit_query_end(struct r300_context* r300)
{
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,
0, RADEON_GEM_DOMAIN_GTT)) {

+ 1
- 2
src/gallium/drivers/r300/r300_emit.h 查看文件

@@ -58,8 +58,7 @@ void r300_emit_fb_state(struct r300_context* r300,

void r300_emit_query_begin(struct r300_context* r300,
struct r300_query* query);
void r300_emit_query_end(struct r300_context* r300,
struct r300_query* query);
void r300_emit_query_end(struct r300_context* r300);

void r300_emit_rs_state(struct r300_context* r300, struct r300_rs_state* rs);


+ 2
- 0
src/gallium/drivers/r300/r300_flush.c 查看文件

@@ -36,6 +36,8 @@ static void r300_flush(struct pipe_context* pipe,
draw_flush(r300->draw);
}

r300_emit_query_end(r300);

if (r300->dirty_hw) {
FLUSH_CS;
r300_emit_invariant_state(r300);

+ 2
- 5
src/gallium/drivers/r300/r300_query.c 查看文件

@@ -88,14 +88,11 @@ static void r300_begin_query(struct pipe_context* pipe,
}

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_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;
}


正在加载...
取消
保存