Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_bo_legacy.c
index 5575da69712402a602b75a4b91a7f1af9c6dfa36..3e7547d2f9d26e46b660aabe5cd00197719935b1 100644 (file)
@@ -235,8 +235,9 @@ static int legacy_wait_pending(struct radeon_bo *bo)
     return 0;
 }
 
-static void legacy_track_pending(struct bo_manager_legacy *boml, int debug)
+void legacy_track_pending(struct radeon_bo_manager *bom, int debug)
 {
+    struct bo_manager_legacy *boml = (struct bo_manager_legacy*) bom;
     struct bo_legacy *bo_legacy;
     struct bo_legacy *next;
 
@@ -244,8 +245,8 @@ static void legacy_track_pending(struct bo_manager_legacy *boml, int debug)
     bo_legacy = boml->pending_bos.pnext;
     while (bo_legacy) {
         if (debug)
-         fprintf(stderr,"pending %p %d %d %d\n", bo_legacy, bo_legacy->base.size,
-                 boml->current_age, bo_legacy->pending);
+            fprintf(stderr,"pending %p %d %d %d\n", bo_legacy, bo_legacy->base.size,
+                    boml->current_age, bo_legacy->pending);
         next = bo_legacy->pnext;
         if (legacy_is_pending(&(bo_legacy->base))) {
         }
@@ -444,7 +445,7 @@ static struct radeon_bo *bo_open(struct radeon_bo_manager *bom,
     if (bo_legacy->base.domains & RADEON_GEM_DOMAIN_GTT) 
     {
 retry:
-        legacy_track_pending(boml, 0);
+        legacy_track_pending(&boml->base, 0);
         /* dma buffers */
 
         r = bo_dma_alloc(&(bo_legacy->base));
@@ -541,6 +542,18 @@ static int bo_unmap(struct radeon_bo *bo)
     return 0;
 }
 
+static int bo_is_busy(struct radeon_bo *bo, uint32_t *domain)
+{
+    *domain = 0;
+    if (bo->domains & RADEON_GEM_DOMAIN_GTT)
+        *domain = RADEON_GEM_DOMAIN_GTT;
+    else
+        *domain = RADEON_GEM_DOMAIN_CPU;
+    if (legacy_is_pending(bo))
+        return -EBUSY;
+    else
+        return 0;
+}
 
 static int bo_is_static(struct radeon_bo *bo)
 {
@@ -558,6 +571,7 @@ static struct radeon_bo_funcs bo_legacy_funcs = {
     bo_is_static,
     NULL,
     NULL,
+    bo_is_busy
 };
 
 static int bo_vram_validate(struct radeon_bo *bo,
@@ -580,7 +594,7 @@ static int bo_vram_validate(struct radeon_bo *bo,
         if (r) {
                pending_retry = 0;
                while(boml->cpendings && pending_retry++ < 10000) {
-                       legacy_track_pending(boml, 0);
+                       legacy_track_pending(&boml->base, 0);
                        retry_count++;
                        if (retry_count > 2) {
                                free(bo_legacy->tobj);
@@ -626,7 +640,7 @@ static int bo_vram_validate(struct radeon_bo *bo,
                                                      &tex,
                                                      sizeof(drm_radeon_texture_t));
                            if (ret) {
-                                   if (RADEON_DEBUG & DEBUG_IOCTL)
+                                   if (RADEON_DEBUG & RADEON_IOCTL)
                                            fprintf(stderr, "DRM_RADEON_TEXTURE:  again!\n");
                                    usleep(1);
                            }
@@ -663,7 +677,7 @@ static int bo_vram_validate(struct radeon_bo *bo,
                                                      &tex,
                                                      sizeof(drm_radeon_texture_t));
                            if (ret) {
-                                   if (RADEON_DEBUG & DEBUG_IOCTL)
+                                   if (RADEON_DEBUG & RADEON_IOCTL)
                                            fprintf(stderr, "DRM_RADEON_TEXTURE:  again!\n");
                                    usleep(1);
                            }
@@ -706,7 +720,7 @@ int radeon_bo_legacy_validate(struct radeon_bo *bo,
 
         r = bo_vram_validate(bo, soffset, eoffset);
         if (r) {
-           legacy_track_pending(boml, 0);
+           legacy_track_pending(&boml->base, 0);
            legacy_kick_all_buffers(boml);
            retries++;
            if (retries == 2) {