Index: cc/gl_renderer.cc |
diff --git a/cc/gl_renderer.cc b/cc/gl_renderer.cc |
index 3b1cec7292e30150f51b7dd6f60ed4e50520ff1d..c2e6a31f88e315d2e8ac68833d7ad5f301e19445 100644 |
--- a/cc/gl_renderer.cc |
+++ b/cc/gl_renderer.cc |
@@ -18,6 +18,7 @@ |
#include "cc/damage_tracker.h" |
#include "cc/geometry_binding.h" |
#include "cc/gl_frame_data.h" |
+#include "cc/grcontext_provider.h" |
#include "cc/layer_quad.h" |
#include "cc/math_util.h" |
#include "cc/priority_calculator.h" |
@@ -31,7 +32,6 @@ |
#include "cc/video_layer_impl.h" |
#include "gpu/GLES2/gl2extchromium.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" |
-#include "third_party/WebKit/Source/Platform/chromium/public/WebSharedGraphicsContext3D.h" |
#include "third_party/khronos/GLES2/gl2.h" |
#include "third_party/khronos/GLES2/gl2ext.h" |
#include "third_party/skia/include/core/SkBitmap.h" |
@@ -45,7 +45,6 @@ |
using WebKit::WebGraphicsContext3D; |
using WebKit::WebGraphicsMemoryAllocation; |
-using WebKit::WebSharedGraphicsContext3D; |
namespace cc { |
@@ -155,6 +154,8 @@ bool GLRenderer::initialize() |
// so we only need to avoid POT textures if we have an NPOT fast-path. |
m_capabilities.avoidPow2Textures = extensions.count("GL_CHROMIUM_fast_NPOT_MO8_textures"); |
+ m_capabilities.usingOffscreenContext3d = true; |
+ |
m_isUsingBindUniform = extensions.count("GL_CHROMIUM_bind_uniform_location"); |
// Make sure scissoring starts as disabled. |
@@ -372,67 +373,52 @@ void GLRenderer::drawDebugBorderQuad(const DrawingFrame& frame, const DebugBorde |
GLC(context(), context()->drawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0)); |
} |
-static WebGraphicsContext3D* getFilterContext(bool hasImplThread) |
-{ |
- if (hasImplThread) |
- return WebSharedGraphicsContext3D::compositorThreadContext(); |
- else |
- return WebSharedGraphicsContext3D::mainThreadContext(); |
-} |
- |
-static GrContext* getFilterGrContext(bool hasImplThread) |
-{ |
- if (hasImplThread) |
- return WebSharedGraphicsContext3D::compositorThreadGrContext(); |
- else |
- return WebSharedGraphicsContext3D::mainThreadGrContext(); |
-} |
- |
-static inline SkBitmap applyFilters(GLRenderer* renderer, const WebKit::WebFilterOperations& filters, ScopedResource* sourceTexture, bool hasImplThread) |
+static inline SkBitmap applyFilters(GLRenderer* renderer, const WebKit::WebFilterOperations& filters, ScopedResource* sourceTextureResource) |
{ |
if (filters.isEmpty()) |
return SkBitmap(); |
- WebGraphicsContext3D* filterContext = getFilterContext(hasImplThread); |
- GrContext* filterGrContext = getFilterGrContext(hasImplThread); |
- |
- if (!filterContext || !filterGrContext) |
+ GrContextProvider* offscreenContexts = renderer->resourceProvider()->offscreenContextProvider(); |
+ if (!offscreenContexts->has_contexts()) |
return SkBitmap(); |
- renderer->context()->flush(); |
+ ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceTextureResource->id()); |
- ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceTexture->id()); |
- SkBitmap source = RenderSurfaceFilters::apply(filters, lock.textureId(), sourceTexture->size(), filterContext, filterGrContext); |
+ // Do this after locking/creating the compositor texture. |
+ offscreenContexts->BeginUsingContexts(); |
+ |
+ SkBitmap source = RenderSurfaceFilters::apply(filters, lock.textureId(), sourceTextureResource->size(), offscreenContexts->gr_context()); |
+ |
+ offscreenContexts->FinishUsingContexts(); |
return source; |
} |
-static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, ScopedResource* sourceTexture, bool hasImplThread) |
+static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, ScopedResource* sourceTextureResource) |
{ |
if (!filter) |
return SkBitmap(); |
- WebGraphicsContext3D* context3d = getFilterContext(hasImplThread); |
- GrContext* grContext = getFilterGrContext(hasImplThread); |
- |
- if (!context3d || !grContext) |
+ GrContextProvider* offscreenContexts = renderer->resourceProvider()->offscreenContextProvider(); |
+ if (!offscreenContexts->has_contexts()) |
return SkBitmap(); |
- renderer->context()->flush(); |
+ ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceTextureResource->id()); |
- ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceTexture->id()); |
+ // Do this after locking/creating the compositor texture. |
+ offscreenContexts->BeginUsingContexts(); |
Stephen White
2013/02/13 15:26:06
This is still somewhat mysterious to someone who d
|
// Wrap the source texture in a Ganesh platform texture. |
GrBackendTextureDesc backendTextureDescription; |
- backendTextureDescription.fWidth = sourceTexture->size().width(); |
- backendTextureDescription.fHeight = sourceTexture->size().height(); |
+ backendTextureDescription.fWidth = sourceTextureResource->size().width(); |
+ backendTextureDescription.fHeight = sourceTextureResource->size().height(); |
backendTextureDescription.fConfig = kSkia8888_GrPixelConfig; |
backendTextureDescription.fTextureHandle = lock.textureId(); |
backendTextureDescription.fOrigin = kTopLeft_GrSurfaceOrigin; |
- skia::RefPtr<GrTexture> texture = skia::AdoptRef(grContext->wrapBackendTexture(backendTextureDescription)); |
+ skia::RefPtr<GrTexture> texture = skia::AdoptRef(offscreenContexts->gr_context()->wrapBackendTexture(backendTextureDescription)); |
// Place the platform texture inside an SkBitmap. |
SkBitmap source; |
- source.setConfig(SkBitmap::kARGB_8888_Config, sourceTexture->size().width(), sourceTexture->size().height()); |
+ source.setConfig(SkBitmap::kARGB_8888_Config, sourceTextureResource->size().width(), sourceTextureResource->size().height()); |
skia::RefPtr<SkGrPixelRef> pixelRef = skia::AdoptRef(new SkGrPixelRef(texture.get())); |
source.setPixelRef(pixelRef.get()); |
@@ -444,11 +430,11 @@ static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, Sc |
desc.fHeight = source.height(); |
desc.fConfig = kSkia8888_GrPixelConfig; |
desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
- GrAutoScratchTexture scratchTexture(grContext, desc, GrContext::kExact_ScratchTexMatch); |
+ GrAutoScratchTexture scratchTexture(offscreenContexts->gr_context(), desc, GrContext::kExact_ScratchTexMatch); |
skia::RefPtr<GrTexture> backingStore = skia::AdoptRef(scratchTexture.detach()); |
// Create a device and canvas using that backing store. |
- SkGpuDevice device(grContext, backingStore.get()); |
+ SkGpuDevice device(offscreenContexts->gr_context(), backingStore.get()); |
SkCanvas canvas(&device); |
// Draw the source bitmap through the filter to the canvas. |
@@ -456,8 +442,7 @@ static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, Sc |
paint.setImageFilter(filter); |
canvas.clear(0x0); |
canvas.drawSprite(source, 0, 0, &paint); |
- canvas.flush(); |
- context3d->flush(); |
+ offscreenContexts->FinishUsingContexts(); |
return device.accessBitmap(false); |
} |
@@ -505,7 +490,7 @@ scoped_ptr<ScopedResource> GLRenderer::drawBackgroundFilters( |
if (!getFramebufferTexture(deviceBackgroundTexture.get(), deviceRect)) |
return scoped_ptr<ScopedResource>(); |
- SkBitmap filteredDeviceBackground = applyFilters(this, filters, deviceBackgroundTexture.get(), m_client->hasImplThread()); |
+ SkBitmap filteredDeviceBackground = applyFilters(this, filters, deviceBackgroundTexture.get()); |
if (!filteredDeviceBackground.getTexture()) |
return scoped_ptr<ScopedResource>(); |
@@ -558,9 +543,9 @@ void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua |
// Apply filters to the contents texture. |
SkBitmap filterBitmap; |
if (quad->filter) { |
- filterBitmap = applyImageFilter(this, quad->filter.get(), contentsTexture, m_client->hasImplThread()); |
+ filterBitmap = applyImageFilter(this, quad->filter.get(), contentsTexture); |
} else { |
- filterBitmap = applyFilters(this, quad->filters, contentsTexture, m_client->hasImplThread()); |
+ filterBitmap = applyFilters(this, quad->filters, contentsTexture); |
} |
// Draw the background texture if there is one. |