1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_drm_winsys.h"
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_drm.h"
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915/i915_debug.h"
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86drm.h>
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BATCH_RESERVED 16
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTEL_DEFAULT_RELOCS 100
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTEL_MAX_RELOCS 400
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTEL_BATCH_NO_CLIPRECTS 0x1
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTEL_BATCH_CLIPRECTS    0x2
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef INTEL_RUN_SYNC
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct i915_drm_batchbuffer
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_winsys_batchbuffer base;
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t actual_size;
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bo;
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct i915_drm_batchbuffer *
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_batchbuffer(struct i915_winsys_batchbuffer *batch)
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct i915_drm_batchbuffer *)batch;
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_batchbuffer_reset(struct i915_drm_batchbuffer *batch)
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_drm_winsys *idws = i915_drm_winsys(batch->base.iws);
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (batch->bo)
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo_unreference(batch->bo);
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->bo = drm_intel_bo_alloc(idws->gem_manager,
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  "gallium3d_batchbuffer",
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  batch->actual_size,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  4096);
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(batch->base.map, 0, batch->actual_size);
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.ptr = batch->base.map;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.size = batch->actual_size - BATCH_RESERVED;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.relocs = 0;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct i915_winsys_batchbuffer *
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_batchbuffer_create(struct i915_winsys *iws)
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_drm_winsys *idws = i915_drm_winsys(iws);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_drm_batchbuffer *batch = CALLOC_STRUCT(i915_drm_batchbuffer);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->actual_size = idws->max_batch_size;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.map = MALLOC(batch->actual_size);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.ptr = NULL;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.size = 0;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.relocs = 0;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.iws = iws;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i915_drm_batchbuffer_reset(batch);
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &batch->base;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      struct i915_winsys_buffer **buffer,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      int num_of_buffers)
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_drm_batchbuffer *drm_batch = i915_drm_batchbuffer(batch);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo *bos[num_of_buffers + 1];
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, ret;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bos[0] = drm_batch->bo;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < num_of_buffers; i++)
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bos[i+1] = intel_bo(buffer[i]);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = drm_intel_bufmgr_check_aperture_space(bos, num_of_buffers);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret != 0)
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct i915_winsys_buffer *buffer,
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            enum i915_winsys_buffer_usage usage,
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            unsigned pre_add, boolean fenced)
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned write_domain = 0;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned read_domain = 0;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned offset;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ret = 0;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (usage) {
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case I915_USAGE_SAMPLER:
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      write_domain = 0;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      read_domain = I915_GEM_DOMAIN_SAMPLER;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case I915_USAGE_RENDER:
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      write_domain = I915_GEM_DOMAIN_RENDER;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      read_domain = I915_GEM_DOMAIN_RENDER;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case I915_USAGE_2D_TARGET:
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      write_domain = I915_GEM_DOMAIN_RENDER;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      read_domain = I915_GEM_DOMAIN_RENDER;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case I915_USAGE_2D_SOURCE:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      write_domain = 0;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      read_domain = I915_GEM_DOMAIN_RENDER;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case I915_USAGE_VERTEX:
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      write_domain = 0;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      read_domain = I915_GEM_DOMAIN_VERTEX;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   offset = (unsigned)(batch->base.ptr - batch->base.map);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fenced)
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = drm_intel_bo_emit_reloc_fence(batch->bo, offset,
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    intel_bo(buffer), pre_add,
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    read_domain,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    write_domain);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = drm_intel_bo_emit_reloc(batch->bo, offset,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    intel_bo(buffer), pre_add,
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    read_domain,
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    write_domain);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ((uint32_t*)batch->base.ptr)[0] = intel_bo(buffer)->offset + pre_add;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   batch->base.ptr += 4;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ret)
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      batch->base.relocs++;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ret;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_throttle(struct i915_drm_winsys *idws)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drmIoctl(idws->fd, DRM_IOCTL_I915_GEM_THROTTLE, NULL);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct pipe_fence_handle **fence)
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned used;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ret;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* MI_BATCH_BUFFER_END */
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   used = batch->base.ptr - batch->base.map;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (used & 4) {
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* MI_NOOP */
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      used += 4;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Do the sending to HW */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = drm_intel_bo_subdata(batch->bo, 0, used, batch->base.map);
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret == 0 && i915_drm_winsys(ibatch->iws)->send_cmd)
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i915_drm_throttle(i915_drm_winsys(ibatch->iws));
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret != 0 || i915_drm_winsys(ibatch->iws)->dump_cmd) {
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i915_dump_batchbuffer(ibatch);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(ret == 0);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i915_drm_winsys(ibatch->iws)->dump_raw_file) {
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FILE *file = fopen(i915_drm_winsys(ibatch->iws)->dump_raw_file, "a");
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (file) {
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fwrite(batch->base.map, used, 1, file);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fclose(file);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef INTEL_RUN_SYNC
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_wait_rendering(batch->bo);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fence) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef INTEL_RUN_SYNC
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we run synced to GPU so just pass null */
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*fence) = i915_drm_fence_create(NULL);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*fence) = i915_drm_fence_create(batch->bo);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i915_drm_batchbuffer_reset(batch);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_drm_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (batch->bo)
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_intel_bo_unreference(batch->bo);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(batch->base.map);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(batch);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid i915_drm_winsys_init_batchbuffer_functions(struct i915_drm_winsys *idws)
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   idws->base.batchbuffer_create = i915_drm_batchbuffer_create;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   idws->base.validate_buffers = i915_drm_batchbuffer_validate_buffers;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   idws->base.batchbuffer_reloc = i915_drm_batchbuffer_reloc;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   idws->base.batchbuffer_flush = i915_drm_batchbuffer_flush;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   idws->base.batchbuffer_destroy = i915_drm_batchbuffer_destroy;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
236