1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2005-2012 TransGaming Inc.
\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,
\r
6 // transcribed, stored in a retrieval system, translated into any human or computer
\r
7 // language by any means, or disclosed to third parties without the explicit written
\r
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
\r
9 // or implied, including but not limited to any patent rights, are granted to you.
\r
12 // libEGL.cpp: Implements the exported EGL functions.
\r
15 #include "Display.h"
\r
16 #include "Surface.h"
\r
17 #include "Texture.hpp"
\r
18 #include "Context.hpp"
\r
19 #include "common/Image.hpp"
\r
20 #include "common/debug.h"
\r
21 #include "Common/Version.h"
\r
23 #if defined(__ANDROID__)
\r
24 #include <system/window.h>
\r
29 using namespace egl;
\r
31 static bool validateDisplay(egl::Display *display)
\r
33 if(display == EGL_NO_DISPLAY)
\r
35 return error(EGL_BAD_DISPLAY, false);
\r
38 if(!display->isInitialized())
\r
40 return error(EGL_NOT_INITIALIZED, false);
\r
46 static bool validateConfig(egl::Display *display, EGLConfig config)
\r
48 if(!validateDisplay(display))
\r
53 if(!display->isValidConfig(config))
\r
55 return error(EGL_BAD_CONFIG, false);
\r
61 static bool validateContext(egl::Display *display, egl::Context *context)
\r
63 if(!validateDisplay(display))
\r
68 if(!display->isValidContext(context))
\r
70 return error(EGL_BAD_CONTEXT, false);
\r
76 static bool validateSurface(egl::Display *display, egl::Surface *surface)
\r
78 if(!validateDisplay(display))
\r
83 if(!display->isValidSurface(surface))
\r
85 return error(EGL_BAD_SURFACE, false);
\r
93 EGLint GetError(void)
\r
97 EGLint error = egl::getCurrentError();
\r
99 if(error != EGL_SUCCESS)
\r
101 egl::setCurrentError(EGL_SUCCESS);
\r
107 EGLDisplay GetDisplay(EGLNativeDisplayType display_id)
\r
109 TRACE("(EGLNativeDisplayType display_id = %p)", display_id);
\r
111 return egl::Display::getPlatformDisplay(EGL_UNKNOWN, display_id);
\r
114 EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
\r
116 TRACE("(EGLDisplay dpy = %p, EGLint *major = %p, EGLint *minor = %p)",
\r
117 dpy, major, minor);
\r
119 if(dpy == EGL_NO_DISPLAY)
\r
121 return error(EGL_BAD_DISPLAY, EGL_FALSE);
\r
124 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
126 if(!display->initialize())
\r
128 return error(EGL_NOT_INITIALIZED, EGL_FALSE);
\r
131 if(major) *major = 1;
\r
132 if(minor) *minor = 4;
\r
134 return success(EGL_TRUE);
\r
137 EGLBoolean Terminate(EGLDisplay dpy)
\r
139 TRACE("(EGLDisplay dpy = %p)", dpy);
\r
141 if(dpy == EGL_NO_DISPLAY)
\r
143 return error(EGL_BAD_DISPLAY, EGL_FALSE);
\r
146 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
148 display->terminate();
\r
150 return success(EGL_TRUE);
\r
153 const char *QueryString(EGLDisplay dpy, EGLint name)
\r
155 TRACE("(EGLDisplay dpy = %p, EGLint name = %d)", dpy, name);
\r
157 if(dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS)
\r
159 return success("EGL_KHR_platform_gbm "
\r
160 "EGL_KHR_platform_x11 "
\r
161 "EGL_EXT_client_extensions "
\r
162 "EGL_EXT_platform_base");
\r
165 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
167 if(!validateDisplay(display))
\r
174 case EGL_CLIENT_APIS:
\r
175 return success("OpenGL_ES");
\r
176 case EGL_EXTENSIONS:
\r
177 return success("EGL_KHR_gl_texture_2D_image "
\r
178 "EGL_KHR_gl_texture_cubemap_image "
\r
179 "EGL_KHR_gl_renderbuffer_image "
\r
180 "EGL_KHR_image_base "
\r
181 "EGL_ANDROID_framebuffer_target "
\r
182 "EGL_ANDROID_recordable");
\r
184 return success("TransGaming Inc.");
\r
186 return success("1.4 SwiftShader " VERSION_STRING);
\r
189 return error(EGL_BAD_PARAMETER, (const char*)NULL);
\r
192 EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
\r
194 TRACE("(EGLDisplay dpy = %p, EGLConfig *configs = %p, "
\r
195 "EGLint config_size = %d, EGLint *num_config = %p)",
\r
196 dpy, configs, config_size, num_config);
\r
198 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
200 if(!validateDisplay(display))
\r
207 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
210 const EGLint attribList[] = {EGL_NONE};
\r
212 if(!display->getConfigs(configs, attribList, config_size, num_config))
\r
214 return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
\r
217 return success(EGL_TRUE);
\r
220 EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
\r
222 TRACE("(EGLDisplay dpy = %p, const EGLint *attrib_list = %p, "
\r
223 "EGLConfig *configs = %p, EGLint config_size = %d, EGLint *num_config = %p)",
\r
224 dpy, attrib_list, configs, config_size, num_config);
\r
226 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
228 if(!validateDisplay(display))
\r
235 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
238 const EGLint attribList[] = {EGL_NONE};
\r
242 attrib_list = attribList;
\r
245 if(!display->getConfigs(configs, attrib_list, config_size, num_config))
\r
247 return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
\r
250 return success(EGL_TRUE);
\r
253 EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
\r
255 TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLint attribute = %d, EGLint *value = %p)",
\r
256 dpy, config, attribute, value);
\r
258 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
260 if(!validateConfig(display, config))
\r
265 if(!display->getConfigAttrib(config, attribute, value))
\r
267 return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
\r
270 return success(EGL_TRUE);
\r
273 EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
\r
275 TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativeWindowType win = %p, "
\r
276 "const EGLint *attrib_list = %p)", dpy, config, window, attrib_list);
\r
278 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
280 if(!validateConfig(display, config))
\r
282 return EGL_NO_SURFACE;
\r
285 if(!display->isValidWindow(window))
\r
287 return error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
\r
290 return display->createWindowSurface(window, config, attrib_list);
\r
293 EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
\r
295 TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, const EGLint *attrib_list = %p)",
\r
296 dpy, config, attrib_list);
\r
298 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
300 if(!validateConfig(display, config))
\r
302 return EGL_NO_SURFACE;
\r
305 return display->createOffscreenSurface(config, attrib_list);
\r
308 EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
\r
310 TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativePixmapType pixmap = %p, "
\r
311 "const EGLint *attrib_list = %p)", dpy, config, pixmap, attrib_list);
\r
313 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
315 if(!validateConfig(display, config))
\r
317 return EGL_NO_SURFACE;
\r
320 UNIMPLEMENTED(); // FIXME
\r
322 return success(EGL_NO_SURFACE);
\r
325 EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface)
\r
327 TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p)", dpy, surface);
\r
329 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
330 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
332 if(!validateSurface(display, eglSurface))
\r
337 if(surface == EGL_NO_SURFACE)
\r
339 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
342 display->destroySurface((egl::Surface*)surface);
\r
344 return success(EGL_TRUE);
\r
347 EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
\r
349 TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint attribute = %d, EGLint *value = %p)",
\r
350 dpy, surface, attribute, value);
\r
352 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
353 egl::Surface *eglSurface = (egl::Surface*)surface;
\r
355 if(!validateSurface(display, eglSurface))
\r
360 if(surface == EGL_NO_SURFACE)
\r
362 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
367 case EGL_VG_ALPHA_FORMAT:
\r
368 UNIMPLEMENTED(); // FIXME
\r
370 case EGL_VG_COLORSPACE:
\r
371 UNIMPLEMENTED(); // FIXME
\r
373 case EGL_CONFIG_ID:
\r
374 *value = eglSurface->getConfigID();
\r
377 *value = eglSurface->getHeight();
\r
379 case EGL_HORIZONTAL_RESOLUTION:
\r
380 UNIMPLEMENTED(); // FIXME
\r
382 case EGL_LARGEST_PBUFFER:
\r
383 UNIMPLEMENTED(); // FIXME
\r
385 case EGL_MIPMAP_TEXTURE:
\r
386 UNIMPLEMENTED(); // FIXME
\r
388 case EGL_MIPMAP_LEVEL:
\r
389 UNIMPLEMENTED(); // FIXME
\r
391 case EGL_MULTISAMPLE_RESOLVE:
\r
392 UNIMPLEMENTED(); // FIXME
\r
394 case EGL_PIXEL_ASPECT_RATIO:
\r
395 *value = eglSurface->getPixelAspectRatio();
\r
397 case EGL_RENDER_BUFFER:
\r
398 *value = eglSurface->getRenderBuffer();
\r
400 case EGL_SWAP_BEHAVIOR:
\r
401 *value = eglSurface->getSwapBehavior();
\r
403 case EGL_TEXTURE_FORMAT:
\r
404 *value = eglSurface->getTextureFormat();
\r
406 case EGL_TEXTURE_TARGET:
\r
407 *value = eglSurface->getTextureTarget();
\r
409 case EGL_VERTICAL_RESOLUTION:
\r
410 UNIMPLEMENTED(); // FIXME
\r
413 *value = eglSurface->getWidth();
\r
416 return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
\r
419 return success(EGL_TRUE);
\r
422 EGLBoolean BindAPI(EGLenum api)
\r
424 TRACE("(EGLenum api = 0x%X)", api);
\r
428 case EGL_OPENGL_API:
\r
429 case EGL_OPENVG_API:
\r
430 return error(EGL_BAD_PARAMETER, EGL_FALSE); // Not supported by this implementation
\r
431 case EGL_OPENGL_ES_API:
\r
434 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
437 egl::setCurrentAPI(api);
\r
439 return success(EGL_TRUE);
\r
442 EGLenum QueryAPI(void)
\r
446 EGLenum API = egl::getCurrentAPI();
\r
448 return success(API);
\r
451 EGLBoolean WaitClient(void)
\r
455 UNIMPLEMENTED(); // FIXME
\r
457 return success(EGL_FALSE);
\r
460 EGLBoolean ReleaseThread(void)
\r
464 eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
\r
466 return success(EGL_TRUE);
\r
469 EGLSurface CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
\r
471 TRACE("(EGLDisplay dpy = %p, EGLenum buftype = 0x%X, EGLClientBuffer buffer = %p, "
\r
472 "EGLConfig config = %p, const EGLint *attrib_list = %p)",
\r
473 dpy, buftype, buffer, config, attrib_list);
\r
477 return error(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
\r
480 EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
\r
482 TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint attribute = %d, EGLint value = %d)",
\r
483 dpy, surface, attribute, value);
\r
485 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
486 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
488 if(!validateSurface(display, eglSurface))
\r
495 case EGL_SWAP_BEHAVIOR:
\r
496 if(value == EGL_BUFFER_PRESERVED)
\r
498 if(!(eglSurface->getSurfaceType() & EGL_SWAP_BEHAVIOR_PRESERVED_BIT))
\r
500 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
503 else if(value != EGL_BUFFER_DESTROYED)
\r
505 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
507 eglSurface->setSwapBehavior(value);
\r
510 UNIMPLEMENTED(); // FIXME
\r
513 return success(EGL_TRUE);
\r
516 EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
\r
518 TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint buffer = %d)", dpy, surface, buffer);
\r
520 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
521 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
523 if(!validateSurface(display, eglSurface))
\r
528 if(buffer != EGL_BACK_BUFFER)
\r
530 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
533 if(surface == EGL_NO_SURFACE || eglSurface->getWindowHandle())
\r
535 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
538 if(eglSurface->getBoundTexture())
\r
540 return error(EGL_BAD_ACCESS, EGL_FALSE);
\r
543 if(eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
\r
545 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
548 egl::Context *context = static_cast<egl::Context*>(egl::getCurrentContext());
\r
552 context->bindTexImage(eglSurface);
\r
555 return success(EGL_TRUE);
\r
558 EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
\r
560 TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint buffer = %d)", dpy, surface, buffer);
\r
562 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
563 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
565 if(!validateSurface(display, eglSurface))
\r
570 if(buffer != EGL_BACK_BUFFER)
\r
572 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
575 if(surface == EGL_NO_SURFACE || eglSurface->getWindowHandle())
\r
577 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
580 if(eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
\r
582 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
585 egl::Texture *texture = eglSurface->getBoundTexture();
\r
589 texture->releaseTexImage();
\r
592 return success(EGL_TRUE);
\r
595 EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval)
\r
597 TRACE("(EGLDisplay dpy = %p, EGLint interval = %d)", dpy, interval);
\r
599 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
601 if(!validateDisplay(display))
\r
606 egl::Surface *draw_surface = static_cast<egl::Surface*>(egl::getCurrentDrawSurface());
\r
608 if(draw_surface == NULL)
\r
610 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
613 draw_surface->setSwapInterval(interval);
\r
615 return success(EGL_TRUE);
\r
618 EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
\r
620 TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLContext share_context = %p, "
\r
621 "const EGLint *attrib_list = %p)", dpy, config, share_context, attrib_list);
\r
623 EGLint clientVersion = 1;
\r
626 for(const EGLint* attribute = attrib_list; attribute[0] != EGL_NONE; attribute += 2)
\r
628 if(attribute[0] == EGL_CONTEXT_CLIENT_VERSION)
\r
630 clientVersion = attribute[1];
\r
634 return error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT);
\r
639 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
640 egl::Context *shareContext = static_cast<egl::Context*>(share_context);
\r
642 if(!validateConfig(display, config))
\r
644 return EGL_NO_CONTEXT;
\r
647 if(shareContext && shareContext->getClientVersion() != clientVersion)
\r
649 return error(EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
\r
652 return display->createContext(config, shareContext, clientVersion);
\r
655 EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx)
\r
657 TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p)", dpy, ctx);
\r
659 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
660 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
662 if(!validateContext(display, context))
\r
667 if(ctx == EGL_NO_CONTEXT)
\r
669 return error(EGL_BAD_CONTEXT, EGL_FALSE);
\r
672 display->destroyContext(context);
\r
674 return success(EGL_TRUE);
\r
677 EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
\r
679 TRACE("(EGLDisplay dpy = %p, EGLSurface draw = %p, EGLSurface read = %p, EGLContext ctx = %p)",
\r
680 dpy, draw, read, ctx);
\r
682 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
683 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
684 egl::Surface *drawSurface = static_cast<egl::Surface*>(draw);
\r
685 egl::Surface *readSurface = static_cast<egl::Surface*>(read);
\r
687 if(ctx != EGL_NO_CONTEXT || draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE)
\r
689 if(!validateDisplay(display))
\r
695 if(ctx == EGL_NO_CONTEXT && (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
\r
697 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
700 if(ctx != EGL_NO_CONTEXT && !validateContext(display, context))
\r
705 if((draw != EGL_NO_SURFACE && !validateSurface(display, drawSurface)) ||
\r
706 (read != EGL_NO_SURFACE && !validateSurface(display, readSurface)))
\r
711 if((draw != EGL_NO_SURFACE) ^ (read != EGL_NO_SURFACE))
\r
713 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
718 UNIMPLEMENTED(); // FIXME
\r
721 egl::setCurrentDisplay(display);
\r
722 egl::setCurrentDrawSurface(drawSurface);
\r
723 egl::setCurrentReadSurface(readSurface);
\r
724 egl::setCurrentContext(context);
\r
728 context->makeCurrent(drawSurface);
\r
731 return success(EGL_TRUE);
\r
734 EGLContext GetCurrentContext(void)
\r
738 EGLContext context = egl::getCurrentContext();
\r
740 return success(context);
\r
743 EGLSurface GetCurrentSurface(EGLint readdraw)
\r
745 TRACE("(EGLint readdraw = %d)", readdraw);
\r
747 if(readdraw == EGL_READ)
\r
749 EGLSurface read = egl::getCurrentReadSurface();
\r
750 return success(read);
\r
752 else if(readdraw == EGL_DRAW)
\r
754 EGLSurface draw = egl::getCurrentDrawSurface();
\r
755 return success(draw);
\r
759 return error(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
\r
763 EGLDisplay GetCurrentDisplay(void)
\r
767 EGLDisplay dpy = egl::getCurrentDisplay();
\r
769 return success(dpy);
\r
772 EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
\r
774 TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLint attribute = %d, EGLint *value = %p)",
\r
775 dpy, ctx, attribute, value);
\r
777 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
778 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
780 if(!validateContext(display, context))
\r
785 UNIMPLEMENTED(); // FIXME
\r
790 EGLBoolean WaitGL(void)
\r
794 UNIMPLEMENTED(); // FIXME
\r
796 return success(EGL_FALSE);
\r
799 EGLBoolean WaitNative(EGLint engine)
\r
801 TRACE("(EGLint engine = %d)", engine);
\r
803 UNIMPLEMENTED(); // FIXME
\r
805 return success(EGL_FALSE);
\r
808 EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface)
\r
810 TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p)", dpy, surface);
\r
812 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
813 egl::Surface *eglSurface = (egl::Surface*)surface;
\r
815 if(!validateSurface(display, eglSurface))
\r
820 if(surface == EGL_NO_SURFACE)
\r
822 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
825 eglSurface->swap();
\r
827 return success(EGL_TRUE);
\r
830 EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
\r
832 TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLNativePixmapType target = %p)", dpy, surface, target);
\r
834 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
835 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
837 if(!validateSurface(display, eglSurface))
\r
842 UNIMPLEMENTED(); // FIXME
\r
844 return success(EGL_FALSE);
\r
847 EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
\r
849 TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLenum target = 0x%X, buffer = %p, const EGLint attrib_list = %p)", dpy, ctx, target, buffer, attrib_list);
\r
851 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
852 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
854 if(!validateDisplay(display))
\r
856 return error(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
\r
859 if(context != EGL_NO_CONTEXT && !display->isValidContext(context))
\r
861 return error(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
\r
864 EGLenum imagePreserved = EGL_FALSE;
\r
865 GLuint textureLevel = 0;
\r
868 for(const EGLint *attribute = attrib_list; attribute[0] != EGL_NONE; attribute += 2)
\r
870 if(attribute[0] == EGL_IMAGE_PRESERVED_KHR)
\r
872 imagePreserved = attribute[1];
\r
874 else if(attribute[0] == EGL_GL_TEXTURE_LEVEL_KHR)
\r
876 textureLevel = attribute[1];
\r
880 return error(EGL_BAD_ATTRIBUTE, EGL_NO_IMAGE_KHR);
\r
885 GLuint name = reinterpret_cast<intptr_t>(buffer);
\r
889 return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
\r
892 #if defined(__ANDROID__)
\r
893 if(target == EGL_NATIVE_BUFFER_ANDROID)
\r
895 return new AndroidNativeImage(reinterpret_cast<ANativeWindowBuffer*>(name));
\r
899 EGLenum validationResult = context->validateSharedImage(target, name, textureLevel);
\r
901 if(validationResult != EGL_SUCCESS)
\r
903 return error(validationResult, EGL_NO_IMAGE_KHR);
\r
906 egl::Image *image = context->createSharedImage(target, name, textureLevel);
\r
910 return error(EGL_BAD_MATCH, EGL_NO_IMAGE_KHR);
\r
913 if(image->getDepth() > 1)
\r
915 return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
\r
918 return success((EGLImageKHR)image);
\r
921 EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
\r
923 TRACE("(EGLDisplay dpy = %p, EGLImageKHR image = %p)", dpy, image);
\r
925 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
927 if(!validateDisplay(display))
\r
929 return error(EGL_BAD_DISPLAY, EGL_FALSE);
\r
934 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
937 egl::Image *glImage = static_cast<egl::Image*>(image);
\r
938 glImage->destroyShared();
\r
940 return success(EGL_TRUE);
\r
943 EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
\r
945 TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLint *attrib_list = %p)", platform, native_display, attrib_list);
\r
947 return egl::Display::getPlatformDisplay(platform, (EGLNativeDisplayType)native_display);
\r
950 EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
\r
952 return CreateWindowSurface(dpy, config, (EGLNativeWindowType)native_window, attrib_list);
\r
955 EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
\r
957 return CreatePixmapSurface(dpy, config, (EGLNativePixmapType)native_pixmap, attrib_list);
\r
960 __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname)
\r
962 TRACE("(const char *procname = \"%s\")", procname);
\r
967 __eglMustCastToProperFunctionPointerType address;
\r
970 static const Extension eglExtensions[] =
\r
972 #define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
\r
974 EXTENSION(eglCreateImageKHR),
\r
975 EXTENSION(eglDestroyImageKHR),
\r
976 EXTENSION(eglGetPlatformDisplayEXT),
\r
977 EXTENSION(eglCreatePlatformWindowSurfaceEXT),
\r
978 EXTENSION(eglCreatePlatformPixmapSurfaceEXT),
\r
983 for(int ext = 0; ext < sizeof(eglExtensions) / sizeof(Extension); ext++)
\r
985 if(strcmp(procname, eglExtensions[ext].name) == 0)
\r
987 return (__eglMustCastToProperFunctionPointerType)eglExtensions[ext].address;
\r
993 __eglMustCastToProperFunctionPointerType proc = libGLESv2->es2GetProcAddress(procname);
\r
994 if(proc) return proc;
\r
999 __eglMustCastToProperFunctionPointerType proc = libGLES_CM->es1GetProcAddress(procname);
\r
1000 if(proc) return proc;
\r