diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp')
-rw-r--r-- | Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp | 194 |
1 files changed, 156 insertions, 38 deletions
diff --git a/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp b/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp index 940265a9a..b4ae79e4a 100644 --- a/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp +++ b/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp @@ -12,10 +12,10 @@ * 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 APPLE COMPUTER, INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. 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 @@ -27,7 +27,9 @@ #include "config.h" -#if USE(3D_GRAPHICS) +#if USE(CAIRO) + +#if ENABLE(GRAPHICS_CONTEXT_3D) #include "GraphicsContext3D.h" #include "CairoUtilities.h" @@ -38,13 +40,11 @@ #include "PlatformContextCairo.h" #include "RefPtrCairo.h" #include <cairo.h> -#include <wtf/OwnPtr.h> -#include <wtf/PassOwnPtr.h> #if PLATFORM(WIN) -#include "GLSLANG/ShaderLang.h" +#include <GLSLANG/ShaderLang.h> #else -#include "ShaderLang.h" +#include <ANGLE/ShaderLang.h> #endif #if USE(OPENGL_ES_2) @@ -54,9 +54,13 @@ #include "OpenGLShims.h" #endif +#if USE(TEXTURE_MAPPER) +#include "TextureMapperGC3DPlatformLayer.h" +#endif + namespace WebCore { -PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attributes attributes, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle) +RefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3DAttributes attributes, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle) { // This implementation doesn't currently support rendering directly to the HostWindow. if (renderStyle == RenderDirectlyToHostWindow) @@ -73,24 +77,30 @@ PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attri if (!success) return 0; - RefPtr<GraphicsContext3D> context = adoptRef(new GraphicsContext3D(attributes, hostWindow, renderStyle)); - return context.release(); + return adoptRef(new GraphicsContext3D(attributes, hostWindow, renderStyle)); } -GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attributes, HostWindow*, GraphicsContext3D::RenderStyle renderStyle) +GraphicsContext3D::GraphicsContext3D(GraphicsContext3DAttributes attributes, HostWindow*, GraphicsContext3D::RenderStyle renderStyle) : m_currentWidth(0) , m_currentHeight(0) - , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT) , m_attrs(attributes) , m_texture(0) , m_compositorTexture(0) , m_fbo(0) - , m_depthStencilBuffer(0) +#if USE(COORDINATED_GRAPHICS_THREADED) + , m_intermediateTexture(0) +#endif + , m_layerComposited(false) , m_multisampleFBO(0) , m_multisampleDepthStencilBuffer(0) , m_multisampleColorBuffer(0) - , m_private(GraphicsContext3DPrivate::create(this, renderStyle)) { +#if USE(TEXTURE_MAPPER) + m_texmapLayer = std::make_unique<TextureMapperGC3DPlatformLayer>(*this, renderStyle); +#else + m_private = std::make_unique<GraphicsContext3DPrivate>(this, renderStyle); +#endif + makeContextCurrent(); validateAttributes(); @@ -109,9 +119,24 @@ GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attributes, H ::glGenFramebuffers(1, &m_fbo); ::glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); - m_state.boundFBO = m_fbo; - if (!m_attrs.antialias && (m_attrs.stencil || m_attrs.depth)) - ::glGenRenderbuffers(1, &m_depthStencilBuffer); +#if USE(COORDINATED_GRAPHICS_THREADED) + ::glGenTextures(1, &m_compositorTexture); + ::glBindTexture(GL_TEXTURE_2D, m_compositorTexture); + ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_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); + + ::glGenTextures(1, &m_intermediateTexture); + ::glBindTexture(GL_TEXTURE_2D, m_intermediateTexture); + ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_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); + + ::glBindTexture(GL_TEXTURE_2D, 0); +#endif + // Create a multisample FBO. if (m_attrs.antialias) { @@ -121,9 +146,51 @@ GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attributes, H ::glGenRenderbuffers(1, &m_multisampleColorBuffer); if (m_attrs.stencil || m_attrs.depth) ::glGenRenderbuffers(1, &m_multisampleDepthStencilBuffer); + } else { + // Bind canvas FBO. + glBindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo); + m_state.boundFBO = m_fbo; +#if USE(OPENGL_ES_2) + if (m_attrs.depth) + glGenRenderbuffers(1, &m_depthBuffer); + if (m_attrs.stencil) + glGenRenderbuffers(1, &m_stencilBuffer); +#endif + if (m_attrs.stencil || m_attrs.depth) + glGenRenderbuffers(1, &m_depthStencilBuffer); } } +#if !USE(OPENGL_ES_2) + ::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); + + if (GLContext::current()->version() >= 320) { + m_usingCoreProfile = true; + + // From version 3.2 on we use the OpenGL Core profile, so request that ouput to the shader compiler. + // OpenGL version 3.2 uses GLSL version 1.50. + m_compiler = ANGLEWebKitBridge(SH_GLSL_150_CORE_OUTPUT); + + // From version 3.2 on we use the OpenGL Core profile, and we need a VAO for rendering. + // A VAO could be created and bound by each component using GL rendering (TextureMapper, WebGL, etc). This is + // a simpler solution: the first GraphicsContext3D created on a GLContext will create and bind a VAO for that context. + GC3Dint currentVAO = 0; + getIntegerv(GraphicsContext3D::VERTEX_ARRAY_BINDING, ¤tVAO); + if (!currentVAO) { + m_vao = createVertexArray(); + bindVertexArray(m_vao); + } + } else { + // For lower versions request the compatibility output to the shader compiler. + m_compiler = ANGLEWebKitBridge(SH_GLSL_COMPATIBILITY_OUTPUT); + + // GL_POINT_SPRITE is needed in lower versions. + ::glEnable(GL_POINT_SPRITE); + } +#else + m_compiler = ANGLEWebKitBridge(SH_ESSL_OUTPUT); +#endif + // ANGLE initialization. ShBuiltInResources ANGLEResources; ShInitBuiltInResources(&ANGLEResources); @@ -145,18 +212,18 @@ GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attributes, H m_compiler.setResources(ANGLEResources); -#if !USE(OPENGL_ES_2) - ::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); - ::glEnable(GL_POINT_SPRITE); -#endif - ::glClearColor(0, 0, 0, 0); } GraphicsContext3D::~GraphicsContext3D() { +#if USE(TEXTURE_MAPPER) + if (m_texmapLayer->renderStyle() == RenderToCurrentGLContext) + return; +#else if (m_private->renderStyle() == RenderToCurrentGLContext) return; +#endif makeContextCurrent(); if (m_texture) @@ -169,11 +236,24 @@ GraphicsContext3D::~GraphicsContext3D() if (m_attrs.stencil || m_attrs.depth) ::glDeleteRenderbuffers(1, &m_multisampleDepthStencilBuffer); ::glDeleteFramebuffers(1, &m_multisampleFBO); - } else { - if (m_attrs.stencil || m_attrs.depth) + } else if (m_attrs.stencil || m_attrs.depth) { +#if USE(OPENGL_ES_2) + if (m_depthBuffer) + glDeleteRenderbuffers(1, &m_depthBuffer); + + if (m_stencilBuffer) + glDeleteRenderbuffers(1, &m_stencilBuffer); +#endif + if (m_depthStencilBuffer) ::glDeleteRenderbuffers(1, &m_depthStencilBuffer); } ::glDeleteFramebuffers(1, &m_fbo); +#if USE(COORDINATED_GRAPHICS_THREADED) + ::glDeleteTextures(1, &m_intermediateTexture); +#endif + + if (m_vao) + deleteVertexArray(m_vao); } GraphicsContext3D::ImageExtractor::~ImageExtractor() @@ -187,17 +267,21 @@ bool GraphicsContext3D::ImageExtractor::extractImage(bool premultiplyAlpha, bool if (!m_image) return false; // We need this to stay in scope because the native image is just a shallow copy of the data. - m_decoder = new ImageSource(premultiplyAlpha ? ImageSource::AlphaPremultiplied : ImageSource::AlphaNotPremultiplied, ignoreGammaAndColorProfile ? ImageSource::GammaAndColorProfileIgnored : ImageSource::GammaAndColorProfileApplied); + AlphaOption alphaOption = premultiplyAlpha ? AlphaOption::Premultiplied : AlphaOption::NotPremultiplied; + GammaAndColorProfileOption gammaAndColorProfileOption = ignoreGammaAndColorProfile ? GammaAndColorProfileOption::Ignored : GammaAndColorProfileOption::Applied; + m_decoder = new ImageSource(nullptr, alphaOption, gammaAndColorProfileOption); + if (!m_decoder) return false; - ImageSource& decoder = *m_decoder; + ImageSource& decoder = *m_decoder; m_alphaOp = AlphaDoNothing; + if (m_image->data()) { decoder.setData(m_image->data(), true); - if (!decoder.frameCount() || !decoder.frameIsCompleteAtIndex(0)) + if (!decoder.frameCount()) return false; - m_imageSurface = decoder.createFrameAtIndex(0); + m_imageSurface = decoder.createFrameImageAtIndex(0); } else { m_imageSurface = m_image->nativeImageForCurrentFrame(); // 1. For texImage2D with HTMLVideoElment input, assume no PremultiplyAlpha had been applied and the alpha value is 0xFF for each pixel, @@ -209,9 +293,10 @@ bool GraphicsContext3D::ImageExtractor::extractImage(bool premultiplyAlpha, bool // if m_imageSurface is not an image, extract a copy of the surface if (m_imageSurface && cairo_surface_get_type(m_imageSurface.get()) != CAIRO_SURFACE_TYPE_IMAGE) { - RefPtr<cairo_surface_t> tmpSurface = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, m_imageWidth, m_imageHeight)); - copyRectFromOneSurfaceToAnother(m_imageSurface.get(), tmpSurface.get(), IntSize(), IntRect(0, 0, m_imageWidth, m_imageHeight), IntSize(), CAIRO_OPERATOR_SOURCE); - m_imageSurface = tmpSurface.release(); + IntSize surfaceSize = cairoSurfaceSize(m_imageSurface.get()); + auto tmpSurface = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, surfaceSize.width(), surfaceSize.height())); + copyRectFromOneSurfaceToAnother(m_imageSurface.get(), tmpSurface.get(), IntSize(), IntRect(IntPoint(), surfaceSize), IntSize(), CAIRO_OPERATOR_SOURCE); + m_imageSurface = WTFMove(tmpSurface); } } @@ -272,24 +357,37 @@ void GraphicsContext3D::paintToCanvas(const unsigned char* imagePixels, int imag context->restore(); } -void GraphicsContext3D::setContextLostCallback(PassOwnPtr<ContextLostCallback>) +void GraphicsContext3D::setContextLostCallback(std::unique_ptr<ContextLostCallback>) { } -void GraphicsContext3D::setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>) +void GraphicsContext3D::setErrorMessageCallback(std::unique_ptr<ErrorMessageCallback>) { } bool GraphicsContext3D::makeContextCurrent() { - if (!m_private) - return false; - return m_private->makeContextCurrent(); +#if USE(TEXTURE_MAPPER) + if (m_texmapLayer) + return m_texmapLayer->makeContextCurrent(); +#else + if (m_private) + return m_private->makeContextCurrent(); +#endif + return false; +} + +void GraphicsContext3D::checkGPUStatusIfNecessary() +{ } PlatformGraphicsContext3D GraphicsContext3D::platformGraphicsContext3D() { +#if USE(TEXTURE_MAPPER) + return m_texmapLayer->platformContext(); +#else return m_private->platformContext(); +#endif } Platform3DObject GraphicsContext3D::platformTexture() const @@ -306,13 +404,33 @@ bool GraphicsContext3D::isGLES2Compliant() const #endif } -#if USE(ACCELERATED_COMPOSITING) PlatformLayer* GraphicsContext3D::platformLayer() const { +#if USE(TEXTURE_MAPPER) + return m_texmapLayer.get(); +#else return m_private.get(); +#endif +} + +#if PLATFORM(GTK) +Extensions3D& GraphicsContext3D::getExtensions() +{ + if (!m_extensions) { +#if USE(OPENGL_ES_2) + // glGetStringi is not available on GLES2. + m_extensions = std::make_unique<Extensions3DOpenGLES>(this, false); +#else + // From OpenGL 3.2 on we use the Core profile, and there we must use glGetStringi. + m_extensions = std::make_unique<Extensions3DOpenGL>(this, GLContext::current()->version() >= 320); +#endif + } + return *m_extensions; } #endif } // namespace WebCore -#endif // USE(3D_GRAPHICS) +#endif // ENABLE(GRAPHICS_CONTEXT_3D) + +#endif // USE(CAIRO) |