void TopCanvas::CreateGLX(_XDisplay *_x_display, X11Window x_window, GLXFBConfig *fb_cfg) { x_display = _x_display; glx_context = glXCreateNewContext(_x_display, *fb_cfg, GLX_RGBA_TYPE, nullptr, true); if (glx_context == nullptr) { fprintf(stderr, "Failed to create GLX context\n"); exit(EXIT_FAILURE); } glx_window = glXCreateWindow(_x_display, *fb_cfg, x_window, nullptr); XSync(x_display, false); if (!glXMakeContextCurrent(_x_display, glx_window, glx_window, glx_context)) { fprintf(stderr, "Failed to attach GLX context to GLX window\n"); exit(EXIT_FAILURE); } unsigned int glx_width = -1, glx_height = -1; glXQueryDrawable(_x_display, glx_window, GLX_WIDTH, &glx_width); glXQueryDrawable(_x_display, glx_window, GLX_HEIGHT, &glx_height); if ((glx_width <= 0) || (glx_height <= 0)) { fprintf(stderr, "Failed to query GLX drawable size\n"); exit(EXIT_FAILURE); } const PixelSize effective_size = { glx_width, glx_height }; OpenGL::SetupContext(); OpenGL::SetupViewport(UnsignedPoint2D(effective_size.cx, effective_size.cy)); Canvas::Create(effective_size); }
void TopCanvas::SetupViewport(PixelSize native_size) { auto new_size = OpenGL::SetupViewport(UnsignedPoint2D(native_size.cx, native_size.cy)); Canvas::Create(PixelSize(new_size.x, new_size.y)); }
void TopCanvas::OnResize(PixelSize new_size) { if (new_size == size) return; OpenGL::SetupViewport(UnsignedPoint2D(new_size.cx, new_size.cy)); Canvas::Create(new_size); }
void TopCanvas::Resume() { #if defined(ANDROID) && defined(USE_EGL) surface = eglGetCurrentSurface(EGL_DRAW); #endif OpenGL::SetupContext(); OpenGL::SetupViewport(UnsignedPoint2D(size.cx, size.cy)); }
void TopCanvas::Create(PixelSize new_size, bool full_screen, bool resizable) { #ifdef USE_EGL display = eglGetDisplay(EGL_DEFAULT_DISPLAY); surface = eglGetCurrentSurface(EGL_DRAW); #endif OpenGL::SetupContext(); OpenGL::SetupViewport(UnsignedPoint2D(new_size.cx, new_size.cy)); Canvas::Create(new_size); }