Intereting Posts
Android Market – консоль разработчика: включен маркетинг / отключен? Javax.net.ssl.SSLException: сертификат не доверенного сервера Как использовать анимацию для анимации Панель инструментов Android с кнопкой «домой» и «назад» Как проверить, является ли ответ от сервера JSONAobject или JSONArray? Создание основной операции, которая НЕ отображается в списке запуска Создание файла заголовка для класса активности android Нет ошибки «Только исходный поток, создавший иерархию представлений, может коснуться его представлений», когда представление обновляется без задержки Изменение ориентации экрана во время обезьяны Изменение цвета кнопки переполнения на ActionBar Начать распознавание речи через голос фразой типа «О'кей, Google»? Отладка / загрузка bluestacks из eclipse Почему AIDL / Messenger привязаны к службе? Android-анимация списка анимации Роль файла classes.dex в файле apk

Почему eglCreateImageKHR возвращает EGL_NO_IMAGE_KHR (на Android)?

Мне нужно создать текстуру в одном потоке и использовать ее в другом потоке. Я попытался использовать общий контекст, но текстура, похоже, не разделяется. Я попытался использовать eglCreateImageKHR используя этот образец (код, отправленный Wiktor)

eglCreateImageKHR возвращает EGL_NO_IMAGE_KHR .

Кроме того, при использовании расширений мне нужно было определить #define EGL_EGLEXT_PROTOTYPES и #define GL_GLEXT_PROTOTYPES прежде чем включать eglext.h и gl2ext.h, чтобы получить код для компиляции. Это неправильно? Должны ли они быть определены в каком-то другом заголовке?

Если это помогает, вот мой код для потока, который создает текстуру. Я думаю, что я делаю неправильно, передавая eglCreateImageKHR текстуры, возвращаемый 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"); }