1 /*
2 * Copyright © 2016 Red Hat.
3 *
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:
10 *
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
13 * Software.
14 *
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
21 * DEALINGS IN THE SOFTWARE.
22 */
23
24 #include "macros.h"
25 #include "mtypes.h"
26 #include "externalobjects.h"
27 #include "teximage.h"
28 #include "texobj.h"
29 #include "glformats.h"
30 #include "texstorage.h"
31
32 /**
33 * Allocate and initialize a new memory object. But don't put it into the
34 * memory object hash table.
35 *
36 * Called via ctx->Driver.NewMemoryObject, unless overridden by a device
37 * driver.
38 *
39 * \return pointer to new memory object.
40 */
41 static struct gl_memory_object *
_mesa_new_memory_object(struct gl_context * ctx,GLuint name)42 _mesa_new_memory_object(struct gl_context *ctx, GLuint name)
43 {
44 struct gl_memory_object *obj = MALLOC_STRUCT(gl_memory_object);
45 if (!obj)
46 return NULL;
47
48 _mesa_initialize_memory_object(ctx, obj, name);
49 return obj;
50 }
51
52 /**
53 * Delete a memory object. Called via ctx->Driver.DeleteMemory().
54 * Not removed from hash table here.
55 */
56 void
_mesa_delete_memory_object(struct gl_context * ctx,struct gl_memory_object * memObj)57 _mesa_delete_memory_object(struct gl_context *ctx,
58 struct gl_memory_object *memObj)
59 {
60 free(memObj);
61 }
62
63 void
_mesa_init_memory_object_functions(struct dd_function_table * driver)64 _mesa_init_memory_object_functions(struct dd_function_table *driver)
65 {
66 driver->NewMemoryObject = _mesa_new_memory_object;
67 driver->DeleteMemoryObject = _mesa_delete_memory_object;
68 }
69
70 /**
71 * Initialize a buffer object to default values.
72 */
73 void
_mesa_initialize_memory_object(struct gl_context * ctx,struct gl_memory_object * obj,GLuint name)74 _mesa_initialize_memory_object(struct gl_context *ctx,
75 struct gl_memory_object *obj,
76 GLuint name)
77 {
78 memset(obj, 0, sizeof(struct gl_memory_object));
79 obj->Name = name;
80 obj->Dedicated = GL_FALSE;
81 }
82
83 void GLAPIENTRY
_mesa_DeleteMemoryObjectsEXT(GLsizei n,const GLuint * memoryObjects)84 _mesa_DeleteMemoryObjectsEXT(GLsizei n, const GLuint *memoryObjects)
85 {
86 GET_CURRENT_CONTEXT(ctx);
87
88 if (MESA_VERBOSE & (VERBOSE_API)) {
89 _mesa_debug(ctx, "glDeleteMemoryObjectsEXT(%d, %p)\n", n,
90 memoryObjects);
91 }
92
93 if (!ctx->Extensions.EXT_memory_object) {
94 _mesa_error(ctx, GL_INVALID_OPERATION,
95 "glDeleteMemoryObjectsEXT(unsupported)");
96 return;
97 }
98
99 if (n < 0) {
100 _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteMemoryObjectsEXT(n < 0)");
101 return;
102 }
103
104 if (!memoryObjects)
105 return;
106
107 _mesa_HashLockMutex(ctx->Shared->MemoryObjects);
108 for (GLint i = 0; i < n; i++) {
109 if (memoryObjects[i] > 0) {
110 struct gl_memory_object *delObj
111 = _mesa_lookup_memory_object_locked(ctx, memoryObjects[i]);
112
113 if (delObj) {
114 _mesa_HashRemoveLocked(ctx->Shared->MemoryObjects,
115 memoryObjects[i]);
116 ctx->Driver.DeleteMemoryObject(ctx, delObj);
117 }
118 }
119 }
120 _mesa_HashUnlockMutex(ctx->Shared->MemoryObjects);
121 }
122
123 GLboolean GLAPIENTRY
_mesa_IsMemoryObjectEXT(GLuint memoryObject)124 _mesa_IsMemoryObjectEXT(GLuint memoryObject)
125 {
126 GET_CURRENT_CONTEXT(ctx);
127
128 if (!ctx->Extensions.EXT_memory_object) {
129 _mesa_error(ctx, GL_INVALID_OPERATION,
130 "glIsMemoryObjectEXT(unsupported)");
131 return GL_FALSE;
132 }
133
134 struct gl_memory_object *obj =
135 _mesa_lookup_memory_object(ctx, memoryObject);
136
137 return obj ? GL_TRUE : GL_FALSE;
138 }
139
140 void GLAPIENTRY
_mesa_CreateMemoryObjectsEXT(GLsizei n,GLuint * memoryObjects)141 _mesa_CreateMemoryObjectsEXT(GLsizei n, GLuint *memoryObjects)
142 {
143 GET_CURRENT_CONTEXT(ctx);
144
145 const char *func = "glCreateMemoryObjectsEXT";
146
147 if (MESA_VERBOSE & (VERBOSE_API))
148 _mesa_debug(ctx, "%s(%d, %p)", func, n, memoryObjects);
149
150 if (!ctx->Extensions.EXT_memory_object) {
151 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
152 return;
153 }
154
155 if (n < 0) {
156 _mesa_error(ctx, GL_INVALID_VALUE, "%s(n < 0)", func);
157 return;
158 }
159
160 if (!memoryObjects)
161 return;
162
163 _mesa_HashLockMutex(ctx->Shared->MemoryObjects);
164 GLuint first = _mesa_HashFindFreeKeyBlock(ctx->Shared->MemoryObjects, n);
165 if (first) {
166 for (GLsizei i = 0; i < n; i++) {
167 struct gl_memory_object *memObj;
168
169 memoryObjects[i] = first + i;
170
171 /* allocate memory object */
172 memObj = ctx->Driver.NewMemoryObject(ctx, memoryObjects[i]);
173 if (!memObj) {
174 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s()", func);
175 _mesa_HashUnlockMutex(ctx->Shared->MemoryObjects);
176 return;
177 }
178
179 /* insert into hash table */
180 _mesa_HashInsertLocked(ctx->Shared->MemoryObjects,
181 memoryObjects[i],
182 memObj);
183 }
184 }
185
186 _mesa_HashUnlockMutex(ctx->Shared->MemoryObjects);
187 }
188
189 void GLAPIENTRY
_mesa_MemoryObjectParameterivEXT(GLuint memoryObject,GLenum pname,const GLint * params)190 _mesa_MemoryObjectParameterivEXT(GLuint memoryObject,
191 GLenum pname,
192 const GLint *params)
193 {
194 GET_CURRENT_CONTEXT(ctx);
195 struct gl_memory_object *memObj;
196
197 const char *func = "glMemoryObjectParameterivEXT";
198
199 if (!ctx->Extensions.EXT_memory_object) {
200 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
201 return;
202 }
203
204 memObj = _mesa_lookup_memory_object(ctx, memoryObject);
205 if (!memObj)
206 return;
207
208 if (memObj->Immutable) {
209 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(memoryObject is immutable", func);
210 return;
211 }
212
213 switch (pname) {
214 case GL_DEDICATED_MEMORY_OBJECT_EXT:
215 memObj->Dedicated = (GLboolean) params[0];
216 break;
217 case GL_PROTECTED_MEMORY_OBJECT_EXT:
218 /* EXT_protected_textures not supported */
219 goto invalid_pname;
220 default:
221 goto invalid_pname;
222 }
223 return;
224
225 invalid_pname:
226 _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
227 }
228
229 void GLAPIENTRY
_mesa_GetMemoryObjectParameterivEXT(GLuint memoryObject,GLenum pname,GLint * params)230 _mesa_GetMemoryObjectParameterivEXT(GLuint memoryObject,
231 GLenum pname,
232 GLint *params)
233 {
234 GET_CURRENT_CONTEXT(ctx);
235 struct gl_memory_object *memObj;
236
237 const char *func = "glMemoryObjectParameterivEXT";
238
239 if (!ctx->Extensions.EXT_memory_object) {
240 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
241 return;
242 }
243
244 memObj = _mesa_lookup_memory_object(ctx, memoryObject);
245 if (!memObj)
246 return;
247
248 switch (pname) {
249 case GL_DEDICATED_MEMORY_OBJECT_EXT:
250 *params = (GLint) memObj->Dedicated;
251 break;
252 case GL_PROTECTED_MEMORY_OBJECT_EXT:
253 /* EXT_protected_textures not supported */
254 goto invalid_pname;
255 default:
256 goto invalid_pname;
257 }
258 return;
259
260 invalid_pname:
261 _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
262 }
263
264 static struct gl_memory_object *
lookup_memory_object_err(struct gl_context * ctx,unsigned memory,const char * func)265 lookup_memory_object_err(struct gl_context *ctx, unsigned memory,
266 const char* func)
267 {
268 if (memory == 0) {
269 _mesa_error(ctx, GL_INVALID_VALUE, "%s(memory=0)", func);
270 return NULL;
271 }
272
273 struct gl_memory_object *memObj = _mesa_lookup_memory_object(ctx, memory);
274 if (!memObj)
275 return NULL;
276
277 if (!memObj->Immutable) {
278 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no associated memory)",
279 func);
280 return NULL;
281 }
282
283 return memObj;
284 }
285
286 /**
287 * Helper used by _mesa_TexStorageMem1/2/3DEXT().
288 */
289 static void
texstorage_memory(GLuint dims,GLenum target,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLuint memory,GLuint64 offset,const char * func)290 texstorage_memory(GLuint dims, GLenum target, GLsizei levels,
291 GLenum internalFormat, GLsizei width, GLsizei height,
292 GLsizei depth, GLuint memory, GLuint64 offset,
293 const char *func)
294 {
295 struct gl_texture_object *texObj;
296 struct gl_memory_object *memObj;
297
298 GET_CURRENT_CONTEXT(ctx);
299
300 if (!ctx->Extensions.EXT_memory_object) {
301 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
302 return;
303 }
304
305 texObj = _mesa_get_current_tex_object(ctx, target);
306 if (!texObj)
307 return;
308
309 memObj = lookup_memory_object_err(ctx, memory, func);
310 if (!memObj)
311 return;
312
313 _mesa_texture_storage_memory(ctx, dims, texObj, memObj, target,
314 levels, internalFormat,
315 width, height, depth, offset, false);
316 }
317
318 static void
texstorage_memory_ms(GLuint dims,GLenum target,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations,GLuint memory,GLuint64 offset,const char * func)319 texstorage_memory_ms(GLuint dims, GLenum target, GLsizei samples,
320 GLenum internalFormat, GLsizei width, GLsizei height,
321 GLsizei depth, GLboolean fixedSampleLocations,
322 GLuint memory, GLuint64 offset, const char* func)
323 {
324 struct gl_texture_object *texObj;
325 struct gl_memory_object *memObj;
326
327 GET_CURRENT_CONTEXT(ctx);
328
329 if (!ctx->Extensions.EXT_memory_object) {
330 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
331 return;
332 }
333
334 texObj = _mesa_get_current_tex_object(ctx, target);
335 if (!texObj)
336 return;
337
338 memObj = lookup_memory_object_err(ctx, memory, func);
339 if (!memObj)
340 return;
341
342 _mesa_texture_storage_ms_memory(ctx, dims, texObj, memObj, target, samples,
343 internalFormat, width, height, depth,
344 fixedSampleLocations, offset, func);
345 }
346
347 /**
348 * Helper used by _mesa_TextureStorageMem1/2/3DEXT().
349 */
350 static void
texturestorage_memory(GLuint dims,GLuint texture,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLuint memory,GLuint64 offset,const char * func)351 texturestorage_memory(GLuint dims, GLuint texture, GLsizei levels,
352 GLenum internalFormat, GLsizei width, GLsizei height,
353 GLsizei depth, GLuint memory, GLuint64 offset,
354 const char *func)
355 {
356 struct gl_texture_object *texObj;
357 struct gl_memory_object *memObj;
358
359 GET_CURRENT_CONTEXT(ctx);
360
361 if (!ctx->Extensions.EXT_memory_object) {
362 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
363 return;
364 }
365
366 texObj = _mesa_lookup_texture(ctx, texture);
367 if (!texObj)
368 return;
369
370 memObj = lookup_memory_object_err(ctx, memory, func);
371 if (!memObj)
372 return;
373
374 _mesa_texture_storage_memory(ctx, dims, texObj, memObj, texObj->Target,
375 levels, internalFormat,
376 width, height, depth, offset, true);
377 }
378
379 static void
texturestorage_memory_ms(GLuint dims,GLuint texture,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations,GLuint memory,GLuint64 offset,const char * func)380 texturestorage_memory_ms(GLuint dims, GLuint texture, GLsizei samples,
381 GLenum internalFormat, GLsizei width, GLsizei height,
382 GLsizei depth, GLboolean fixedSampleLocations,
383 GLuint memory, GLuint64 offset, const char* func)
384 {
385 struct gl_texture_object *texObj;
386 struct gl_memory_object *memObj;
387
388 GET_CURRENT_CONTEXT(ctx);
389
390 if (!ctx->Extensions.EXT_memory_object) {
391 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
392 return;
393 }
394
395 texObj = _mesa_lookup_texture(ctx, texture);
396 if (!texObj)
397 return;
398
399 memObj = lookup_memory_object_err(ctx, memory, func);
400 if (!memObj)
401 return;
402
403 _mesa_texture_storage_ms_memory(ctx, dims, texObj, memObj, texObj->Target,
404 samples, internalFormat, width, height,
405 depth, fixedSampleLocations, offset, func);
406 }
407
408 void GLAPIENTRY
_mesa_TexStorageMem2DEXT(GLenum target,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLuint memory,GLuint64 offset)409 _mesa_TexStorageMem2DEXT(GLenum target,
410 GLsizei levels,
411 GLenum internalFormat,
412 GLsizei width,
413 GLsizei height,
414 GLuint memory,
415 GLuint64 offset)
416 {
417 texstorage_memory(2, target, levels, internalFormat, width, height, 1,
418 memory, offset, "glTexStorageMem2DEXT");
419 }
420
421 void GLAPIENTRY
_mesa_TexStorageMem2DMultisampleEXT(GLenum target,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations,GLuint memory,GLuint64 offset)422 _mesa_TexStorageMem2DMultisampleEXT(GLenum target,
423 GLsizei samples,
424 GLenum internalFormat,
425 GLsizei width,
426 GLsizei height,
427 GLboolean fixedSampleLocations,
428 GLuint memory,
429 GLuint64 offset)
430 {
431 texstorage_memory_ms(2, target, samples, internalFormat, width, height, 1,
432 fixedSampleLocations, memory, offset,
433 "glTexStorageMem2DMultisampleEXT");
434 }
435
436 void GLAPIENTRY
_mesa_TexStorageMem3DEXT(GLenum target,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLuint memory,GLuint64 offset)437 _mesa_TexStorageMem3DEXT(GLenum target,
438 GLsizei levels,
439 GLenum internalFormat,
440 GLsizei width,
441 GLsizei height,
442 GLsizei depth,
443 GLuint memory,
444 GLuint64 offset)
445 {
446 texstorage_memory(3, target, levels, internalFormat, width, height, depth,
447 memory, offset, "glTexStorageMem3DEXT");
448 }
449
450 void GLAPIENTRY
_mesa_TexStorageMem3DMultisampleEXT(GLenum target,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations,GLuint memory,GLuint64 offset)451 _mesa_TexStorageMem3DMultisampleEXT(GLenum target,
452 GLsizei samples,
453 GLenum internalFormat,
454 GLsizei width,
455 GLsizei height,
456 GLsizei depth,
457 GLboolean fixedSampleLocations,
458 GLuint memory,
459 GLuint64 offset)
460 {
461 texstorage_memory_ms(3, target, samples, internalFormat, width, height,
462 depth, fixedSampleLocations, memory, offset,
463 "glTexStorageMem3DMultisampleEXT");
464 }
465
466 void GLAPIENTRY
_mesa_TextureStorageMem2DEXT(GLuint texture,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLuint memory,GLuint64 offset)467 _mesa_TextureStorageMem2DEXT(GLuint texture,
468 GLsizei levels,
469 GLenum internalFormat,
470 GLsizei width,
471 GLsizei height,
472 GLuint memory,
473 GLuint64 offset)
474 {
475 texturestorage_memory(2, texture, levels, internalFormat, width, height, 1,
476 memory, offset, "glTexureStorageMem2DEXT");
477 }
478
479 void GLAPIENTRY
_mesa_TextureStorageMem2DMultisampleEXT(GLuint texture,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations,GLuint memory,GLuint64 offset)480 _mesa_TextureStorageMem2DMultisampleEXT(GLuint texture,
481 GLsizei samples,
482 GLenum internalFormat,
483 GLsizei width,
484 GLsizei height,
485 GLboolean fixedSampleLocations,
486 GLuint memory,
487 GLuint64 offset)
488 {
489 texturestorage_memory_ms(2, texture, samples, internalFormat, width, height,
490 1, fixedSampleLocations, memory, offset,
491 "glTextureStorageMem2DMultisampleEXT");
492 }
493
494 void GLAPIENTRY
_mesa_TextureStorageMem3DEXT(GLuint texture,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLuint memory,GLuint64 offset)495 _mesa_TextureStorageMem3DEXT(GLuint texture,
496 GLsizei levels,
497 GLenum internalFormat,
498 GLsizei width,
499 GLsizei height,
500 GLsizei depth,
501 GLuint memory,
502 GLuint64 offset)
503 {
504 texturestorage_memory(3, texture, levels, internalFormat, width, height,
505 depth, memory, offset, "glTextureStorageMem3DEXT");
506 }
507
508 void GLAPIENTRY
_mesa_TextureStorageMem3DMultisampleEXT(GLuint texture,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations,GLuint memory,GLuint64 offset)509 _mesa_TextureStorageMem3DMultisampleEXT(GLuint texture,
510 GLsizei samples,
511 GLenum internalFormat,
512 GLsizei width,
513 GLsizei height,
514 GLsizei depth,
515 GLboolean fixedSampleLocations,
516 GLuint memory,
517 GLuint64 offset)
518 {
519 texturestorage_memory_ms(3, texture, samples, internalFormat, width, height,
520 depth, fixedSampleLocations, memory, offset,
521 "glTextureStorageMem3DMultisampleEXT");
522 }
523
524 void GLAPIENTRY
_mesa_TexStorageMem1DEXT(GLenum target,GLsizei levels,GLenum internalFormat,GLsizei width,GLuint memory,GLuint64 offset)525 _mesa_TexStorageMem1DEXT(GLenum target,
526 GLsizei levels,
527 GLenum internalFormat,
528 GLsizei width,
529 GLuint memory,
530 GLuint64 offset)
531 {
532 texstorage_memory(1, target, levels, internalFormat, width, 1, 1, memory,
533 offset, "glTexStorageMem1DEXT");
534 }
535
536 void GLAPIENTRY
_mesa_TextureStorageMem1DEXT(GLuint texture,GLsizei levels,GLenum internalFormat,GLsizei width,GLuint memory,GLuint64 offset)537 _mesa_TextureStorageMem1DEXT(GLuint texture,
538 GLsizei levels,
539 GLenum internalFormat,
540 GLsizei width,
541 GLuint memory,
542 GLuint64 offset)
543 {
544 texturestorage_memory(1, texture, levels, internalFormat, width, 1, 1,
545 memory, offset, "glTextureStorageMem1DEXT");
546 }
547
548 void GLAPIENTRY
_mesa_GenSemaphoresEXT(GLsizei n,GLuint * semaphores)549 _mesa_GenSemaphoresEXT(GLsizei n, GLuint *semaphores)
550 {
551
552 }
553
554 void GLAPIENTRY
_mesa_DeleteSemaphoresEXT(GLsizei n,const GLuint * semaphores)555 _mesa_DeleteSemaphoresEXT(GLsizei n, const GLuint *semaphores)
556 {
557
558 }
559
560 GLboolean GLAPIENTRY
_mesa_IsSemaphoreEXT(GLuint semaphore)561 _mesa_IsSemaphoreEXT(GLuint semaphore)
562 {
563 return GL_FALSE;
564 }
565
566 void GLAPIENTRY
_mesa_SemaphoreParameterui64vEXT(GLuint semaphore,GLenum pname,const GLuint64 * params)567 _mesa_SemaphoreParameterui64vEXT(GLuint semaphore,
568 GLenum pname,
569 const GLuint64 *params)
570 {
571
572 }
573
574 void GLAPIENTRY
_mesa_GetSemaphoreParameterui64vEXT(GLuint semaphore,GLenum pname,GLuint64 * params)575 _mesa_GetSemaphoreParameterui64vEXT(GLuint semaphore,
576 GLenum pname,
577 GLuint64 *params)
578 {
579
580 }
581
582 void GLAPIENTRY
_mesa_WaitSemaphoreEXT(GLuint semaphore,GLuint numBufferBarriers,const GLuint * buffers,GLuint numTextureBarriers,const GLuint * textures,const GLenum * srcLayouts)583 _mesa_WaitSemaphoreEXT(GLuint semaphore,
584 GLuint numBufferBarriers,
585 const GLuint *buffers,
586 GLuint numTextureBarriers,
587 const GLuint *textures,
588 const GLenum *srcLayouts)
589 {
590
591 }
592
593 void GLAPIENTRY
_mesa_SignalSemaphoreEXT(GLuint semaphore,GLuint numBufferBarriers,const GLuint * buffers,GLuint numTextureBarriers,const GLuint * textures,const GLenum * dstLayouts)594 _mesa_SignalSemaphoreEXT(GLuint semaphore,
595 GLuint numBufferBarriers,
596 const GLuint *buffers,
597 GLuint numTextureBarriers,
598 const GLuint *textures,
599 const GLenum *dstLayouts)
600 {
601
602 }
603
604 void GLAPIENTRY
_mesa_ImportMemoryFdEXT(GLuint memory,GLuint64 size,GLenum handleType,GLint fd)605 _mesa_ImportMemoryFdEXT(GLuint memory,
606 GLuint64 size,
607 GLenum handleType,
608 GLint fd)
609 {
610 GET_CURRENT_CONTEXT(ctx);
611
612 const char *func = "glImportMemoryFdEXT";
613
614 if (!ctx->Extensions.EXT_memory_object_fd) {
615 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
616 return;
617 }
618
619 if (handleType != GL_HANDLE_TYPE_OPAQUE_FD_EXT) {
620 _mesa_error(ctx, GL_INVALID_VALUE, "%s(handleType=%u)", func, handleType);
621 return;
622 }
623
624 struct gl_memory_object *memObj = _mesa_lookup_memory_object(ctx, memory);
625 if (!memObj)
626 return;
627
628 ctx->Driver.ImportMemoryObjectFd(ctx, memObj, size, fd);
629 memObj->Immutable = GL_TRUE;
630 }
631
632 void GLAPIENTRY
_mesa_ImportSemaphoreFdEXT(GLuint semaphore,GLenum handleType,GLint fd)633 _mesa_ImportSemaphoreFdEXT(GLuint semaphore,
634 GLenum handleType,
635 GLint fd)
636 {
637
638 }
639