| Index: Source/WebCore/platform/graphics/surfaces/win/GraphicsSurfaceWin.cpp
|
| diff --git a/Source/WebCore/platform/graphics/surfaces/win/GraphicsSurfaceWin.cpp b/Source/WebCore/platform/graphics/surfaces/win/GraphicsSurfaceWin.cpp
|
| deleted file mode 100644
|
| index 6c88190c576a3348451a9d37ec6b2e83d70bdcea..0000000000000000000000000000000000000000
|
| --- a/Source/WebCore/platform/graphics/surfaces/win/GraphicsSurfaceWin.cpp
|
| +++ /dev/null
|
| @@ -1,483 +0,0 @@
|
| -/*
|
| -
|
| - Copyright (C) 2012 Zeno Albisser <zeno@webkit.org>
|
| -
|
| - This library is free software; you can redistribute it and/or
|
| - modify it under the terms of the GNU Library General Public
|
| - License as published by the Free Software Foundation; either
|
| - version 2 of the License, or (at your option) any later version.
|
| -
|
| - This library is distributed in the hope that it will be useful,
|
| - but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - Library General Public License for more details.
|
| -
|
| - You should have received a copy of the GNU Library General Public License
|
| - along with this library; see the file COPYING.LIB. If not, write to
|
| - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - Boston, MA 02110-1301, USA.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "GraphicsSurface.h"
|
| -
|
| -#if USE(GRAPHICS_SURFACE)
|
| -#include "TextureMapperGL.h"
|
| -
|
| -#define EGL_EGLEXT_PROTOTYPES // This must be defined before including egl.h and eglext.h.
|
| -#include <EGL/egl.h>
|
| -#include <EGL/eglext.h>
|
| -
|
| -namespace WebCore {
|
| -
|
| -#define STRINGIFY(...) #__VA_ARGS__
|
| -
|
| -static GLuint loadShader(GLenum type, const GLchar *shaderSrc)
|
| -{
|
| - GLuint shader;
|
| - GLint compiled;
|
| -
|
| - shader = glCreateShader(type);
|
| - if (!shader)
|
| - return 0;
|
| -
|
| - glShaderSource(shader, 1, &shaderSrc, 0);
|
| - glCompileShader(shader);
|
| - glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
|
| - if (!compiled) {
|
| - glDeleteShader(shader);
|
| - return 0;
|
| - }
|
| - return shader;
|
| -}
|
| -
|
| -struct GraphicsSurfacePrivate {
|
| -public:
|
| - GraphicsSurfacePrivate(const IntSize& size, GraphicsSurfaceToken token)
|
| - : m_token(token)
|
| - , m_detachedContext(0)
|
| - , m_detachedReadSurface(0)
|
| - , m_detachedDrawSurface(0)
|
| - , m_size(size)
|
| - , m_eglDisplay(0)
|
| - , m_eglContext(0)
|
| - , m_eglConfig(0)
|
| - , m_eglFrontBufferSurface(0)
|
| - , m_eglBackBufferSurface(0)
|
| - , m_initialFrontBufferShareHandle(token.frontBufferHandle)
|
| - , m_frontBufferShareHandle(token.frontBufferHandle)
|
| - , m_backBufferShareHandle(token.backBufferHandle)
|
| - , m_frontBufferTexture(0)
|
| - , m_shaderProgram(0)
|
| - {
|
| - initializeShaderProgram();
|
| - }
|
| -
|
| -
|
| - GraphicsSurfacePrivate(const PlatformGraphicsContext3D shareContext, const IntSize& size, GraphicsSurface::Flags flags)
|
| - : m_detachedContext(0)
|
| - , m_detachedReadSurface(0)
|
| - , m_detachedDrawSurface(0)
|
| - , m_size(size)
|
| - , m_eglDisplay(0)
|
| - , m_eglContext(0)
|
| - , m_eglConfig(0)
|
| - , m_eglFrontBufferSurface(0)
|
| - , m_eglBackBufferSurface(0)
|
| - , m_initialFrontBufferShareHandle(0)
|
| - , m_frontBufferShareHandle(0)
|
| - , m_backBufferShareHandle(0)
|
| - , m_frontBufferTexture(0)
|
| - , m_shaderProgram(0)
|
| - {
|
| - initializeShaderProgram();
|
| -
|
| - static PFNEGLQUERYSURFACEPOINTERANGLEPROC eglQuerySurfacePointerANGLE = 0;
|
| - if (!eglQuerySurfacePointerANGLE) {
|
| - eglQuerySurfacePointerANGLE = reinterpret_cast<PFNEGLQUERYSURFACEPOINTERANGLEPROC>(eglGetProcAddress("eglQuerySurfacePointerANGLE"));
|
| - if (!eglQuerySurfacePointerANGLE)
|
| - return;
|
| - }
|
| -
|
| - if (!m_eglDisplay || !m_eglContext || !m_eglConfig) {
|
| - m_eglDisplay = eglGetCurrentDisplay();
|
| - EGLint contextAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
|
| - m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, eglShareContext, contextAttributes);
|
| - }
|
| -
|
| - EGLint attributes[] = {
|
| - EGL_WIDTH, size.width(),
|
| - EGL_HEIGHT, size.height(),
|
| - EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
|
| - EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
|
| - EGL_NONE
|
| - };
|
| -
|
| - m_eglFrontBufferSurface = eglCreatePbufferSurface(m_eglDisplay, m_eglConfig, attributes);
|
| - m_eglBackBufferSurface = eglCreatePbufferSurface(m_eglDisplay, m_eglConfig, attributes);
|
| - if (m_eglFrontBufferSurface == EGL_NO_SURFACE || m_eglBackBufferSurface == EGL_NO_SURFACE)
|
| - return;
|
| -
|
| - eglQuerySurfacePointerANGLE(m_eglDisplay, m_eglFrontBufferSurface, EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, &m_frontBufferShareHandle);
|
| - eglQuerySurfacePointerANGLE(m_eglDisplay, m_eglBackBufferSurface, EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, &m_backBufferShareHandle);
|
| -
|
| - m_initialFrontBufferShareHandle = m_frontBufferShareHandle;
|
| -
|
| - m_token = GraphicsSurfaceToken(m_frontBufferShareHandle, m_backBufferShareHandle);
|
| - }
|
| -
|
| - ~GraphicsSurfacePrivate()
|
| - {
|
| - releaseFrontBufferTexture();
|
| -
|
| - if (m_eglBackBufferSurface)
|
| - eglDestroySurface(m_eglDisplay, m_eglBackBufferSurface);
|
| -
|
| - if (m_shaderProgram)
|
| - glDeleteProgram(m_shaderProgram);
|
| - m_shaderProgram = 0;
|
| -
|
| - if (m_eglDisplay && m_eglContext)
|
| - eglDestroyContext(m_eglDisplay, m_eglContext);
|
| - }
|
| -
|
| - void copyFromTexture(uint32_t texture, const IntRect& sourceRect)
|
| - {
|
| - if (!makeCurrent())
|
| - return;
|
| - glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
| - drawTexture(texture);
|
| - glFinish();
|
| - doneCurrent();
|
| - }
|
| -
|
| - bool makeCurrent()
|
| - {
|
| - m_detachedContext = eglGetCurrentContext();
|
| - m_detachedReadSurface = eglGetCurrentSurface(EGL_READ);
|
| - m_detachedDrawSurface = eglGetCurrentSurface(EGL_DRAW);
|
| -
|
| - return eglMakeCurrent(m_eglDisplay, m_eglBackBufferSurface, m_eglBackBufferSurface, m_eglContext);
|
| - }
|
| -
|
| - bool doneCurrent()
|
| - {
|
| - if (!m_detachedContext || !m_detachedDrawSurface || !m_detachedReadSurface)
|
| - return false;
|
| -
|
| - bool success = eglMakeCurrent(m_eglDisplay, m_detachedDrawSurface, m_detachedReadSurface, m_detachedContext);
|
| - m_detachedContext = 0;
|
| - m_detachedReadSurface = 0;
|
| - m_detachedDrawSurface = 0;
|
| - return success;
|
| - }
|
| -
|
| - PlatformGraphicsSurface swapBuffers()
|
| - {
|
| - if (m_frontBufferTexture)
|
| - releaseFrontBufferTexture();
|
| - std::swap(m_eglFrontBufferSurface, m_eglBackBufferSurface);
|
| - std::swap(m_frontBufferShareHandle, m_backBufferShareHandle);
|
| -
|
| - return m_frontBufferShareHandle;
|
| - }
|
| -
|
| - GraphicsSurfaceToken token() const
|
| - {
|
| - return m_token;
|
| - }
|
| -
|
| - uint32_t frontBufferTextureID()
|
| - {
|
| - if (!m_eglFrontBufferSurface) {
|
| - m_eglFrontBufferSurface = createSurfaceFromShareHandle(m_size, m_frontBufferShareHandle);
|
| -
|
| - glGenTextures(1, &m_frontBufferTexture);
|
| - glActiveTexture(GL_TEXTURE0);
|
| - glBindTexture(GL_TEXTURE_2D, m_frontBufferTexture);
|
| - eglBindTexImage(m_eglDisplay, m_eglFrontBufferSurface, EGL_BACK_BUFFER);
|
| -
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| - }
|
| -
|
| - return m_frontBufferTexture;
|
| - }
|
| -
|
| - PlatformGraphicsSurface initialFrontBufferShareHandle() const
|
| - {
|
| - return m_initialFrontBufferShareHandle;
|
| - }
|
| -
|
| - PlatformGraphicsSurface frontBufferShareHandle() const
|
| - {
|
| - return m_frontBufferShareHandle;
|
| - }
|
| -
|
| - PlatformGraphicsSurface backBufferShareHandle() const
|
| - {
|
| - return m_backBufferShareHandle;
|
| - }
|
| -
|
| - void releaseFrontBufferTexture()
|
| - {
|
| - if (m_frontBufferTexture) {
|
| - eglReleaseTexImage(m_eglDisplay, m_eglFrontBufferSurface, EGL_BACK_BUFFER);
|
| - glDeleteTextures(1, &m_frontBufferTexture);
|
| - m_frontBufferTexture = 0;
|
| - }
|
| -
|
| - if (m_eglFrontBufferSurface)
|
| - eglDestroySurface(m_eglDisplay, m_eglFrontBufferSurface);
|
| - m_eglFrontBufferSurface = 0;
|
| - }
|
| -
|
| - IntSize size() const
|
| - {
|
| - return m_size;
|
| - }
|
| -
|
| -protected:
|
| - void initializeShaderProgram()
|
| - {
|
| - if (m_shaderProgram)
|
| - return;
|
| -
|
| - GLchar vShaderStr[] =
|
| - STRINGIFY(
|
| - attribute highp vec2 vertex;
|
| - attribute highp vec2 textureCoordinates;
|
| - varying highp vec2 textureCoords;
|
| - void main(void)
|
| - {
|
| - gl_Position = vec4(vertex, 0.0, 1.0);
|
| - textureCoords = textureCoordinates;
|
| - }
|
| - );
|
| -
|
| - GLchar fShaderStr[] =
|
| - STRINGIFY(
|
| - varying highp vec2 textureCoords;
|
| - uniform sampler2D texture;
|
| - void main(void)
|
| - {
|
| - highp vec3 color = texture2D(texture, textureCoords).rgb;
|
| - gl_FragColor = vec4(clamp(color, 0.0, 1.0), 1.0);
|
| - }
|
| - );
|
| -
|
| - GLuint vertexShader;
|
| - GLuint fragmentShader;
|
| - GLint linked;
|
| -
|
| - vertexShader = loadShader(GL_VERTEX_SHADER, vShaderStr);
|
| - fragmentShader = loadShader(GL_FRAGMENT_SHADER, fShaderStr);
|
| - if (!vertexShader || !fragmentShader)
|
| - return;
|
| -
|
| - m_shaderProgram = glCreateProgram();
|
| - if (!m_shaderProgram)
|
| - return;
|
| -
|
| - glAttachShader(m_shaderProgram, vertexShader);
|
| - glAttachShader(m_shaderProgram, fragmentShader);
|
| -
|
| - glLinkProgram(m_shaderProgram);
|
| - glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, &linked);
|
| - if (!linked) {
|
| - glDeleteProgram(m_shaderProgram);
|
| - m_shaderProgram = 0;
|
| - }
|
| -
|
| - m_vertexAttr = glGetAttribLocation(m_shaderProgram, "vertex");
|
| - m_textureCoordinatesAttr = glGetAttribLocation(m_shaderProgram, "textureCoordinates");
|
| - m_textureUniform = glGetAttribLocation(m_shaderProgram, "texture");
|
| -
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| - }
|
| -
|
| - EGLSurface createSurfaceFromShareHandle(const IntSize& size, HANDLE shareHandle)
|
| - {
|
| - if (!m_eglDisplay || !m_eglConfig)
|
| - m_eglDisplay = eglGetCurrentDisplay();
|
| -
|
| - EGLint attributes[] = {
|
| - EGL_WIDTH, size.width(),
|
| - EGL_HEIGHT, size.height(),
|
| - EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
|
| - EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
|
| - EGL_NONE
|
| - };
|
| -
|
| - EGLSurface surface = eglCreatePbufferFromClientBuffer(m_eglDisplay, EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, reinterpret_cast<EGLClientBuffer>(shareHandle), m_eglConfig, attributes);
|
| - ASSERT(surface);
|
| -
|
| - return surface;
|
| - }
|
| -
|
| - void drawTexture(uint32_t texture)
|
| - {
|
| - glUseProgram(m_shaderProgram);
|
| -
|
| - glBindBuffer(GL_ARRAY_BUFFER, 0);
|
| - glBindTexture(GL_TEXTURE_2D, texture);
|
| -
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| -
|
| - GLfloat afVertices[] = {
|
| - -1, -1,
|
| - 1, -1,
|
| - -1, 1,
|
| - 1, 1
|
| - };
|
| - glVertexAttribPointer(m_vertexAttr, 2, GL_FLOAT, GL_FALSE, 0, afVertices);
|
| -
|
| - GLfloat aftextureCoordinates[] = {
|
| - 0, 1,
|
| - 1, 1,
|
| - 0, 0,
|
| - 1, 0
|
| - };
|
| - glVertexAttribPointer(m_textureCoordinatesAttr, 2, GL_FLOAT, GL_FALSE, 0, aftextureCoordinates);
|
| -
|
| - glUniform1i(m_textureUniform, 0);
|
| -
|
| - glEnableVertexAttribArray(m_vertexAttr);
|
| - glEnableVertexAttribArray(m_textureCoordinatesAttr);
|
| -
|
| - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
| -
|
| - glDisableVertexAttribArray(m_vertexAttr);
|
| - glDisableVertexAttribArray(m_textureCoordinatesAttr);
|
| -
|
| - glBindTexture(GL_TEXTURE_2D, 0);
|
| - }
|
| -
|
| -private:
|
| - GraphicsSurfaceToken m_token;
|
| - EGLContext m_detachedContext;
|
| - EGLSurface m_detachedReadSurface;
|
| - EGLSurface m_detachedDrawSurface;
|
| - IntSize m_size;
|
| - EGLDisplay m_eglDisplay;
|
| - EGLContext m_eglContext;
|
| - EGLConfig m_eglConfig;
|
| - EGLSurface m_eglFrontBufferSurface;
|
| - EGLSurface m_eglBackBufferSurface;
|
| - PlatformGraphicsSurface m_initialFrontBufferShareHandle;
|
| - PlatformGraphicsSurface m_frontBufferShareHandle;
|
| - PlatformGraphicsSurface m_backBufferShareHandle;
|
| - GLuint m_frontBufferTexture;
|
| - GLint m_shaderProgram;
|
| -
|
| - GLuint m_vertexAttr;
|
| - GLuint m_textureCoordinatesAttr;
|
| - GLuint m_textureUniform;
|
| -};
|
| -
|
| -GraphicsSurfaceToken GraphicsSurface::platformExport()
|
| -{
|
| - return m_private->token();
|
| -}
|
| -
|
| -uint32_t GraphicsSurface::platformGetTextureID()
|
| -{
|
| - return m_private->frontBufferTextureID();
|
| -}
|
| -
|
| -void GraphicsSurface::platformCopyToGLTexture(uint32_t target, uint32_t id, const IntRect& targetRect, const IntPoint& offset)
|
| -{
|
| - // Currently not implemented.
|
| -}
|
| -
|
| -void GraphicsSurface::platformCopyFromTexture(uint32_t texture, const IntRect& sourceRect)
|
| -{
|
| - m_private->copyFromTexture(texture, sourceRect);
|
| -}
|
| -
|
| -void GraphicsSurface::platformPaintToTextureMapper(TextureMapper* textureMapper, const FloatRect& targetRect, const TransformationMatrix& transform, float opacity)
|
| -{
|
| - IntSize size = m_private->size();
|
| - FloatRect rectOnContents(FloatPoint::zero(), size);
|
| - TransformationMatrix adjustedTransform = transform;
|
| - adjustedTransform.multiply(TransformationMatrix::rectToRect(rectOnContents, targetRect));
|
| - static_cast<TextureMapperGL*>(textureMapper)->drawTexture(platformGetTextureID(), 0, size, rectOnContents, adjustedTransform, opacity);
|
| -}
|
| -
|
| -uint32_t GraphicsSurface::platformFrontBuffer() const
|
| -{
|
| - if (m_private->initialFrontBufferShareHandle() == m_private->frontBufferShareHandle())
|
| - return 0;
|
| - if (m_private->initialFrontBufferShareHandle() == m_private->backBufferShareHandle())
|
| - return 1;
|
| - return 0xFFFF;
|
| -}
|
| -
|
| -uint32_t GraphicsSurface::platformSwapBuffers()
|
| -{
|
| - m_private->swapBuffers();
|
| - return platformFrontBuffer();
|
| -}
|
| -
|
| -IntSize GraphicsSurface::platformSize() const
|
| -{
|
| - return m_private->size();
|
| -}
|
| -
|
| -PassRefPtr<GraphicsSurface> GraphicsSurface::platformCreate(const IntSize& size, Flags flags, const PlatformGraphicsContext3D shareContext)
|
| -{
|
| - // Single buffered GraphicsSurface is currently not supported.
|
| - if (flags & SupportsCopyToTexture || flags & SupportsSingleBuffered)
|
| - return PassRefPtr<GraphicsSurface>();
|
| -
|
| - RefPtr<GraphicsSurface> surface = adoptRef(new GraphicsSurface(size, flags));
|
| - surface->m_private = new GraphicsSurfacePrivate(shareContext, size, flags);
|
| -
|
| - if (!surface->m_private->frontBufferShareHandle() || !surface->m_private->backBufferShareHandle())
|
| - return PassRefPtr<GraphicsSurface>();
|
| -
|
| - return surface;
|
| -}
|
| -
|
| -PassRefPtr<GraphicsSurface> GraphicsSurface::platformImport(const IntSize& size, Flags flags, const GraphicsSurfaceToken& token)
|
| -{
|
| - // Single buffered GraphicsSurface is currently not supported.
|
| - if (flags & SupportsCopyToTexture || flags & SupportsSingleBuffered)
|
| - return PassRefPtr<GraphicsSurface>();
|
| -
|
| - RefPtr<GraphicsSurface> surface = adoptRef(new GraphicsSurface(size, flags));
|
| - surface->m_private = new GraphicsSurfacePrivate(size, token);
|
| -
|
| - if (!surface->m_private->frontBufferShareHandle() || !surface->m_private->backBufferShareHandle())
|
| - return PassRefPtr<GraphicsSurface>();
|
| -
|
| - return surface;
|
| -}
|
| -
|
| -char* GraphicsSurface::platformLock(const IntRect& rect, int* outputStride, LockOptions lockOptions)
|
| -{
|
| - // GraphicsSurface is currently only being used for WebGL, which does not require this locking mechanism.
|
| - return 0;
|
| -}
|
| -
|
| -void GraphicsSurface::platformUnlock()
|
| -{
|
| - // GraphicsSurface is currently only being used for WebGL, which does not require this locking mechanism.
|
| -}
|
| -
|
| -void GraphicsSurface::platformDestroy()
|
| -{
|
| - delete m_private;
|
| - m_private = 0;
|
| -}
|
| -
|
| -}
|
| -#endif
|
|
|