diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/ColorBuffer.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/ColorBuffer.cpp index 0a794ed97..adc84d27a 100644 --- a/tools/emulator/opengl/host/libs/libOpenglRender/ColorBuffer.cpp +++ b/tools/emulator/opengl/host/libs/libOpenglRender/ColorBuffer.cpp @@ -56,10 +56,16 @@ ColorBuffer *ColorBuffer::create(int p_width, int p_height, s_gl.glGenTextures(1, &cb->m_tex); s_gl.glBindTexture(GL_TEXTURE_2D, cb->m_tex); + int nComp = (texInternalFormat == GL_RGB ? 3 : 4); + char *zBuff = new char[nComp*p_width*p_height]; + if (zBuff) { + memset(zBuff, 0, nComp*p_width*p_height); + } s_gl.glTexImage2D(GL_TEXTURE_2D, 0, texInternalFormat, p_width, p_height, 0, texInternalFormat, - GL_UNSIGNED_BYTE, NULL); + GL_UNSIGNED_BYTE, zBuff); + delete [] zBuff; s_gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); s_gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); s_gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); @@ -231,10 +237,10 @@ void ColorBuffer::drawTexQuad() +1.0f, -1.0f, 0.0f, +1.0f, +1.0f, 0.0f }; - GLfloat tcoords[] = { 0.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 0.0f, - 1.0f, 1.0f }; + GLfloat tcoords[] = { 0.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 1.0f, + 1.0f, 0.0f }; s_gl.glClientActiveTexture(GL_TEXTURE0); s_gl.glEnableClientState(GL_TEXTURE_COORD_ARRAY); diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/RenderControl.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/RenderControl.cpp index 9c973e9f6..c5097a4ab 100644 --- a/tools/emulator/opengl/host/libs/libOpenglRender/RenderControl.cpp +++ b/tools/emulator/opengl/host/libs/libOpenglRender/RenderControl.cpp @@ -224,13 +224,14 @@ static void rcDestroyColorBuffer(uint32_t colorbuffer) fb->DestroyColorBuffer( colorbuffer ); } -static void rcFlushWindowColorBuffer(uint32_t windowSurface) +static int rcFlushWindowColorBuffer(uint32_t windowSurface) { FrameBuffer *fb = FrameBuffer::getFB(); if (!fb) { - return; + return -1; } fb->flushWindowSurfaceColorBuffer(windowSurface); + return 0; } static void rcSetWindowColorBuffer(uint32_t windowSurface, @@ -296,17 +297,18 @@ static void rcReadColorBuffer(uint32_t colorBuffer, // XXX: TBD - should be implemented } -static void rcUpdateColorBuffer(uint32_t colorBuffer, +static int rcUpdateColorBuffer(uint32_t colorBuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void* pixels) { FrameBuffer *fb = FrameBuffer::getFB(); if (!fb) { - return; + return -1; } fb->updateColorBuffer(colorBuffer, x, y, width, height, format, type, pixels); + return 0; } void initRenderControlContext(renderControl_decoder_context_t *dec) diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp b/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp index 21b92e286..0b12604be 100644 --- a/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp +++ b/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.cpp @@ -227,8 +227,27 @@ void WindowSurface::copyToColorBuffer() GL_RGBA, GL_UNSIGNED_BYTE, data); } +#define FLIP_BUFFER 1 +#if FLIP_BUFFER + //We need to flip the pixels + int bpp = 4; + void *tmpBuf = m_xUpdateBuf.alloc(m_width * m_height * bpp); + + int dst_line_len = m_width * bpp; + int src_line_len = m_width * bpp; + char *src = (char *)data; + char *dst = (char*)tmpBuf + (m_height-1)*dst_line_len; + for (uint32_t y=0; yupdate(GL_RGBA, GL_UNSIGNED_BYTE, tmpBuf); +#else // update the attached color buffer with the readback pixels m_attachedColorBuffer->update(GL_RGBA, GL_UNSIGNED_BYTE, data); +#endif // restore current context/surface s_egl.eglMakeCurrent(fb->getDisplay(), prevDrawSurf, diff --git a/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.h b/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.h index 2a496df53..73ef86b92 100644 --- a/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.h +++ b/tools/emulator/opengl/host/libs/libOpenglRender/WindowSurface.h @@ -58,6 +58,7 @@ private: bool m_useEGLImage; bool m_useBindToTexture; FixedBuffer m_xferBuffer; + FixedBuffer m_xUpdateBuf; }; typedef SmartPtr WindowSurfacePtr; diff --git a/tools/emulator/opengl/system/egl/egl.cpp b/tools/emulator/opengl/system/egl/egl.cpp index d8ef8aa03..50fb2c56b 100644 --- a/tools/emulator/opengl/system/egl/egl.cpp +++ b/tools/emulator/opengl/system/egl/egl.cpp @@ -325,8 +325,12 @@ EGLBoolean egl_window_surface_t::connect() if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) { setErrorReturn(EGL_BAD_ALLOC, EGL_FALSE); } + buffer->common.incRef(&buffer->common); + // lock the buffer + nativeWindow->lockBuffer(nativeWindow, buffer); + DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); rcEnc->rcSetWindowColorBuffer(rcEnc, rcSurface, ((cb_handle_t *)(buffer->handle))->hostHandle); @@ -360,6 +364,9 @@ EGLBoolean egl_window_surface_t::swapBuffers() setErrorReturn(EGL_BAD_ALLOC, EGL_FALSE); } + // lock the buffer + nativeWindow->lockBuffer(nativeWindow, buffer); + rcEnc->rcSetWindowColorBuffer(rcEnc, rcSurface, ((cb_handle_t *)(buffer->handle))->hostHandle); return EGL_TRUE; @@ -634,7 +641,7 @@ EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig } DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); - *num_config = rcEnc->rcChooseConfig(rcEnc, (EGLint*)attrib_list, attribs_size * sizeof(EGLint), (uint32_t*)configs, config_size*sizeof(EGLint)); + *num_config = rcEnc->rcChooseConfig(rcEnc, (EGLint*)attrib_list, attribs_size * sizeof(EGLint), (uint32_t*)configs, config_size); return EGL_TRUE; } diff --git a/tools/emulator/opengl/system/gralloc/gralloc.cpp b/tools/emulator/opengl/system/gralloc/gralloc.cpp index 774d7b669..5c11ee367 100644 --- a/tools/emulator/opengl/system/gralloc/gralloc.cpp +++ b/tools/emulator/opengl/system/gralloc/gralloc.cpp @@ -441,6 +441,8 @@ static int gralloc_unregister_buffer(gralloc_module_t const* module, if (err) { return -EINVAL; } + cb->ashmemBase = NULL; + cb->mappedPid = 0; } return 0; diff --git a/tools/emulator/opengl/system/renderControl_enc/renderControl.attrib b/tools/emulator/opengl/system/renderControl_enc/renderControl.attrib index 4197d64ef..7baaf0752 100644 --- a/tools/emulator/opengl/system/renderControl_enc/renderControl.attrib +++ b/tools/emulator/opengl/system/renderControl_enc/renderControl.attrib @@ -28,7 +28,7 @@ rcChooseConfig dir attribs in len attribs attribs_size dir configs out - len configs configs_size + len configs configs_size*sizeof(uint32_t) rcReadColorBuffer dir pixels out diff --git a/tools/emulator/opengl/system/renderControl_enc/renderControl.in b/tools/emulator/opengl/system/renderControl_enc/renderControl.in index 37a8e9013..9ee3d3f1e 100644 --- a/tools/emulator/opengl/system/renderControl_enc/renderControl.in +++ b/tools/emulator/opengl/system/renderControl_enc/renderControl.in @@ -13,11 +13,11 @@ GL_ENTRY(void, rcDestroyWindowSurface, uint32_t windowSurface) GL_ENTRY(uint32_t, rcCreateColorBuffer, uint32_t width, uint32_t height, GLenum internalFormat) GL_ENTRY(void, rcDestroyColorBuffer, uint32_t colorbuffer) GL_ENTRY(void, rcSetWindowColorBuffer, uint32_t windowSurface, uint32_t colorBuffer) -GL_ENTRY(void, rcFlushWindowColorBuffer, uint32_t windowSurface) +GL_ENTRY(int, rcFlushWindowColorBuffer, uint32_t windowSurface) GL_ENTRY(EGLint, rcMakeCurrent, uint32_t context, uint32_t drawSurf, uint32_t readSurf) GL_ENTRY(void, rcFBPost, uint32_t colorBuffer) GL_ENTRY(void, rcFBSetSwapInterval, EGLint interval) GL_ENTRY(void, rcBindTexture, uint32_t colorBuffer) GL_ENTRY(EGLint, rcColorBufferCacheFlush, uint32_t colorbuffer, EGLint postCount,int forRead) GL_ENTRY(void, rcReadColorBuffer, uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void *pixels) -GL_ENTRY(void, rcUpdateColorBuffer, uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void *pixels) +GL_ENTRY(int, rcUpdateColorBuffer, uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void *pixels)