为什么eglCreateImageKHR返回EGL_NO_IMAGE_KHR(在android上)?

时间:2013-06-24 06:37:10

标签: android opengl-es egl

我需要在一个线程中创建一个纹理并在另一个线程中使用它。 我尝试过使用共享上下文,但似乎没有共享纹理。 我尝试使用eglCreateImageKHR this sample(由Wiktor发布的代码)

eglCreateImageKHR正在返回EGL_NO_IMAGE_KHR

在使用扩展程序时,我必须定义#define EGL_EGLEXT_PROTOTYPES和 在包含eglext.h和gl2ext.h之前#define GL_GLEXT_PROTOTYPES来获取要编译的代码。这是错的吗?这些是否应该在其他标题中定义?

如果有帮助,这是我创建纹理的线程的代码。 我认为我做错了是将OpenGL返回的纹理句柄传递给eglCreateImageKHR并将其转换为EGLClientBuffer。 (另外我不知道reinterpret_cast做了什么,只是从样本中复制了它。但是这个部分的样本不是很清楚。)

  GLuint framebuffer;
    GLuint depthRenderbuffer;
    GLuint texture;
    GLint texWidth = 256, texHeight = 256;



    const EGLint attribs[] = {
        EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
        EGL_RED_SIZE, 8,
        EGL_GREEN_SIZE, 8,
        EGL_BLUE_SIZE, 8,
        EGL_ALPHA_SIZE, 8,
        EGL_DEPTH_SIZE, 8,
        EGL_STENCIL_SIZE, 0,
        EGL_NONE
    };

    const EGLint pbuf_attribs[] = {
                    EGL_WIDTH, 512,
                    EGL_HEIGHT, 512,
                    EGL_NONE};

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

    if ((display = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY) {
        LOG_ERROR("Tex eglGetDisplay() returned error %d", eglGetError());
        return false;
    }

    if (!eglChooseConfig(display, attribs, &config, 1, &numConfigs)) {
        LOG_ERROR("eglChooseConfig() returned error %d", eglGetError());
        destroy();
        return false;
    }

    if (!(context = eglCreateContext(display, config, 0, contextAttribs))) {
        LOG_ERROR("Tex eglCreateContext() returned error %d", eglGetError());
        destroy();
        return false;
    }

    if (!(psurface = eglCreatePbufferSurface(display, config, pbuf_attribs))) {
        LOG_ERROR("Tex eglCreatePbufferSurface() returned error %d", eglGetError());
        destroy();
        return false;
    }

    LOGI("About to make current. Display %p surface %p context %p",display, psurface, context);
    if (!eglMakeCurrent(display, psurface, psurface, context)) {
        LOG_ERROR("Tex eglMakeCurrent() returned error %d", eglGetError());
        destroy();
        return false;
    }
    checkGlError("make current");

    glGenFramebuffers(1, &framebuffer);
    glGenRenderbuffers(1, &depthRenderbuffer);
    glGenTextures(1, &texture);

    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texWidth, texHeight,
    0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL);


    glBindTexture(GL_TEXTURE_2D, 0); //FIXME Should this be here?? Tried with and without
    EGLint imageAttributes[] = { EGL_GL_TEXTURE_LEVEL_KHR, 0,
            EGL_IMAGE_PRESERVED_KHR, EGL_FALSE, EGL_NONE };

    LOGI("Before CreateImage display %p context %p texture %d",display, context, texture);

    _eglImage = eglCreateImageKHR(display, context,
            EGL_GL_TEXTURE_2D_KHR, reinterpret_cast<EGLClientBuffer>(texture),
            0);

    if(_eglImage == EGL_NO_IMAGE_KHR){
        LOGE("eglCreateImageKHR failed");
    }

0 个答案:

没有答案