[Mesa-dev] [PATCH 3/4] i965: Refactor in preparation for fixing GL_TIME_ELAPSED across batchbuffers.
Eric Anholt
eric at anholt.net
Tue Oct 23 13:25:10 PDT 2012
---
src/mesa/drivers/dri/i965/brw_context.h | 15 +++++-
src/mesa/drivers/dri/i965/brw_queryobj.c | 87 ++++++++++++++++++------------
2 files changed, 66 insertions(+), 36 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 9232a72..d639a4a 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -737,6 +737,11 @@ struct brw_query_object {
int last_index;
};
+enum query_types {
+ QUERY_SAMPLES,
+ QUERY_TIME_ELAPSED,
+ QUERY_TYPE_COUNT,
+};
/**
* brw_context is derived from intel_context.
@@ -1053,12 +1058,18 @@ struct brw_context
uint32_t vp_offset;
} cc;
- struct {
+ /**
+ * For each type of query that requires tracking in the hardware per
+ * batchbuffer, keep a BO that accumulates query results and a position to
+ * store the next query result.
+ */
+ struct active_query {
struct brw_query_object *obj;
drm_intel_bo *bo;
int index;
bool begin_emitted;
- } query;
+ } query[QUERY_TYPE_COUNT];
+
/* Used to give every program string a unique id
*/
GLuint program_id;
diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c
index ff873ae..36caf1e 100644
--- a/src/mesa/drivers/dri/i965/brw_queryobj.c
+++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
@@ -268,7 +268,7 @@ brw_begin_query(struct gl_context *ctx, struct gl_query_object *q)
query->first_index = -1;
query->last_index = -1;
- brw->query.obj = query;
+ brw->query[QUERY_SAMPLES].obj = query;
intel->stats_wm++;
break;
@@ -320,11 +320,11 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q)
if (query->bo) {
brw_emit_query_end(brw);
- drm_intel_bo_unreference(brw->query.bo);
- brw->query.bo = NULL;
+ drm_intel_bo_unreference(brw->query[QUERY_SAMPLES].bo);
+ brw->query[QUERY_SAMPLES].bo = NULL;
}
- brw->query.obj = NULL;
+ brw->query[QUERY_SAMPLES].obj = NULL;
intel->stats_wm--;
break;
@@ -398,39 +398,50 @@ brw_emit_query_begin(struct brw_context *brw)
{
struct intel_context *intel = &brw->intel;
struct gl_context *ctx = &intel->ctx;
- struct brw_query_object *query = brw->query.obj;
- /* Skip if we're not doing any queries, or we've emitted the start. */
- if (!query || brw->query.begin_emitted)
- return;
+ for (enum query_types i = 0; i < QUERY_TYPE_COUNT; i++) {
+ struct brw_query_object *query = brw->query[i].obj;
- /* Get a new query BO if we're going to need it. */
- if (brw->query.bo == NULL ||
- brw->query.index * 2 + 1 >= 4096 / sizeof(uint64_t)) {
- drm_intel_bo_unreference(brw->query.bo);
- brw->query.bo = NULL;
+ if (!query)
+ continue;
- brw->query.bo = drm_intel_bo_alloc(intel->bufmgr, "query", 4096, 1);
+ if (brw->query[i].begin_emitted)
+ continue;
- /* clear target buffer */
- drm_intel_bo_map(brw->query.bo, true);
- memset((char *)brw->query.bo->virtual, 0, 4096);
- drm_intel_bo_unmap(brw->query.bo);
+ /* Get a new query BO if we're going to need it. */
+ if (brw->query[i].bo == NULL ||
+ brw->query[i].index * 2 + 1 >= 4096 / sizeof(uint64_t)) {
+ drm_intel_bo_unreference(brw->query[i].bo);
+ brw->query[i].bo = NULL;
- brw->query.index = 0;
- }
+ brw->query[i].bo = drm_intel_bo_alloc(intel->bufmgr, "query", 4096, 1);
+
+ /* clear target buffer */
+ drm_intel_bo_map(brw->query[i].bo, true);
+ memset((char *)brw->query[i].bo->virtual, 0, 4096);
+ drm_intel_bo_unmap(brw->query[i].bo);
+
+ brw->query[i].index = 0;
+ }
- write_depth_count(intel, brw->query.bo, brw->query.index * 2);
+ switch (i) {
+ case QUERY_SAMPLES:
+ write_depth_count(intel, brw->query[i].bo, brw->query[i].index * 2);
+ break;
+ default:
+ assert(!"not reached");
+ }
- if (query->bo != brw->query.bo) {
- if (query->bo != NULL)
- brw_queryobj_get_results(ctx, query);
- drm_intel_bo_reference(brw->query.bo);
- query->bo = brw->query.bo;
- query->first_index = brw->query.index;
+ if (query->bo != brw->query[i].bo) {
+ if (query->bo != NULL)
+ brw_queryobj_get_results(ctx, query);
+ drm_intel_bo_reference(brw->query[i].bo);
+ query->bo = brw->query[i].bo;
+ query->first_index = brw->query[i].index;
+ }
+ query->last_index = brw->query[i].index;
+ brw->query[i].begin_emitted = true;
}
- query->last_index = brw->query.index;
- brw->query.begin_emitted = true;
}
/** Called at batchbuffer flush to get an ending PS_DEPTH_COUNT */
@@ -439,13 +450,21 @@ brw_emit_query_end(struct brw_context *brw)
{
struct intel_context *intel = &brw->intel;
- if (!brw->query.begin_emitted)
- return;
+ for (enum query_types i = 0; i < QUERY_TYPE_COUNT; i++) {
+ if (!brw->query[i].begin_emitted)
+ continue;
- write_depth_count(intel, brw->query.bo, brw->query.index * 2 + 1);
+ switch (i) {
+ case QUERY_SAMPLES:
+ write_depth_count(intel, brw->query[i].bo, brw->query[i].index * 2 + 1);
+ break;
+ default:
+ assert(!"not reached");
+ }
- brw->query.begin_emitted = false;
- brw->query.index++;
+ brw->query[i].begin_emitted = false;
+ brw->query[i].index++;
+ }
}
static uint64_t
--
1.7.10.4
More information about the mesa-dev
mailing list