summaryrefslogtreecommitdiff
path: root/lib/intel_batchbuffer.h
diff options
context:
space:
mode:
authorGraydon, Tracy <tracy.graydon@intel.com>2013-01-31 15:14:28 -0800
committerGraydon, Tracy <tracy.graydon@intel.com>2013-01-31 15:14:28 -0800
commit3c7b03f2f7b4ecfb18fb30f2e43b6321cb1aa4de (patch)
treebb8c57f401c0087a3ce4e96dc733abff854c3a43 /lib/intel_batchbuffer.h
downloadintel-gpu-tools-2.0alpha.tar.gz
intel-gpu-tools-2.0alpha.tar.bz2
intel-gpu-tools-2.0alpha.zip
Diffstat (limited to 'lib/intel_batchbuffer.h')
-rw-r--r--lib/intel_batchbuffer.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/lib/intel_batchbuffer.h b/lib/intel_batchbuffer.h
new file mode 100644
index 00000000..ba0934cb
--- /dev/null
+++ b/lib/intel_batchbuffer.h
@@ -0,0 +1,112 @@
+#ifndef INTEL_BATCHBUFFER_H
+#define INTEL_BATCHBUFFER_H
+
+#include <assert.h>
+#include "intel_bufmgr.h"
+
+#define BATCH_SZ 4096
+#define BATCH_RESERVED 16
+
+struct intel_batchbuffer {
+ drm_intel_bufmgr *bufmgr;
+ uint32_t devid;
+
+ drm_intel_bo *bo;
+
+ uint8_t buffer[BATCH_SZ];
+ uint8_t *ptr;
+};
+
+struct intel_batchbuffer *intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr,
+ uint32_t devid);
+
+void intel_batchbuffer_free(struct intel_batchbuffer *batch);
+
+
+void intel_batchbuffer_flush(struct intel_batchbuffer *batch);
+void intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring);
+void intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch,
+ drm_intel_context *context);
+
+void intel_batchbuffer_reset(struct intel_batchbuffer *batch);
+
+void intel_batchbuffer_data(struct intel_batchbuffer *batch,
+ const void *data, unsigned int bytes);
+
+void intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch,
+ drm_intel_bo *buffer,
+ uint32_t delta,
+ uint32_t read_domains,
+ uint32_t write_domain,
+ int fenced);
+
+/* Inline functions - might actually be better off with these
+ * non-inlined. Certainly better off switching all command packets to
+ * be passed as structs rather than dwords, but that's a little bit of
+ * work...
+ */
+#pragma GCC diagnostic ignored "-Winline"
+static inline int
+intel_batchbuffer_space(struct intel_batchbuffer *batch)
+{
+ return (BATCH_SZ - BATCH_RESERVED) - (batch->ptr - batch->buffer);
+}
+
+
+static inline void
+intel_batchbuffer_emit_dword(struct intel_batchbuffer *batch, uint32_t dword)
+{
+ assert(intel_batchbuffer_space(batch) >= 4);
+ *(uint32_t *) (batch->ptr) = dword;
+ batch->ptr += 4;
+}
+
+static inline void
+intel_batchbuffer_require_space(struct intel_batchbuffer *batch,
+ unsigned int sz)
+{
+ assert(sz < BATCH_SZ - BATCH_RESERVED);
+ if (intel_batchbuffer_space(batch) < sz)
+ intel_batchbuffer_flush(batch);
+}
+
+/* Here are the crusty old macros, to be removed:
+ */
+#define BATCH_LOCALS
+
+#define BEGIN_BATCH(n) do { \
+ intel_batchbuffer_require_space(batch, (n)*4); \
+} while (0)
+
+#define OUT_BATCH(d) intel_batchbuffer_emit_dword(batch, d)
+
+#define OUT_RELOC_FENCED(buf, read_domains, write_domain, delta) do { \
+ assert((delta) >= 0); \
+ intel_batchbuffer_emit_reloc(batch, buf, delta, \
+ read_domains, write_domain, 1); \
+} while (0)
+
+#define OUT_RELOC(buf, read_domains, write_domain, delta) do { \
+ assert((delta) >= 0); \
+ intel_batchbuffer_emit_reloc(batch, buf, delta, \
+ read_domains, write_domain, 0); \
+} while (0)
+
+#define ADVANCE_BATCH() do { \
+} while(0)
+
+void
+intel_batchbuffer_emit_mi_flush(struct intel_batchbuffer *batch);
+
+void intel_copy_bo(struct intel_batchbuffer *batch,
+ drm_intel_bo *dst_bo, drm_intel_bo *src_bo,
+ int width, int height);
+
+#define I915_EXEC_CONTEXT_ID_MASK (0xffffffff)
+#define i915_execbuffer2_set_context_id(eb2, context) \
+ (eb2).rsvd1 = context & I915_EXEC_CONTEXT_ID_MASK
+#define i915_execbuffer2_get_context_id(eb2) \
+ ((eb2).rsvd1 & I915_EXEC_CONTEXT_ID_MASK)
+
+
+#endif