X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr300%2Fr300_query.c;h=f9e4aca0e929fefa28b9fceaa0e4aa7cb0ef4150;hb=e3b249f1665612cab63795cfee4dd54ec7f513f6;hp=fbf44c68419d6ff958a623dc3034d81f16fa5ace;hpb=793e8e3d7ed816cc9a066245dde798afdcf8b581;p=mesa.git diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c index fbf44c68419..f9e4aca0e92 100644 --- a/src/gallium/drivers/r300/r300_query.c +++ b/src/gallium/drivers/r300/r300_query.c @@ -21,7 +21,7 @@ * USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "util/u_memory.h" -#include "util/u_simple_list.h" +#include "util/simple_list.h" #include "r300_context.h" #include "r300_screen.h" @@ -30,7 +30,8 @@ #include static struct pipe_query *r300_create_query(struct pipe_context *pipe, - unsigned query_type) + unsigned query_type, + unsigned index) { struct r300_context *r300 = r300_context(pipe); struct r300_screen *r300screen = r300->screen; @@ -38,6 +39,7 @@ static struct pipe_query *r300_create_query(struct pipe_context *pipe, if (query_type != PIPE_QUERY_OCCLUSION_COUNTER && query_type != PIPE_QUERY_OCCLUSION_PREDICATE && + query_type != PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE && query_type != PIPE_QUERY_GPU_FINISHED) { return NULL; } @@ -57,14 +59,15 @@ static struct pipe_query *r300_create_query(struct pipe_context *pipe, else q->num_pipes = r300screen->info.r300_num_gb_pipes; - q->buf = r300->rws->buffer_create(r300->rws, 4096, 4096, TRUE, - RADEON_DOMAIN_GTT); + q->buf = r300->rws->buffer_create(r300->rws, + r300screen->info.gart_page_size, + r300screen->info.gart_page_size, + RADEON_DOMAIN_GTT, + RADEON_FLAG_NO_INTERPROCESS_SHARING); if (!q->buf) { FREE(q); return NULL; } - q->cs_buf = r300->rws->buffer_get_cs_handle(q->buf); - return (struct pipe_query*)q; } @@ -84,24 +87,25 @@ void r300_resume_query(struct r300_context *r300, r300_mark_atom_dirty(r300, &r300->query_start); } -static void r300_begin_query(struct pipe_context* pipe, +static bool r300_begin_query(struct pipe_context* pipe, struct pipe_query* query) { struct r300_context* r300 = r300_context(pipe); struct r300_query* q = r300_query(query); if (q->type == PIPE_QUERY_GPU_FINISHED) - return; + return true; if (r300->query_current != NULL) { fprintf(stderr, "r300: begin_query: " "Some other query has already been started.\n"); assert(0); - return; + return false; } q->num_results = 0; r300_resume_query(r300, q); + return true; } void r300_stop_query(struct r300_context *r300) @@ -110,7 +114,7 @@ void r300_stop_query(struct r300_context *r300) r300->query_current = NULL; } -static void r300_end_query(struct pipe_context* pipe, +static bool r300_end_query(struct pipe_context* pipe, struct pipe_query* query) { struct r300_context* r300 = r300_context(pipe); @@ -118,24 +122,26 @@ static void r300_end_query(struct pipe_context* pipe, if (q->type == PIPE_QUERY_GPU_FINISHED) { pb_reference(&q->buf, NULL); - r300_flush(pipe, RADEON_FLUSH_ASYNC, + r300_flush(pipe, PIPE_FLUSH_ASYNC, (struct pipe_fence_handle**)&q->buf); - return; + return true; } if (q != r300->query_current) { fprintf(stderr, "r300: end_query: Got invalid query.\n"); assert(0); - return; + return false; } r300_stop_query(r300); + + return true; } -static boolean r300_get_query_result(struct pipe_context* pipe, - struct pipe_query* query, - boolean wait, - union pipe_query_result *vresult) +static bool r300_get_query_result(struct pipe_context* pipe, + struct pipe_query* query, + bool wait, + union pipe_query_result *vresult) { struct r300_context* r300 = r300_context(pipe); struct r300_query *q = r300_query(query); @@ -144,15 +150,16 @@ static boolean r300_get_query_result(struct pipe_context* pipe, if (q->type == PIPE_QUERY_GPU_FINISHED) { if (wait) { - r300->rws->buffer_wait(q->buf, RADEON_USAGE_READWRITE); + r300->rws->buffer_wait(q->buf, PIPE_TIMEOUT_INFINITE, + RADEON_USAGE_READWRITE); vresult->b = TRUE; } else { - vresult->b = !r300->rws->buffer_is_busy(q->buf, RADEON_USAGE_READWRITE); + vresult->b = r300->rws->buffer_wait(q->buf, 0, RADEON_USAGE_READWRITE); } return vresult->b; } - map = r300->rws->buffer_map(q->cs_buf, r300->cs, + map = r300->rws->buffer_map(q->buf, r300->cs, PIPE_TRANSFER_READ | (!wait ? PIPE_TRANSFER_DONTBLOCK : 0)); if (!map) @@ -166,9 +173,8 @@ static boolean r300_get_query_result(struct pipe_context* pipe, map++; } - r300->rws->buffer_unmap(q->cs_buf); - - if (q->type == PIPE_QUERY_OCCLUSION_PREDICATE) { + if (q->type == PIPE_QUERY_OCCLUSION_PREDICATE || + q->type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE) { vresult->b = temp != 0; } else { vresult->u64 = temp; @@ -178,12 +184,12 @@ static boolean r300_get_query_result(struct pipe_context* pipe, static void r300_render_condition(struct pipe_context *pipe, struct pipe_query *query, - boolean condition, - uint mode) + bool condition, + enum pipe_render_cond_flag mode) { struct r300_context *r300 = r300_context(pipe); union pipe_query_result result; - boolean wait; + bool wait; r300->skip_rendering = FALSE; @@ -192,7 +198,8 @@ static void r300_render_condition(struct pipe_context *pipe, mode == PIPE_RENDER_COND_BY_REGION_WAIT; if (r300_get_query_result(pipe, query, wait, &result)) { - if (r300_query(query)->type == PIPE_QUERY_OCCLUSION_PREDICATE) { + if (r300_query(query)->type == PIPE_QUERY_OCCLUSION_PREDICATE || + r300_query(query)->type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE) { r300->skip_rendering = condition == result.b; } else { r300->skip_rendering = condition == !!result.u64; @@ -201,6 +208,11 @@ static void r300_render_condition(struct pipe_context *pipe, } } +static void +r300_set_active_query_state(struct pipe_context *pipe, bool enable) +{ +} + void r300_init_query_functions(struct r300_context* r300) { r300->context.create_query = r300_create_query; @@ -208,5 +220,6 @@ void r300_init_query_functions(struct r300_context* r300) r300->context.begin_query = r300_begin_query; r300->context.end_query = r300_end_query; r300->context.get_query_result = r300_get_query_result; + r300->context.set_active_query_state = r300_set_active_query_state; r300->context.render_condition = r300_render_condition; }