2017-09-06 13 views
4

XGL과 OpenGL에서 EGL을 사용합니다. 내가 창문 위에서 똑바로 그림을 그리는 동안 모든 것이 좋았다. 이제는 pixmap을 EGL 표면으로 사용하려하지만 OpenGL은 전혀 변경하지 않습니다.EGL 픽스맵 표면이 작동하지 않습니다.

OpenGL을 사용하여 배경을 청색으로 청소합니다. 여기에 내가 대신 무엇을 얻을 :

Trash

여기에 문제 (이 쓰레기를 그리기) demonstaiting 최소한의 예입니다.

업데이트 : 오류 검사를 추가 eglCopyBuffersEGL_BAD_NATIVE_PIXMAP을 생산하는 것을 찾을 수 있습니다. Docs은 구현이 네이티브 픽스맵을 지원하지 않거나 네이티브 pixmap 인수가 유효하지 않은 경우에 발생할 수 있다고 설명합니다. 그들은 둘 다있을 것 같지 않습니다. 오류없이 픽스 surface 표면을 생성 할 수 있다면 구현이 고유 픽스맵을 지원한다고 생각합니다. XFillRectangle과 같은 원시 메소드를 사용하여 pixmap을 그릴 수 있다면 pixmap이 유효하다고 생각합니다.

업데이트 : 우분투 그놈의 랩톱에이를 실행하고 있습니다. 인텔 HD 그래픽 5500 (드라이버 = i915)과 엔비디아 지포스 920m (드라이버 = 엔비디아)의 두 가지 비디오 카드가 있습니다. es2_info 출력에서 ​​메인 라인 (full version) :

EGL_VERSION: 1.4 
EGL_VENDOR: NVIDIA 
EGL_CLIENT_APIS: OpenGL_ES OpenGL 
GL_VERSION: OpenGL ES 3.2 NVIDIA 375.66 
GL_RENDERER: GeForce 920M/PCIe/SSE2 

코드 :

// main.c 
// cc main.c -lX11 -lEGL -lGL 
#include <stdio.h> 
#include <stdarg.h> 
#include <stdlib.h> 
#include <GL/gl.h> 
#include <EGL/egl.h> 
#include <X11/Xlib.h> 

void 
die(const char * errstr, ...) { 
    va_list ap; 
    va_start(ap, errstr); 
    vfprintf(stderr, errstr, ap); 
    va_end(ap); 
    exit(1); 
} 

int main() { 
    Display * display = XOpenDisplay(NULL); 
    if (!display) die("Can't create xlib display.\n"); 
    int screen = XDefaultScreen(display); 
    GC gc = XDefaultGC(display, screen); 
    Window root_window = XRootWindow(display, screen); 
    unsigned long black_pixel = XBlackPixel(display, screen); 
    unsigned long white_pixel = XWhitePixel(display, screen); 
    Window window = XCreateSimpleWindow(display, root_window, 0, 0, 640, 480, 
     0, black_pixel, white_pixel); 
    if (!window) die("Can't create window.\n"); 
    int res = XSelectInput(display, window, ExposureMask); 
    if (!res) die("XSelectInput failed.\n"); 
    Pixmap pixmap = XCreatePixmap(display, window, 400, 400, 24); 
    if (!pixmap) die("Can't create pixmap.\n"); 
    EGLDisplay egldisplay = eglGetDisplay(display); 
    if (EGL_NO_DISPLAY == egldisplay) die("Can't cate egl display.\n"); 
    res = eglInitialize(egldisplay, NULL, NULL); 
    if (!res) die("eglInitialize failed.\n"); 
    EGLConfig config; 
    int num_configs; 
    static int attrib_list[] = { 
     EGL_RED_SIZE,   8, 
     EGL_GREEN_SIZE,   8, 
     EGL_BLUE_SIZE,   8, 
     EGL_ALPHA_SIZE,   0, 
     EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, 
     EGL_SURFACE_TYPE,  EGL_PIXMAP_BIT, 
     EGL_NONE 
    }; 
    res = eglChooseConfig(egldisplay, attrib_list, &config, 1, &num_configs); 
    if (!res) die("eglChooseConfig failed.\n"); 
    if (0 == num_configs) die("No appropriate egl config found.\n"); 
    EGLSurface surface = 
     eglCreatePixmapSurface(egldisplay, config, pixmap, NULL); 
    if (EGL_NO_SURFACE == surface) die("Can't create egl pixmap surface.\n"); 
    res = eglBindAPI(EGL_OPENGL_API); 
    if (!res) die("eglBindApi failed.\n"); 
    EGLContext context = 
     eglCreateContext(egldisplay, config, EGL_NO_CONTEXT, NULL); 
    if (EGL_NO_CONTEXT == config) die("Can't create egl context.\n"); 
    res = eglMakeCurrent(egldisplay, surface, surface, context); 
    if (!res) die("eglMakeCurrent failed.\n"); 
    res = XMapWindow(display, window); 
    if (!res) die("XMapWindow failed.\n"); 
    while (1) { 
     XEvent event; 
     res = XNextEvent(display, &event); 
     if (Expose != event.type) continue; 
     glClearColor(0, 0, 1, 1); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glFinish(); 
     res = eglWaitGL(); 
     if (!res) die("eglWaitGL failed.\n"); 
     res = XCopyArea(display, pixmap, window, gc, 0, 0, 400, 400, 0, 0); 
     if (!res) die("XCopyArea failed.\n"); 
    } 
} 
+0

당신은'eglCreatePixmapSurface은()''EGL_NO_SURFACE' 반환되지 않았는지 확인 했습니까? '사촌 그게 내 데비안 안정 기계에서 돌아오고있어. 은'attrib_list' 속성 – genpfault

+0

중에 유효 eglCreatePixmapSurface 없다 '()'[워드 프로세서]에 따라 (https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglCreatePixmapSurface.xhtml). – genpfault

+0

[This] (https://github.com/i-rinat/freshplayerplugin/blob/master/tests/util_egl_pixmap.c)는 내 시스템에서 작동합니다. – genpfault

답변

0

eglBindApi(EGL_OPENGL_API) 문제의 근원 밝혀졌습니다. 하나를 삭제하면 예상대로 파란색 사각형이 나타납니다. 기본 EGL으로

는 API를 렌더링으로는 OpenGL ES를 사용하고 그것은 단순히 OpenGL은이 API를 렌더링 작동하지 않습니다. OpenGL 렌더링 API에서 EGL을 사용하는 코드의 단일 예제를 찾을 수 없지만 this 대답을 발견했습니다. 이것은 eglBindApi(EGL_OPENGL_API)docs "EGL 구현에서 지정된 클라이언트 API를 지원하지 않는 경우"로 반품해야하는 EGL_BAD_PARAMETER을 리턴하지 않더라도 EGL이 OpenGL과 작동하지 않아야한다고 생각합니다. API를 렌더링하는 코드는 여전히 알 수없는 고장으로 실제 이유는 왜 OpenGL을 설정하기 때문에

그래서 내가 대답으로이 동의하지 않습니다.