#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;
}
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);
}
}
(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
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
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
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
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