freedreno/a6xx: VSC overflow detection/handling
[mesa.git] / src / gallium / drivers / freedreno / a6xx / fd6_emit.h
index 5c86b9927402b6c6b6b6af7c27230ef791255749..46a9ca8214993b46d57dc02131f238b7ff139a6d 100644 (file)
@@ -43,6 +43,7 @@ struct fd_ringbuffer;
  * need to be emit'd.
  */
 enum fd6_state_id {
+       FD6_GROUP_PROG_CONFIG,
        FD6_GROUP_PROG,
        FD6_GROUP_PROG_BINNING,
        FD6_GROUP_LRZ,
@@ -135,7 +136,7 @@ fd6_event_write(struct fd_batch *batch, struct fd_ringbuffer *ring,
        if (timestamp) {
                struct fd6_context *fd6_ctx = fd6_context(batch->ctx);
                seqno = ++fd6_ctx->seqno;
-               OUT_RELOCW(ring, fd6_ctx->blit_mem, 0, 0, 0);  /* ADDR_LO/HI */
+               OUT_RELOCW(ring, control_ptr(fd6_ctx, seqno));  /* ADDR_LO/HI */
                OUT_RING(ring, seqno);
        }
 
@@ -158,7 +159,7 @@ fd6_cache_flush(struct fd_batch *batch, struct fd_ringbuffer *ring)
 
        OUT_PKT7(ring, CP_WAIT_REG_MEM, 6);
        OUT_RING(ring, 0x00000013);
-       OUT_RELOC(ring, fd6_ctx->blit_mem, 0, 0, 0);
+       OUT_RELOC(ring, control_ptr(fd6_ctx, seqno));
        OUT_RING(ring, seqno);
        OUT_RING(ring, 0xffffffff);
        OUT_RING(ring, 0x00000010);
@@ -167,7 +168,7 @@ fd6_cache_flush(struct fd_batch *batch, struct fd_ringbuffer *ring)
 
        OUT_PKT7(ring, CP_UNK_A6XX_14, 4);
        OUT_RING(ring, 0x00000000);
-       OUT_RELOC(ring, fd6_ctx->blit_mem, 0, 0, 0);
+       OUT_RELOC(ring, control_ptr(fd6_ctx, seqno));
        OUT_RING(ring, seqno);
 }
 
@@ -186,6 +187,24 @@ fd6_emit_lrz_flush(struct fd_ringbuffer *ring)
        OUT_RING(ring, LRZ_FLUSH);
 }
 
+static inline uint32_t
+fd6_stage2opcode(gl_shader_stage type)
+{
+       switch (type) {
+       case MESA_SHADER_VERTEX:
+       case MESA_SHADER_TESS_CTRL:
+       case MESA_SHADER_TESS_EVAL:
+       case MESA_SHADER_GEOMETRY:
+               return CP_LOAD_STATE6_GEOM;
+       case MESA_SHADER_FRAGMENT:
+       case MESA_SHADER_COMPUTE:
+       case MESA_SHADER_KERNEL:
+               return CP_LOAD_STATE6_FRAG;
+       default:
+               unreachable("bad shader type");
+       }
+}
+
 static inline enum a6xx_state_block
 fd6_stage2shadersb(gl_shader_stage type)
 {