- /* XXX use this when it's ready */
- /*if (bo->rws->info.drm_minor >= 12) {
- struct drm_radeon_gem_wait args = {};
- args.handle = bo->handle;
- args.flags = usage | RADEON_GEM_NO_WAIT;
- return drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_WAIT,
- &args, sizeof(args)) != 0;
- } else*/ {
- struct drm_radeon_gem_busy args;
- memset(&args, 0, sizeof(args));
- args.handle = bo->handle;
- return drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_BUSY,
- &args, sizeof(args)) != 0;
- }
+ args.handle = bo->handle;
+ return drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_BUSY,
+ &args, sizeof(args)) != 0;
+}
+
+static enum radeon_bo_domain get_valid_domain(enum radeon_bo_domain domain)
+{
+ /* Zero domains the driver doesn't understand. */
+ domain &= RADEON_DOMAIN_VRAM_GTT;
+
+ /* If no domain is set, we must set something... */
+ if (!domain)
+ domain = RADEON_DOMAIN_VRAM_GTT;
+
+ return domain;
+}
+
+static enum radeon_bo_domain radeon_bo_get_initial_domain(
+ struct radeon_winsys_cs_handle *buf)
+{
+ struct radeon_bo *bo = (struct radeon_bo*)buf;
+ struct drm_radeon_gem_op args;
+
+ if (bo->rws->info.drm_minor < 38)
+ return RADEON_DOMAIN_VRAM_GTT;
+
+ memset(&args, 0, sizeof(args));
+ args.handle = bo->handle;
+ args.op = RADEON_GEM_OP_GET_INITIAL_DOMAIN;
+
+ drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_OP,
+ &args, sizeof(args));
+
+ /* GEM domains and winsys domains are defined the same. */
+ return get_valid_domain(args.value);