OpenGL ES 2.0 на SGX540 Поддержка OpenGL Offscreen PIXMAP

На DM370 (TI OMAP 3) с Imagination Technologies PowerVR SGX 530 я смог использовать следующий код для инициализации моего EglSurface с использованием внеэкранных поверхностей CMEM и PIXMAP:

// Index to bind the attributes to vertex shaders
#define VERTEX_ARRAY 0
#define TEXCOORD_ARRAY 1

// Bit types
#define SGXPERF_RGB565 0
#define SGXPERF_ARGB8888 2

// SurfaceTypes
#define SGXPERF_SURFACE_TYPE_WINDOW 0
#define SGXPERF_SURFACE_TYPE_PIXMAP_16 1
#define SGXPERF_SURFACE_TYPE_PIXMAP_32 2

typedef struct _NATIVE_PIXMAP_STRUCT
{
    long pixelFormat;
    long rotation;
    long width;
    long height;
    long stride;
    long sizeInBytes;
    long pvAddress;
    long lAddress;
} NATIVE_PIXMAP_STRUCT;


// Init EGL with offscreen PIXMAP support
void* GLWidget::commonEglInit(int surfaceType, NATIVE_PIXMAP_STRUCT** pNativePixmapPtr) {

    int windowWidthTi, windowHeightTi;

    EGLint iMajorVersion, iMinorVersion;
    EGLint ai32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
    eglDisplay = eglGetDisplay((int)0);

    if (!eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion))
        return NULL;

    if ( !eglBindAPI(EGL_OPENGL_ES_API) ) {
        return NULL;
    }

    EGLint pi32ConfigAttribs[5];
    pi32ConfigAttribs[0] = EGL_SURFACE_TYPE;
    pi32ConfigAttribs[1] = EGL_WINDOW_BIT | EGL_PIXMAP_BIT;
    pi32ConfigAttribs[2] = EGL_RENDERABLE_TYPE;
    pi32ConfigAttribs[3] = EGL_OPENGL_ES2_BIT;
    pi32ConfigAttribs[4] = EGL_NONE;

    int iConfigs;
    if (!eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs) || (iConfigs != 1))
    {
        fprintf(stderr,"Error: eglChooseConfig() failed.\n");
        return NULL;
    }

    commonCreateNativePixmap(SGXPERF_ARGB8888,WIDTH, HEIGHT, pNativePixmapPtr);
    eglSurface = eglCreatePixmapSurface(eglDisplay, eglConfig, *pNativePixmapPtr, NULL);

    if (!fprintf(stderr,"eglCreateSurface\n"))
        return NULL;

    eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, ai32ContextAttribs);
    if (!fprintf(stderr,"eglCreateContext\n"))
        return NULL;

    eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
    if (!fprintf(stderr,"eglMakeCurrent\n"))
        return NULL;

    EGLBoolean success = eglSwapInterval(eglDisplay, 1);
    if ( !success ) {
        fprintf(stderr,"eglSwapInterval\n");
        sleep(3600);
        return NULL;
    }

    eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &windowWidthTi);
    eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &windowHeightTi);

    fprintf(stderr,"Window width=%d, Height=%d\n", windowWidthTi, windowHeightTi);

    (void*)(*pNativePixmapPtr)->lAddress;

    return (void*)(*pNativePixmapPtr)->lAddress;
}

На OMAP 5 / Sitara — AM57xx EVM с графическим процессором SGX 540 я собрал и развернул процессор SDK с библиотеками OpenGL, cmemk.ko и pvrsrvctl. Я могу успешно запустить демонстрации PVR OpenGL, и они отображаются на дисплее. Я пытаюсь запустить свое приложение на этой новой EVM, и оно всегда терпит неудачу:

Error: eglChooseConfig() failed.
Error creating EGL surface!

Если я удалю EGL_PIXMAP_BIT в pi32ConfigAttribs, то дело пойдет дальше.

Поддерживают ли библиотеки AM57xx OpenGL поверхности PIXMAP? Если да, то как я могу заставить их работать? Спасибо!


person PhilBot    schedule 10.05.2016    source источник


Ответы (1)


Вы не должны использовать EGL_PIXMAP_BIT. Это требует, чтобы EGL предоставлял поверхности в формате, который напрямую совместим с оконной системой ОС для передачи изображений за пределы экрана. Вместо этого используйте для этого FBO.

Обратите внимание, что растровые изображения — это не то же самое, что пиксельные буферы или (pbuffers).

Похоже, вы используете встроенный дистрибутив Linux от TI, поэтому растровые изображения должны быть совместимы с чем-то вроде Qt, DirectFB или X11. TI никогда не предоставляла драйверы EGL для OMAP, которые были бы настолько хорошо интегрированы для внеэкранных изображений конкретной оконной системы. EGL_PIXMAP_BIT, возможно, работал в прошлом с какой-то конкретной оконной системой, но не обязательно с той, которую вы используете. В этой статье более подробно объясняются различия между различными типами закадровых изображений для OpenGL ES:

Визуализация в текстуру с помощью OpenGL ES

person ClayMontgomery    schedule 12.05.2016