X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_queryobj.c;h=a8e5ababba47c8f509e2d3467e27322221523d2d;hb=65a5af6dd0550e93a5250582147689a1ddef9ffa;hp=dc26c0864e17a168a1269cbe9ada63d20c58a7dc;hpb=f5dd608db2d6a67cfe27efed948408414a057fe3;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c index dc26c0864e1..a8e5ababba4 100644 --- a/src/mesa/drivers/dri/i965/brw_queryobj.c +++ b/src/mesa/drivers/dri/i965/brw_queryobj.c @@ -63,15 +63,14 @@ brw_write_timestamp(struct brw_context *brw, drm_intel_bo *query_bo, int idx) /** * Emit PIPE_CONTROLs to write the PS_DEPTH_COUNT register into a buffer. */ -static void -write_depth_count(struct brw_context *brw, drm_intel_bo *query_bo, int idx) +void +brw_write_depth_count(struct brw_context *brw, drm_intel_bo *query_bo, int idx) { - assert(brw->gen < 6); - brw_emit_pipe_control_write(brw, - PIPE_CONTROL_WRITE_DEPTH_COUNT - | PIPE_CONTROL_DEPTH_STALL, - query_bo, idx * sizeof(uint64_t), 0, 0); + PIPE_CONTROL_WRITE_DEPTH_COUNT | + PIPE_CONTROL_DEPTH_STALL, + query_bo, idx * sizeof(uint64_t), + 0, 0); } /** @@ -149,8 +148,7 @@ brw_queryobj_get_results(struct gl_context *ctx, break; default: - assert(!"Unrecognized query target in brw_queryobj_get_results()"); - break; + unreachable("Unrecognized query target in brw_queryobj_get_results()"); } drm_intel_bo_unmap(query->bo); @@ -254,12 +252,11 @@ brw_begin_query(struct gl_context *ctx, struct gl_query_object *q) * so turn them on now. */ brw->stats_wm++; - brw->state.dirty.brw |= BRW_NEW_STATS_WM; + brw->ctx.NewDriverState |= BRW_NEW_STATS_WM; break; default: - assert(!"Unrecognized query target in brw_begin_query()"); - break; + unreachable("Unrecognized query target in brw_begin_query()"); } } @@ -312,12 +309,11 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q) brw->query.obj = NULL; brw->stats_wm--; - brw->state.dirty.brw |= BRW_NEW_STATS_WM; + brw->ctx.NewDriverState |= BRW_NEW_STATS_WM; break; default: - assert(!"Unrecognized query target in brw_end_query()"); - break; + unreachable("Unrecognized query target in brw_end_query()"); } } @@ -431,7 +427,7 @@ brw_emit_query_begin(struct brw_context *brw) ensure_bo_has_space(ctx, query); - write_depth_count(brw, query->bo, query->last_index * 2); + brw_write_depth_count(brw, query->bo, query->last_index * 2); brw->query.begin_emitted = true; } @@ -453,7 +449,7 @@ brw_emit_query_end(struct brw_context *brw) if (!brw->query.begin_emitted) return; - write_depth_count(brw, query->bo, query->last_index * 2 + 1); + brw_write_depth_count(brw, query->bo, query->last_index * 2 + 1); brw->query.begin_emitted = false; query->last_index++; @@ -477,6 +473,8 @@ brw_query_counter(struct gl_context *ctx, struct gl_query_object *q) drm_intel_bo_unreference(query->bo); query->bo = drm_intel_bo_alloc(brw->bufmgr, "timestamp query", 4096, 4096); brw_write_timestamp(brw, query->bo, 0); + + query->flushed = false; } /** @@ -490,13 +488,22 @@ brw_get_timestamp(struct gl_context *ctx) struct brw_context *brw = brw_context(ctx); uint64_t result = 0; - drm_intel_reg_read(brw->bufmgr, TIMESTAMP, &result); + switch (brw->intelScreen->hw_has_timestamp) { + case 3: /* New kernel, always full 36bit accuracy */ + drm_intel_reg_read(brw->bufmgr, TIMESTAMP | 1, &result); + break; + case 2: /* 64bit kernel, result is left-shifted by 32bits, losing 4bits */ + drm_intel_reg_read(brw->bufmgr, TIMESTAMP, &result); + result = result >> 32; + break; + case 1: /* 32bit kernel, result is 36bit wide but may be inaccurate! */ + drm_intel_reg_read(brw->bufmgr, TIMESTAMP, &result); + break; + } /* See logic in brw_queryobj_get_results() */ - result = result >> 32; result *= 80; result &= (1ull << 36) - 1; - return result; }