summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/i965/brw_queryobj.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c
index 36de43e16a..592b958e53 100644
--- a/src/mesa/drivers/dri/i965/brw_queryobj.c
+++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
@@ -45,6 +45,49 @@
#include "intel_batchbuffer.h"
#include "intel_reg.h"
+#include <xf86drm.h>
+
+static void clear_bo(struct brw_context *brw, drm_intel_bo *dst)
+{
+ struct intel_context *intel = &brw->intel;
+ struct drm_i915_gem_execbuffer2 execbuf;
+ struct drm_i915_gem_exec_object2 exec[2];
+ struct drm_i915_gem_relocation_entry reloc[1];
+ drm_intel_bo *bo = drm_intel_bo_alloc(intel->bufmgr, "clear", 4096, 0);
+ uint32_t batch[6] = {
+ 2<<29 | 0x40<<22 | 0x3<<20 | 0x3,
+ 0x3<<24 | 0x0 << 16 | 4096,
+ 1 << 16 | 4096,
+ dst->offset,
+ 0,
+ MI_BATCH_BUFFER_END,
+ };
+ drm_intel_bo_subdata(bo, 0, sizeof(batch), batch);
+
+ memset(reloc, 0, sizeof(reloc));
+ reloc->offset = 3 * sizeof(uint32_t);
+ reloc->target_handle = dst->handle;
+ reloc->presumed_offset = dst->offset;
+ reloc->read_domains = I915_GEM_DOMAIN_RENDER;
+ reloc->write_domain = I915_GEM_DOMAIN_RENDER;
+
+ memset(exec, 0, sizeof(exec));
+ exec[0].handle = dst->handle;
+ exec[1].handle = bo->handle;
+ exec[1].relocation_count = 1;
+ exec[1].relocs_ptr = (uintptr_t)reloc;
+
+ memset(&execbuf, 0, sizeof(execbuf));
+ execbuf.buffers_ptr = (uintptr_t)exec;
+ execbuf.buffer_count = 2;
+ execbuf.batch_len = sizeof(batch);
+ execbuf.flags = intel->gen >= 6 ? I915_EXEC_BLT : 0;
+
+ drmIoctl(intel->driFd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf);
+
+ drm_intel_bo_unreference(bo);
+}
+
/** Waits on the query object's BO and totals the results for this query */
static void
brw_queryobj_get_results(struct gl_context *ctx,
@@ -335,10 +378,8 @@ brw_prepare_query_begin(struct brw_context *brw)
brw->query.bo = drm_intel_bo_alloc(intel->bufmgr, "query", 4096, 1);
- /* 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);
+ if (intel->gen == 6 && brw->query.bo->offset)
+ clear_bo(brw, brw->query.bo);
brw->query.index = 0;
}