Index: cc/gl_renderer.cc |
diff --git a/cc/gl_renderer.cc b/cc/gl_renderer.cc |
index 1b48615a12c70d9a905a4ed3b9166bb1fac04cf0..57d23357149e9e28b6d7c98d58fcdb068ce46527 100644 |
--- a/cc/gl_renderer.cc |
+++ b/cc/gl_renderer.cc |
@@ -16,6 +16,7 @@ |
#include "cc/compositor_frame.h" |
#include "cc/compositor_frame_metadata.h" |
#include "cc/damage_tracker.h" |
+#include "cc/ganesh_resource_provider.h" |
#include "cc/geometry_binding.h" |
#include "cc/gl_frame_data.h" |
#include "cc/layer_quad.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 { |
@@ -150,6 +149,8 @@ bool GLRenderer::initialize() |
// The updater can access textures while the GLRenderer is using them. |
m_capabilities.allowPartialTextureUpdates = true; |
+ m_capabilities.usingOffscreenContext3d = true; |
+ |
m_isUsingBindUniform = extensions.count("GL_CHROMIUM_bind_uniform_location"); |
// Make sure scissoring starts as disabled. |
@@ -367,67 +368,45 @@ 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* sourceResource) |
{ |
if (filters.isEmpty()) |
return SkBitmap(); |
- WebGraphicsContext3D* filterContext = getFilterContext(hasImplThread); |
- GrContext* filterGrContext = getFilterGrContext(hasImplThread); |
- |
- if (!filterContext || !filterGrContext) |
+ if (!renderer->resourceProvider()->ganeshResourceProvider()->has_contexts()) |
return SkBitmap(); |
- renderer->context()->flush(); |
- |
- ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceTexture->id()); |
- SkBitmap source = RenderSurfaceFilters::apply(filters, lock.textureId(), sourceTexture->size(), filterContext, filterGrContext); |
+ ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceResource->id()); |
+ GaneshResourceProvider::ScopedContextsFlushed ganeshContexts(renderer->resourceProvider(), renderer->resourceProvider()->ganeshResourceProvider()); |
+ SkBitmap source = RenderSurfaceFilters::apply(filters, lock.textureId(), sourceResource->size(), ganeshContexts.gr_context()); |
return source; |
} |
-static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, ScopedResource* sourceTexture, bool hasImplThread) |
+static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, ScopedResource* sourceResource) |
{ |
if (!filter) |
return SkBitmap(); |
- WebGraphicsContext3D* context3d = getFilterContext(hasImplThread); |
- GrContext* grContext = getFilterGrContext(hasImplThread); |
- |
- if (!context3d || !grContext) |
+ if (!renderer->resourceProvider()->ganeshResourceProvider()->has_contexts()) |
return SkBitmap(); |
- renderer->context()->flush(); |
+ ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceResource->id()); |
- ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourceTexture->id()); |
+ // Flush after locking the resource on the compositor context. |
+ GaneshResourceProvider::ScopedContextsFlushed ganeshContexts(renderer->resourceProvider(), renderer->resourceProvider()->ganeshResourceProvider()); |
// Wrap the source texture in a Ganesh platform texture. |
GrBackendTextureDesc backendTextureDescription; |
- backendTextureDescription.fWidth = sourceTexture->size().width(); |
- backendTextureDescription.fHeight = sourceTexture->size().height(); |
+ backendTextureDescription.fWidth = sourceResource->size().width(); |
+ backendTextureDescription.fHeight = sourceResource->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(ganeshContexts.gr_context()->createPlatformTexture(backendTextureDescription)); |
piman
2013/02/11 18:45:33
Is the s/wrapBackendTexture/createPlatformTexture/
danakj
2013/02/11 18:58:13
Done. This code changed and unchanged a lot, I thi
|
// 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, sourceResource->size().width(), sourceResource->size().height()); |
skia::RefPtr<SkGrPixelRef> pixelRef = skia::AdoptRef(new SkGrPixelRef(texture.get())); |
source.setPixelRef(pixelRef.get()); |
@@ -439,11 +418,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(ganeshContexts.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(ganeshContexts.gr_context(), backingStore.get()); |
SkCanvas canvas(&device); |
// Draw the source bitmap through the filter to the canvas. |
@@ -451,8 +430,6 @@ static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, Sc |
paint.setImageFilter(filter); |
canvas.clear(0x0); |
canvas.drawSprite(source, 0, 0, &paint); |
- canvas.flush(); |
- context3d->flush(); |
return device.accessBitmap(false); |
} |
@@ -500,7 +477,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>(); |
@@ -553,9 +530,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. |