bool Surface::initialize() { ASSERT(!mSwapChain && !mOffscreenTexture && !mDepthStencil); if (!resetSwapChain()) return false; // Modify present parameters for this window, if we are composited, // to minimize the amount of queuing done by DWM between our calls to // present and the actual screen. if (mWindow && (getComparableOSVersion() >= versionWindowsVista)) { BOOL isComposited; HRESULT result = DwmIsCompositionEnabled(&isComposited); if (SUCCEEDED(result) && isComposited) { DWM_PRESENT_PARAMETERS presentParams; memset(&presentParams, 0, sizeof(presentParams)); presentParams.cbSize = sizeof(DWM_PRESENT_PARAMETERS); presentParams.cBuffer = 2; result = DwmSetPresentParameters(mWindow, &presentParams); if (FAILED(result)) ERR("Unable to set present parameters: 0x%08X", result); } } return true; }
bool SurfaceD3D::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(); } bool wasDirty = (mSwapIntervalDirty || sizeDirty); if (mSwapIntervalDirty) { resetSwapChain(clientWidth, clientHeight); } else if (sizeDirty) { resizeSwapChain(clientWidth, clientHeight); } return wasDirty; }
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; }
bool Surface::initialize() { if (!resetSwapChain()) return false; return true; }
void Surface::resetSwapChain() { if (!mWindow) { resetSwapChain(mWidth, mHeight); return; } RECT windowRect; if (!GetClientRect(getWindowHandle(), &windowRect)) { ASSERT(false); ERR("Could not retrieve the window dimensions"); return; } resetSwapChain(windowRect.right - windowRect.left, windowRect.bottom - windowRect.top); }
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; }
egl::Error SurfaceD3D::initialize(const egl::Display *display) { if (mNativeWindow->getNativeWindow()) { if (!mNativeWindow->initialize()) { return egl::Error(EGL_BAD_SURFACE); } } ANGLE_TRY(resetSwapChain()); return egl::Error(EGL_SUCCESS); }
bool Surface::resetSwapChain() { ASSERT(!mSwapChain); int width; int height; if (mWindow) { #if defined(ANGLE_PLATFORM_WINRT) winrt::getCurrentWindowDimensions(width, height); #else RECT windowRect; if (!GetClientRect(getWindowHandle(), &windowRect)) { ASSERT(false); ERR("Could not retrieve the window dimensions"); return error(EGL_BAD_SURFACE, false); } width = windowRect.right - windowRect.left; height = windowRect.bottom - windowRect.top; #endif // #if defined(ANGLE_PLATFORM_WINRT) } else { // non-window surface - size is determined at creation width = mWidth; height = mHeight; } mSwapChain = mRenderer->createSwapChain(mWindow, mShareHandle, mConfig->mRenderTargetFormat, mConfig->mDepthStencilFormat); if (!mSwapChain) { return error(EGL_BAD_ALLOC, false); } if (!resetSwapChain(width, height)) { delete mSwapChain; mSwapChain = NULL; return false; } return true; }
bool Surface::initialize() { if (mNativeWindow.getNativeWindow()) { if (!mNativeWindow.initialize()) { return false; } } if (!resetSwapChain()) return false; return true; }
Surface::Surface(Display *display, const Config *config, HWND window) : mDisplay(display), mConfig(config), mWindow(window) { mSwapChain = NULL; mDepthStencil = NULL; mBackBuffer = NULL; mRenderTarget = NULL; mFlipTexture = NULL; mFlipState = NULL; mPreFlipState = NULL; mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio mRenderBuffer = EGL_BACK_BUFFER; mSwapBehavior = EGL_BUFFER_PRESERVED; resetSwapChain(); }
bool Surface::resetSwapChain() { ASSERT(!mSwapChain); int width; int height; if (!mFixedSize) { RECT windowRect; if (!mNativeWindow.getClientRect(&windowRect)) { ASSERT(false); ERR("Could not retrieve the window dimensions"); return error(EGL_BAD_SURFACE, false); } width = windowRect.right - windowRect.left; height = windowRect.bottom - windowRect.top; } else { // non-window surface - size is determined at creation width = mWidth; height = mHeight; } mSwapChain = mRenderer->createSwapChain(mNativeWindow, mShareHandle, mConfig->mRenderTargetFormat, mConfig->mDepthStencilFormat); if (!mSwapChain) { return error(EGL_BAD_ALLOC, false); } if (!resetSwapChain(width, height)) { delete mSwapChain; mSwapChain = NULL; return false; } return true; }
egl::Error SurfaceD3D::initialize() { if (mNativeWindow.getNativeWindow()) { if (!mNativeWindow.initialize()) { return egl::Error(EGL_BAD_SURFACE); } } egl::Error error = resetSwapChain(); if (error.isError()) { return error; } return egl::Error(EGL_SUCCESS); }
Surface::Surface(Display *display, const Config *config, EGLint width, EGLint height) : mDisplay(display), mWindow(NULL), mConfig(config), mWidth(width), mHeight(height) { mSwapChain = NULL; mDepthStencil = NULL; mRenderTarget = NULL; mOffscreenTexture = NULL; mShareHandle = NULL; mWindowSubclassed = false; mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio mRenderBuffer = EGL_BACK_BUFFER; mSwapBehavior = EGL_BUFFER_PRESERVED; mSwapInterval = -1; setSwapInterval(1); resetSwapChain(width, height); }
egl::Error SurfaceD3D::resetSwapChain() { ASSERT(!mSwapChain); int width; int height; if (!mFixedSize) { RECT windowRect; if (!mNativeWindow.getClientRect(&windowRect)) { ASSERT(false); return egl::Error(EGL_BAD_SURFACE, "Could not retrieve the window dimensions"); } width = windowRect.right - windowRect.left; height = windowRect.bottom - windowRect.top; } else { // non-window surface - size is determined at creation width = mWidth; height = mHeight; } mSwapChain = mRenderer->createSwapChain(mNativeWindow, static_cast<HANDLE>(mShareHandle), mConfig->mRenderTargetFormat, mConfig->mDepthStencilFormat); if (!mSwapChain) { return egl::Error(EGL_BAD_ALLOC); } egl::Error error = resetSwapChain(width, height); if (error.isError()) { SafeDelete(mSwapChain); return error; } return egl::Error(EGL_SUCCESS); }
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; }