2 * Copyright © 2010 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * @file brw_object_purgeable.c
27 * The driver implementation of the GL_APPLE_object_purgeable extension.
30 #include "main/imports.h"
31 #include "main/mtypes.h"
32 #include "main/macros.h"
33 #include "main/bufferobj.h"
35 #include "brw_context.h"
36 #include "intel_buffer_objects.h"
37 #include "intel_fbo.h"
38 #include "intel_mipmap_tree.h"
41 intel_buffer_purgeable(struct brw_bo
*buffer
)
46 retained
= brw_bo_madvise(buffer
, I915_MADV_DONTNEED
);
48 return retained
? GL_VOLATILE_APPLE
: GL_RELEASED_APPLE
;
52 intel_buffer_object_purgeable(struct gl_context
* ctx
,
53 struct gl_buffer_object
*obj
,
56 struct intel_buffer_object
*intel_obj
= intel_buffer_object(obj
);
58 if (intel_obj
->buffer
!= NULL
)
59 return intel_buffer_purgeable(intel_obj
->buffer
);
61 if (option
== GL_RELEASED_APPLE
) {
62 return GL_RELEASED_APPLE
;
64 /* XXX Create the buffer and madvise(MADV_DONTNEED)? */
65 return intel_buffer_purgeable(intel_obj
->buffer
);
70 intel_texture_object_purgeable(struct gl_context
* ctx
,
71 struct gl_texture_object
*obj
,
74 struct intel_texture_object
*intel
;
79 intel
= intel_texture_object(obj
);
80 if (intel
->mt
== NULL
|| intel
->mt
->bo
== NULL
)
81 return GL_RELEASED_APPLE
;
83 return intel_buffer_purgeable(intel
->mt
->bo
);
87 intel_render_object_purgeable(struct gl_context
* ctx
,
88 struct gl_renderbuffer
*obj
,
91 struct intel_renderbuffer
*intel
;
96 intel
= intel_renderbuffer(obj
);
97 if (intel
->mt
== NULL
)
98 return GL_RELEASED_APPLE
;
100 return intel_buffer_purgeable(intel
->mt
->bo
);
104 intel_bo_unpurgeable(struct brw_bo
*buffer
)
110 retained
= brw_bo_madvise(buffer
, I915_MADV_WILLNEED
);
116 intel_buffer_object_unpurgeable(struct gl_context
* ctx
,
117 struct gl_buffer_object
*obj
,
120 struct intel_buffer_object
*intel
= intel_buffer_object(obj
);
125 return GL_UNDEFINED_APPLE
;
127 if (option
== GL_UNDEFINED_APPLE
|| !intel_bo_unpurgeable(intel
->buffer
)) {
128 brw_bo_unreference(intel
->buffer
);
129 intel
->buffer
= NULL
;
130 return GL_UNDEFINED_APPLE
;
133 return GL_RETAINED_APPLE
;
137 intel_texture_object_unpurgeable(struct gl_context
* ctx
,
138 struct gl_texture_object
*obj
,
141 struct intel_texture_object
*intel
;
145 intel
= intel_texture_object(obj
);
146 if (intel
->mt
== NULL
|| intel
->mt
->bo
== NULL
)
147 return GL_UNDEFINED_APPLE
;
149 if (option
== GL_UNDEFINED_APPLE
|| !intel_bo_unpurgeable(intel
->mt
->bo
)) {
150 intel_miptree_release(&intel
->mt
);
151 return GL_UNDEFINED_APPLE
;
154 return GL_RETAINED_APPLE
;
158 intel_render_object_unpurgeable(struct gl_context
* ctx
,
159 struct gl_renderbuffer
*obj
,
162 struct intel_renderbuffer
*intel
;
166 intel
= intel_renderbuffer(obj
);
167 if (intel
->mt
== NULL
)
168 return GL_UNDEFINED_APPLE
;
170 if (option
== GL_UNDEFINED_APPLE
|| !intel_bo_unpurgeable(intel
->mt
->bo
)) {
171 intel_miptree_release(&intel
->mt
);
172 return GL_UNDEFINED_APPLE
;
175 return GL_RETAINED_APPLE
;
179 brw_init_object_purgeable_functions(struct dd_function_table
*functions
)
181 functions
->BufferObjectPurgeable
= intel_buffer_object_purgeable
;
182 functions
->TextureObjectPurgeable
= intel_texture_object_purgeable
;
183 functions
->RenderObjectPurgeable
= intel_render_object_purgeable
;
185 functions
->BufferObjectUnpurgeable
= intel_buffer_object_unpurgeable
;
186 functions
->TextureObjectUnpurgeable
= intel_texture_object_unpurgeable
;
187 functions
->RenderObjectUnpurgeable
= intel_render_object_unpurgeable
;