i915g: Use PIPE_FLUSH_END_OF_FRAME to trigger throttling
[mesa.git] / src / gallium / winsys / i915 / drm / i915_drm_batchbuffer.c
index afeab5eef42b07fe902cfa91c45767b59250582d..9fedb121565b6e6b5d2bd0ab1df48509688f6c70 100644 (file)
@@ -5,6 +5,7 @@
 #include "i915_drm.h"
 #include "i915/i915_debug.h"
 #include <xf86drm.h>
+#include <stdio.h>
 
 #define BATCH_RESERVED 16
 
@@ -62,7 +63,6 @@ i915_drm_batchbuffer_create(struct i915_winsys *iws)
    batch->base.size = 0;
 
    batch->base.relocs = 0;
-   batch->base.max_relocs = 300;/*INTEL_DEFAULT_RELOCS;*/
 
    batch->base.iws = iws;
 
@@ -71,6 +71,26 @@ i915_drm_batchbuffer_create(struct i915_winsys *iws)
    return &batch->base;
 }
 
+static boolean
+i915_drm_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
+                                     struct i915_winsys_buffer **buffer,
+                                     int num_of_buffers)
+{
+   struct i915_drm_batchbuffer *drm_batch = i915_drm_batchbuffer(batch);
+   drm_intel_bo *bos[num_of_buffers + 1];
+   int i, ret;
+
+   bos[0] = drm_batch->bo;
+   for (i = 0; i < num_of_buffers; i++)
+      bos[i+1] = intel_bo(buffer[i]);
+
+   ret = drm_intel_bufmgr_check_aperture_space(bos, num_of_buffers);
+   if (ret != 0)
+      return FALSE;
+
+   return TRUE;
+}
+
 static int
 i915_drm_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
                             struct i915_winsys_buffer *buffer,
@@ -83,8 +103,6 @@ i915_drm_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
    unsigned offset;
    int ret = 0;
 
-   assert(batch->base.relocs < batch->base.max_relocs);
-
    switch (usage) {
    case I915_USAGE_SAMPLER:
       write_domain = 0;
@@ -133,7 +151,7 @@ i915_drm_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
    return ret;
 }
 
-static void 
+static void
 i915_drm_throttle(struct i915_drm_winsys *idws)
 {
    drmIoctl(idws->fd, DRM_IOCTL_I915_GEM_THROTTLE, NULL);
@@ -141,7 +159,8 @@ i915_drm_throttle(struct i915_drm_winsys *idws)
 
 static void
 i915_drm_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
-                            struct pipe_fence_handle **fence)
+                           struct pipe_fence_handle **fence,
+                           enum i915_winsys_flush_flags flags)
 {
    struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
    unsigned used;
@@ -162,13 +181,22 @@ i915_drm_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
    if (ret == 0 && i915_drm_winsys(ibatch->iws)->send_cmd)
       ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
 
-   i915_drm_throttle(i915_drm_winsys(ibatch->iws));
+   if (flags & I915_FLUSH_END_OF_FRAME)
+      i915_drm_throttle(i915_drm_winsys(ibatch->iws));
 
    if (ret != 0 || i915_drm_winsys(ibatch->iws)->dump_cmd) {
       i915_dump_batchbuffer(ibatch);
       assert(ret == 0);
    }
 
+   if (i915_drm_winsys(ibatch->iws)->dump_raw_file) {
+      FILE *file = fopen(i915_drm_winsys(ibatch->iws)->dump_raw_file, "a");
+      if (file) {
+        fwrite(batch->base.map, used, 1, file);
+        fclose(file);
+      }
+   }
+
 #ifdef INTEL_RUN_SYNC
    drm_intel_bo_wait_rendering(batch->bo);
 #endif
@@ -202,6 +230,7 @@ i915_drm_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
 void i915_drm_winsys_init_batchbuffer_functions(struct i915_drm_winsys *idws)
 {
    idws->base.batchbuffer_create = i915_drm_batchbuffer_create;
+   idws->base.validate_buffers = i915_drm_batchbuffer_validate_buffers;
    idws->base.batchbuffer_reloc = i915_drm_batchbuffer_reloc;
    idws->base.batchbuffer_flush = i915_drm_batchbuffer_flush;
    idws->base.batchbuffer_destroy = i915_drm_batchbuffer_destroy;