void Display::terminate() { makeCurrent(nullptr, nullptr, nullptr); while (!mContextSet.empty()) { destroyContext(*mContextSet.begin()); } while (!mImageSet.empty()) { destroyImage(*mImageSet.begin()); } while (!mImplementation->getSurfaceSet().empty()) { destroySurface(*mImplementation->getSurfaceSet().begin()); } mConfigSet.clear(); if (mDevice != nullptr && mDevice->getOwningDisplay() != nullptr) { // Don't delete the device if it was created externally using eglCreateDeviceANGLE // We also shouldn't set it to null in case eglInitialize() is called again later SafeDelete(mDevice); } mImplementation->terminate(); mInitialized = false; // Never de-init default platform.. terminate is not that final. }
void TestWindow::updateSurfaces() { auto now = usecTimestampNow(); // Fetch any new textures for (size_t x = 0; x < DIVISIONS_X; ++x) { for (size_t y = 0; y < DIVISIONS_Y; ++y) { auto& qmlInfo = _surfaces[x][y]; if (!qmlInfo.surface) { if (now < _createStopTime && randFloat() > 0.99f) { buildSurface(qmlInfo, x == 0 && y == 0); } else { continue; } } if (now > qmlInfo.lifetime) { destroySurface(qmlInfo); continue; } auto& surface = qmlInfo.surface; auto& currentTexture = qmlInfo.texture; TextureAndFence newTextureAndFence; if (surface->fetchTexture(newTextureAndFence)) { if (currentTexture != 0) { auto readFence = _glf.glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); glFlush(); _discardLamdba(currentTexture, readFence); } currentTexture = newTextureAndFence.first; _glf.glWaitSync((GLsync)newTextureAndFence.second, 0, GL_TIMEOUT_IGNORED); } } } }
status_t BnSurfaceComposerClient::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case CREATE_SURFACE: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); surface_data_t params; String8 name = data.readString8(); DisplayID display = data.readInt32(); uint32_t w = data.readInt32(); uint32_t h = data.readInt32(); PixelFormat format = data.readInt32(); uint32_t flags = data.readInt32(); sp<ISurface> s = createSurface(¶ms, name, display, w, h, format, flags); params.writeToParcel(reply); reply->writeStrongBinder(s->asBinder()); return NO_ERROR; } break; case DESTROY_SURFACE: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); reply->writeInt32( destroySurface( data.readInt32() ) ); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } }
EGLWindow::~EGLWindow() { // clear screen std::cout<<"dtor called\n"; glClear( GL_COLOR_BUFFER_BIT ); destroySurface(); }
/** * Process the next main command. */ static void engine_handle_cmd(struct android_app* app, int32_t cmd) { struct engine* engine = (struct engine*)app->userData; switch (cmd) { case APP_CMD_SAVE_STATE: // The system has asked us to save our current state. Do so. LOGI("APP_CMD_SAVE_STATE"); engine->app->savedState = malloc(sizeof(int)); *((int*)engine->app->savedState) = 0x1337; engine->app->savedStateSize = sizeof(int); break; case APP_CMD_INIT_WINDOW: // The window is being shown, get it ready. LOGI("APP_CMD_INIT_WINDOW"); if (engine->app->window != NULL) { updateGL(engine); } break; case APP_CMD_TERM_WINDOW: // The window is being hidden or closed, clean it up. LOGI("APP_CMD_TERM_WINDOW"); destroySurface(engine); break; case APP_CMD_GAINED_FOCUS: // When our app gains focus, we start monitoring the accelerometer. LOGI("APP_CMD_GAINED_FOCUS"); engine->animating = engine->surface != EGL_NO_SURFACE; break; case APP_CMD_LOST_FOCUS: // Also stop animating. LOGI("APP_CMD_LOST_FOCUS"); engine->animating = GK_FALSE; break; } }
DisplayImpl::~DisplayImpl() { while (!mSurfaceSet.empty()) { destroySurface(*mSurfaceSet.begin()); } }
QWebOSGLContext::~QWebOSGLContext() { if (m_eglContext != EGL_NO_CONTEXT) eglDestroyContext(s_eglDisplay, m_eglContext); destroySurface(); }
PaintPlugin::~PaintPlugin() { gPathI.deletePath(m_touchPath); gPaintI.deletePaint(m_paintSurface); gPaintI.deletePaint(m_paintButton); setContext(NULL); destroySurface(); }
EGLDisplayOpenVG::~EGLDisplayOpenVG() { eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); ASSERT_EGL_NO_ERROR(); delete m_sharedPlatformSurface; HashMap<EGLSurface, EGLint>::const_iterator end = m_surfaceConfigIds.end(); for (HashMap<EGLSurface, EGLint>::const_iterator it = m_surfaceConfigIds.begin(); it != end; ++it) destroySurface((*it).first); eglTerminate(m_display); ASSERT_EGL_NO_ERROR(); }
void Display::terminate() { while (!mSurfaceSet.empty()) { destroySurface(*mSurfaceSet.begin()); } while (!mContextSet.empty()) { destroyContext(*mContextSet.begin()); } glDestroyRenderer(mRenderer); mRenderer = NULL; }
void Display::terminate() { while(!mSurfaceSet.empty()) { destroySurface(*mSurfaceSet.begin()); } while(!mContextSet.empty()) { destroyContext(*mContextSet.begin()); } while(!mSharedImageNameSpace.empty()) { destroySharedImage(reinterpret_cast<EGLImageKHR>((intptr_t)mSharedImageNameSpace.firstName())); } }
void QWebOSGLContext::resizeSurface(const QSize& size) { bool restoreCurrent = false; if (isCurrent()) { doneCurrent(); restoreCurrent = true; } destroySurface(); m_platformWindow->resize(size.width(), size.height()); m_surfaceSize = size; createSurface(); if (restoreCurrent) { makeCurrent(); } }
status_t BnSurfaceComposerClient::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case CREATE_SURFACE: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); String8 name = data.readString8(); uint32_t w = data.readInt32(); uint32_t h = data.readInt32(); PixelFormat format = data.readInt32(); uint32_t flags = data.readInt32(); sp<IBinder> handle; sp<IGraphicBufferProducer> gbp; status_t result = createSurface(name, w, h, format, flags, &handle, &gbp); reply->writeStrongBinder(handle); reply->writeStrongBinder(gbp->asBinder()); reply->writeInt32(result); return NO_ERROR; } break; case DESTROY_SURFACE: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); reply->writeInt32(destroySurface( data.readStrongBinder() ) ); return NO_ERROR; } break; case CLEAR_LAYER_FRAME_STATS: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); sp<IBinder> handle = data.readStrongBinder(); status_t result = clearLayerFrameStats(handle); reply->writeInt32(result); return NO_ERROR; } break; case GET_LAYER_FRAME_STATS: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); sp<IBinder> handle = data.readStrongBinder(); FrameStats stats; status_t result = getLayerFrameStats(handle, &stats); reply->write(stats); reply->writeInt32(result); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } }
void deinit() { destroySurface(); }
void deinit() { onDeinit(); destroySurface(); }
CEGLManager::~CEGLManager() { destroyContext(); destroySurface(); terminate(); }
VideoPlugin::~VideoPlugin() { setContext(NULL); destroySurface(); }
void EGLWindow::setScreen(uint32_t _x, uint32_t _y, uint32_t _w, uint32_t _h) { // destroy our surface the make a new one destroySurface(); makeSurface(_x,_y,_w,_h); }
void EGLWindow::resizeScreen(uint32_t _w, uint32_t _h) { destroySurface(); makeSurface(0,0,_w,_h); }
void Display::terminate() { while (!mSurfaceSet.empty()) { destroySurface(*mSurfaceSet.begin()); } while (!mContextSet.empty()) { destroyContext(*mContextSet.begin()); } while (!mEventQueryPool.empty()) { mEventQueryPool.back()->Release(); mEventQueryPool.pop_back(); } mVertexShaderCache.clear(); mPixelShaderCache.clear(); if (mDevice) { // If the device is lost, reset it first to prevent leaving the driver in an unstable state if (testDeviceLost()) { resetDevice(); } mDevice->Release(); mDevice = NULL; } if (mDeviceEx) { mDeviceEx->Release(); mDeviceEx = NULL; } if (mD3d9) { mD3d9->Release(); mD3d9 = NULL; } if (mDeviceWindow) { DestroyWindow(mDeviceWindow); mDeviceWindow = NULL; } if (mD3d9Ex) { mD3d9Ex->Release(); mD3d9Ex = NULL; } if (mD3d9Module) { mD3d9Module = NULL; } if (mD3dCompilerModule) { FreeLibrary(mD3dCompilerModule); mD3dCompilerModule = NULL; } }
bool CWGLManager::initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& videodata) { // store params, videoData is set later as it would be overwritten else Params=params; // Create a window to test antialiasing support const fschar_t* ClassName = __TEXT("CWGLManager"); HINSTANCE lhInstance = GetModuleHandle(0); // Register Class WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)DefWindowProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = lhInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = 0; wcex.lpszClassName = ClassName; wcex.hIconSm = 0; wcex.hIcon = 0; RegisterClassEx(&wcex); RECT clientSize; clientSize.top = 0; clientSize.left = 0; clientSize.right = Params.WindowSize.Width; clientSize.bottom = Params.WindowSize.Height; DWORD style = WS_POPUP; if (!Params.Fullscreen) style = WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; AdjustWindowRect(&clientSize, style, FALSE); const s32 realWidth = clientSize.right - clientSize.left; const s32 realHeight = clientSize.bottom - clientSize.top; const s32 windowLeft = (GetSystemMetrics(SM_CXSCREEN) - realWidth) / 2; const s32 windowTop = (GetSystemMetrics(SM_CYSCREEN) - realHeight) / 2; HWND temporary_wnd=CreateWindow(ClassName, __TEXT(""), style, windowLeft, windowTop, realWidth, realHeight, NULL, NULL, lhInstance, NULL); if (!temporary_wnd) { os::Printer::log("Cannot create a temporary window.", ELL_ERROR); UnregisterClass(ClassName, lhInstance); return false; } HDC HDc = GetDC(temporary_wnd); // Set up pixel format descriptor with desired parameters PIXELFORMATDESCRIPTOR tmp_pfd = { sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor 1, // Version Number PFD_DRAW_TO_WINDOW | // Format Must Support Window PFD_SUPPORT_OPENGL | // Format Must Support OpenGL (Params.Doublebuffer?PFD_DOUBLEBUFFER:0) | // Must Support Double Buffering (Params.Stereobuffer?PFD_STEREO:0), // Must Support Stereo Buffer PFD_TYPE_RGBA, // Request An RGBA Format Params.Bits, // Select Our Color Depth 0, 0, 0, 0, 0, 0, // Color Bits Ignored 0, // No Alpha Buffer 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits Ignored Params.ZBufferBits, // Z-Buffer (Depth Buffer) BYTE(Params.Stencilbuffer ? 1 : 0), // Stencil Buffer Depth 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer 0, // Reserved 0, 0, 0 // Layer Masks Ignored }; pfd=tmp_pfd; for (u32 i=0; i<6; ++i) { if (i == 1) { if (Params.Stencilbuffer) { os::Printer::log("Cannot create a GL device with stencil buffer, disabling stencil shadows.", ELL_WARNING); Params.Stencilbuffer = false; pfd.cStencilBits = 0; } else continue; } else if (i == 2) { pfd.cDepthBits = 24; } else if (i == 3) { if (Params.Bits!=16) pfd.cDepthBits = 16; else continue; } else if (i == 4) { // try single buffer if (Params.Doublebuffer) pfd.dwFlags &= ~PFD_DOUBLEBUFFER; else continue; } else if (i == 5) { os::Printer::log("Cannot create a GL device context", "No suitable format for temporary window.", ELL_ERROR); ReleaseDC(temporary_wnd, HDc); DestroyWindow(temporary_wnd); UnregisterClass(ClassName, lhInstance); return false; } // choose pixelformat PixelFormat = ChoosePixelFormat(HDc, &pfd); if (PixelFormat) break; } SetPixelFormat(HDc, PixelFormat, &pfd); os::Printer::log("Temporary context"); HGLRC hrc=wglCreateContext(HDc); if (!hrc) { os::Printer::log("Cannot create a temporary GL rendering context.", ELL_ERROR); ReleaseDC(temporary_wnd, HDc); DestroyWindow(temporary_wnd); UnregisterClass(ClassName, lhInstance); return false; } CurrentContext.OpenGLWin32.HDc = HDc; CurrentContext.OpenGLWin32.HRc = hrc; CurrentContext.OpenGLWin32.HWnd = temporary_wnd; if (!activateContext(CurrentContext)) { os::Printer::log("Cannot activate a temporary GL rendering context.", ELL_ERROR); wglDeleteContext(hrc); ReleaseDC(temporary_wnd, HDc); DestroyWindow(temporary_wnd); UnregisterClass(ClassName, lhInstance); return false; } core::stringc wglExtensions; #ifdef WGL_ARB_extensions_string PFNWGLGETEXTENSIONSSTRINGARBPROC irrGetExtensionsString = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); if (irrGetExtensionsString) wglExtensions = irrGetExtensionsString(HDc); #elif defined(WGL_EXT_extensions_string) PFNWGLGETEXTENSIONSSTRINGEXTPROC irrGetExtensionsString = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)wglGetProcAddress("wglGetExtensionsStringEXT"); if (irrGetExtensionsString) wglExtensions = irrGetExtensionsString(HDc); #endif const bool pixel_format_supported = (wglExtensions.find("WGL_ARB_pixel_format") != -1); const bool multi_sample_supported = ((wglExtensions.find("WGL_ARB_multisample") != -1) || (wglExtensions.find("WGL_EXT_multisample") != -1) || (wglExtensions.find("WGL_3DFX_multisample") != -1) ); #ifdef _DEBUG os::Printer::log("WGL_extensions", wglExtensions); #endif #ifdef WGL_ARB_pixel_format PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormat_ARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB"); if (pixel_format_supported && wglChoosePixelFormat_ARB) { // This value determines the number of samples used for antialiasing // My experience is that 8 does not show a big // improvement over 4, but 4 shows a big improvement // over 2. if (Params.AntiAlias > 32) Params.AntiAlias = 32; f32 fAttributes[] = {0.0, 0.0}; s32 iAttributes[] = { WGL_DRAW_TO_WINDOW_ARB,1, WGL_SUPPORT_OPENGL_ARB,1, WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB, WGL_COLOR_BITS_ARB,(Params.Bits==32) ? 24 : 15, WGL_ALPHA_BITS_ARB,(Params.Bits==32) ? 8 : 1, WGL_DEPTH_BITS_ARB,Params.ZBufferBits, // 10,11 WGL_STENCIL_BITS_ARB,Params.Stencilbuffer ? 1 : 0, WGL_DOUBLE_BUFFER_ARB,Params.Doublebuffer ? 1 : 0, WGL_STEREO_ARB,Params.Stereobuffer ? 1 : 0, WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, #ifdef WGL_ARB_multisample WGL_SAMPLES_ARB,Params.AntiAlias, // 20,21 WGL_SAMPLE_BUFFERS_ARB, 1, #elif defined(WGL_EXT_multisample) WGL_SAMPLES_EXT,AntiAlias, // 20,21 WGL_SAMPLE_BUFFERS_EXT, 1, #elif defined(WGL_3DFX_multisample) WGL_SAMPLES_3DFX,AntiAlias, // 20,21 WGL_SAMPLE_BUFFERS_3DFX, 1, #endif #ifdef WGL_ARB_framebuffer_sRGB WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, Params.HandleSRGB ? 1:0, #elif defined(WGL_EXT_framebuffer_sRGB) WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT, Params.HandleSRGB ? 1:0, #endif // WGL_DEPTH_FLOAT_EXT, 1, 0,0,0,0 }; int iAttrSize = sizeof(iAttributes)/sizeof(int); const bool framebuffer_srgb_supported = ((wglExtensions.find("WGL_ARB_framebuffer_sRGB") != -1) || (wglExtensions.find("WGL_EXT_framebuffer_sRGB") != -1)); if (!framebuffer_srgb_supported) { memmove(&iAttributes[24],&iAttributes[26],sizeof(int)*(iAttrSize-26)); iAttrSize -= 2; } if (!multi_sample_supported) { memmove(&iAttributes[20],&iAttributes[24],sizeof(int)*(iAttrSize-24)); iAttrSize -= 4; } s32 rv=0; // Try to get an acceptable pixel format do { int pixelFormat=0; UINT numFormats=0; const BOOL valid = wglChoosePixelFormat_ARB(HDc,iAttributes,fAttributes,1,&pixelFormat,&numFormats); if (valid && numFormats) rv = pixelFormat; else iAttributes[21] -= 1; } while(rv==0 && iAttributes[21]>1); if (rv) { PixelFormat=rv; Params.AntiAlias=iAttributes[21]; } } else #endif Params.AntiAlias=0; // this only terminates the temporary HRc destroyContext(); destroySurface(); terminate(); DestroyWindow(temporary_wnd); UnregisterClass(ClassName, lhInstance); // now get new window CurrentContext.OpenGLWin32.HWnd=videodata.OpenGLWin32.HWnd; // get hdc if (!(CurrentContext.OpenGLWin32.HDc=GetDC((HWND)videodata.OpenGLWin32.HWnd))) { os::Printer::log("Cannot create a GL device context.", ELL_ERROR); return false; } if (!PrimaryContext.OpenGLWin32.HWnd) { PrimaryContext.OpenGLWin32.HWnd=CurrentContext.OpenGLWin32.HWnd; PrimaryContext.OpenGLWin32.HDc=CurrentContext.OpenGLWin32.HDc; } return true; }
BackgroundPlugin::~BackgroundPlugin() { setContext(NULL); destroySurface(); }