2
* Mesa 3-D graphics library
4
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5
* Copyright (C) 2009 VMware, Inc. All Rights Reserved.
7
* Permission is hereby granted, free of charge, to any person obtaining a
8
* copy of this software and associated documentation files (the "Software"),
9
* to deal in the Software without restriction, including without limitation
10
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
* and/or sell copies of the Software, and to permit persons to whom the
12
* Software is furnished to do so, subject to the following conditions:
14
* The above copyright notice and this permission notice shall be included
15
* in all copies or substantial portions of the Software.
17
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
* OTHER DEALINGS IN THE SOFTWARE.
27
* Code related to the GL_APPLE_object_purgeable extension.
36
#include "bufferobj.h"
41
#include "api_exec_decl.h"
45
buffer_object_purgeable(struct gl_context *ctx, GLuint name, GLenum option)
47
struct gl_buffer_object *bufObj;
50
bufObj = _mesa_lookup_bufferobj(ctx, name);
52
_mesa_error(ctx, GL_INVALID_VALUE,
53
"glObjectPurgeable(name = 0x%x)", name);
57
if (bufObj->Purgeable) {
58
_mesa_error(ctx, GL_INVALID_OPERATION,
59
"glObjectPurgeable(name = 0x%x) is already purgeable", name);
60
return GL_VOLATILE_APPLE;
63
bufObj->Purgeable = GL_TRUE;
65
retval = GL_VOLATILE_APPLE;
72
renderbuffer_purgeable(struct gl_context *ctx, GLuint name, GLenum option)
74
struct gl_renderbuffer *bufObj;
77
bufObj = _mesa_lookup_renderbuffer(ctx, name);
79
_mesa_error(ctx, GL_INVALID_VALUE,
80
"glObjectUnpurgeable(name = 0x%x)", name);
84
if (bufObj->Purgeable) {
85
_mesa_error(ctx, GL_INVALID_OPERATION,
86
"glObjectPurgeable(name = 0x%x) is already purgeable", name);
87
return GL_VOLATILE_APPLE;
90
bufObj->Purgeable = GL_TRUE;
92
retval = GL_VOLATILE_APPLE;
99
texture_object_purgeable(struct gl_context *ctx, GLuint name, GLenum option)
101
struct gl_texture_object *bufObj;
104
bufObj = _mesa_lookup_texture(ctx, name);
106
_mesa_error(ctx, GL_INVALID_VALUE,
107
"glObjectPurgeable(name = 0x%x)", name);
111
if (bufObj->Purgeable) {
112
_mesa_error(ctx, GL_INVALID_OPERATION,
113
"glObjectPurgeable(name = 0x%x) is already purgeable", name);
114
return GL_VOLATILE_APPLE;
117
bufObj->Purgeable = GL_TRUE;
119
retval = GL_VOLATILE_APPLE;
126
_mesa_ObjectPurgeableAPPLE(GLenum objectType, GLuint name, GLenum option)
130
GET_CURRENT_CONTEXT(ctx);
131
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
134
_mesa_error(ctx, GL_INVALID_VALUE,
135
"glObjectPurgeable(name = 0x%x)", name);
140
case GL_VOLATILE_APPLE:
141
case GL_RELEASED_APPLE:
145
_mesa_error(ctx, GL_INVALID_ENUM,
146
"glObjectPurgeable(name = 0x%x) invalid option: %d",
151
switch (objectType) {
153
retval = texture_object_purgeable(ctx, name, option);
155
case GL_RENDERBUFFER_EXT:
156
retval = renderbuffer_purgeable(ctx, name, option);
158
case GL_BUFFER_OBJECT_APPLE:
159
retval = buffer_object_purgeable(ctx, name, option);
162
_mesa_error(ctx, GL_INVALID_ENUM,
163
"glObjectPurgeable(name = 0x%x) invalid type: %d",
168
/* In strict conformance to the spec, we must only return VOLATILE when
169
* when passed the VOLATILE option. Madness.
171
* XXX First fix the spec, then fix me.
173
return option == GL_VOLATILE_APPLE ? GL_VOLATILE_APPLE : retval;
178
buffer_object_unpurgeable(struct gl_context *ctx, GLuint name, GLenum option)
180
struct gl_buffer_object *bufObj;
183
bufObj = _mesa_lookup_bufferobj(ctx, name);
185
_mesa_error(ctx, GL_INVALID_VALUE,
186
"glObjectUnpurgeable(name = 0x%x)", name);
190
if (! bufObj->Purgeable) {
191
_mesa_error(ctx, GL_INVALID_OPERATION,
192
"glObjectUnpurgeable(name = 0x%x) object is "
193
" already \"unpurged\"", name);
197
bufObj->Purgeable = GL_FALSE;
206
renderbuffer_unpurgeable(struct gl_context *ctx, GLuint name, GLenum option)
208
struct gl_renderbuffer *bufObj;
211
bufObj = _mesa_lookup_renderbuffer(ctx, name);
213
_mesa_error(ctx, GL_INVALID_VALUE,
214
"glObjectUnpurgeable(name = 0x%x)", name);
218
if (! bufObj->Purgeable) {
219
_mesa_error(ctx, GL_INVALID_OPERATION,
220
"glObjectUnpurgeable(name = 0x%x) object is "
221
" already \"unpurged\"", name);
225
bufObj->Purgeable = GL_FALSE;
234
texture_object_unpurgeable(struct gl_context *ctx, GLuint name, GLenum option)
236
struct gl_texture_object *bufObj;
239
bufObj = _mesa_lookup_texture(ctx, name);
241
_mesa_error(ctx, GL_INVALID_VALUE,
242
"glObjectUnpurgeable(name = 0x%x)", name);
246
if (! bufObj->Purgeable) {
247
_mesa_error(ctx, GL_INVALID_OPERATION,
248
"glObjectUnpurgeable(name = 0x%x) object is"
249
" already \"unpurged\"", name);
253
bufObj->Purgeable = GL_FALSE;
262
_mesa_ObjectUnpurgeableAPPLE(GLenum objectType, GLuint name, GLenum option)
264
GET_CURRENT_CONTEXT(ctx);
265
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
268
_mesa_error(ctx, GL_INVALID_VALUE,
269
"glObjectUnpurgeable(name = 0x%x)", name);
274
case GL_RETAINED_APPLE:
275
case GL_UNDEFINED_APPLE:
279
_mesa_error(ctx, GL_INVALID_ENUM,
280
"glObjectUnpurgeable(name = 0x%x) invalid option: %d",
285
switch (objectType) {
286
case GL_BUFFER_OBJECT_APPLE:
287
return buffer_object_unpurgeable(ctx, name, option);
289
return texture_object_unpurgeable(ctx, name, option);
290
case GL_RENDERBUFFER_EXT:
291
return renderbuffer_unpurgeable(ctx, name, option);
293
_mesa_error(ctx, GL_INVALID_ENUM,
294
"glObjectUnpurgeable(name = 0x%x) invalid type: %d",
302
get_buffer_object_parameteriv(struct gl_context *ctx, GLuint name,
303
GLenum pname, GLint *params)
305
struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, name);
307
_mesa_error(ctx, GL_INVALID_VALUE,
308
"glGetObjectParameteriv(name = 0x%x) invalid object", name);
313
case GL_PURGEABLE_APPLE:
314
*params = bufObj->Purgeable;
317
_mesa_error(ctx, GL_INVALID_ENUM,
318
"glGetObjectParameteriv(name = 0x%x) invalid enum: %d",
326
get_renderbuffer_parameteriv(struct gl_context *ctx, GLuint name,
327
GLenum pname, GLint *params)
329
struct gl_renderbuffer *rb = _mesa_lookup_renderbuffer(ctx, name);
331
_mesa_error(ctx, GL_INVALID_VALUE,
332
"glObjectUnpurgeable(name = 0x%x)", name);
337
case GL_PURGEABLE_APPLE:
338
*params = rb->Purgeable;
341
_mesa_error(ctx, GL_INVALID_ENUM,
342
"glGetObjectParameteriv(name = 0x%x) invalid enum: %d",
350
get_texture_object_parameteriv(struct gl_context *ctx, GLuint name,
351
GLenum pname, GLint *params)
353
struct gl_texture_object *texObj = _mesa_lookup_texture(ctx, name);
355
_mesa_error(ctx, GL_INVALID_VALUE,
356
"glObjectUnpurgeable(name = 0x%x)", name);
361
case GL_PURGEABLE_APPLE:
362
*params = texObj->Purgeable;
365
_mesa_error(ctx, GL_INVALID_ENUM,
366
"glGetObjectParameteriv(name = 0x%x) invalid enum: %d",
374
_mesa_GetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname,
377
GET_CURRENT_CONTEXT(ctx);
380
_mesa_error(ctx, GL_INVALID_VALUE,
381
"glGetObjectParameteriv(name = 0x%x)", name);
385
switch (objectType) {
387
get_texture_object_parameteriv(ctx, name, pname, params);
389
case GL_BUFFER_OBJECT_APPLE:
390
get_buffer_object_parameteriv(ctx, name, pname, params);
392
case GL_RENDERBUFFER_EXT:
393
get_renderbuffer_parameteriv(ctx, name, pname, params);
396
_mesa_error(ctx, GL_INVALID_ENUM,
397
"glGetObjectParameteriv(name = 0x%x) invalid type: %d",