X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr300%2Fr300_query.c;h=f9e4aca0e929fefa28b9fceaa0e4aa7cb0ef4150;hb=e3b249f1665612cab63795cfee4dd54ec7f513f6;hp=8f7de79538da1db11b24c67c1449f3f23046769a;hpb=083482d493ce3d604d83bfed874bd662dfd165ca;p=mesa.git diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c index 8f7de79538d..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; } @@ -52,19 +54,20 @@ static struct pipe_query *r300_create_query(struct pipe_context *pipe, return (struct pipe_query*)q; } - if (r300screen->caps.family == CHIP_FAMILY_RV530) + if (r300screen->caps.family == CHIP_RV530) q->num_pipes = r300screen->info.r300_num_z_pipes; else q->num_pipes = r300screen->info.r300_num_gb_pipes; - q->buf = r300->rws->buffer_create(r300->rws, 4096, 4096, - PIPE_BIND_CUSTOM, PIPE_USAGE_STAGING); + 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, - void* 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); @@ -143,15 +149,14 @@ static boolean r300_get_query_result(struct pipe_context* pipe, uint32_t temp, *map; if (q->type == PIPE_QUERY_GPU_FINISHED) { - uint32_t *r = (uint32_t*)vresult; - if (wait) { - r300->rws->buffer_wait(q->buf, RADEON_USAGE_READWRITE); - *r = TRUE; + r300->rws->buffer_wait(q->buf, PIPE_TIMEOUT_INFINITE, + RADEON_USAGE_READWRITE); + vresult->b = TRUE; } else { - *r = !r300->rws->buffer_is_busy(q->buf, RADEON_USAGE_READWRITE); + vresult->b = r300->rws->buffer_wait(q->buf, 0, RADEON_USAGE_READWRITE); } - return *r; + return vresult->b; } map = r300->rws->buffer_map(q->buf, r300->cs, @@ -168,22 +173,23 @@ static boolean r300_get_query_result(struct pipe_context* pipe, map++; } - r300->rws->buffer_unmap(q->buf); - - if (q->type == PIPE_QUERY_OCCLUSION_PREDICATE) { - temp = temp != 0; + if (q->type == PIPE_QUERY_OCCLUSION_PREDICATE || + q->type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE) { + vresult->b = temp != 0; + } else { + vresult->u64 = temp; } - *((uint64_t*)vresult) = temp; return TRUE; } static void r300_render_condition(struct pipe_context *pipe, struct pipe_query *query, - uint mode) + bool condition, + enum pipe_render_cond_flag mode) { struct r300_context *r300 = r300_context(pipe); - uint64_t result = 0; - boolean wait; + union pipe_query_result result; + bool wait; r300->skip_rendering = FALSE; @@ -192,11 +198,21 @@ 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)) { - r300->skip_rendering = result == 0; + 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; + } } } } +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; @@ -204,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; }