i965: Use force_compat_profile driconf option
[mesa.git] / src / mesa / drivers / dri / i965 / brw_object_purgeable.c
index 46304167b2276f75f737b8138b6ecc43bc54364a..c6d4a085f0fdaca6df8b8aa6b3051322b32561b4 100644 (file)
 #include "intel_mipmap_tree.h"
 
 static GLenum
-intel_buffer_purgeable(drm_intel_bo *buffer)
+intel_buffer_purgeable(struct brw_bo *buffer)
 {
    int retained = 0;
 
    if (buffer != NULL)
-      retained = drm_intel_bo_madvise(buffer, I915_MADV_DONTNEED);
+      retained = brw_bo_madvise(buffer, I915_MADV_DONTNEED);
 
    return retained ? GL_VOLATILE_APPLE : GL_RELEASED_APPLE;
 }
@@ -62,10 +62,7 @@ intel_buffer_object_purgeable(struct gl_context * ctx,
       return GL_RELEASED_APPLE;
    } else {
       /* XXX Create the buffer and madvise(MADV_DONTNEED)? */
-      struct brw_context *brw = brw_context(ctx);
-      drm_intel_bo *bo = intel_bufferobj_buffer(brw, intel_obj, INTEL_READ);
-
-      return intel_buffer_purgeable(bo);
+      return intel_buffer_purgeable(intel_obj->buffer);
    }
 }
 
@@ -80,10 +77,10 @@ intel_texture_object_purgeable(struct gl_context * ctx,
    (void) option;
 
    intel = intel_texture_object(obj);
-   if (intel->mt == NULL || intel->mt->region == NULL)
+   if (intel->mt == NULL || intel->mt->bo == NULL)
       return GL_RELEASED_APPLE;
 
-   return intel_buffer_purgeable(intel->mt->region->bo);
+   return intel_buffer_purgeable(intel->mt->bo);
 }
 
 static GLenum
@@ -100,19 +97,19 @@ intel_render_object_purgeable(struct gl_context * ctx,
    if (intel->mt == NULL)
       return GL_RELEASED_APPLE;
 
-   return intel_buffer_purgeable(intel->mt->region->bo);
+   return intel_buffer_purgeable(intel->mt->bo);
 }
 
-static GLenum
-intel_buffer_unpurgeable(drm_intel_bo *buffer)
+static int
+intel_bo_unpurgeable(struct brw_bo *buffer)
 {
    int retained;
 
    retained = 0;
    if (buffer != NULL)
-      retained = drm_intel_bo_madvise(buffer, I915_MADV_WILLNEED);
+      retained = brw_bo_madvise(buffer, I915_MADV_WILLNEED);
 
-   return retained ? GL_RETAINED_APPLE : GL_UNDEFINED_APPLE;
+   return retained;
 }
 
 static GLenum
@@ -120,10 +117,20 @@ intel_buffer_object_unpurgeable(struct gl_context * ctx,
                                 struct gl_buffer_object *obj,
                                 GLenum option)
 {
+   struct intel_buffer_object *intel = intel_buffer_object(obj);
+
    (void) ctx;
-   (void) option;
 
-   return intel_buffer_unpurgeable(intel_buffer_object(obj)->buffer);
+   if (!intel->buffer)
+      return GL_UNDEFINED_APPLE;
+
+   if (option == GL_UNDEFINED_APPLE || !intel_bo_unpurgeable(intel->buffer)) {
+      brw_bo_unreference(intel->buffer);
+      intel->buffer = NULL;
+      return GL_UNDEFINED_APPLE;
+   }
+
+   return GL_RETAINED_APPLE;
 }
 
 static GLenum
@@ -134,13 +141,17 @@ intel_texture_object_unpurgeable(struct gl_context * ctx,
    struct intel_texture_object *intel;
 
    (void) ctx;
-   (void) option;
 
    intel = intel_texture_object(obj);
-   if (intel->mt == NULL || intel->mt->region == NULL)
+   if (intel->mt == NULL || intel->mt->bo == NULL)
       return GL_UNDEFINED_APPLE;
 
-   return intel_buffer_unpurgeable(intel->mt->region->bo);
+   if (option == GL_UNDEFINED_APPLE || !intel_bo_unpurgeable(intel->mt->bo)) {
+      intel_miptree_release(&intel->mt);
+      return GL_UNDEFINED_APPLE;
+   }
+
+   return GL_RETAINED_APPLE;
 }
 
 static GLenum
@@ -151,13 +162,17 @@ intel_render_object_unpurgeable(struct gl_context * ctx,
    struct intel_renderbuffer *intel;
 
    (void) ctx;
-   (void) option;
 
    intel = intel_renderbuffer(obj);
    if (intel->mt == NULL)
       return GL_UNDEFINED_APPLE;
 
-   return intel_buffer_unpurgeable(intel->mt->region->bo);
+   if (option == GL_UNDEFINED_APPLE || !intel_bo_unpurgeable(intel->mt->bo)) {
+      intel_miptree_release(&intel->mt);
+      return GL_UNDEFINED_APPLE;
+   }
+
+   return GL_RETAINED_APPLE;
 }
 
 void