freedreno: introduce fd_batch
[mesa.git] / src / gallium / drivers / freedreno / freedreno_util.h
index 0d2418e1e00c6fe3dce05243a9348616c84380c3..b6b91f92c7c91b550e7979f40197c0ad220e4d0d 100644 (file)
@@ -73,6 +73,8 @@ enum adreno_stencil_op fd_stencil_op(unsigned op);
 #define FD_DBG_GLSL120  0x0400
 #define FD_DBG_SHADERDB 0x0800
 #define FD_DBG_FLUSH    0x1000
+#define FD_DBG_DEQP     0x2000
+#define FD_DBG_NIR      0x4000
 
 extern int fd_mesa_debug;
 extern bool fd_binning_enabled;
@@ -180,7 +182,7 @@ OUT_RING(struct fd_ringbuffer *ring, uint32_t data)
                DBG("ring[%p]: OUT_RING   %04x:  %08x", ring,
                                (uint32_t)(ring->cur - ring->last_start), data);
        }
-       *(ring->cur++) = data;
+       fd_ringbuffer_emit(ring, data);
 }
 
 /* like OUT_RING() but appends a cmdstream patch point to 'buf' */
@@ -206,6 +208,7 @@ OUT_RELOC(struct fd_ringbuffer *ring, struct fd_bo *bo,
                DBG("ring[%p]: OUT_RELOC   %04x:  %p+%u << %d", ring,
                                (uint32_t)(ring->cur - ring->last_start), bo, offset, shift);
        }
+       debug_assert(offset < fd_bo_size(bo));
        fd_ringbuffer_reloc(ring, &(struct fd_reloc){
                .bo = bo,
                .flags = FD_RELOC_READ,
@@ -223,6 +226,7 @@ OUT_RELOCW(struct fd_ringbuffer *ring, struct fd_bo *bo,
                DBG("ring[%p]: OUT_RELOCW  %04x:  %p+%u << %d", ring,
                                (uint32_t)(ring->cur - ring->last_start), bo, offset, shift);
        }
+       debug_assert(offset < fd_bo_size(bo));
        fd_ringbuffer_reloc(ring, &(struct fd_reloc){
                .bo = bo,
                .flags = FD_RELOC_READ | FD_RELOC_WRITE,
@@ -265,10 +269,9 @@ OUT_WFI(struct fd_ringbuffer *ring)
 }
 
 static inline void
-OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start,
-               struct fd_ringmarker *end)
+__OUT_IB(struct fd_ringbuffer *ring, bool prefetch, struct fd_ringbuffer *target)
 {
-       uint32_t dwords = fd_ringmarker_dwords(start, end);
+       uint32_t dwords = target->cur - target->start;
 
        assert(dwords > 0);
 
@@ -280,8 +283,8 @@ OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start,
         */
        emit_marker(ring, 6);
 
-       OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2);
-       fd_ringbuffer_emit_reloc_ring(ring, start, end);
+       OUT_PKT3(ring, prefetch ? CP_INDIRECT_BUFFER_PFE : CP_INDIRECT_BUFFER_PFD, 2);
+       fd_ringbuffer_emit_reloc_ring_full(ring, target, 0);
        OUT_RING(ring, dwords);
 
        emit_marker(ring, 6);