Loading libs/hwui/AssetAtlas.cpp +11 −30 Original line number Diff line number Diff line Loading @@ -14,14 +14,10 @@ * limitations under the License. */ #define LOG_TAG "OpenGLRenderer" #include "AssetAtlas.h" #include <GLES2/gl2ext.h> #include <utils/Log.h> namespace android { namespace uirenderer { Loading @@ -30,41 +26,26 @@ namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// void AssetAtlas::init(sp<GraphicBuffer> buffer, int* map, int count) { if (mImage != EGL_NO_IMAGE_KHR) { if (mImage) { return; } // Create the EGLImage object that maps the GraphicBuffer EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer(); EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE }; mImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs); if (mImage == EGL_NO_IMAGE_KHR) { ALOGW("Error creating atlas image (%#x)", eglGetError()); return; } // Create a 2D texture to sample from the EGLImage glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); mImage = new Image(buffer); mTexture = mImage->getTexture(); if (mTexture) { mWidth = buffer->getWidth(); mHeight = buffer->getHeight(); createEntries(map, count); } else { delete mImage; } } void AssetAtlas::terminate() { if (mImage != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage); mImage = EGL_NO_IMAGE_KHR; glDeleteTextures(1, &mTexture); mTexture = 0; if (mImage) { delete mImage; for (size_t i = 0; i < mEntries.size(); i++) { delete mEntries.valueAt(i); Loading libs/hwui/AssetAtlas.h +3 −5 Original line number Diff line number Diff line Loading @@ -19,9 +19,6 @@ #include <GLES2/gl2.h> #include <EGL/egl.h> #include <EGL/eglext.h> #include <ui/GraphicBuffer.h> #include <utils/KeyedVector.h> Loading @@ -30,6 +27,7 @@ #include <SkBitmap.h> #include "Image.h" #include "Texture.h" #include "UvMapper.h" Loading Loading @@ -92,7 +90,7 @@ public: friend class AssetAtlas; }; AssetAtlas(): mWidth(0), mHeight(0), mTexture(0), mImage(EGL_NO_IMAGE_KHR) { } AssetAtlas(): mWidth(0), mHeight(0), mTexture(0), mImage(NULL) { } ~AssetAtlas() { terminate(); } /** Loading Loading @@ -160,7 +158,7 @@ private: uint32_t mHeight; GLuint mTexture; EGLImageKHR mImage; Image* mImage; KeyedVector<SkBitmap*, Entry*> mEntries; }; // class AssetAtlas Loading libs/hwui/Image.h 0 → 100644 +103 −0 Original line number Diff line number Diff line /* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HWUI_IMAGE_H #define ANDROID_HWUI_IMAGE_H #define LOG_TAG "OpenGLRenderer" #include <EGL/egl.h> #include <EGL/eglext.h> #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> #include <ui/GraphicBuffer.h> #include <utils/Log.h> namespace android { namespace uirenderer { /** * A simple wrapper that creates an EGLImage and a texture for a GraphicBuffer. */ class Image { public: /** * Creates a new image from the specified graphic buffer. If the image * cannot be created, getTexture() will return 0 and getImage() will * return EGL_NO_IMAGE_KHR. */ Image(sp<GraphicBuffer> buffer) { // Create the EGLImage object that maps the GraphicBuffer EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer(); EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE }; mImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs); if (mImage == EGL_NO_IMAGE_KHR) { ALOGW("Error creating image (%#x)", eglGetError()); mTexture = 0; } else { // Create a 2D texture to sample from the EGLImage glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); GLenum status = GL_NO_ERROR; while ((status = glGetError()) != GL_NO_ERROR) { ALOGW("Error creating image (%#x)", status); } } } ~Image() { if (mImage != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage); mImage = EGL_NO_IMAGE_KHR; glDeleteTextures(1, &mTexture); mTexture = 0; } } /** * Returns the name of the GL texture that can be used to sample * from this image. */ GLuint getTexture() const { return mTexture; } /** * Returns the name of the EGL image represented by this object. */ EGLImageKHR getImage() const { return mImage; } private: GLuint mTexture; EGLImageKHR mImage; }; // class Image }; // namespace uirenderer }; // namespace android #endif // ANDROID_HWUI_IMAGE_H Loading
libs/hwui/AssetAtlas.cpp +11 −30 Original line number Diff line number Diff line Loading @@ -14,14 +14,10 @@ * limitations under the License. */ #define LOG_TAG "OpenGLRenderer" #include "AssetAtlas.h" #include <GLES2/gl2ext.h> #include <utils/Log.h> namespace android { namespace uirenderer { Loading @@ -30,41 +26,26 @@ namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// void AssetAtlas::init(sp<GraphicBuffer> buffer, int* map, int count) { if (mImage != EGL_NO_IMAGE_KHR) { if (mImage) { return; } // Create the EGLImage object that maps the GraphicBuffer EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer(); EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE }; mImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs); if (mImage == EGL_NO_IMAGE_KHR) { ALOGW("Error creating atlas image (%#x)", eglGetError()); return; } // Create a 2D texture to sample from the EGLImage glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); mImage = new Image(buffer); mTexture = mImage->getTexture(); if (mTexture) { mWidth = buffer->getWidth(); mHeight = buffer->getHeight(); createEntries(map, count); } else { delete mImage; } } void AssetAtlas::terminate() { if (mImage != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage); mImage = EGL_NO_IMAGE_KHR; glDeleteTextures(1, &mTexture); mTexture = 0; if (mImage) { delete mImage; for (size_t i = 0; i < mEntries.size(); i++) { delete mEntries.valueAt(i); Loading
libs/hwui/AssetAtlas.h +3 −5 Original line number Diff line number Diff line Loading @@ -19,9 +19,6 @@ #include <GLES2/gl2.h> #include <EGL/egl.h> #include <EGL/eglext.h> #include <ui/GraphicBuffer.h> #include <utils/KeyedVector.h> Loading @@ -30,6 +27,7 @@ #include <SkBitmap.h> #include "Image.h" #include "Texture.h" #include "UvMapper.h" Loading Loading @@ -92,7 +90,7 @@ public: friend class AssetAtlas; }; AssetAtlas(): mWidth(0), mHeight(0), mTexture(0), mImage(EGL_NO_IMAGE_KHR) { } AssetAtlas(): mWidth(0), mHeight(0), mTexture(0), mImage(NULL) { } ~AssetAtlas() { terminate(); } /** Loading Loading @@ -160,7 +158,7 @@ private: uint32_t mHeight; GLuint mTexture; EGLImageKHR mImage; Image* mImage; KeyedVector<SkBitmap*, Entry*> mEntries; }; // class AssetAtlas Loading
libs/hwui/Image.h 0 → 100644 +103 −0 Original line number Diff line number Diff line /* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HWUI_IMAGE_H #define ANDROID_HWUI_IMAGE_H #define LOG_TAG "OpenGLRenderer" #include <EGL/egl.h> #include <EGL/eglext.h> #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> #include <ui/GraphicBuffer.h> #include <utils/Log.h> namespace android { namespace uirenderer { /** * A simple wrapper that creates an EGLImage and a texture for a GraphicBuffer. */ class Image { public: /** * Creates a new image from the specified graphic buffer. If the image * cannot be created, getTexture() will return 0 and getImage() will * return EGL_NO_IMAGE_KHR. */ Image(sp<GraphicBuffer> buffer) { // Create the EGLImage object that maps the GraphicBuffer EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer(); EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE }; mImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs); if (mImage == EGL_NO_IMAGE_KHR) { ALOGW("Error creating image (%#x)", eglGetError()); mTexture = 0; } else { // Create a 2D texture to sample from the EGLImage glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage); GLenum status = GL_NO_ERROR; while ((status = glGetError()) != GL_NO_ERROR) { ALOGW("Error creating image (%#x)", status); } } } ~Image() { if (mImage != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage); mImage = EGL_NO_IMAGE_KHR; glDeleteTextures(1, &mTexture); mTexture = 0; } } /** * Returns the name of the GL texture that can be used to sample * from this image. */ GLuint getTexture() const { return mTexture; } /** * Returns the name of the EGL image represented by this object. */ EGLImageKHR getImage() const { return mImage; } private: GLuint mTexture; EGLImageKHR mImage; }; // class Image }; // namespace uirenderer }; // namespace android #endif // ANDROID_HWUI_IMAGE_H