Пример #1
0
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;
}