EGLBoolean __stdcall eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface draw = 0x%0.8p, EGLSurface read = 0x%0.8p, EGLContext ctx = 0x%0.8p)", dpy, draw, read, ctx); try { egl::Display *display = static_cast<egl::Display*>(dpy); gl::Context *context = static_cast<gl::Context*>(ctx); IDirect3DDevice9 *device = display->getDevice(); if (!device || display->testDeviceLost()) { display->notifyDeviceLost(); return EGL_FALSE; } if (display->isDeviceLost()) { return error(EGL_CONTEXT_LOST, EGL_FALSE); } if (ctx != EGL_NO_CONTEXT && !validateContext(display, context)) { return EGL_FALSE; } if ((draw != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(draw))) || (read != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(read)))) { return EGL_FALSE; } if (draw != read) { UNIMPLEMENTED(); // FIXME } egl::Surface* previousDraw = static_cast<egl::Surface*>(egl::getCurrentDrawSurface()); egl::Surface* previousRead = static_cast<egl::Surface*>(egl::getCurrentReadSurface()); egl::setCurrentDisplay(dpy); egl::setCurrentDrawSurface(draw); egl::setCurrentReadSurface(read); glMakeCurrent(context, display, static_cast<egl::Surface*>(draw)); return success(EGL_TRUE); } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface draw = 0x%0.8p, EGLSurface read = 0x%0.8p, EGLContext ctx = 0x%0.8p)", dpy, draw, read, ctx); ANGLE_TRY { egl::Display *display = static_cast<egl::Display*>(dpy); gl::Context *context = static_cast<gl::Context*>(ctx); if (ctx != EGL_NO_CONTEXT && !validateContext(display, context)) { return EGL_FALSE; } if (dpy != EGL_NO_DISPLAY) { rx::Renderer *renderer = display->getRenderer(); if (renderer->testDeviceLost(true)) { return EGL_FALSE; } if (renderer->isDeviceLost()) { return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } } if ((draw != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(draw))) || (read != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(read)))) { return EGL_FALSE; } if (draw != read) { UNIMPLEMENTED(); // FIXME } egl::setCurrentDisplay(dpy); egl::setCurrentDrawSurface(draw); egl::setCurrentReadSurface(read); glMakeCurrent(context, display, static_cast<egl::Surface*>(draw)); return egl::success(EGL_TRUE); } ANGLE_CATCH_ALL { return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } }
EGLBoolean __stdcall eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint value = %d)", dpy, surface, attribute, value); try { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } UNIMPLEMENTED(); // FIXME return success(EGL_TRUE); } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglDestroySurface(EGLDisplay dpy, EGLSurface surface) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface); try { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { return error(EGL_BAD_SURFACE, EGL_FALSE); } display->destroySurface((egl::Surface*)surface); return success(EGL_TRUE); } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLNativePixmapType target = 0x%0.8p)", dpy, surface, target); try { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (display->isDeviceLost()) { return error(EGL_CONTEXT_LOST, EGL_FALSE); } UNIMPLEMENTED(); // FIXME return success(0); } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLNativePixmapType target = 0x%0.8p)", dpy, surface, target); ANGLE_TRY { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (display->getRenderer()->isDeviceLost()) { return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } UNIMPLEMENTED(); // FIXME return egl::success(0); } ANGLE_CATCH_ALL { return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } }
EGLBoolean __stdcall eglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint x = %d, EGLint y = %d, EGLint width = %d, EGLint height = %d)", dpy, surface, x, y, width, height); if (x < 0 || y < 0 || width < 0 || height < 0) { return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (display->getRenderer()->isDeviceLost()) { return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } if (surface == EGL_NO_SURFACE) { return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->postSubBuffer(x, y, width, height)) { return egl::success(EGL_TRUE); } return EGL_FALSE; }
EGLBoolean __stdcall eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p)", dpy, surface); egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = (egl::Surface*)surface; if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (display->getRenderer()->isDeviceLost()) { return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } if (surface == EGL_NO_SURFACE) { return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->swap()) { return egl::success(EGL_TRUE); } return EGL_FALSE; }
EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value) { TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, void **value = 0x%0.8p)", dpy, surface, attribute, value); egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = (egl::Surface*)surface; if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } switch (attribute) { case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: { rx::SwapChain *swapchain = eglSurface->getSwapChain(); *value = (void*) (swapchain ? swapchain->getShareHandle() : NULL); } break; default: return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } return egl::success(EGL_TRUE); }
EGLBoolean __stdcall eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, surface, buffer); try { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (buffer != EGL_BACK_BUFFER) { return error(EGL_BAD_PARAMETER, EGL_FALSE); } if (surface == EGL_NO_SURFACE || eglSurface->getWindowHandle()) { return error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->getBoundTexture()) { return error(EGL_BAD_ACCESS, EGL_FALSE); } if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE) { return error(EGL_BAD_MATCH, EGL_FALSE); } if (!glBindTexImage(eglSurface)) { return error(EGL_BAD_MATCH, EGL_FALSE); } return success(EGL_TRUE); } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint buffer = %d)", dpy, surface, buffer); ANGLE_TRY { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (buffer != EGL_BACK_BUFFER) { return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } if (surface == EGL_NO_SURFACE || eglSurface->getWindowHandle()) { return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE) { return egl::error(EGL_BAD_MATCH, EGL_FALSE); } gl::Texture2D *texture = eglSurface->getBoundTexture(); if (texture) { texture->releaseTexImage(); } return egl::success(EGL_TRUE); } ANGLE_CATCH_ALL { return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } }
EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value) { TRACE("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, void **value = 0x%0.8p)", dpy, surface, attribute, value); try { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = (egl::Surface*)surface; if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { return error(EGL_BAD_SURFACE, EGL_FALSE); } switch (attribute) { case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: *value = (void*) eglSurface->getShareHandle(); break; default: return error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } return success(EGL_TRUE); } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint x = %d, EGLint y = %d, EGLint width = %d, EGLint height = %d)", dpy, surface, x, y, width, height); try { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (display->isDeviceLost()) { return error(EGL_CONTEXT_LOST, EGL_FALSE); } if (surface == EGL_NO_SURFACE) { return error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->postSubBuffer(x, y, width, height)) { return success(EGL_TRUE); } } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)", dpy, surface, attribute, value); try { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = (egl::Surface*)surface; if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { return error(EGL_BAD_SURFACE, EGL_FALSE); } switch (attribute) { case EGL_VG_ALPHA_FORMAT: UNIMPLEMENTED(); // FIXME break; case EGL_VG_COLORSPACE: UNIMPLEMENTED(); // FIXME break; case EGL_CONFIG_ID: UNIMPLEMENTED(); // FIXME break; case EGL_HEIGHT: *value = eglSurface->getHeight(); break; case EGL_HORIZONTAL_RESOLUTION: UNIMPLEMENTED(); // FIXME break; case EGL_LARGEST_PBUFFER: UNIMPLEMENTED(); // FIXME break; case EGL_MIPMAP_TEXTURE: UNIMPLEMENTED(); // FIXME break; case EGL_MIPMAP_LEVEL: UNIMPLEMENTED(); // FIXME break; case EGL_MULTISAMPLE_RESOLVE: UNIMPLEMENTED(); // FIXME break; case EGL_PIXEL_ASPECT_RATIO: UNIMPLEMENTED(); // FIXME break; case EGL_RENDER_BUFFER: UNIMPLEMENTED(); // FIXME break; case EGL_SWAP_BEHAVIOR: UNIMPLEMENTED(); // FIXME break; case EGL_TEXTURE_FORMAT: UNIMPLEMENTED(); // FIXME break; case EGL_TEXTURE_TARGET: UNIMPLEMENTED(); // FIXME break; case EGL_VERTICAL_RESOLUTION: UNIMPLEMENTED(); // FIXME break; case EGL_WIDTH: *value = eglSurface->getWidth(); break; case EGL_POST_SUB_BUFFER_SUPPORTED_NV: *value = eglSurface->isPostSubBufferSupported(); break; default: return error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } return success(EGL_TRUE); } catch(std::bad_alloc&) { return error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; }
EGLBoolean __stdcall eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, EGLint *value = 0x%0.8p)", dpy, surface, attribute, value); ANGLE_TRY { egl::Display *display = static_cast<egl::Display*>(dpy); egl::Surface *eglSurface = (egl::Surface*)surface; if (!validateSurface(display, eglSurface)) { return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } switch (attribute) { case EGL_VG_ALPHA_FORMAT: UNIMPLEMENTED(); // FIXME break; case EGL_VG_COLORSPACE: UNIMPLEMENTED(); // FIXME break; case EGL_CONFIG_ID: *value = eglSurface->getConfigID(); break; case EGL_HEIGHT: *value = eglSurface->getHeight(); break; case EGL_HORIZONTAL_RESOLUTION: UNIMPLEMENTED(); // FIXME break; case EGL_LARGEST_PBUFFER: UNIMPLEMENTED(); // FIXME break; case EGL_MIPMAP_TEXTURE: UNIMPLEMENTED(); // FIXME break; case EGL_MIPMAP_LEVEL: UNIMPLEMENTED(); // FIXME break; case EGL_MULTISAMPLE_RESOLVE: UNIMPLEMENTED(); // FIXME break; case EGL_PIXEL_ASPECT_RATIO: *value = eglSurface->getPixelAspectRatio(); break; case EGL_RENDER_BUFFER: *value = eglSurface->getRenderBuffer(); break; case EGL_SWAP_BEHAVIOR: *value = eglSurface->getSwapBehavior(); break; case EGL_TEXTURE_FORMAT: *value = eglSurface->getTextureFormat(); break; case EGL_TEXTURE_TARGET: *value = eglSurface->getTextureTarget(); break; case EGL_VERTICAL_RESOLUTION: UNIMPLEMENTED(); // FIXME break; case EGL_WIDTH: *value = eglSurface->getWidth(); break; case EGL_POST_SUB_BUFFER_SUPPORTED_NV: *value = eglSurface->isPostSubBufferSupported(); break; case EGL_FIXED_SIZE_ANGLE: *value = eglSurface->isFixedSize(); break; default: return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } return egl::success(EGL_TRUE); } ANGLE_CATCH_ALL { return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } }