XGL과 OpenGL에서 EGL을 사용합니다. 내가 창문 위에서 똑바로 그림을 그리는 동안 모든 것이 좋았다. 이제는 pixmap을 EGL 표면으로 사용하려하지만 OpenGL은 전혀 변경하지 않습니다.EGL 픽스맵 표면이 작동하지 않습니다.
OpenGL을 사용하여 배경을 청색으로 청소합니다. 여기에 내가 대신 무엇을 얻을 :
여기에 문제 (이 쓰레기를 그리기) demonstaiting 최소한의 예입니다.
업데이트 : 오류 검사를 추가 eglCopyBuffers
이 EGL_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");
}
}
당신은'eglCreatePixmapSurface은()''EGL_NO_SURFACE' 반환되지 않았는지 확인 했습니까? '사촌 그게 내 데비안 안정 기계에서 돌아오고있어. 은'attrib_list' 속성 – genpfault
중에 유효 eglCreatePixmapSurface 없다 '()'[워드 프로세서]에 따라 (https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglCreatePixmapSurface.xhtml). – genpfault
[This] (https://github.com/i-rinat/freshplayerplugin/blob/master/tests/util_egl_pixmap.c)는 내 시스템에서 작동합니다. – genpfault