| Index: Source/core/platform/chromium/support/GraphicsContext3DPrivate.cpp
|
| diff --git a/Source/core/platform/chromium/support/GraphicsContext3DPrivate.cpp b/Source/core/platform/chromium/support/GraphicsContext3DPrivate.cpp
|
| deleted file mode 100644
|
| index df84c7409a618217e08c3139e30903767b4b694f..0000000000000000000000000000000000000000
|
| --- a/Source/core/platform/chromium/support/GraphicsContext3DPrivate.cpp
|
| +++ /dev/null
|
| @@ -1,372 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2009 Google Inc. All rights reserved.
|
| - *
|
| - * 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.
|
| - * * Neither the name of Google Inc. nor the names of its
|
| - * contributors may be used to endorse or promote products derived from
|
| - * this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| - * "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 "core/platform/chromium/support/GraphicsContext3DPrivate.h"
|
| -
|
| -#include "GrContext.h"
|
| -#include "GrGLInterface.h"
|
| -#include "core/platform/graphics/Extensions3D.h"
|
| -#include "core/platform/graphics/GraphicsContext.h"
|
| -#include "core/platform/graphics/ImageBuffer.h"
|
| -#include "core/platform/graphics/gpu/DrawingBuffer.h"
|
| -#include <public/WebGraphicsContext3D.h>
|
| -#include <public/WebGraphicsContext3DProvider.h>
|
| -#include <public/WebGraphicsMemoryAllocation.h>
|
| -#include <wtf/text/CString.h>
|
| -#include <wtf/text/StringHash.h>
|
| -
|
| -namespace {
|
| -
|
| -// The limit of the number of textures we hold in the GrContext's bitmap->texture cache.
|
| -const int maxGaneshTextureCacheCount = 2048;
|
| -// The limit of the bytes allocated toward textures in the GrContext's bitmap->texture cache.
|
| -const size_t maxGaneshTextureCacheBytes = 96 * 1024 * 1024;
|
| -
|
| -}
|
| -
|
| -namespace WebCore {
|
| -
|
| -//----------------------------------------------------------------------
|
| -// GraphicsContext3DPrivate
|
| -
|
| -GraphicsContext3DPrivate::GraphicsContext3DPrivate(PassOwnPtr<WebKit::WebGraphicsContext3D> webContext, bool preserveDrawingBuffer)
|
| - : m_impl(webContext.get())
|
| - , m_ownedWebContext(webContext)
|
| - , m_initializedAvailableExtensions(false)
|
| - , m_layerComposited(false)
|
| - , m_preserveDrawingBuffer(preserveDrawingBuffer)
|
| - , m_resourceSafety(ResourceSafetyUnknown)
|
| - , m_grContext(0)
|
| -{
|
| -}
|
| -
|
| -GraphicsContext3DPrivate::GraphicsContext3DPrivate(PassOwnPtr<WebKit::WebGraphicsContext3DProvider> provider, bool preserveDrawingBuffer)
|
| - : m_provider(provider)
|
| - , m_impl(m_provider->context3d())
|
| - , m_initializedAvailableExtensions(false)
|
| - , m_layerComposited(false)
|
| - , m_preserveDrawingBuffer(preserveDrawingBuffer)
|
| - , m_resourceSafety(ResourceSafetyUnknown)
|
| - , m_grContext(m_provider->grContext())
|
| -{
|
| -}
|
| -
|
| -
|
| -GraphicsContext3DPrivate::~GraphicsContext3DPrivate()
|
| -{
|
| - if (m_ownedGrContext) {
|
| - m_ownedWebContext->setMemoryAllocationChangedCallbackCHROMIUM(0);
|
| - m_ownedGrContext->contextDestroyed();
|
| - }
|
| -}
|
| -
|
| -PassRefPtr<GraphicsContext3D> GraphicsContext3DPrivate::createGraphicsContextFromWebContext(PassOwnPtr<WebKit::WebGraphicsContext3D> webContext, bool preserveDrawingBuffer)
|
| -{
|
| - RefPtr<GraphicsContext3D> context = adoptRef(new GraphicsContext3D());
|
| -
|
| - OwnPtr<GraphicsContext3DPrivate> priv = adoptPtr(new GraphicsContext3DPrivate(webContext, preserveDrawingBuffer));
|
| - context->m_private = priv.release();
|
| - return context.release();
|
| -}
|
| -
|
| -PassRefPtr<GraphicsContext3D> GraphicsContext3DPrivate::createGraphicsContextFromProvider(PassOwnPtr<WebKit::WebGraphicsContext3DProvider> provider, bool preserveDrawingBuffer)
|
| -{
|
| - RefPtr<GraphicsContext3D> context = adoptRef(new GraphicsContext3D());
|
| -
|
| - OwnPtr<GraphicsContext3DPrivate> priv = adoptPtr(new GraphicsContext3DPrivate(provider, preserveDrawingBuffer));
|
| - context->m_private = priv.release();
|
| - return context.release();
|
| -}
|
| -
|
| -WebKit::WebGraphicsContext3D* GraphicsContext3DPrivate::extractWebGraphicsContext3D(GraphicsContext3D* context)
|
| -{
|
| - if (!context)
|
| - return 0;
|
| - return context->m_private->webContext();
|
| -}
|
| -
|
| -class GrMemoryAllocationChangedCallbackAdapter : public WebKit::WebGraphicsContext3D::WebGraphicsMemoryAllocationChangedCallbackCHROMIUM {
|
| -public:
|
| - GrMemoryAllocationChangedCallbackAdapter(GrContext* context)
|
| - : m_context(context)
|
| - {
|
| - }
|
| -
|
| - virtual void onMemoryAllocationChanged(WebKit::WebGraphicsMemoryAllocation allocation) OVERRIDE
|
| - {
|
| - if (!m_context)
|
| - return;
|
| -
|
| - if (!allocation.gpuResourceSizeInBytes) {
|
| - m_context->freeGpuResources();
|
| - m_context->setTextureCacheLimits(0, 0);
|
| - } else
|
| - m_context->setTextureCacheLimits(maxGaneshTextureCacheCount, maxGaneshTextureCacheBytes);
|
| - }
|
| -
|
| -private:
|
| - GrContext* m_context;
|
| -};
|
| -
|
| -namespace {
|
| -void bindWebGraphicsContext3DGLContextCallback(const GrGLInterface* interface)
|
| -{
|
| - reinterpret_cast<WebKit::WebGraphicsContext3D*>(interface->fCallbackData)->makeContextCurrent();
|
| -}
|
| -}
|
| -
|
| -GrContext* GraphicsContext3DPrivate::grContext()
|
| -{
|
| - if (m_grContext)
|
| - return m_grContext;
|
| - if (!m_ownedWebContext)
|
| - return 0;
|
| -
|
| - SkAutoTUnref<GrGLInterface> interface(m_ownedWebContext->createGrGLInterface());
|
| - if (!interface)
|
| - return 0;
|
| -
|
| - interface->fCallback = bindWebGraphicsContext3DGLContextCallback;
|
| - interface->fCallbackData = reinterpret_cast<GrGLInterfaceCallbackData>(m_ownedWebContext.get());
|
| -
|
| - m_ownedGrContext.reset(GrContext::Create(kOpenGL_GrBackend, reinterpret_cast<GrBackendContext>(interface.get())));
|
| - m_grContext = m_ownedGrContext;
|
| - if (!m_grContext)
|
| - return 0;
|
| -
|
| - m_grContext->setTextureCacheLimits(maxGaneshTextureCacheCount, maxGaneshTextureCacheBytes);
|
| - m_grContextMemoryAllocationCallbackAdapter = adoptPtr(new GrMemoryAllocationChangedCallbackAdapter(m_grContext));
|
| - m_ownedWebContext->setMemoryAllocationChangedCallbackCHROMIUM(m_grContextMemoryAllocationCallbackAdapter.get());
|
| -
|
| - return m_grContext;
|
| -}
|
| -
|
| -void GraphicsContext3DPrivate::markContextChanged()
|
| -{
|
| - m_layerComposited = false;
|
| -}
|
| -
|
| -bool GraphicsContext3DPrivate::layerComposited() const
|
| -{
|
| - return m_layerComposited;
|
| -}
|
| -
|
| -void GraphicsContext3DPrivate::markLayerComposited()
|
| -{
|
| - m_layerComposited = true;
|
| -}
|
| -
|
| -void GraphicsContext3DPrivate::paintFramebufferToCanvas(int framebuffer, int width, int height, bool premultiplyAlpha, ImageBuffer* imageBuffer)
|
| -{
|
| - unsigned char* pixels = 0;
|
| - size_t bufferSize = 4 * width * height;
|
| -
|
| - const SkBitmap* canvasBitmap = imageBuffer->context()->bitmap();
|
| - const SkBitmap* readbackBitmap = 0;
|
| - ASSERT(canvasBitmap->config() == SkBitmap::kARGB_8888_Config);
|
| - if (canvasBitmap->width() == width && canvasBitmap->height() == height) {
|
| - // This is the fastest and most common case. We read back
|
| - // directly into the canvas's backing store.
|
| - readbackBitmap = canvasBitmap;
|
| - m_resizingBitmap.reset();
|
| - } else {
|
| - // We need to allocate a temporary bitmap for reading back the
|
| - // pixel data. We will then use Skia to rescale this bitmap to
|
| - // the size of the canvas's backing store.
|
| - if (m_resizingBitmap.width() != width || m_resizingBitmap.height() != height) {
|
| - m_resizingBitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| - width,
|
| - height);
|
| - if (!m_resizingBitmap.allocPixels())
|
| - return;
|
| - }
|
| - readbackBitmap = &m_resizingBitmap;
|
| - }
|
| -
|
| - // Read back the frame buffer.
|
| - SkAutoLockPixels bitmapLock(*readbackBitmap);
|
| - pixels = static_cast<unsigned char*>(readbackBitmap->getPixels());
|
| -
|
| - m_impl->readBackFramebuffer(pixels, 4 * width * height, framebuffer, width, height);
|
| -
|
| - if (premultiplyAlpha) {
|
| - for (size_t i = 0; i < bufferSize; i += 4) {
|
| - pixels[i + 0] = std::min(255, pixels[i + 0] * pixels[i + 3] / 255);
|
| - pixels[i + 1] = std::min(255, pixels[i + 1] * pixels[i + 3] / 255);
|
| - pixels[i + 2] = std::min(255, pixels[i + 2] * pixels[i + 3] / 255);
|
| - }
|
| - }
|
| -
|
| - readbackBitmap->notifyPixelsChanged();
|
| - if (m_resizingBitmap.readyToDraw()) {
|
| - // We need to draw the resizing bitmap into the canvas's backing store.
|
| - SkCanvas canvas(*canvasBitmap);
|
| - SkRect dst;
|
| - dst.set(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(canvasBitmap->width()), SkIntToScalar(canvasBitmap->height()));
|
| - canvas.drawBitmapRect(m_resizingBitmap, 0, dst);
|
| - }
|
| -}
|
| -
|
| -class GraphicsContext3DContextLostCallbackAdapter : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback {
|
| -public:
|
| - GraphicsContext3DContextLostCallbackAdapter(PassOwnPtr<GraphicsContext3D::ContextLostCallback> callback)
|
| - : m_contextLostCallback(callback) { }
|
| - virtual ~GraphicsContext3DContextLostCallbackAdapter() { }
|
| -
|
| - virtual void onContextLost()
|
| - {
|
| - if (m_contextLostCallback)
|
| - m_contextLostCallback->onContextLost();
|
| - }
|
| -private:
|
| - OwnPtr<GraphicsContext3D::ContextLostCallback> m_contextLostCallback;
|
| -};
|
| -
|
| -void GraphicsContext3DPrivate::setContextLostCallback(PassOwnPtr<GraphicsContext3D::ContextLostCallback> callback)
|
| -{
|
| - if (m_ownedWebContext) {
|
| - m_contextLostCallbackAdapter = adoptPtr(new GraphicsContext3DContextLostCallbackAdapter(callback));
|
| - m_ownedWebContext->setContextLostCallback(m_contextLostCallbackAdapter.get());
|
| - }
|
| -}
|
| -
|
| -class GraphicsContext3DErrorMessageCallbackAdapter : public WebKit::WebGraphicsContext3D::WebGraphicsErrorMessageCallback {
|
| -public:
|
| - GraphicsContext3DErrorMessageCallbackAdapter(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback> callback)
|
| - : m_errorMessageCallback(callback) { }
|
| - virtual ~GraphicsContext3DErrorMessageCallbackAdapter() { }
|
| -
|
| - virtual void onErrorMessage(const WebKit::WebString& message, WebKit::WGC3Dint id)
|
| - {
|
| - if (m_errorMessageCallback)
|
| - m_errorMessageCallback->onErrorMessage(message, id);
|
| - }
|
| -private:
|
| - OwnPtr<GraphicsContext3D::ErrorMessageCallback> m_errorMessageCallback;
|
| -};
|
| -
|
| -void GraphicsContext3DPrivate::setErrorMessageCallback(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback> callback)
|
| -{
|
| - if (m_ownedWebContext) {
|
| - m_errorMessageCallbackAdapter = adoptPtr(new GraphicsContext3DErrorMessageCallbackAdapter(callback));
|
| - m_ownedWebContext->setErrorMessageCallback(m_errorMessageCallbackAdapter.get());
|
| - }
|
| -}
|
| -
|
| -Extensions3D* GraphicsContext3DPrivate::getExtensions()
|
| -{
|
| - if (!m_extensions)
|
| - m_extensions = adoptPtr(new Extensions3D(this));
|
| - return m_extensions.get();
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -void splitStringHelper(const String& str, HashSet<String>& set)
|
| -{
|
| - Vector<String> substrings;
|
| - str.split(" ", substrings);
|
| - for (size_t i = 0; i < substrings.size(); ++i)
|
| - set.add(substrings[i]);
|
| -}
|
| -
|
| -String mapExtensionName(const String& name)
|
| -{
|
| - if (name == "GL_ANGLE_framebuffer_blit"
|
| - || name == "GL_ANGLE_framebuffer_multisample")
|
| - return "GL_CHROMIUM_framebuffer_multisample";
|
| - return name;
|
| -}
|
| -
|
| -} // anonymous namespace
|
| -
|
| -void GraphicsContext3DPrivate::initializeExtensions()
|
| -{
|
| - if (m_initializedAvailableExtensions)
|
| - return;
|
| -
|
| - m_initializedAvailableExtensions = true;
|
| - bool success = m_impl->makeContextCurrent();
|
| - ASSERT(success);
|
| - if (!success)
|
| - return;
|
| -
|
| - String extensionsString = m_impl->getString(GraphicsContext3D::EXTENSIONS);
|
| - splitStringHelper(extensionsString, m_enabledExtensions);
|
| -
|
| - String requestableExtensionsString = m_impl->getRequestableExtensionsCHROMIUM();
|
| - splitStringHelper(requestableExtensionsString, m_requestableExtensions);
|
| -}
|
| -
|
| -
|
| -bool GraphicsContext3DPrivate::supportsExtension(const String& name)
|
| -{
|
| - initializeExtensions();
|
| - String mappedName = mapExtensionName(name);
|
| - return m_enabledExtensions.contains(mappedName) || m_requestableExtensions.contains(mappedName);
|
| -}
|
| -
|
| -bool GraphicsContext3DPrivate::ensureExtensionEnabled(const String& name)
|
| -{
|
| - initializeExtensions();
|
| -
|
| - String mappedName = mapExtensionName(name);
|
| - if (m_enabledExtensions.contains(mappedName))
|
| - return true;
|
| -
|
| - if (m_requestableExtensions.contains(mappedName)) {
|
| - m_impl->requestExtensionCHROMIUM(mappedName.ascii().data());
|
| - m_enabledExtensions.clear();
|
| - m_requestableExtensions.clear();
|
| - m_initializedAvailableExtensions = false;
|
| - }
|
| -
|
| - initializeExtensions();
|
| - return m_enabledExtensions.contains(mappedName);
|
| -}
|
| -
|
| -bool GraphicsContext3DPrivate::isExtensionEnabled(const String& name)
|
| -{
|
| - initializeExtensions();
|
| - String mappedName = mapExtensionName(name);
|
| - return m_enabledExtensions.contains(mappedName);
|
| -}
|
| -
|
| -
|
| -bool GraphicsContext3DPrivate::isResourceSafe()
|
| -{
|
| - if (m_resourceSafety == ResourceSafetyUnknown)
|
| - m_resourceSafety = getExtensions()->isEnabled("GL_CHROMIUM_resource_safe") ? ResourceSafe : ResourceUnsafe;
|
| - return m_resourceSafety == ResourceSafe;
|
| -}
|
| -
|
| -} // namespace WebCore
|
|
|