void EGLInteropResource::releaseEGL() { if (egl->surface != EGL_NO_SURFACE) { eglReleaseTexImage(egl->dpy, egl->surface, EGL_BACK_BUFFER); eglDestroySurface(egl->dpy, egl->surface); egl->surface = EGL_NO_SURFACE; } }
void QGLPixelBuffer::releaseFromDynamicTexture() { #if QGL_RENDER_TEXTURE Q_D(QGLPixelBuffer); if (d->invalid || d->textureFormat == EGL_NONE || !d->ctx) return; eglReleaseTexImage(d->ctx->display(), d->ctx->surface(), EGL_BACK_BUFFER); #endif }
/* EGLBoolean eglReleaseTexImage ( EGLDisplay dpy, EGLSurface surface, EGLint buffer ) */ static jboolean android_eglReleaseTexImage (JNIEnv *_env, jobject _this, jobject dpy, jobject surface, jint buffer) { EGLBoolean _returnValue = (EGLBoolean) 0; EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); EGLSurface surface_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, surface); _returnValue = eglReleaseTexImage( (EGLDisplay)dpy_native, (EGLSurface)surface_native, (EGLint)buffer ); return (jboolean)_returnValue; }
void QGLContextPrivate::unbindPixmapFromTexture(QPixmapData* pmd) { Q_ASSERT(pmd->classId() == QPixmapData::X11Class); QX11PixmapData *pixmapData = static_cast<QX11PixmapData*>(pmd); if (pixmapData->gl_surface) { EGLBoolean success; success = eglReleaseTexImage(QEgl::display(), (EGLSurface)pixmapData->gl_surface, EGL_BACK_BUFFER); if (success == EGL_FALSE) { qWarning() << "unbindPixmapFromTexture() - Unable to release bound texture: " << QEgl::errorString(); } } }
/* private native int _eglReleaseTexImage ( int display , int surface , int buffer ) ; */ KNIEXPORT KNI_RETURNTYPE_INT Java_javax_microedition_khronos_egl_EGL10Impl__1eglReleaseTexImage() { jint display = KNI_GetParameterAsInt(1); jint surface = KNI_GetParameterAsInt(2); jint buffer = KNI_GetParameterAsInt(3); jint returnValue = (jint)eglReleaseTexImage((EGLDisplay)display, (EGLSurface)surface, (EGLint)buffer); #ifdef DEBUG printf("eglReleaseTexImage(0x%x, 0x%x, %d) = %d\n", display, surface, buffer, returnValue); #endif KNI_ReturnInt(returnValue); }
bool EGLTextureFromPixmap::reBindTexImage() { if (m_surface != EGL_NO_SURFACE) { bool success = eglReleaseTexImage(EGLHelper::eglDisplay(), m_surface, EGL_BACK_BUFFER); if (success) success = eglBindTexImage(EGLHelper::eglDisplay(), m_surface, EGL_BACK_BUFFER); return success; } if (m_eglImage) { EGLHelper::imageTargetTexture2DOES(m_eglImage); return true; } return false; }
void EGLTextureFromPixmap::destroy() { eglWaitNative(EGL_CORE_NATIVE_ENGINE); if (m_surface != EGL_NO_SURFACE) eglReleaseTexImage(EGLHelper::eglDisplay(), m_surface, EGL_BACK_BUFFER); if (m_eglImage) { EGLHelper::destroyEGLImage(m_eglImage); m_eglImage = 0; } if (m_surface != EGL_NO_SURFACE) { eglDestroySurface(EGLHelper::eglDisplay(), m_surface); m_surface = EGL_NO_SURFACE; } eglWaitGL(); }
static void draw(void) { use_pbuffer(); draw_triangle(); use_window(); eglBindTexImage(dpy, surf_pbuf, EGL_BACK_BUFFER); glPushMatrix(); glRotatef(view_rotx, 1, 0, 0); glRotatef(view_roty, 0, 1, 0); glRotatef(view_rotz, 0, 0, 1); draw_textured_cube(); glPopMatrix(); eglReleaseTexImage(dpy, surf_pbuf, EGL_BACK_BUFFER); }
static void texture_gears(struct egl_manager *eman, int surface_type) { static const GLint verts[12] = { -5, -6, -10, 5, -6, -10, -5, 4, 10, 5, 4, 10 }; static const GLint tex_coords[8] = { 0, 0, 1, 0, 0, 1, 1, 1 }; eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(3, GL_INT, 0, verts); glTexCoordPointer(2, GL_INT, 0, tex_coords); if (surface_type == GEARS_PBUFFER_TEXTURE) eglBindTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisable(GL_TEXTURE_2D); if (surface_type == GEARS_PBUFFER_TEXTURE) eglReleaseTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER); eglSwapBuffers(eman->dpy, eman->win); }
// Test creating a pbuffer from a d3d surface and binding it to a texture TEST_P(D3DTextureTest, BindTexImage) { if (!valid()) { return; } EGLWindow *window = getEGLWindow(); EGLDisplay display = window->getDisplay(); const size_t bufferSize = 32; EGLSurface pbuffer = createPBuffer(bufferSize, bufferSize, EGL_TEXTURE_RGBA, EGL_TEXTURE_2D, 1, 0); ASSERT_EGL_SUCCESS(); ASSERT_NE(pbuffer, EGL_NO_SURFACE); // Apply the Pbuffer and clear it to purple eglMakeCurrent(display, pbuffer, pbuffer, window->getContext()); ASSERT_EGL_SUCCESS(); glViewport(0, 0, static_cast<GLsizei>(bufferSize), static_cast<GLsizei>(bufferSize)); glClearColor(1.0f, 0.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); ASSERT_GL_NO_ERROR(); EXPECT_PIXEL_EQ(static_cast<GLint>(bufferSize) / 2, static_cast<GLint>(bufferSize) / 2, 255, 0, 255, 255); // Apply the window surface eglMakeCurrent(display, window->getSurface(), window->getSurface(), window->getContext()); // Create a texture and bind the Pbuffer to it GLuint texture = 0; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); EXPECT_GL_NO_ERROR(); eglBindTexImage(display, pbuffer, EGL_BACK_BUFFER); glViewport(0, 0, getWindowWidth(), getWindowHeight()); ASSERT_EGL_SUCCESS(); // Draw a quad and verify that it is purple glUseProgram(mTextureProgram); glUniform1i(mTextureUniformLocation, 0); drawQuad(mTextureProgram, "position", 0.5f); EXPECT_GL_NO_ERROR(); // Unbind the texture eglReleaseTexImage(display, pbuffer, EGL_BACK_BUFFER); ASSERT_EGL_SUCCESS(); // Verify that purple was drawn EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 255, 255); glDeleteTextures(1, &texture); // Make current with fixture EGL to ensure the Surface can be released immediately. getEGLWindow()->makeCurrent(); eglDestroySurface(display, pbuffer); }