summaryrefslogtreecommitdiff
path: root/src/sna/kgem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sna/kgem.c')
-rw-r--r--src/sna/kgem.c45
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--;