// EGL_EXT_device_query EGLBoolean EGLAPIENTRY QueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint attribute = %d, EGLAttrib *value = 0x%0.8p)", dpy, attribute, value); Display *display = static_cast<Display*>(dpy); Error error(EGL_SUCCESS); if (!display->getExtensions().deviceQuery) { SetGlobalError(Error(EGL_BAD_ACCESS)); return EGL_FALSE; } // validate the attribute parameter switch (attribute) { case EGL_DEVICE_EXT: *value = reinterpret_cast<EGLAttrib>(display->getDevice()); break; default: SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } SetGlobalError(error); return (error.isError() ? EGL_FALSE : EGL_TRUE); }
// EGL_ANGLE_query_surface_pointer EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value) { EVENT("(EGLDisplay dpy = 0x%0.8p, EGLSurface surface = 0x%0.8p, EGLint attribute = %d, void **value = 0x%0.8p)", dpy, surface, attribute, value); Display *display = static_cast<Display*>(dpy); Surface *eglSurface = static_cast<Surface*>(surface); Error error = ValidateSurface(display, eglSurface); if (error.isError()) { SetGlobalError(error); return EGL_FALSE; } if (!display->getExtensions().querySurfacePointer) { SetGlobalError(Error(EGL_SUCCESS)); return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { SetGlobalError(Error(EGL_BAD_SURFACE)); return EGL_FALSE; } // validate the attribute parameter switch (attribute) { case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: if (!display->getExtensions().surfaceD3DTexture2DShareHandle) { SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } break; default: SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } error = eglSurface->querySurfacePointerANGLE(attribute, value); SetGlobalError(error); return (error.isError() ? EGL_FALSE : EGL_TRUE); }
// EGL_NV_post_sub_buffer EGLBoolean EGLAPIENTRY PostSubBufferNV(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) { SetGlobalError(Error(EGL_BAD_PARAMETER)); return EGL_FALSE; } Display *display = static_cast<Display*>(dpy); Surface *eglSurface = static_cast<Surface*>(surface); Error error = ValidateSurface(display, eglSurface); if (error.isError()) { SetGlobalError(error); return EGL_FALSE; } if (display->isDeviceLost()) { SetGlobalError(Error(EGL_CONTEXT_LOST)); return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { SetGlobalError(Error(EGL_BAD_SURFACE)); return EGL_FALSE; } #if !defined(ANGLE_ENABLE_WINDOWS_STORE) || (defined(ANGLE_ENABLE_WINDOWS_STORE) && WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) // Qt WP: Allow this entry point as a workaround if (!display->getExtensions().postSubBuffer) { // Spec is not clear about how this should be handled. SetGlobalError(Error(EGL_SUCCESS)); return EGL_TRUE; } #endif error = eglSurface->postSubBuffer(x, y, width, height); if (error.isError()) { SetGlobalError(error); return EGL_FALSE; } SetGlobalError(Error(EGL_SUCCESS)); return EGL_TRUE; }
// EGL_NV_post_sub_buffer EGLBoolean EGLAPIENTRY PostSubBufferNV(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) { SetGlobalError(Error(EGL_BAD_PARAMETER)); return EGL_FALSE; } Display *display = static_cast<Display*>(dpy); Surface *eglSurface = static_cast<Surface*>(surface); Error error = ValidateSurface(display, eglSurface); if (error.isError()) { SetGlobalError(error); return EGL_FALSE; } if (display->isDeviceLost()) { SetGlobalError(Error(EGL_CONTEXT_LOST)); return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { SetGlobalError(Error(EGL_BAD_SURFACE)); return EGL_FALSE; } if (!display->getExtensions().postSubBuffer) { // Spec is not clear about how this should be handled. SetGlobalError(Error(EGL_SUCCESS)); return EGL_TRUE; } error = eglSurface->postSubBuffer(x, y, width, height); if (error.isError()) { SetGlobalError(error); return EGL_FALSE; } SetGlobalError(Error(EGL_SUCCESS)); return EGL_TRUE; }
// EGL_EXT_device_query EGLBoolean EGLAPIENTRY QueryDeviceAttribEXT(EGLDeviceEXT device, EGLint attribute, EGLAttrib *value) { EVENT("(EGLDeviceEXT device = 0x%0.8p, EGLint attribute = %d, EGLAttrib *value = 0x%0.8p)", device, attribute, value); Device *dev = static_cast<Device*>(device); if (dev == EGL_NO_DEVICE_EXT) { SetGlobalError(Error(EGL_BAD_ACCESS)); return EGL_FALSE; } Display *display = dev->getDisplay(); Error error(EGL_SUCCESS); if (!display->getExtensions().deviceQuery) { SetGlobalError(Error(EGL_BAD_ACCESS)); return EGL_FALSE; } // validate the attribute parameter switch (attribute) { case EGL_D3D11_DEVICE_ANGLE: if (!dev->getExtensions().deviceD3D || dev->getType() != EGL_D3D11_DEVICE_ANGLE) { SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } error = dev->getDevice(value); break; case EGL_D3D9_DEVICE_ANGLE: if (!dev->getExtensions().deviceD3D || dev->getType() != EGL_D3D9_DEVICE_ANGLE) { SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } error = dev->getDevice(value); break; default: SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } SetGlobalError(error); return (error.isError() ? EGL_FALSE : EGL_TRUE); }
// EGL_EXT_device_query EGLBoolean EGLAPIENTRY QueryDeviceAttribEXT(EGLDeviceEXT device, EGLint attribute, EGLAttrib *value) { EVENT("(EGLDeviceEXT device = 0x%0.8p, EGLint attribute = %d, EGLAttrib *value = 0x%0.8p)", device, attribute, value); Device *dev = static_cast<Device*>(device); if (dev == EGL_NO_DEVICE_EXT || !Device::IsValidDevice(dev)) { SetGlobalError(Error(EGL_BAD_ACCESS)); return EGL_FALSE; } // If the device was created by (and is owned by) a display, and that display doesn't support // device querying, then this call should fail Display *owningDisplay = dev->getOwningDisplay(); if (owningDisplay != nullptr && !owningDisplay->getExtensions().deviceQuery) { SetGlobalError(Error(EGL_BAD_ACCESS, "Device wasn't created using eglCreateDeviceANGLE, and the Display " "that created it doesn't support device querying")); return EGL_FALSE; } Error error(EGL_SUCCESS); // validate the attribute parameter switch (attribute) { case EGL_D3D11_DEVICE_ANGLE: case EGL_D3D9_DEVICE_ANGLE: if (!dev->getExtensions().deviceD3D || dev->getType() != attribute) { SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } error = dev->getDevice(value); break; default: SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } SetGlobalError(error); return (error.isError() ? EGL_FALSE : EGL_TRUE); }
EGLBoolean EGLAPIENTRY QuerySurface(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); Display *display = static_cast<Display*>(dpy); Surface *eglSurface = (Surface*)surface; Error error = ValidateSurface(display, eglSurface); if (error.isError()) { SetGlobalError(error); return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { SetGlobalError(Error(EGL_BAD_SURFACE)); return 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->getConfig()->configID; 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: if (!display->getExtensions().postSubBuffer) { SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } *value = eglSurface->isPostSubBufferSupported(); break; case EGL_FIXED_SIZE_ANGLE: if (!display->getExtensions().windowFixedSize) { SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } *value = eglSurface->isFixedSize(); break; default: SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); return EGL_FALSE; } SetGlobalError(Error(EGL_SUCCESS)); return EGL_TRUE; }