diff options
Diffstat (limited to 'src/sna/kgem.c')
-rw-r--r-- | src/sna/kgem.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 15ddd7a8..8ea4607a 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -398,6 +398,10 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen) (void)drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp); kgem->fence_max = v - 2; + if (gen >= 60) { + kgem->wa_scratch_bo = kgem_create_linear(kgem, 4096); + } + DBG(("%s: max fences=%d\n", __FUNCTION__, kgem->fence_max)); } @@ -1840,10 +1844,17 @@ void kgem_clear_dirty(struct kgem *kgem) /* Flush the contents of the RenderCache and invalidate the TextureCache */ void kgem_emit_flush(struct kgem *kgem) { + int space; + if (kgem->nbatch == 0) return; - if (!kgem_check_batch(kgem, 4)) { + if (kgem->gen >= 60 && kgem->ring == KGEM_RENDER) + space = 4*3; + else + space = 4; + + if (!kgem_check_batch(kgem, space)) { _kgem_submit(kgem); return; } @@ -1855,14 +1866,30 @@ void kgem_emit_flush(struct kgem *kgem) kgem->batch[kgem->nbatch++] = 0; kgem->batch[kgem->nbatch++] = 0; kgem->batch[kgem->nbatch++] = 0; - } else if (kgem->gen >= 50 && 0) { - kgem->batch[kgem->nbatch++] = PIPE_CONTROL | 2; - kgem->batch[kgem->nbatch++] = - PIPE_CONTROL_WC_FLUSH | - PIPE_CONTROL_TC_FLUSH | - PIPE_CONTROL_NOWRITE; - kgem->batch[kgem->nbatch++] = 0; - kgem->batch[kgem->nbatch++] = 0; + } else if (kgem->gen >= 60) { + kgem->batch[kgem->nbatch++] = PIPE_CONTROL | (4 - 2); + kgem->batch[kgem->nbatch++] = PIPE_CONTROL_CS_STALL | + PIPE_CONTROL_STALL_AT_SCOREBOARD; + kgem->batch[kgem->nbatch++] = 0; /* address */ + kgem->batch[kgem->nbatch++] = 0; /* write data */ + + kgem->batch[kgem->nbatch++] = PIPE_CONTROL | (4 - 2); + kgem->batch[kgem->nbatch++] = PIPE_CONTROL_WRITE_QWORD; + kgem->batch[kgem->nbatch] = kgem_add_reloc(kgem, kgem->nbatch, + kgem->wa_scratch_bo, + I915_GEM_DOMAIN_INSTRUCTION << 16 | + I915_GEM_DOMAIN_INSTRUCTION, + 0); + kgem->nbatch++; + kgem->batch[kgem->nbatch++] = 0; /* write data */ + + /* now finally the _real flush */ + kgem->batch[kgem->nbatch++] = PIPE_CONTROL | (4 - 2); + kgem->batch[kgem->nbatch++] = PIPE_CONTROL_WC_FLUSH | + PIPE_CONTROL_TC_FLUSH | + PIPE_CONTROL_NOWRITE; + kgem->batch[kgem->nbatch++] = 0; /* write address */ + kgem->batch[kgem->nbatch++] = 0; /* write data */ } else { if ((kgem->batch[kgem->nbatch-1] & (0xff<<23)) == MI_FLUSH) kgem->nbatch--; |