summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/android/GLUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/android/GLUtils.cpp')
-rw-r--r--WebCore/platform/graphics/android/GLUtils.cpp424
1 files changed, 0 insertions, 424 deletions
diff --git a/WebCore/platform/graphics/android/GLUtils.cpp b/WebCore/platform/graphics/android/GLUtils.cpp
deleted file mode 100644
index 5eabb85..0000000
--- a/WebCore/platform/graphics/android/GLUtils.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright 2010, The Android Open Source Project
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "GLUtils.h"
-
-#if USE(ACCELERATED_COMPOSITING)
-
-#include "ShaderProgram.h"
-
-#include <cutils/log.h>
-#include <wtf/CurrentTime.h>
-#include <wtf/text/CString.h>
-
-#undef XLOG
-#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "GLUtils", __VA_ARGS__)
-
-namespace WebCore {
-
-using namespace android;
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// Matrix utilities
-/////////////////////////////////////////////////////////////////////////////////////////
-
-void GLUtils::toGLMatrix(GLfloat* flattened, const TransformationMatrix& m)
-{
- flattened[0] = m.m11(); // scaleX
- flattened[1] = m.m12(); // skewY
- flattened[2] = m.m13();
- flattened[3] = m.m14(); // persp0
- flattened[4] = m.m21(); // skewX
- flattened[5] = m.m22(); // scaleY
- flattened[6] = m.m23();
- flattened[7] = m.m24(); // persp1
- flattened[8] = m.m31();
- flattened[9] = m.m32();
- flattened[10] = m.m33();
- flattened[11] = m.m34();
- flattened[12] = m.m41(); // transX
- flattened[13] = m.m42(); // transY
- flattened[14] = m.m43();
- flattened[15] = m.m44(); // persp2
-}
-
-void GLUtils::toSkMatrix(SkMatrix& matrix, const TransformationMatrix& m)
-{
- matrix[0] = m.m11(); // scaleX
- matrix[1] = m.m21(); // skewX
- matrix[2] = m.m41(); // transX
- matrix[3] = m.m12(); // skewY
- matrix[4] = m.m22(); // scaleY
- matrix[5] = m.m42(); // transY
- matrix[6] = m.m14(); // persp0
- matrix[7] = m.m24(); // persp1
- matrix[8] = m.m44(); // persp2
-}
-
-void GLUtils::setOrthographicMatrix(TransformationMatrix& ortho, float left, float top,
- float right, float bottom, float nearZ, float farZ)
-{
- float deltaX = right - left;
- float deltaY = top - bottom;
- float deltaZ = farZ - nearZ;
- if (!deltaX || !deltaY || !deltaZ)
- return;
-
- ortho.setM11(2.0f / deltaX);
- ortho.setM41(-(right + left) / deltaX);
- ortho.setM22(2.0f / deltaY);
- ortho.setM42(-(top + bottom) / deltaY);
- ortho.setM33(-2.0f / deltaZ);
- ortho.setM43(-(nearZ + farZ) / deltaZ);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// GL & EGL error checks
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static void crashIfOOM(GLint errorCode) {
- const GLint OOM_ERROR_CODE = 0x505;
- if (errorCode == OOM_ERROR_CODE) {
- XLOG("Fatal OOM detected.");
- CRASH();
- }
-}
-
-void GLUtils::checkEglError(const char* op, EGLBoolean returnVal)
-{
- if (returnVal != EGL_TRUE)
- XLOG("EGL ERROR - %s() returned %d\n", op, returnVal);
-
- for (EGLint error = eglGetError(); error != EGL_SUCCESS; error = eglGetError()) {
- XLOG("after %s() eglError (0x%x)\n", op, error);
- crashIfOOM(error);
- }
-}
-
-bool GLUtils::checkGlError(const char* op)
-{
- bool ret = false;
- for (GLint error = glGetError(); error; error = glGetError()) {
- XLOG("GL ERROR - after %s() glError (0x%x)\n", op, error);
- crashIfOOM(error);
- ret = true;
- }
- return ret;
-}
-
-bool GLUtils::checkGlErrorOn(void* p, const char* op)
-{
- bool ret = false;
- for (GLint error = glGetError(); error; error = glGetError()) {
- XLOG("GL ERROR on %x - after %s() glError (0x%x)\n", p, op, error);
- crashIfOOM(error);
- ret = true;
- }
- return ret;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// GL & EGL extension checks
-/////////////////////////////////////////////////////////////////////////////////////////
-
-bool GLUtils::isEGLImageSupported()
-{
- const char* eglExtensions = eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS);
- const char* glExtensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
-
- return eglExtensions && glExtensions
- && strstr(eglExtensions, "EGL_KHR_image_base")
- && strstr(eglExtensions, "EGL_KHR_gl_texture_2D_image")
- && strstr(glExtensions, "GL_OES_EGL_image");
-}
-
-bool GLUtils::isEGLFenceSyncSupported()
-{
- const char* eglExtensions = eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS);
- return eglExtensions && strstr(eglExtensions, "EGL_KHR_fence_sync");
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// Textures utilities
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static GLenum getInternalFormat(SkBitmap::Config config)
-{
- switch (config) {
- case SkBitmap::kA8_Config:
- return GL_ALPHA;
- case SkBitmap::kARGB_4444_Config:
- return GL_RGBA;
- case SkBitmap::kARGB_8888_Config:
- return GL_RGBA;
- case SkBitmap::kRGB_565_Config:
- return GL_RGB;
- default:
- return -1;
- }
-}
-
-static GLenum getType(SkBitmap::Config config)
-{
- switch (config) {
- case SkBitmap::kA8_Config:
- return GL_UNSIGNED_BYTE;
- case SkBitmap::kARGB_4444_Config:
- return GL_UNSIGNED_SHORT_4_4_4_4;
- case SkBitmap::kARGB_8888_Config:
- return GL_UNSIGNED_BYTE;
- case SkBitmap::kIndex8_Config:
- return -1; // No type for compressed data.
- case SkBitmap::kRGB_565_Config:
- return GL_UNSIGNED_SHORT_5_6_5;
- default:
- return -1;
- }
-}
-
-static EGLConfig defaultPbufferConfig(EGLDisplay display)
-{
- EGLConfig config;
- EGLint numConfigs;
-
- static const EGLint configAttribs[] = {
- EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_NONE
- };
-
- eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
- GLUtils::checkEglError("eglPbufferConfig");
- if (numConfigs != 1)
- LOGI("eglPbufferConfig failed (%d)\n", numConfigs);
-
- return config;
-}
-
-static EGLSurface createPbufferSurface(EGLDisplay display, const EGLConfig& config,
- EGLint* errorCode)
-{
- const EGLint attribList[] = {
- EGL_WIDTH, 1,
- EGL_HEIGHT, 1,
- EGL_NONE
- };
- EGLSurface surface = eglCreatePbufferSurface(display, config, attribList);
-
- if (errorCode)
- *errorCode = eglGetError();
- else
- GLUtils::checkEglError("eglCreatePbufferSurface");
-
- if (surface == EGL_NO_SURFACE)
- return EGL_NO_SURFACE;
-
- return surface;
-}
-
-EGLContext GLUtils::createBackgroundContext(EGLContext sharedContext)
-{
- checkEglError("<init>");
- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- checkEglError("eglGetDisplay");
- if (display == EGL_NO_DISPLAY) {
- XLOG("eglGetDisplay returned EGL_NO_DISPLAY");
- return EGL_NO_CONTEXT;
- }
-
- EGLint majorVersion;
- EGLint minorVersion;
- EGLBoolean returnValue = eglInitialize(display, &majorVersion, &minorVersion);
- checkEglError("eglInitialize", returnValue);
- if (returnValue != EGL_TRUE) {
- XLOG("eglInitialize failed\n");
- return EGL_NO_CONTEXT;
- }
-
- EGLConfig config = defaultPbufferConfig(display);
- EGLSurface surface = createPbufferSurface(display, config, 0);
-
- EGLint surfaceConfigId;
- EGLBoolean success = eglGetConfigAttrib(display, config, EGL_CONFIG_ID, &surfaceConfigId);
-
- EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
- EGLContext context = eglCreateContext(display, config, sharedContext, contextAttribs);
- checkEglError("eglCreateContext");
- if (context == EGL_NO_CONTEXT) {
- XLOG("eglCreateContext failed\n");
- return EGL_NO_CONTEXT;
- }
-
- returnValue = eglMakeCurrent(display, surface, surface, context);
- checkEglError("eglMakeCurrent", returnValue);
- if (returnValue != EGL_TRUE) {
- XLOG("eglMakeCurrent failed\n");
- return EGL_NO_CONTEXT;
- }
-
- return context;
-}
-
-void GLUtils::deleteTexture(GLuint* texture)
-{
- glDeleteTextures(1, texture);
- GLUtils::checkGlError("glDeleteTexture");
- *texture = 0;
-}
-
-GLuint GLUtils::createSampleColorTexture(int r, int g, int b) {
- GLuint texture;
- glGenTextures(1, &texture);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- GLubyte pixels[4 *3] = {
- r, g, b,
- r, g, b,
- r, g, b,
- r, g, b
- };
- glBindTexture(GL_TEXTURE_2D, texture);
- GLUtils::checkGlError("glBindTexture");
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
- GLUtils::checkGlError("glTexImage2D");
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- return texture;
-}
-
-GLuint GLUtils::createSampleTexture()
-{
- GLuint texture;
- glGenTextures(1, &texture);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- GLubyte pixels[4 *3] = {
- 255, 0, 0,
- 0, 255, 0,
- 0, 0, 255,
- 255, 255, 0
- };
- glBindTexture(GL_TEXTURE_2D, texture);
- GLUtils::checkGlError("glBindTexture");
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
- GLUtils::checkGlError("glTexImage2D");
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- return texture;
-}
-
-void GLUtils::createTextureWithBitmap(GLuint texture, SkBitmap& bitmap, GLint filter)
-{
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glBindTexture(GL_TEXTURE_2D, texture);
- GLUtils::checkGlError("glBindTexture");
- SkBitmap::Config config = bitmap.getConfig();
- int internalformat = getInternalFormat(config);
- int type = getType(config);
- bitmap.lockPixels();
- glTexImage2D(GL_TEXTURE_2D, 0, internalformat, bitmap.width(), bitmap.height(),
- 0, internalformat, type, bitmap.getPixels());
- bitmap.unlockPixels();
- if (GLUtils::checkGlError("glTexImage2D")) {
- XLOG("GL ERROR: glTexImage2D parameters are : bitmap.width() %d, bitmap.height() %d,"
- " internalformat 0x%x, type 0x%x, bitmap.getPixels() %p",
- bitmap.width(), bitmap.height(), internalformat, type, bitmap.getPixels());
- }
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
-
- // The following is a workaround -- remove when EGLImage texture upload is fixed.
- GLuint fboID;
- glGenFramebuffers(1, &fboID);
- glBindFramebuffer(GL_FRAMEBUFFER, fboID);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
- glCheckFramebufferStatus(GL_FRAMEBUFFER); // should return GL_FRAMEBUFFER_COMPLETE
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0); // rebind the standard FBO
- glDeleteFramebuffers(1, &fboID);
-}
-
-void GLUtils::updateTextureWithBitmap(GLuint texture, SkBitmap& bitmap, GLint filter)
-{
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glBindTexture(GL_TEXTURE_2D, texture);
- GLUtils::checkGlError("glBindTexture");
- SkBitmap::Config config = bitmap.getConfig();
- int internalformat = getInternalFormat(config);
- int type = getType(config);
- bitmap.lockPixels();
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(),
- internalformat, type, bitmap.getPixels());
- bitmap.unlockPixels();
- if (GLUtils::checkGlError("glTexSubImage2D")) {
- XLOG("GL ERROR: glTexSubImage2D parameters are : bitmap.width() %d, bitmap.height() %d,"
- " internalformat 0x%x, type 0x%x, bitmap.getPixels() %p",
- bitmap.width(), bitmap.height(), internalformat, type, bitmap.getPixels());
- }
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
-}
-
-void GLUtils::updateTextureWithBitmap(GLuint texture, int x, int y, SkBitmap& bitmap, GLint filter)
-{
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glBindTexture(GL_TEXTURE_2D, texture);
- GLUtils::checkGlError("glBindTexture");
- SkBitmap::Config config = bitmap.getConfig();
- int internalformat = getInternalFormat(config);
- int type = getType(config);
- bitmap.lockPixels();
- glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, bitmap.width(), bitmap.height(),
- internalformat, type, bitmap.getPixels());
- bitmap.unlockPixels();
- if (GLUtils::checkGlError("glTexSubImage2D")) {
- XLOG("GL ERROR: glTexSubImage2D parameters are : bitmap.width() %d, bitmap.height() %d,"
- " x %d, y %d, internalformat 0x%x, type 0x%x, bitmap.getPixels() %p",
- bitmap.width(), bitmap.height(), x, y, internalformat, type, bitmap.getPixels());
- }
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
-}
-
-void GLUtils::createEGLImageFromTexture(GLuint texture, EGLImageKHR* image)
-{
- EGLClientBuffer buffer = reinterpret_cast<EGLClientBuffer>(texture);
- static const EGLint attr[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
- *image = eglCreateImageKHR(eglGetCurrentDisplay(), eglGetCurrentContext(),
- EGL_GL_TEXTURE_2D_KHR, buffer, attr);
- GLUtils::checkEglError("eglCreateImage", (*image != EGL_NO_IMAGE_KHR));
-}
-
-void GLUtils::createTextureFromEGLImage(GLuint texture, EGLImageKHR image, GLint filter)
-{
- glBindTexture(GL_TEXTURE_2D, texture);
- GLUtils::checkGlError("glBindTexture");
- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
-}
-
-} // namespace WebCore
-
-#endif // USE(ACCELERATED_COMPOSITING)