APPLE_object_purgeable: intel

Implement support for purgeable objects by using the GEM madvise ioctl.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2010-01-13 18:35:25 +00:00
parent 99864d595f
commit 755915fa5d
2 changed files with 136 additions and 1 deletions

View File

@ -31,10 +31,12 @@
#include "main/macros.h"
#include "main/bufferobj.h"
#include "intel_context.h"
#include "intel_blit.h"
#include "intel_buffer_objects.h"
#include "intel_batchbuffer.h"
#include "intel_context.h"
#include "intel_fbo.h"
#include "intel_mipmap_tree.h"
#include "intel_regions.h"
static GLboolean
@ -588,6 +590,126 @@ intel_bufferobj_copy_subdata(GLcontext *ctx,
intel_batchbuffer_emit_mi_flush(intel->batch);
}
#if FEATURE_APPLE_object_purgeable
static GLenum
intel_buffer_purgeable(GLcontext * ctx,
drm_intel_bo *buffer,
GLenum option)
{
int retained = 0;
if (buffer != NULL)
retained = drm_intel_bo_madvise (buffer, I915_MADV_DONTNEED);
return retained ? GL_VOLATILE_APPLE : GL_RELEASED_APPLE;
}
static GLenum
intel_buffer_object_purgeable(GLcontext * ctx,
struct gl_buffer_object *obj,
GLenum option)
{
struct intel_buffer_object *intel;
intel = intel_buffer_object (obj);
if (intel->buffer != NULL)
return intel_buffer_purgeable (ctx, intel->buffer, option);
if (option == GL_RELEASED_APPLE) {
if (intel->sys_buffer != NULL) {
free(intel->sys_buffer);
intel->sys_buffer = NULL;
}
return GL_RELEASED_APPLE;
} else {
/* XXX Create the buffer and madvise(MADV_DONTNEED)? */
return intel_buffer_purgeable (ctx,
intel_bufferobj_buffer(intel_context(ctx),
intel, INTEL_READ),
option);
}
}
static GLenum
intel_texture_object_purgeable(GLcontext * ctx,
struct gl_texture_object *obj,
GLenum option)
{
struct intel_texture_object *intel;
intel = intel_texture_object(obj);
if (intel->mt == NULL || intel->mt->region == NULL)
return GL_RELEASED_APPLE;
return intel_buffer_purgeable (ctx, intel->mt->region->buffer, option);
}
static GLenum
intel_render_object_purgeable(GLcontext * ctx,
struct gl_renderbuffer *obj,
GLenum option)
{
struct intel_renderbuffer *intel;
intel = intel_renderbuffer(obj);
if (intel->region == NULL)
return GL_RELEASED_APPLE;
return intel_buffer_purgeable (ctx, intel->region->buffer, option);
}
static GLenum
intel_buffer_unpurgeable(GLcontext * ctx,
drm_intel_bo *buffer,
GLenum option)
{
int retained;
retained = 0;
if (buffer != NULL)
retained = drm_intel_bo_madvise (buffer, I915_MADV_WILLNEED);
return retained ? GL_RETAINED_APPLE : GL_UNDEFINED_APPLE;
}
static GLenum
intel_buffer_object_unpurgeable(GLcontext * ctx,
struct gl_buffer_object *obj,
GLenum option)
{
return intel_buffer_unpurgeable (ctx, intel_buffer_object (obj)->buffer, option);
}
static GLenum
intel_texture_object_unpurgeable(GLcontext * ctx,
struct gl_texture_object *obj,
GLenum option)
{
struct intel_texture_object *intel;
intel = intel_texture_object(obj);
if (intel->mt == NULL || intel->mt->region == NULL)
return GL_UNDEFINED_APPLE;
return intel_buffer_unpurgeable (ctx, intel->mt->region->buffer, option);
}
static GLenum
intel_render_object_unpurgeable(GLcontext * ctx,
struct gl_renderbuffer *obj,
GLenum option)
{
struct intel_renderbuffer *intel;
intel = intel_renderbuffer(obj);
if (intel->region == NULL)
return GL_UNDEFINED_APPLE;
return intel_buffer_unpurgeable (ctx, intel->region->buffer, option);
}
#endif
void
intelInitBufferObjectFuncs(struct dd_function_table *functions)
{
@ -601,4 +723,14 @@ intelInitBufferObjectFuncs(struct dd_function_table *functions)
functions->FlushMappedBufferRange = intel_bufferobj_flush_mapped_range;
functions->UnmapBuffer = intel_bufferobj_unmap;
functions->CopyBufferSubData = intel_bufferobj_copy_subdata;
#if FEATURE_APPLE_object_purgeable
functions->BufferObjectPurgeable = intel_buffer_object_purgeable;
functions->TextureObjectPurgeable = intel_texture_object_purgeable;
functions->RenderObjectPurgeable = intel_render_object_purgeable;
functions->BufferObjectUnpurgeable = intel_buffer_object_unpurgeable;
functions->TextureObjectUnpurgeable = intel_texture_object_unpurgeable;
functions->RenderObjectUnpurgeable = intel_render_object_unpurgeable;
#endif
}

View File

@ -58,6 +58,7 @@
#define need_GL_EXT_secondary_color
#define need_GL_EXT_stencil_two_side
#define need_GL_APPLE_vertex_array_object
#define need_GL_APPLE_object_purgeable
#define need_GL_ATI_separate_stencil
#define need_GL_ATI_envmap_bumpmap
#define need_GL_NV_point_sprite
@ -121,6 +122,7 @@ static const struct dri_extension card_extensions[] = {
{ "GL_EXT_texture_lod_bias", NULL },
{ "GL_3DFX_texture_compression_FXT1", NULL },
{ "GL_APPLE_client_storage", NULL },
{ "GL_APPLE_object_purgeable", GL_APPLE_object_purgeable_functions },
{ "GL_APPLE_vertex_array_object", GL_APPLE_vertex_array_object_functions},
{ "GL_MESA_pack_invert", NULL },
{ "GL_MESA_ycbcr_texture", NULL },
@ -182,6 +184,7 @@ static const struct dri_extension arb_oq_extensions[] = {
{ NULL, NULL }
};
static const struct dri_extension fragment_shader_extensions[] = {
{ "GL_ARB_fragment_shader", NULL },
{ NULL, NULL }