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:
parent
99864d595f
commit
755915fa5d
|
@ -31,10 +31,12 @@
|
||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
#include "main/bufferobj.h"
|
#include "main/bufferobj.h"
|
||||||
|
|
||||||
#include "intel_context.h"
|
|
||||||
#include "intel_blit.h"
|
#include "intel_blit.h"
|
||||||
#include "intel_buffer_objects.h"
|
#include "intel_buffer_objects.h"
|
||||||
#include "intel_batchbuffer.h"
|
#include "intel_batchbuffer.h"
|
||||||
|
#include "intel_context.h"
|
||||||
|
#include "intel_fbo.h"
|
||||||
|
#include "intel_mipmap_tree.h"
|
||||||
#include "intel_regions.h"
|
#include "intel_regions.h"
|
||||||
|
|
||||||
static GLboolean
|
static GLboolean
|
||||||
|
@ -588,6 +590,126 @@ intel_bufferobj_copy_subdata(GLcontext *ctx,
|
||||||
intel_batchbuffer_emit_mi_flush(intel->batch);
|
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
|
void
|
||||||
intelInitBufferObjectFuncs(struct dd_function_table *functions)
|
intelInitBufferObjectFuncs(struct dd_function_table *functions)
|
||||||
{
|
{
|
||||||
|
@ -601,4 +723,14 @@ intelInitBufferObjectFuncs(struct dd_function_table *functions)
|
||||||
functions->FlushMappedBufferRange = intel_bufferobj_flush_mapped_range;
|
functions->FlushMappedBufferRange = intel_bufferobj_flush_mapped_range;
|
||||||
functions->UnmapBuffer = intel_bufferobj_unmap;
|
functions->UnmapBuffer = intel_bufferobj_unmap;
|
||||||
functions->CopyBufferSubData = intel_bufferobj_copy_subdata;
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
#define need_GL_EXT_secondary_color
|
#define need_GL_EXT_secondary_color
|
||||||
#define need_GL_EXT_stencil_two_side
|
#define need_GL_EXT_stencil_two_side
|
||||||
#define need_GL_APPLE_vertex_array_object
|
#define need_GL_APPLE_vertex_array_object
|
||||||
|
#define need_GL_APPLE_object_purgeable
|
||||||
#define need_GL_ATI_separate_stencil
|
#define need_GL_ATI_separate_stencil
|
||||||
#define need_GL_ATI_envmap_bumpmap
|
#define need_GL_ATI_envmap_bumpmap
|
||||||
#define need_GL_NV_point_sprite
|
#define need_GL_NV_point_sprite
|
||||||
|
@ -121,6 +122,7 @@ static const struct dri_extension card_extensions[] = {
|
||||||
{ "GL_EXT_texture_lod_bias", NULL },
|
{ "GL_EXT_texture_lod_bias", NULL },
|
||||||
{ "GL_3DFX_texture_compression_FXT1", NULL },
|
{ "GL_3DFX_texture_compression_FXT1", NULL },
|
||||||
{ "GL_APPLE_client_storage", 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_APPLE_vertex_array_object", GL_APPLE_vertex_array_object_functions},
|
||||||
{ "GL_MESA_pack_invert", NULL },
|
{ "GL_MESA_pack_invert", NULL },
|
||||||
{ "GL_MESA_ycbcr_texture", NULL },
|
{ "GL_MESA_ycbcr_texture", NULL },
|
||||||
|
@ -182,6 +184,7 @@ static const struct dri_extension arb_oq_extensions[] = {
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static const struct dri_extension fragment_shader_extensions[] = {
|
static const struct dri_extension fragment_shader_extensions[] = {
|
||||||
{ "GL_ARB_fragment_shader", NULL },
|
{ "GL_ARB_fragment_shader", NULL },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|
Loading…
Reference in New Issue