summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/intel/intel_batchbuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/intel/intel_batchbuffer.h')
-rw-r--r--src/mesa/drivers/dri/intel/intel_batchbuffer.h57
1 files changed, 38 insertions, 19 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.h b/src/mesa/drivers/dri/intel/intel_batchbuffer.h
index 5b6e0a19a5..a3058bc6e6 100644
--- a/src/mesa/drivers/dri/intel/intel_batchbuffer.h
+++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.h
@@ -10,9 +10,29 @@ struct intel_context;
#define BATCH_SZ 16384
#define BATCH_RESERVED 16
-enum cliprects_enable {
- INTEL_BATCH_CLIPRECTS = 0,
- INTEL_BATCH_NO_CLIPRECTS = 1
+enum cliprect_mode {
+ /**
+ * Batchbuffer contents may be looped over per cliprect, but do not
+ * require it.
+ */
+ IGNORE_CLIPRECTS,
+ /**
+ * Batchbuffer contents require looping over per cliprect at batch submit
+ * time.
+ */
+ LOOP_CLIPRECTS,
+ /**
+ * Batchbuffer contents contain drawing that should not be executed multiple
+ * times.
+ */
+ NO_LOOP_CLIPRECTS,
+ /**
+ * Batchbuffer contents contain drawing that already handles cliprects, such
+ * as 2D drawing to front/back/depth that doesn't respect DRAWING_RECTANGLE.
+ * Equivalent behavior to NO_LOOP_CLIPRECTS, but may not persist in batch
+ * outside of LOCK/UNLOCK.
+ */
+ REFERENCES_CLIPRECTS
};
struct intel_batchbuffer
@@ -25,7 +45,7 @@ struct intel_batchbuffer
GLubyte *map;
GLubyte *ptr;
- enum cliprects_enable cliprects_enable;
+ enum cliprect_mode cliprect_mode;
GLuint size;
@@ -52,7 +72,7 @@ void intel_batchbuffer_reset(struct intel_batchbuffer *batch);
*/
void intel_batchbuffer_data(struct intel_batchbuffer *batch,
const void *data, GLuint bytes,
- enum cliprects_enable cliprects_enable);
+ enum cliprect_mode cliprect_mode);
void intel_batchbuffer_release_space(struct intel_batchbuffer *batch,
GLuint bytes);
@@ -85,36 +105,35 @@ intel_batchbuffer_emit_dword(struct intel_batchbuffer *batch, GLuint dword)
static INLINE void
intel_batchbuffer_require_space(struct intel_batchbuffer *batch,
GLuint sz,
- enum cliprects_enable cliprects_enable)
+ enum cliprect_mode cliprect_mode)
{
assert(sz < batch->size - 8);
if (intel_batchbuffer_space(batch) < sz)
intel_batchbuffer_flush(batch);
- /* Upgrade the buffer to being looped over per cliprect if this batch
- * emit needs it. The code used to emit a batch whenever the
- * cliprects_enable was changed, but reducing the overhead of frequent
- * batch flushing is more important than reducing state parsing,
- * particularly as we move towards private backbuffers and number
- * cliprects always being 1 except at swap.
- */
- if (cliprects_enable == INTEL_BATCH_CLIPRECTS)
- batch->cliprects_enable = INTEL_BATCH_CLIPRECTS;
+ if (cliprect_mode != IGNORE_CLIPRECTS) {
+ if (batch->cliprect_mode == IGNORE_CLIPRECTS) {
+ batch->cliprect_mode = cliprect_mode;
+ } else {
+ if (batch->cliprect_mode != cliprect_mode)
+ intel_batchbuffer_flush(batch);
+ }
+ }
}
/* Here are the crusty old macros, to be removed:
*/
#define BATCH_LOCALS
-#define BEGIN_BATCH(n, cliprects_enable) do { \
- intel_batchbuffer_require_space(intel->batch, (n)*4, cliprects_enable); \
+#define BEGIN_BATCH(n, cliprect_mode) do { \
+ intel_batchbuffer_require_space(intel->batch, (n)*4, cliprect_mode); \
} while (0)
#define OUT_BATCH(d) intel_batchbuffer_emit_dword(intel->batch, d)
-#define OUT_RELOC(buf, cliprects_enable, delta) do { \
+#define OUT_RELOC(buf, cliprect_mode, delta) do { \
assert((delta) >= 0); \
- intel_batchbuffer_emit_reloc(intel->batch, buf, cliprects_enable, delta); \
+ intel_batchbuffer_emit_reloc(intel->batch, buf, cliprect_mode, delta); \
} while (0)
#define ADVANCE_BATCH() do { } while(0)