4

私は EGL/GLES 2.0 コードを持っています。これを Linux (Mesa 経由) と Android (iOS が来る予定) で実行しようとしています。Linux では問題なく動作し、期待どおりにレンダリングされます。Android (電話、タブレット、エミュレーター - すべて 4.01) で実行すると、正常に動作しますが、何も表示されません (画面は黒いままです)。コードは 3 つすべてで 99% 同じですが、Android 用の特別な処理がいくつかあります。私のEGL属性に従ってください:

EGLint attribList[] =
{
    EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
    EGL_RED_SIZE,       8,
    EGL_GREEN_SIZE,     8,
    EGL_BLUE_SIZE,      8,
    //EGL_ALPHA_SIZE,     (flags & ES_WINDOW_ALPHA) ? 8 : EGL_DONT_CARE,
    //EGL_DEPTH_SIZE,     (flags & ES_WINDOW_DEPTH) ? 8 : EGL_DONT_CARE,
    //EGL_STENCIL_SIZE,   (flags & ES_WINDOW_STENCIL) ? 8 : EGL_DONT_CARE,
    EGL_SAMPLE_BUFFERS, (flags & ES_WINDOW_MULTISAMPLE) ? 1 : 0,
    // For Android this is extremely important - eglCreateContext will fail without it
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_NONE, EGL_NONE
};

EGL 作成コードに従います。

EGLint numConfigs;
EGLint majorVersion;
EGLint minorVersion;
EGLDisplay display;
EGLContext context;
EGLSurface surface;
EGLConfig config;
EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE };

// Get Display
display = eglGetDisplay((EGLNativeDisplayType)x_display);
if ( display == EGL_NO_DISPLAY )
{
  esLogMessage("eglGetDisplay failed %d\n", eglGetError());
   return EGL_FALSE;
}

// Initialize EGL
if ( !eglInitialize(display, &majorVersion, &minorVersion) )
{
  esLogMessage("eglInitialize failed %d\n", eglGetError());
   return EGL_FALSE;
}

static const size_t CONFIG_COUNT = 128;
EGLConfig configs[CONFIG_COUNT];

// Get configs
if ( !eglGetConfigs(display, configs, CONFIG_COUNT, &numConfigs) )
{
  esLogMessage("eglGetConfigs failed %d\n", eglGetError());
   return EGL_FALSE;
}
else if( numConfigs == 0 )
{
   esLogMessage("eglGetConfigs found no configs for the display\n");
   return EGL_FALSE;
}

EGLint chosenConfigCount = 0;
// Choose config
if ( !eglChooseConfig(display, attribList, &config, 1, &chosenConfigCount) )
{
  esLogMessage("eglChooseConfig failed %d\n", eglGetError());
   return EGL_FALSE;
}
else if( chosenConfigCount == 0 )
{
   esLogMessage("eglChooseConfig found no matching configs (%d available)\n", numConfigs);
   return EGL_FALSE;
}

EGLint format;
/* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
 * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
 * As soon as we picked a EGLConfig, we can safely reconfigure the
 * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
if( !eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format) )
{
   esLogMessage("eglGetConfigAttrib failed %d\n", eglGetError());
   return EGL_FALSE;
}

#ifdef ANDROID

if( ANativeWindow_setBuffersGeometry(hWnd, 0, 0, format) )
{
   esLogMessage("ANativeWindow_setBuffersGeometry failed\n");
   return EGL_FALSE;
}

#endif

// Create a surface
surface = eglCreateWindowSurface(display, config, (EGLNativeWindowType)hWnd, NULL);
if ( surface == EGL_NO_SURFACE )
{
   esLogMessage("eglCreateWindowSurface failed %d\n", eglGetError());
   return EGL_FALSE;
}

// Create a GL context
context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs );
if ( context == EGL_NO_CONTEXT )
{
   esLogMessage("eglCreateContext failed %d\n", eglGetError());
   return EGL_FALSE;
}   

// Make the context current
if ( !eglMakeCurrent(display, surface, surface, context) )
{
  esLogMessage("eglMakeCurrent failed %d\n", eglGetError());
   return EGL_FALSE;
}

誰かが光を当てることができますか、何をテストするか、または問題を見つける方法はありますか?

編集:

他のいくつかのバグを修正し、Android Emulator とHP タッチパッド(Cyanogenmod 9 alpha) で正常に動作するようになりましたが、Cyanogenmod 9を使用したSamsung Galaxy S1で黒い画面が表示されます*ため息*。

4

1 に答える 1