diff options
Diffstat (limited to 'src/mesa/drivers/dri/intel/intel_batchbuffer.h')
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_batchbuffer.h | 57 |
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) |