0

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;
}

SGX 540 GPU を搭載した OMAP 5 / Sitara - AM57xx EVM で、OpenGL ライブラリ、cmemk.ko、および pvrsrvctl を使用してプロセッサ SDK をビルドおよびデプロイしました。PVR OpenGL デモを正常に実行でき、ディスプレイに表示されます。この新しい EVM でアプリケーションを実行しようとしていますが、常に次のエラーで失敗します。

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

pi32ConfigAttribs の EGL_PIXMAP_BIT を削除すると、それがさらに進みます。

AM57xx OpenGL ライブラリは PIXMAP サーフェスをサポートしていませんか? もしそうなら、どうすれば彼らを働かせることができますか? ありがとう!

4

1 に答える 1

1

EGL_PIXMAP_BIT を使用しないでください。オフスクリーン イメージ転送用の OS のウィンドウ システムと直接互換性のある形式でサーフェスを提供するには、EGL が必要です。代わりに FBO を使用してください。

ピックスマップは、ピクセル バッファーまたは (pbuffers) と同じではないことに注意してください。

TI の組み込み Linux ディストリビューションを使用しているように見えるため、ピックスマップは Qt、DirectFB、X11 などと互換性がある必要があります。TI は、特定のウィンドウ システムのオフスクリーン イメージに十分に統合された OMAP 用の EGL ドライバを提供したことがありません。EGL_PIXMAP_BIT は、過去に特定のウィンドウ システムで動作していた可能性がありますが、使用しているシステムとは必ずしも一致しませんでした。この記事では、OpenGL ES のさまざまなタイプのオフスクリーン イメージの違いについて詳しく説明します。

OpenGL ES を使用してテクスチャにレンダリングする

于 2016-05-12T22:14:48.020 に答える