static void softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q) { struct softpipe_context *softpipe = softpipe_context( pipe ); struct softpipe_query *sq = softpipe_query(q); switch (sq->type) { case PIPE_QUERY_OCCLUSION_COUNTER: sq->start = softpipe->occlusion_count; break; case PIPE_QUERY_TIMESTAMP_DISJOINT: case PIPE_QUERY_TIME_ELAPSED: sq->start = 1000*os_time_get(); break; case PIPE_QUERY_SO_STATISTICS: sq->so.primitives_storage_needed = 0; case PIPE_QUERY_PRIMITIVES_EMITTED: sq->so.num_primitives_written = 0; softpipe->so_stats.num_primitives_written = 0; break; case PIPE_QUERY_PRIMITIVES_GENERATED: sq->num_primitives_generated = 0; softpipe->num_primitives_generated = 0; break; case PIPE_QUERY_TIMESTAMP: case PIPE_QUERY_GPU_FINISHED: break; default: assert(0); break; } softpipe->active_query_count++; softpipe->dirty |= SP_NEW_QUERY; }
static void softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q) { struct softpipe_context *softpipe = softpipe_context( pipe ); struct softpipe_query *sq = softpipe_query(q); sq->end = softpipe->occlusion_count; }
static boolean softpipe_get_query_result(struct pipe_context *pipe, struct pipe_query *q, boolean wait, uint64_t *result ) { struct softpipe_query *sq = softpipe_query(q); *result = sq->end - sq->start; return TRUE; }
static boolean softpipe_get_query_result(struct pipe_context *pipe, struct pipe_query *q, boolean wait, union pipe_query_result *vresult) { struct softpipe_query *sq = softpipe_query(q); uint64_t *result = (uint64_t*)vresult; switch (sq->type) { case PIPE_QUERY_SO_STATISTICS: { struct pipe_query_data_so_statistics *stats = (struct pipe_query_data_so_statistics *)vresult; stats->num_primitives_written = sq->so.num_primitives_written; stats->primitives_storage_needed = sq->so.primitives_storage_needed; } break; case PIPE_QUERY_PIPELINE_STATISTICS: memcpy(vresult, &sq->stats, sizeof(struct pipe_query_data_pipeline_statistics));; break; case PIPE_QUERY_GPU_FINISHED: vresult->b = TRUE; break; case PIPE_QUERY_SO_OVERFLOW_PREDICATE: vresult->b = sq->end != 0; break; case PIPE_QUERY_TIMESTAMP_DISJOINT: { struct pipe_query_data_timestamp_disjoint *td = (struct pipe_query_data_timestamp_disjoint *)vresult; /* os_get_time_nano return nanoseconds */ td->frequency = UINT64_C(1000000000); td->disjoint = FALSE; } break; case PIPE_QUERY_PRIMITIVES_EMITTED: *result = sq->so.num_primitives_written; break; case PIPE_QUERY_PRIMITIVES_GENERATED: *result = sq->so.primitives_storage_needed; break; case PIPE_QUERY_OCCLUSION_PREDICATE: vresult->b = sq->end - sq->start != 0; break; default: *result = sq->end - sq->start; break; } return TRUE; }
static boolean softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q) { struct softpipe_context *softpipe = softpipe_context( pipe ); struct softpipe_query *sq = softpipe_query(q); switch (sq->type) { case PIPE_QUERY_OCCLUSION_COUNTER: case PIPE_QUERY_OCCLUSION_PREDICATE: sq->start = softpipe->occlusion_count; break; case PIPE_QUERY_TIME_ELAPSED: sq->start = os_time_get_nano(); break; case PIPE_QUERY_SO_STATISTICS: sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written; sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed; break; case PIPE_QUERY_SO_OVERFLOW_PREDICATE: sq->end = FALSE; break; case PIPE_QUERY_PRIMITIVES_EMITTED: sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written; break; case PIPE_QUERY_PRIMITIVES_GENERATED: sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed; break; case PIPE_QUERY_TIMESTAMP: case PIPE_QUERY_GPU_FINISHED: case PIPE_QUERY_TIMESTAMP_DISJOINT: break; case PIPE_QUERY_PIPELINE_STATISTICS: /* reset our cache */ if (softpipe->active_statistics_queries == 0) { memset(&softpipe->pipeline_statistics, 0, sizeof(softpipe->pipeline_statistics)); } memcpy(&sq->stats, &softpipe->pipeline_statistics, sizeof(sq->stats)); softpipe->active_statistics_queries++; break; default: assert(0); break; } softpipe->active_query_count++; softpipe->dirty |= SP_NEW_QUERY; return true; }
static boolean softpipe_get_query_result(struct pipe_context *pipe, struct pipe_query *q, boolean wait, union pipe_query_result *vresult) { struct softpipe_query *sq = softpipe_query(q); uint64_t *result = (uint64_t*)vresult; switch (sq->type) { case PIPE_QUERY_SO_STATISTICS: memcpy(vresult, &sq->so, sizeof(struct pipe_query_data_so_statistics)); break; case PIPE_QUERY_GPU_FINISHED: *result = TRUE; break; case PIPE_QUERY_TIMESTAMP_DISJOINT: { struct pipe_query_data_timestamp_disjoint td; /*os_get_time is in microseconds*/ td.frequency = 1000000; td.disjoint = sq->end != sq->start; memcpy(vresult, &td, sizeof(struct pipe_query_data_timestamp_disjoint)); } break; case PIPE_QUERY_PRIMITIVES_EMITTED: *result = sq->so.num_primitives_written; break; case PIPE_QUERY_PRIMITIVES_GENERATED: *result = sq->num_primitives_generated; break; default: *result = sq->end - sq->start; break; } return TRUE; }
static void softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q) { struct softpipe_context *softpipe = softpipe_context( pipe ); struct softpipe_query *sq = softpipe_query(q); softpipe->active_query_count--; switch (sq->type) { case PIPE_QUERY_OCCLUSION_COUNTER: case PIPE_QUERY_OCCLUSION_PREDICATE: sq->end = softpipe->occlusion_count; break; case PIPE_QUERY_TIMESTAMP: sq->start = 0; /* fall through */ case PIPE_QUERY_TIME_ELAPSED: sq->end = os_time_get_nano(); break; case PIPE_QUERY_SO_OVERFLOW_PREDICATE: sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written; sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed - sq->so.primitives_storage_needed; sq->end = sq->so.primitives_storage_needed > sq->so.num_primitives_written; break; case PIPE_QUERY_SO_STATISTICS: sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written; sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed - sq->so.primitives_storage_needed; break; case PIPE_QUERY_PRIMITIVES_EMITTED: sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written; break; case PIPE_QUERY_PRIMITIVES_GENERATED: sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed - sq->so.primitives_storage_needed; break; case PIPE_QUERY_GPU_FINISHED: case PIPE_QUERY_TIMESTAMP_DISJOINT: break; case PIPE_QUERY_PIPELINE_STATISTICS: sq->stats.ia_vertices = softpipe->pipeline_statistics.ia_vertices - sq->stats.ia_vertices; sq->stats.ia_primitives = softpipe->pipeline_statistics.ia_primitives - sq->stats.ia_primitives; sq->stats.vs_invocations = softpipe->pipeline_statistics.vs_invocations - sq->stats.vs_invocations; sq->stats.gs_invocations = softpipe->pipeline_statistics.gs_invocations - sq->stats.gs_invocations; sq->stats.gs_primitives = softpipe->pipeline_statistics.gs_primitives - sq->stats.gs_primitives; sq->stats.c_invocations = softpipe->pipeline_statistics.c_invocations - sq->stats.c_invocations; sq->stats.c_primitives = softpipe->pipeline_statistics.c_primitives - sq->stats.c_primitives; sq->stats.ps_invocations = softpipe->pipeline_statistics.ps_invocations - sq->stats.ps_invocations; softpipe->active_statistics_queries--; break; default: assert(0); break; } softpipe->dirty |= SP_NEW_QUERY; }