OpenGL ES 2.0在SGX540 OpenGL Offscreen PIXMAP支持上

时间:2016-05-10 18:28:17

标签: opengl-es opengl-es-2.0 omap powervr-sgx

在配备Imagination Technologies PowerVR SGX 530的DM370(TI OMAP 3)上,我能够使用以下代码使用CMEM和PIXMAP屏幕外表面初始化我的EglSurface:

// 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 GPU,我使用OpenGL库cmemk.ko和pvrsrvctl构建并部署了处理器SDK。我可以成功运行PVR OpenGL演示,它们会显示在显示屏上。我正在尝试在这个新的EVM上运行我的应用程序,它总是失败:

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

如果我删除了pi32ConfigAttribs中的EGL_PIXMAP_BIT,那么它会更进一步。

AM57xx OpenGL库是否不支持PIXMAP曲面?如果他们这样做,我怎么能让他们工作?谢谢!

1 个答案:

答案 0 :(得分:1)

您不应该使用EGL_PIXMAP_BIT。它要求EGL以与OS的窗口系统直接兼容的格式提供表面,以进行屏幕外图像传输。请改用FBO。

请注意,pixmaps与像素缓冲区或(pbuffers)不同。

看起来您正在使用TI的嵌入式Linux发行版,因此pixmaps必须与Qt,DirectFB或X11等兼容。 TI从未为OMAP提供过针对特定窗口系统的屏幕外图像进行良好集成的EGL驱动程序。 EGL_PIXMAP_BIT过去可能已经使用某些特定的窗口系统,但不一定是您正在使用的窗口系统。本文更详细地解释了OpenGL ES的各种类型的屏幕外图像之间的差异:

Render to Texture with OpenGL ES