TextureView не может получить контекст для EGL3 для эмулятора - PullRequest
0 голосов
/ 11 октября 2018

У меня возникают проблемы при попытке инициализации EGLContext только на эмуляторах Android.

По странной причине, когда я пытаюсь получить конфигурацию EGL3, она ничего не находит ...

Я использую логику:

EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)
EGLConfig config = getConfig(flags, 3);
if (config != null) {
    int[] attrib3_list = {
            EGL14.EGL_CONTEXT_CLIENT_VERSION, 3,
            EGL14.EGL_NONE
    };
    EGLContext context = EGL14.eglCreateContext(mEGLDisplay, config, sharedContext,
            attrib3_list, 0);


    if (EGL14.eglGetError() == EGL14.EGL_SUCCESS) {
        //Log.d(TAG, "Got GLES 3 config");
        mEGLConfig = config;
        mEGLContext = context;
        mGlVersion = 3;
    }
}

А вот метод getConfig

/**
 * Finds a suitable EGLConfig.
 *
 * @param flags Bit flags from constructor.
 * @param version Must be 2 or 3.
 */
private EGLConfig getConfig(int flags, int version) {
    int renderableType = EGL14.EGL_OPENGL_ES2_BIT;
    if (version >= 3) {
        renderableType |= EGLExt.EGL_OPENGL_ES3_BIT_KHR;
    }

    // The actual surface is generally RGBA or RGBX, so situationally omitting alpha
    // doesn't really help.  It can also lead to a huge performance hit on glReadPixels()
    // when reading into a GL_RGBA buffer.
    int[] attribList = {
            EGL14.EGL_RED_SIZE, 8,
            EGL14.EGL_GREEN_SIZE, 8,
            EGL14.EGL_BLUE_SIZE, 8,
            EGL14.EGL_ALPHA_SIZE, 8,
            EGL14.EGL_SAMPLES, 4,
            //EGL14.EGL_DEPTH_SIZE, 16,
            //EGL14.EGL_STENCIL_SIZE, 8,
            EGL14.EGL_RENDERABLE_TYPE, renderableType,
            EGL14.EGL_NONE, 0,      // placeholder for recordable [@-3]
            EGL14.EGL_NONE
    };
    if ((flags & FLAG_RECORDABLE) != 0) {
        attribList[attribList.length - 3] = EGL_RECORDABLE_ANDROID;
        attribList[attribList.length - 2] = 1;
    }
    EGLConfig[] configs = new EGLConfig[1];
    int[] numConfigs = new int[1];
    if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
            numConfigs, 0)) {
        Log.w(TAG, "unable to find RGB8888 / " + version + " EGLConfig");
        return null;
    }
    return configs[0];
}

Эмулятор, он уже совместим с EGL3;так как я получаю следующий журнал: D/EGL_emulation: eglMakeCurrent: 0xe7205360: ver 3 0 (tinfo 0xe72031f0)

У меня нет идей ...

1 Ответ

0 голосов
/ 11 октября 2018

Наконец-то!Я смог получить действительную конфигурацию.Таким образом, проблема была дана следующим if

if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
        numConfigs, 0)) {
    Log.w(TAG, "unable to find RGB8888 / " + version + " EGLConfig");
    return null;
}

Только на эмуляторах eglChooseConfig всегда будет возвращать false, даже если он нашел действительную конфигурацию ...

Итак, я закончилсо следующей логикой:

EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
        numConfigs, 0);
if (EGL14.eglGetError() != EGL14.EGL_SUCCESS) {
    Log.w(TAG, "unable to find RGB8888 / " + version + " EGLConfig " + EGL14.eglGetError());
    return null;
}

Я знаю, что это что-то вроде хака, но пока "это работает"

...