1935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
2c7015877beedd9831402755dbc58afddcbbd5339Jakob Bornecrantz#include "state_tracker/drm_driver.h"
3bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz#include "i915_drm_winsys.h"
4935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz#include "util/u_memory.h"
5935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
6935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz#include "i915_drm.h"
7935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
84a666488c4e3067eed984e272149411cc2198c77Daniel Vetterstatic char *i915_drm_type_to_name(enum i915_winsys_buffer_type type)
94a666488c4e3067eed984e272149411cc2198c77Daniel Vetter{
104a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   char *name;
114a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
124a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   if (type == I915_NEW_TEXTURE) {
134a666488c4e3067eed984e272149411cc2198c77Daniel Vetter      name = "gallium3d_texture";
144a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   } else if (type == I915_NEW_VERTEX) {
154a666488c4e3067eed984e272149411cc2198c77Daniel Vetter      name = "gallium3d_vertex";
164a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   } else if (type == I915_NEW_SCANOUT) {
174a666488c4e3067eed984e272149411cc2198c77Daniel Vetter      name = "gallium3d_scanout";
184a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   } else {
194a666488c4e3067eed984e272149411cc2198c77Daniel Vetter      assert(0);
204a666488c4e3067eed984e272149411cc2198c77Daniel Vetter      name = "gallium3d_unknown";
214a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   }
224a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
234a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   return name;
244a666488c4e3067eed984e272149411cc2198c77Daniel Vetter}
254a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
26bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzstatic struct i915_winsys_buffer *
27bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_buffer_create(struct i915_winsys *iws,
28c62f5c7e7bc3ed84677805b3800fbcfa93c419eaDaniel Vetter                        unsigned size,
29bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz                        enum i915_winsys_buffer_type type)
30935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
31bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer);
32bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_winsys *idws = i915_drm_winsys(iws);
33935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
34935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   if (!buf)
35935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz      return NULL;
36935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
37935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   buf->magic = 0xDEAD1337;
38935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   buf->flinked = FALSE;
39935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   buf->flink = 0;
40935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
414a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   buf->bo = drm_intel_bo_alloc(idws->gem_manager,
424a666488c4e3067eed984e272149411cc2198c77Daniel Vetter                                i915_drm_type_to_name(type), size, 0);
434a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
444a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   if (!buf->bo)
454a666488c4e3067eed984e272149411cc2198c77Daniel Vetter      goto err;
464a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
474a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   return (struct i915_winsys_buffer *)buf;
484a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
494a666488c4e3067eed984e272149411cc2198c77Daniel Vettererr:
504a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   assert(0);
514a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   FREE(buf);
524a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   return NULL;
534a666488c4e3067eed984e272149411cc2198c77Daniel Vetter}
544a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
554a666488c4e3067eed984e272149411cc2198c77Daniel Vetterstatic struct i915_winsys_buffer *
564a666488c4e3067eed984e272149411cc2198c77Daniel Vetteri915_drm_buffer_create_tiled(struct i915_winsys *iws,
574a666488c4e3067eed984e272149411cc2198c77Daniel Vetter                             unsigned *stride, unsigned height,
584a666488c4e3067eed984e272149411cc2198c77Daniel Vetter                             enum i915_winsys_buffer_tile *tiling,
594a666488c4e3067eed984e272149411cc2198c77Daniel Vetter                             enum i915_winsys_buffer_type type)
604a666488c4e3067eed984e272149411cc2198c77Daniel Vetter{
614a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer);
624a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   struct i915_drm_winsys *idws = i915_drm_winsys(iws);
634a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   unsigned long pitch = 0;
644a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   uint32_t tiling_mode = *tiling;
654a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
664a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   if (!buf)
674a666488c4e3067eed984e272149411cc2198c77Daniel Vetter      return NULL;
684a666488c4e3067eed984e272149411cc2198c77Daniel Vetter
694a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   buf->magic = 0xDEAD1337;
704a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   buf->flinked = FALSE;
714a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   buf->flink = 0;
72935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
734a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   buf->bo = drm_intel_bo_alloc_tiled(idws->gem_manager,
744a666488c4e3067eed984e272149411cc2198c77Daniel Vetter                                      i915_drm_type_to_name(type),
754a666488c4e3067eed984e272149411cc2198c77Daniel Vetter		   		      *stride, height, 1,
764a666488c4e3067eed984e272149411cc2198c77Daniel Vetter                                      &tiling_mode, &pitch, 0);
77935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
78935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   if (!buf->bo)
79935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz      goto err;
80935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
814a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   *stride = pitch;
824a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   *tiling = tiling_mode;
83bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   return (struct i915_winsys_buffer *)buf;
84935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
85935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzerr:
86935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   assert(0);
87935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   FREE(buf);
88935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   return NULL;
89935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
90935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
91bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzstatic struct i915_winsys_buffer *
92bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_buffer_from_handle(struct i915_winsys *iws,
932ff0879a6365e7f7d7e5277274bc965ad57a82b4Daniel Vetter                            struct winsys_handle *whandle,
942ff0879a6365e7f7d7e5277274bc965ad57a82b4Daniel Vetter                            enum i915_winsys_buffer_tile *tiling,
952ff0879a6365e7f7d7e5277274bc965ad57a82b4Daniel Vetter                            unsigned *stride)
960e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz{
97bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_winsys *idws = i915_drm_winsys(iws);
98bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer);
990e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   uint32_t tile = 0, swizzle = 0;
1000e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1010e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   if (!buf)
1020e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      return NULL;
1030e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1040e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   buf->magic = 0xDEAD1337;
105c8fca58d9d5b3f25cb1ac2056ac2b437b79c04eeDaniel Vetter   buf->bo = drm_intel_bo_gem_create_from_name(idws->gem_manager, "gallium3d_from_handle", whandle->handle);
1060e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   buf->flinked = TRUE;
1070e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   buf->flink = whandle->handle;
1080e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1090e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   if (!buf->bo)
1100e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      goto err;
1110e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1120e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
1130e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1140e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   *stride = whandle->stride;
1152ff0879a6365e7f7d7e5277274bc965ad57a82b4Daniel Vetter   *tiling = tile;
1160e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
117bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   return (struct i915_winsys_buffer *)buf;
1180e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1190e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantzerr:
1200e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   FREE(buf);
1210e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   return NULL;
1220e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz}
1230e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1240e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantzstatic boolean
125bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_buffer_get_handle(struct i915_winsys *iws,
126bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz                            struct i915_winsys_buffer *buffer,
1270e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz                            struct winsys_handle *whandle,
1280e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz                            unsigned stride)
1290e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz{
130bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
1310e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1320e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
1330e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      if (!buf->flinked) {
1340e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz         if (drm_intel_bo_flink(buf->bo, &buf->flink))
1350e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz            return FALSE;
1360e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz         buf->flinked = TRUE;
1370e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      }
1380e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1390e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      whandle->handle = buf->flink;
1400e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
1410e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      whandle->handle = buf->bo->handle;
1420e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   } else {
1430e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      assert(!"unknown usage");
1440e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz      return FALSE;
1450e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   }
1460e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
1470e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   whandle->stride = stride;
1480e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz   return TRUE;
1490e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz}
1500e1eb1b8765149873f9fd27d455d8b7ed3387709Jakob Bornecrantz
151935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzstatic void *
152bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_buffer_map(struct i915_winsys *iws,
153bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz                     struct i915_winsys_buffer *buffer,
154935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz                     boolean write)
155935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
156bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
157935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   drm_intel_bo *bo = intel_bo(buffer);
158935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   int ret = 0;
159935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
160935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   assert(bo);
161935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
162935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   if (buf->map_count)
163935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz      goto out;
164935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
165e18261885334522bcb2cce6e4a2ac7c509a7e3c0Daniel Vetter   ret = drm_intel_gem_bo_map_gtt(bo);
166935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
167935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   buf->ptr = bo->virtual;
168935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
169935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   assert(ret == 0);
170935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzout:
171935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   if (ret)
172935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz      return NULL;
173935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
174935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   buf->map_count++;
175935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   return buf->ptr;
176935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
177935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
178935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzstatic void
179bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_buffer_unmap(struct i915_winsys *iws,
180bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz                       struct i915_winsys_buffer *buffer)
181935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
182bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
183935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
184935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   if (--buf->map_count)
185935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz      return;
186935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
187e18261885334522bcb2cce6e4a2ac7c509a7e3c0Daniel Vetter   drm_intel_gem_bo_unmap_gtt(intel_bo(buffer));
188935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
189935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
190e589a37f7b72da4f5eb8cbb46443d7baf710b37cJakob Bornecrantzstatic int
191bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_buffer_write(struct i915_winsys *iws,
192bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz                       struct i915_winsys_buffer *buffer,
193f8ba93aefdf23b88a945d6037cd2e672c99b314cJakob Bornecrantz                       size_t offset,
194e589a37f7b72da4f5eb8cbb46443d7baf710b37cJakob Bornecrantz                       size_t size,
195f8ba93aefdf23b88a945d6037cd2e672c99b314cJakob Bornecrantz                       const void *data)
196e589a37f7b72da4f5eb8cbb46443d7baf710b37cJakob Bornecrantz{
197bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
198e589a37f7b72da4f5eb8cbb46443d7baf710b37cJakob Bornecrantz
199e589a37f7b72da4f5eb8cbb46443d7baf710b37cJakob Bornecrantz   return drm_intel_bo_subdata(buf->bo, offset, size, (void*)data);
200e589a37f7b72da4f5eb8cbb46443d7baf710b37cJakob Bornecrantz}
201e589a37f7b72da4f5eb8cbb46443d7baf710b37cJakob Bornecrantz
202935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzstatic void
203bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_buffer_destroy(struct i915_winsys *iws,
204bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz                         struct i915_winsys_buffer *buffer)
205935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
206935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   drm_intel_bo_unreference(intel_bo(buffer));
207935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
208935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz#ifdef DEBUG
209bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   i915_drm_buffer(buffer)->magic = 0;
210bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   i915_drm_buffer(buffer)->bo = NULL;
211935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz#endif
212935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
213935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz   FREE(buffer);
214935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
215935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz
216e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesinstatic boolean
217e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesini915_drm_buffer_is_busy(struct i915_winsys *iws,
218e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin                        struct i915_winsys_buffer *buffer)
219e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin{
220e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin   struct i915_drm_buffer* i915_buffer = i915_drm_buffer(buffer);
22185e1fa55066783d2748993810708dee6db7a4993Stéphane Marchesin   if (!i915_buffer)
22285e1fa55066783d2748993810708dee6db7a4993Stéphane Marchesin      return FALSE;
223e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin   return drm_intel_bo_busy(i915_buffer->bo);
224e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin}
225e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin
226e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin
227935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantzvoid
228bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantzi915_drm_winsys_init_buffer_functions(struct i915_drm_winsys *idws)
229935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz{
230bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.buffer_create = i915_drm_buffer_create;
2314a666488c4e3067eed984e272149411cc2198c77Daniel Vetter   idws->base.buffer_create_tiled = i915_drm_buffer_create_tiled;
232bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.buffer_from_handle = i915_drm_buffer_from_handle;
233bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.buffer_get_handle = i915_drm_buffer_get_handle;
234bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.buffer_map = i915_drm_buffer_map;
235bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.buffer_unmap = i915_drm_buffer_unmap;
236bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.buffer_write = i915_drm_buffer_write;
237bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz   idws->base.buffer_destroy = i915_drm_buffer_destroy;
238e53b41f2632af26c79c4f7ed5b0fdb86a1feb602Stéphane Marchesin   idws->base.buffer_is_busy = i915_drm_buffer_is_busy;
239935e4c56e5b10a0a702d95f78e9f4e6660c452dcJakob Bornecrantz}
240