bool Surface::checkForOutOfDateSwapChain() { RECT client; if (!GetClientRect(getWindowHandle(), &client)) { ASSERT(false); return false; } // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information. int clientWidth = client.right - client.left; int clientHeight = client.bottom - client.top; bool sizeDirty = clientWidth != getWidth() || clientHeight != getHeight(); if (sizeDirty || mPresentIntervalDirty) { resetSwapChain(clientWidth, clientHeight); if (static_cast<egl::Surface*>(getCurrentDrawSurface()) == this) { glMakeCurrent(glGetCurrentContext(), static_cast<egl::Display*>(getCurrentDisplay()), this); } return true; } return false; }
void GLWnd::glDeleteTextures() { glMakeCurrent(); for (int i=0;i<m_textures.getNumItems();i++) { GLuint tex = m_textures.enumItem(i); ::glDeleteTextures(1, &tex); } m_textures.removeAll(); }
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); } }
bool Surface::checkForOutOfDateSwapChain() { RECT client; int clientWidth = getWidth(); int clientHeight = getHeight(); bool sizeDirty = false; if (!mFixedSize && !mNativeWindow.isIconic()) { // The window is automatically resized to 150x22 when it's minimized, but the swapchain shouldn't be resized // because that's not a useful size to render to. if (!mNativeWindow.getClientRect(&client)) { ASSERT(false); return false; } // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information. clientWidth = client.right - client.left; clientHeight = client.bottom - client.top; sizeDirty = clientWidth != getWidth() || clientHeight != getHeight(); } if (mFixedSize && (mWidth != mFixedWidth || mHeight != mFixedHeight)) { clientWidth = mFixedWidth; clientHeight = mFixedHeight; sizeDirty = true; } bool wasDirty = (mSwapIntervalDirty || sizeDirty); if (mSwapIntervalDirty) { resetSwapChain(clientWidth, clientHeight); } else if (sizeDirty) { resizeSwapChain(clientWidth, clientHeight); } if (wasDirty) { if (static_cast<egl::Surface*>(getCurrentDrawSurface()) == this) { glMakeCurrent(glGetCurrentContext(), static_cast<egl::Display*>(getCurrentDisplay()), this); } return true; } return false; }
GLuint GLWnd::glLoadTexture(const char *filename) { Bitmap b(filename); b.bgra2argb(); glMakeCurrent(); GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, 4, b.getWidth(), b.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, b.getBits()); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); m_textures.addItem(texture); return texture; }
bool Surface::checkForOutOfDateSwapChain() { #if defined(ANGLE_PLATFORM_WINRT) int clientWidth = 0; int clientHeight = 0; winrt::getCurrentWindowDimensions(clientWidth,clientHeight); #else RECT client; if (!GetClientRect(getWindowHandle(), &client)) { ASSERT(false); return false; } // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information. int clientWidth = client.right - client.left; int clientHeight = client.bottom - client.top; #endif // #if defined(ANGLE_PLATFORM_WINRT) bool sizeDirty = clientWidth != getWidth() || clientHeight != getHeight(); if (mSwapIntervalDirty) { resetSwapChain(clientWidth, clientHeight); } else if (sizeDirty) { resizeSwapChain(clientWidth, clientHeight); } if (mSwapIntervalDirty || sizeDirty) { if (static_cast<egl::Surface*>(getCurrentDrawSurface()) == this) { glMakeCurrent(glGetCurrentContext(), static_cast<egl::Display*>(getCurrentDisplay()), this); } return true; } return false; }
bool Surface::checkForWindowResize() { RECT client; if (!GetClientRect(getWindowHandle(), &client)) { ASSERT(false); return false; } if (getWidth() != client.right - client.left || getHeight() != client.bottom - client.top) { resetSwapChain(); if (static_cast<egl::Surface*>(getCurrentDrawSurface()) == this) { glMakeCurrent(glGetCurrentContext(), static_cast<egl::Display*>(getCurrentDisplay()), this); } return true; } return false; }
EGLBoolean __stdcall eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) { TRACE("(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); if (ctx != EGL_NO_CONTEXT && !validate(display, context)) { return EGL_FALSE; } if ((draw != EGL_NO_SURFACE && !validate(display, static_cast<egl::Surface*>(draw))) || (read != EGL_NO_SURFACE && !validate(display, static_cast<egl::Surface*>(read)))) { return EGL_FALSE; } if (draw != read) { UNIMPLEMENTED(); // FIXME } 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; }