static void create_window (GstMirSink * sink, struct display *display, int width, int height) { struct window *window; /* No need to create a window a second time */ if (sink->window) return; g_mutex_lock (&sink->mir_lock); window = malloc (sizeof *window); window->display = display; window->width = width; window->height = height; window->properties = ua_ui_window_properties_new_for_normal_window (); ua_ui_window_properties_set_titlen (window->properties, "MirSinkWindow", 13); ua_ui_window_properties_set_role (window->properties, 1); ua_ui_window_properties_set_input_cb_and_ctx (window->properties, NULL, NULL); GST_DEBUG ("Creating new UA window"); window->window = ua_ui_window_new_for_application_with_properties (sink->session-> app_instance, window->properties); GST_DEBUG ("Setting window geometry"); window->width = window->display->width; window->height = window->display->height; GST_DEBUG_OBJECT (sink, "width: %d, height: %d", window->width, window->height); if (height != 0 || width != 0) ua_ui_window_resize (window->window, window->width, window->height); window->egl_native_window = ua_ui_window_get_native_type (window->window); sink->window = window; g_mutex_unlock (&sink->mir_lock); }
View::View(UAUiWindow* surface) : surface(surface), rotation_angle(0.f), num_vertex(3) { // assert(eglBindAPI(EGL_OPENGL_ES_API) == EGL_TRUE); egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); assert(egl_display != EGL_NO_DISPLAY); EGLint major, minor; if (EGL_FALSE == eglInitialize(egl_display, &major, &minor)) { printf("egl error: problem initializing.\n"); exit(1); } EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE }; EGLint n; if (EGL_FALSE == eglChooseConfig( egl_display, attribs, &egl_config, 1, &n)) { printf("egl error: Cannot choose configuration.\n"); } EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; egl_context = eglCreateContext( egl_display, egl_config, EGL_NO_CONTEXT, context_attribs); assert(EGL_NO_CONTEXT != egl_context); EGLNativeWindowType nativeWindow = ua_ui_window_get_native_type(surface); egl_surface = eglCreateWindowSurface(egl_display, egl_config, nativeWindow, NULL); eglMakeCurrent( egl_display, egl_surface, egl_surface, egl_context); vertex_data = triangle(); color_data = color_triangle(); gProgram = create_program(vertex_shader(), fragment_shader()); if (!gProgram) { printf("error making program\n"); return; } gvPositionHandle = glGetAttribLocation(gProgram, "vPosition"); gvColorHandle = glGetAttribLocation(gProgram, "vColor"); rotation_uniform = glGetUniformLocation(gProgram, "angle"); return; }