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 "Texture2D.hpp"
\r
18 #include "Context.hpp"
\r
19 #include "Image.hpp"
\r
20 #include "common/debug.h"
\r
21 #include "Common/Version.h"
\r
23 #include <exception>
\r
26 static bool validateDisplay(egl::Display *display)
\r
28 if(display == EGL_NO_DISPLAY)
\r
30 return error(EGL_BAD_DISPLAY, false);
\r
33 if(!display->isInitialized())
\r
35 return error(EGL_NOT_INITIALIZED, false);
\r
41 static bool validateConfig(egl::Display *display, EGLConfig config)
\r
43 if(!validateDisplay(display))
\r
48 if(!display->isValidConfig(config))
\r
50 return error(EGL_BAD_CONFIG, false);
\r
56 static bool validateContext(egl::Display *display, egl::Context *context)
\r
58 if(!validateDisplay(display))
\r
63 if(!display->isValidContext(context))
\r
65 return error(EGL_BAD_CONTEXT, false);
\r
71 static bool validateSurface(egl::Display *display, egl::Surface *surface)
\r
73 if(!validateDisplay(display))
\r
78 if(!display->isValidSurface(surface))
\r
80 return error(EGL_BAD_SURFACE, false);
\r
88 EGLint EGLAPIENTRY eglGetError(void)
\r
92 EGLint error = egl::getCurrentError();
\r
94 if(error != EGL_SUCCESS)
\r
96 egl::setCurrentError(EGL_SUCCESS);
\r
102 EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
\r
104 TRACE("(EGLNativeDisplayType display_id = 0x%0.8p)", display_id);
\r
108 return egl::Display::getDisplay(display_id);
\r
110 catch(std::bad_alloc&)
\r
112 return error(EGL_BAD_ALLOC, EGL_NO_DISPLAY);
\r
115 return EGL_NO_DISPLAY;
\r
118 EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
\r
120 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLint *major = 0x%0.8p, EGLint *minor = 0x%0.8p)",
\r
121 dpy, major, minor);
\r
125 if(dpy == EGL_NO_DISPLAY)
\r
127 return error(EGL_BAD_DISPLAY, EGL_FALSE);
\r
130 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
132 if(!display->initialize())
\r
134 return error(EGL_NOT_INITIALIZED, EGL_FALSE);
\r
137 if(major) *major = 1;
\r
138 if(minor) *minor = 4;
\r
140 return success(EGL_TRUE);
\r
142 catch(std::bad_alloc&)
\r
144 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
150 EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
\r
152 TRACE("(EGLDisplay dpy = 0x%0.8p)", dpy);
\r
156 if(dpy == EGL_NO_DISPLAY)
\r
158 return error(EGL_BAD_DISPLAY, EGL_FALSE);
\r
161 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
163 display->terminate();
\r
165 return success(EGL_TRUE);
\r
167 catch(std::bad_alloc&)
\r
169 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
175 const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
\r
177 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLint name = %d)", dpy, name);
\r
181 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
183 if(!validateDisplay(display))
\r
190 case EGL_CLIENT_APIS:
\r
191 return success("OpenGL_ES");
\r
192 case EGL_EXTENSIONS:
\r
193 return success("EGL_KHR_gl_texture_2D_image "
\r
194 "EGL_KHR_gl_texture_cubemap_image "
\r
195 "EGL_KHR_gl_renderbuffer_image "
\r
196 "EGL_KHR_image_base");
\r
198 return success("TransGaming Inc.");
\r
200 return success("1.4 SwiftShader "VERSION_STRING);
\r
203 return error(EGL_BAD_PARAMETER, (const char*)NULL);
\r
205 catch(std::bad_alloc&)
\r
207 return error(EGL_BAD_ALLOC, (const char*)NULL);
\r
213 EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
\r
215 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLConfig *configs = 0x%0.8p, "
\r
216 "EGLint config_size = %d, EGLint *num_config = 0x%0.8p)",
\r
217 dpy, configs, config_size, num_config);
\r
221 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
223 if(!validateDisplay(display))
\r
230 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
233 const EGLint attribList[] = {EGL_NONE};
\r
235 if(!display->getConfigs(configs, attribList, config_size, num_config))
\r
237 return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
\r
240 return success(EGL_TRUE);
\r
242 catch(std::bad_alloc&)
\r
244 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
250 EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
\r
252 TRACE("(EGLDisplay dpy = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p, "
\r
253 "EGLConfig *configs = 0x%0.8p, EGLint config_size = %d, EGLint *num_config = 0x%0.8p)",
\r
254 dpy, attrib_list, configs, config_size, num_config);
\r
258 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
260 if(!validateDisplay(display))
\r
267 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
270 const EGLint attribList[] = {EGL_NONE};
\r
274 attrib_list = attribList;
\r
277 display->getConfigs(configs, attrib_list, config_size, num_config);
\r
279 return success(EGL_TRUE);
\r
281 catch(std::bad_alloc&)
\r
283 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
289 EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
\r
291 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)",
\r
292 dpy, config, attribute, value);
\r
296 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
298 if(!validateConfig(display, config))
\r
303 if(!display->getConfigAttrib(config, attribute, value))
\r
305 return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
\r
308 return success(EGL_TRUE);
\r
310 catch(std::bad_alloc&)
\r
312 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
318 EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
\r
320 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLNativeWindowType win = 0x%0.8p, "
\r
321 "const EGLint *attrib_list = 0x%0.8p)", dpy, config, window, attrib_list);
\r
325 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
327 if(!validateConfig(display, config))
\r
329 return EGL_NO_SURFACE;
\r
332 if(!display->isValidWindow(window))
\r
334 return error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
\r
337 return display->createWindowSurface(window, config, attrib_list);
\r
339 catch(std::bad_alloc&)
\r
341 return error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
\r
344 return EGL_NO_SURFACE;
\r
347 EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
\r
349 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p)",
\r
350 dpy, config, attrib_list);
\r
354 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
356 if(!validateConfig(display, config))
\r
358 return EGL_NO_SURFACE;
\r
361 return display->createOffscreenSurface(config, attrib_list);
\r
363 catch(std::bad_alloc&)
\r
365 return error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
\r
368 return EGL_NO_SURFACE;
\r
371 EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
\r
373 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLNativePixmapType pixmap = 0x%0.8p, "
\r
374 "const EGLint *attrib_list = 0x%0.8p)", dpy, config, pixmap, attrib_list);
\r
378 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
380 if(!validateConfig(display, config))
\r
382 return EGL_NO_SURFACE;
\r
385 UNIMPLEMENTED(); // FIXME
\r
387 return success(EGL_NO_SURFACE);
\r
389 catch(std::bad_alloc&)
\r
391 return error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
\r
394 return EGL_NO_SURFACE;
\r
397 EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
\r
399 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface);
\r
403 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
404 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
406 if(!validateSurface(display, eglSurface))
\r
411 if(surface == EGL_NO_SURFACE)
\r
413 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
416 display->destroySurface((egl::Surface*)surface);
\r
418 return success(EGL_TRUE);
\r
420 catch(std::bad_alloc&)
\r
422 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
428 EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
\r
430 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)",
\r
431 dpy, surface, attribute, value);
\r
435 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
436 egl::Surface *eglSurface = (egl::Surface*)surface;
\r
438 if(!validateSurface(display, eglSurface))
\r
443 if(surface == EGL_NO_SURFACE)
\r
445 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
450 case EGL_VG_ALPHA_FORMAT:
\r
451 UNIMPLEMENTED(); // FIXME
\r
453 case EGL_VG_COLORSPACE:
\r
454 UNIMPLEMENTED(); // FIXME
\r
456 case EGL_CONFIG_ID:
\r
457 *value = eglSurface->getConfigID();
\r
460 *value = eglSurface->getHeight();
\r
462 case EGL_HORIZONTAL_RESOLUTION:
\r
463 UNIMPLEMENTED(); // FIXME
\r
465 case EGL_LARGEST_PBUFFER:
\r
466 UNIMPLEMENTED(); // FIXME
\r
468 case EGL_MIPMAP_TEXTURE:
\r
469 UNIMPLEMENTED(); // FIXME
\r
471 case EGL_MIPMAP_LEVEL:
\r
472 UNIMPLEMENTED(); // FIXME
\r
474 case EGL_MULTISAMPLE_RESOLVE:
\r
475 UNIMPLEMENTED(); // FIXME
\r
477 case EGL_PIXEL_ASPECT_RATIO:
\r
478 *value = eglSurface->getPixelAspectRatio();
\r
480 case EGL_RENDER_BUFFER:
\r
481 *value = eglSurface->getRenderBuffer();
\r
483 case EGL_SWAP_BEHAVIOR:
\r
484 *value = eglSurface->getSwapBehavior();
\r
486 case EGL_TEXTURE_FORMAT:
\r
487 *value = eglSurface->getTextureFormat();
\r
489 case EGL_TEXTURE_TARGET:
\r
490 *value = eglSurface->getTextureTarget();
\r
492 case EGL_VERTICAL_RESOLUTION:
\r
493 UNIMPLEMENTED(); // FIXME
\r
496 *value = eglSurface->getWidth();
\r
499 return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
\r
502 return success(EGL_TRUE);
\r
504 catch(std::bad_alloc&)
\r
506 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
512 EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
\r
514 TRACE("(EGLenum api = 0x%X)", api);
\r
520 case EGL_OPENGL_API:
\r
521 case EGL_OPENVG_API:
\r
522 return error(EGL_BAD_PARAMETER, EGL_FALSE); // Not supported by this implementation
\r
523 case EGL_OPENGL_ES_API:
\r
526 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
529 egl::setCurrentAPI(api);
\r
531 return success(EGL_TRUE);
\r
533 catch(std::bad_alloc&)
\r
535 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
541 EGLenum EGLAPIENTRY eglQueryAPI(void)
\r
547 EGLenum API = egl::getCurrentAPI();
\r
549 return success(API);
\r
551 catch(std::bad_alloc&)
\r
553 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
559 EGLBoolean EGLAPIENTRY eglWaitClient(void)
\r
565 UNIMPLEMENTED(); // FIXME
\r
569 catch(std::bad_alloc&)
\r
571 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
577 EGLBoolean EGLAPIENTRY eglReleaseThread(void)
\r
583 eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE);
\r
585 return success(EGL_TRUE);
\r
587 catch(std::bad_alloc&)
\r
589 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
595 EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
\r
597 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLenum buftype = 0x%X, EGLClientBuffer buffer = 0x%0.8p, "
\r
598 "EGLConfig config = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p)",
\r
599 dpy, buftype, buffer, config, attrib_list);
\r
603 return error(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
\r
606 EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
\r
608 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint value = %d)",
\r
609 dpy, surface, attribute, value);
\r
613 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
614 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
616 if(!validateSurface(display, eglSurface))
\r
621 UNIMPLEMENTED(); // FIXME
\r
623 return success(EGL_TRUE);
\r
625 catch(std::bad_alloc&)
\r
627 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
633 EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
\r
635 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, surface, buffer);
\r
639 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
640 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
642 if(!validateSurface(display, eglSurface))
\r
647 if(buffer != EGL_BACK_BUFFER)
\r
649 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
652 if(surface == EGL_NO_SURFACE || eglSurface->getWindowHandle())
\r
654 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
657 if(eglSurface->getBoundTexture())
\r
659 return error(EGL_BAD_ACCESS, EGL_FALSE);
\r
662 if(eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
\r
664 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
667 egl::Context *context = static_cast<egl::Context*>(egl::getCurrentContext());
\r
671 context->bindTexImage(eglSurface);
\r
674 return success(EGL_TRUE);
\r
676 catch(std::bad_alloc&)
\r
678 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
684 EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
\r
686 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, surface, buffer);
\r
690 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
691 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
693 if(!validateSurface(display, eglSurface))
\r
698 if(buffer != EGL_BACK_BUFFER)
\r
700 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
703 if(surface == EGL_NO_SURFACE || eglSurface->getWindowHandle())
\r
705 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
708 if(eglSurface->getTextureFormat() == EGL_NO_TEXTURE)
\r
710 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
713 egl::Texture2D *texture = eglSurface->getBoundTexture();
\r
717 texture->releaseTexImage();
\r
720 return success(EGL_TRUE);
\r
722 catch(std::bad_alloc&)
\r
724 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
730 EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
\r
732 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLint interval = %d)", dpy, interval);
\r
736 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
738 if(!validateDisplay(display))
\r
743 egl::Surface *draw_surface = static_cast<egl::Surface*>(egl::getCurrentDrawSurface());
\r
745 if(draw_surface == NULL)
\r
747 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
750 draw_surface->setSwapInterval(interval);
\r
752 return success(EGL_TRUE);
\r
754 catch(std::bad_alloc&)
\r
756 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
762 EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
\r
764 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLContext share_context = 0x%0.8p, "
\r
765 "const EGLint *attrib_list = 0x%0.8p)", dpy, config, share_context, attrib_list);
\r
769 EGLint clientVersion = 1;
\r
772 for(const EGLint* attribute = attrib_list; attribute[0] != EGL_NONE; attribute += 2)
\r
774 if(attribute[0] == EGL_CONTEXT_CLIENT_VERSION)
\r
776 clientVersion = attribute[1];
\r
780 return error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT);
\r
785 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
787 if(!validateConfig(display, config))
\r
789 return EGL_NO_CONTEXT;
\r
792 return display->createContext(config, static_cast<egl::Context*>(share_context), clientVersion);
\r
794 catch(std::bad_alloc&)
\r
796 return error(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
\r
799 return EGL_NO_CONTEXT;
\r
802 EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
\r
804 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p)", dpy, ctx);
\r
808 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
809 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
811 if(!validateContext(display, context))
\r
816 if(ctx == EGL_NO_CONTEXT)
\r
818 return error(EGL_BAD_CONTEXT, EGL_FALSE);
\r
821 display->destroyContext(context);
\r
823 return success(EGL_TRUE);
\r
825 catch(std::bad_alloc&)
\r
827 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
833 EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
\r
835 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface draw = 0x%0.8p, EGLSurface read = 0x%0.8p, EGLContext ctx = 0x%0.8p)",
\r
836 dpy, draw, read, ctx);
\r
840 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
841 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
843 if(ctx != EGL_NO_CONTEXT || draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE)
\r
845 if(!validateDisplay(display))
\r
851 if(ctx == EGL_NO_CONTEXT && (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
\r
853 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
856 if(ctx != EGL_NO_CONTEXT && !validateContext(display, context))
\r
861 if((draw != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(draw))) ||
\r
862 (read != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(read))))
\r
867 if((draw != EGL_NO_SURFACE) ^ (read != EGL_NO_SURFACE))
\r
869 return error(EGL_BAD_MATCH, EGL_FALSE);
\r
874 UNIMPLEMENTED(); // FIXME
\r
877 egl::setCurrentDisplay(dpy);
\r
878 egl::setCurrentDrawSurface(draw);
\r
879 egl::setCurrentReadSurface(read);
\r
880 egl::setCurrentContext(ctx);
\r
884 context->makeCurrent(static_cast<egl::Surface*>(draw));
\r
887 return success(EGL_TRUE);
\r
889 catch(std::bad_alloc&)
\r
891 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
897 EGLContext EGLAPIENTRY eglGetCurrentContext(void)
\r
903 EGLContext context = egl::getCurrentContext();
\r
905 return success(context);
\r
907 catch(std::bad_alloc&)
\r
909 return error(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
\r
912 return EGL_NO_CONTEXT;
\r
915 EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
\r
917 TRACE("(EGLint readdraw = %d)", readdraw);
\r
921 if(readdraw == EGL_READ)
\r
923 EGLSurface read = egl::getCurrentReadSurface();
\r
924 return success(read);
\r
926 else if(readdraw == EGL_DRAW)
\r
928 EGLSurface draw = egl::getCurrentDrawSurface();
\r
929 return success(draw);
\r
933 return error(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
\r
936 catch(std::bad_alloc&)
\r
938 return error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
\r
941 return EGL_NO_SURFACE;
\r
944 EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
\r
950 EGLDisplay dpy = egl::getCurrentDisplay();
\r
952 return success(dpy);
\r
954 catch(std::bad_alloc&)
\r
956 return error(EGL_BAD_ALLOC, EGL_NO_DISPLAY);
\r
959 return EGL_NO_DISPLAY;
\r
962 EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
\r
964 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)",
\r
965 dpy, ctx, attribute, value);
\r
969 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
970 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
972 if(!validateContext(display, context))
\r
977 UNIMPLEMENTED(); // FIXME
\r
981 catch(std::bad_alloc&)
\r
983 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
989 EGLBoolean EGLAPIENTRY eglWaitGL(void)
\r
995 UNIMPLEMENTED(); // FIXME
\r
999 catch(std::bad_alloc&)
\r
1001 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
1007 EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
\r
1009 TRACE("(EGLint engine = %d)", engine);
\r
1013 UNIMPLEMENTED(); // FIXME
\r
1015 return success(0);
\r
1017 catch(std::bad_alloc&)
\r
1019 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
1025 EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
\r
1027 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface);
\r
1031 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
1032 egl::Surface *eglSurface = (egl::Surface*)surface;
\r
1034 if(!validateSurface(display, eglSurface))
\r
1039 if(surface == EGL_NO_SURFACE)
\r
1041 return error(EGL_BAD_SURFACE, EGL_FALSE);
\r
1044 eglSurface->swap();
\r
1046 return success(EGL_TRUE);
\r
1048 catch(std::bad_alloc&)
\r
1050 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
1056 EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
\r
1058 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLNativePixmapType target = 0x%0.8p)", dpy, surface, target);
\r
1062 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
1063 egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
\r
1065 if(!validateSurface(display, eglSurface))
\r
1070 UNIMPLEMENTED(); // FIXME
\r
1072 return success(0);
\r
1074 catch(std::bad_alloc&)
\r
1076 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
1082 EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
\r
1084 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLenum target = 0x%X, buffer = 0x%0.8p, const EGLint attrib_list = 0x%0.8p)", dpy, ctx, target, buffer, attrib_list);
\r
1088 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
1089 egl::Context *context = static_cast<egl::Context*>(ctx);
\r
1091 if(!validateDisplay(display))
\r
1093 return error(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
\r
1096 if(context != EGL_NO_CONTEXT && !display->isValidContext(context))
\r
1098 return error(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
\r
1101 EGLenum imagePreserved = EGL_FALSE;
\r
1102 GLuint textureLevel = 0;
\r
1105 for(const EGLint *attribute = attrib_list; attribute[0] != EGL_NONE; attribute += 2)
\r
1107 if(attribute[0] == EGL_IMAGE_PRESERVED_KHR)
\r
1109 imagePreserved = attribute[1];
\r
1111 else if(attribute[0] == EGL_GL_TEXTURE_LEVEL_KHR)
\r
1113 textureLevel = attribute[1];
\r
1117 return error(EGL_BAD_ATTRIBUTE, EGL_NO_IMAGE_KHR);
\r
1122 GLuint name = reinterpret_cast<intptr_t>(buffer);
\r
1126 return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
\r
1129 EGLenum validationResult = context->validateSharedImage(target, name, textureLevel);
\r
1131 if(validationResult != EGL_SUCCESS)
\r
1133 return error(validationResult, EGL_NO_IMAGE_KHR);
\r
1136 egl::Image *image = context->createSharedImage(target, name, textureLevel);
\r
1140 return error(EGL_BAD_MATCH, EGL_NO_IMAGE_KHR);
\r
1143 if(image->getMultiSampleDepth() > 1)
\r
1145 return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
\r
1148 return success((EGLImageKHR)image);
\r
1150 catch(std::bad_alloc&)
\r
1152 return error(EGL_BAD_ALLOC, EGL_NO_IMAGE_KHR);
\r
1155 return EGL_NO_IMAGE_KHR;
\r
1158 EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
\r
1160 TRACE("(EGLDisplay dpy = 0x%0.8p, EGLImageKHR image = 0x%0.8p)", dpy, image);
\r
1164 egl::Display *display = static_cast<egl::Display*>(dpy);
\r
1166 if(!validateDisplay(display))
\r
1168 return error(EGL_BAD_DISPLAY, EGL_FALSE);
\r
1173 return error(EGL_BAD_PARAMETER, EGL_FALSE);
\r
1176 egl::Image *glImage = static_cast<egl::Image*>(image);
\r
1177 glImage->destroyShared();
\r
1179 return success(EGL_TRUE);
\r
1181 catch(std::bad_alloc&)
\r
1183 return error(EGL_BAD_ALLOC, EGL_FALSE);
\r
1189 __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
\r
1191 TRACE("(const char *procname = \"%s\")", procname);
\r
1198 __eglMustCastToProperFunctionPointerType address;
\r
1201 static const Extension eglExtensions[] =
\r
1203 #define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
\r
1205 EXTENSION(eglCreateImageKHR),
\r
1206 EXTENSION(eglDestroyImageKHR),
\r
1211 for(int ext = 0; ext < sizeof(eglExtensions) / sizeof(Extension); ext++)
\r
1213 if(strcmp(procname, eglExtensions[ext].name) == 0)
\r
1215 return (__eglMustCastToProperFunctionPointerType)eglExtensions[ext].address;
\r
1219 if(es2::getProcAddress != 0)
\r
1221 __eglMustCastToProperFunctionPointerType proc = es2::getProcAddress(procname);
\r
1222 if(proc) return proc;
\r
1225 if(es1::getProcAddress != 0)
\r
1227 __eglMustCastToProperFunctionPointerType proc = es1::getProcAddress(procname);
\r
1228 if(proc) return proc;
\r
1231 catch(std::bad_alloc&)
\r
1233 return error(EGL_BAD_ALLOC, (__eglMustCastToProperFunctionPointerType)NULL);
\r