1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2008 Intel Corporation 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Eric Anholt <eric@anholt.net> 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** @file brw_queryobj.c 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Support for query objects (GL_ARB_occlusion_query, GL_ARB_timer_query, 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_EXT_transform_feedback, and friends). 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The hardware provides a PIPE_CONTROL command that can report the number of 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragments that passed the depth test, or the hardware timer. They are 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * appropriately synced with the stage of the pipeline for our extensions' 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * needs. 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * To avoid getting samples from another context's rendering in our results, 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we capture the counts at the start and end of every batchbuffer while the 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * query is active, and sum up the differences. (We should do so for 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_TIME_ELAPSED as well, but don't). 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_batchbuffer.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_reg.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_timestamp(struct intel_context *intel, drm_intel_bo *query_bo, int idx) 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit workaround flushes: */ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 6) { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The timestamp write below is a non-zero post-sync op, which on 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Gen6 necessitates a CS stall. CS stalls need stall at scoreboard 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * set. See the comments for intel_emit_post_sync_nonzero_flush(). 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_PIPE_CONTROL | (4 - 2)); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(PIPE_CONTROL_CS_STALL | PIPE_CONTROL_STALL_AT_SCOREBOARD); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(5); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_PIPE_CONTROL | (5 - 2)); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(PIPE_CONTROL_WRITE_TIMESTAMP); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(query_bo, 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_GLOBAL_GTT_WRITE | 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org idx * sizeof(uint64_t)); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_PIPE_CONTROL | (4 - 2) | 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_WRITE_TIMESTAMP); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(query_bo, 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_GLOBAL_GTT_WRITE | 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org idx * sizeof(uint64_t)); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_depth_count(struct intel_context *intel, drm_intel_bo *query_bo, int idx) 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit Sandybridge workaround flush: */ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 6) 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_emit_post_sync_nonzero_flush(intel); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(5); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_PIPE_CONTROL | (5 - 2)); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(PIPE_CONTROL_DEPTH_STALL | 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_WRITE_DEPTH_COUNT); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(query_bo, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_GLOBAL_GTT_WRITE | 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (idx * sizeof(uint64_t))); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_BATCH(4); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(_3DSTATE_PIPE_CONTROL | (4 - 2) | 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_DEPTH_STALL | 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_WRITE_DEPTH_COUNT); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This object could be mapped cacheable, but we don't have an exposed 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mechanism to support that. Since it's going uncached, tell GEM that 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we're writing to it. The usual clflush should be all that's required 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to pick up the results. 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_RELOC(query_bo, 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_CONTROL_GLOBAL_GTT_WRITE | 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (idx * sizeof(uint64_t))); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_BATCH(0); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADVANCE_BATCH(); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Waits on the query object's BO and totals the results for this query */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_queryobj_get_results(struct gl_context *ctx, 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = intel_context(ctx); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t *results; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (query->bo == NULL) 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(INTEL_DEBUG & DEBUG_PERF)) { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (drm_intel_bo_busy(query->bo)) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perf_debug("Stalling on the GPU waiting for a query object.\n"); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_map(query->bo, false); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org results = query->bo->virtual; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (query->Base.Target) { 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TIME_ELAPSED_EXT: 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result += 80 * (results[1] - results[0]); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result += 1000 * ((results[1] >> 32) - (results[0] >> 32)); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TIMESTAMP: 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Our timer is a clock that increments every 80ns (regardless of 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * other clock scaling in the system). The timestamp register we can 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * read for glGetTimestamp() masks out the top 32 bits, so we do that 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * here too to let the two counters be compared against each other. 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we just multiplied that 32 bits of data by 80, it would roll 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * over at a non-power-of-two, so an application couldn't use 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_QUERY_COUNTER_BITS to handle rollover correctly. Instead, we 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * report 36 bits and truncate at that (rolling over 5 times as often 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as the HW counter), and when the 32-bit counter rolls over, it 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * happens to also be at a rollover in the reported value from near 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (1<<36) to 0. 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The low 32 bits rolls over in ~343 seconds. Our 36-bit result 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rolls over every ~69 seconds. 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result = 80 * (results[1] & 0xffffffff); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result &= (1ull << 36) - 1; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result = 1000 * (results[1] >> 32); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SAMPLES_PASSED_ARB: 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Map and count the pixels from the current query BO */ 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = query->first_index; i <= query->last_index; i++) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result += results[i * 2 + 1] - results[i * 2]; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ANY_SAMPLES_PASSED: 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set true if any of the sub-queries passed. */ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = query->first_index; i <= query->last_index; i++) { 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (results[i * 2 + 1] != results[i * 2]) { 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result = GL_TRUE; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PRIMITIVES_GENERATED: 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We don't actually query the hardware for this value, so query->bo 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * should always be NULL and execution should never reach here. 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unreachable"); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unrecognized query target in brw_queryobj_get_results()"); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unmap(query->bo); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unreference(query->bo); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->bo = NULL; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_query_object * 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_new_query_object(struct gl_context *ctx, GLuint id) 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query = calloc(1, sizeof(struct brw_query_object)); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Id = id; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result = 0; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Active = false; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Ready = true; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &query->Base; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_delete_query(struct gl_context *ctx, struct gl_query_object *q) 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query = (struct brw_query_object *)q; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unreference(query->bo); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(query); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_begin_query(struct gl_context *ctx, struct gl_query_object *q) 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = brw_context(ctx); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = intel_context(ctx); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query = (struct brw_query_object *)q; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (query->Base.Target) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TIME_ELAPSED_EXT: 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unreference(query->bo); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->bo = drm_intel_bo_alloc(intel->bufmgr, "timer query", 4096, 4096); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_timestamp(intel, query->bo, 0); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ANY_SAMPLES_PASSED: 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SAMPLES_PASSED_ARB: 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Reset our driver's tracking of query state. */ 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unreference(query->bo); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->bo = NULL; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->first_index = -1; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->last_index = -1; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.obj = query; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel->stats_wm++; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PRIMITIVES_GENERATED: 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We don't actually query the hardware for this value; we keep track of 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it a software counter. So just reset the counter. 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->sol.primitives_generated = 0; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->sol.counting_primitives_generated = true; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We don't actually query the hardware for this value; we keep track of 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it a software counter. So just reset the counter. 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->sol.primitives_written = 0; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->sol.counting_primitives_written = true; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unrecognized query target in brw_begin_query()"); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Begin the ARB_occlusion_query query on a query object. 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_end_query(struct gl_context *ctx, struct gl_query_object *q) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = brw_context(ctx); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = intel_context(ctx); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query = (struct brw_query_object *)q; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (query->Base.Target) { 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TIMESTAMP: 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unreference(query->bo); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->bo = drm_intel_bo_alloc(intel->bufmgr, "timer query", 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4096, 4096); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FALLTHROUGH */ 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TIME_ELAPSED_EXT: 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_timestamp(intel, query->bo, 1); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_batchbuffer_flush(intel); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ANY_SAMPLES_PASSED: 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SAMPLES_PASSED_ARB: 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Flush the batchbuffer in case it has writes to our query BO. 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Have later queries write to a new query BO so that further rendering 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * doesn't delay the collection of our results. 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (query->bo) { 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_emit_query_end(brw); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel_batchbuffer_flush(intel); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unreference(brw->query.bo); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.bo = NULL; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.obj = NULL; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intel->stats_wm--; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PRIMITIVES_GENERATED: 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We don't actually query the hardware for this value; we keep track of 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it in a software counter. So just read the counter and store it in 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the query object. 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result = brw->sol.primitives_generated; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->sol.counting_primitives_generated = false; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* And set brw->query.obj to NULL so that this query won't try to wait 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for any rendering to complete. 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->bo = NULL; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We don't actually query the hardware for this value; we keep track of 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it in a software counter. So just read the counter and store it in 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the query object. 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Result = brw->sol.primitives_written; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->sol.counting_primitives_written = false; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* And set brw->query.obj to NULL so that this query won't try to wait 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for any rendering to complete. 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->bo = NULL; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unrecognized query target in brw_end_query()"); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void brw_wait_query(struct gl_context *ctx, struct gl_query_object *q) 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query = (struct brw_query_object *)q; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_queryobj_get_results(ctx, query); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Ready = true; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void brw_check_query(struct gl_context *ctx, struct gl_query_object *q) 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query = (struct brw_query_object *)q; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (query->bo == NULL || !drm_intel_bo_busy(query->bo)) { 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_queryobj_get_results(ctx, query); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->Base.Ready = true; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Called to set up the query BO and account for its aperture space */ 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_prepare_query_begin(struct brw_context *brw) 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Skip if we're not doing any queries. */ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!brw->query.obj) 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Get a new query BO if we're going to need it. */ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (brw->query.bo == NULL || 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.index * 2 + 1 >= 4096 / sizeof(uint64_t)) { 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unreference(brw->query.bo); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.bo = NULL; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.bo = drm_intel_bo_alloc(intel->bufmgr, "query", 4096, 1); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clear target buffer */ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_map(brw->query.bo, true); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset((char *)brw->query.bo->virtual, 0, 4096); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_unmap(brw->query.bo); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.index = 0; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Called just before primitive drawing to get a beginning PS_DEPTH_COUNT. */ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_emit_query_begin(struct brw_context *brw) 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &intel->ctx; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_query_object *query = brw->query.obj; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Skip if we're not doing any queries, or we've emitted the start. */ 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!query || brw->query.active) 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_depth_count(intel, brw->query.bo, brw->query.index * 2); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (query->bo != brw->query.bo) { 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (query->bo != NULL) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_queryobj_get_results(ctx, query); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_bo_reference(brw->query.bo); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->bo = brw->query.bo; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->first_index = brw->query.index; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->last_index = brw->query.index; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.active = true; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Called at batchbuffer flush to get an ending PS_DEPTH_COUNT */ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_emit_query_end(struct brw_context *brw) 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!brw->query.active) 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_depth_count(intel, brw->query.bo, brw->query.index * 2 + 1); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.active = false; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->query.index++; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint64_t 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_get_timestamp(struct gl_context *ctx) 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = intel_context(ctx); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t result = 0; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_intel_reg_read(intel->bufmgr, TIMESTAMP, &result); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See logic in brw_queryobj_get_results() */ 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result = result >> 32; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result *= 80; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result &= (1ull << 36) - 1; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return result; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_init_queryobj_functions(struct dd_function_table *functions) 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->NewQueryObject = brw_new_query_object; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->DeleteQuery = brw_delete_query; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->BeginQuery = brw_begin_query; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->EndQuery = brw_end_query; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->CheckQuery = brw_check_query; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->WaitQuery = brw_wait_query; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->GetTimestamp = brw_get_timestamp; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 480