Index: Source/WebCore/platform/graphics/chromium/cc/CCVideoLayerImpl.cpp |
=================================================================== |
--- Source/WebCore/platform/graphics/chromium/cc/CCVideoLayerImpl.cpp (revision 122257) |
+++ Source/WebCore/platform/graphics/chromium/cc/CCVideoLayerImpl.cpp (working copy) |
@@ -31,7 +31,7 @@ |
#include "Extensions3DChromium.h" |
#include "GraphicsContext3D.h" |
-#include "LayerRendererChromium.h" |
+#include "LayerRendererChromium.h" // For GLC macro |
#include "LayerTextureSubImage.h" |
#include "NotImplemented.h" |
#include "ProgramBinding.h" |
@@ -75,7 +75,7 @@ |
m_provider->setVideoFrameProviderClient(0); |
m_provider = 0; |
} |
- freePlaneData(layerTreeHostImpl()->layerRenderer()); |
+ freePlaneData(layerTreeHostImpl()->context()); |
#if !ASSERT_DISABLED |
for (unsigned i = 0; i < WebKit::WebVideoFrame::maxPlanes; ++i) |
@@ -125,7 +125,7 @@ |
m_providerMutex.lock(); |
willDrawInternal(layerRenderer, context); |
- freeUnusedPlaneData(layerRenderer); |
+ freeUnusedPlaneData(context); |
if (!m_frame) |
m_providerMutex.unlock(); |
@@ -159,7 +159,7 @@ |
return; |
} |
- if (!allocatePlaneData(layerRenderer)) { |
+ if (!allocatePlaneData(layerRenderer, context)) { |
m_provider->putCurrentFrame(m_frame); |
m_frame = 0; |
return; |
@@ -282,25 +282,43 @@ |
return IntSize(visibleWidth, visibleHeight); |
} |
-bool CCVideoLayerImpl::FramePlane::allocateData(CCRenderer* layerRenderer) |
+bool CCVideoLayerImpl::FramePlane::allocateData(CCGraphicsContext* context) |
{ |
if (textureId) |
return true; |
- textureId = layerRenderer->contentsTextureAllocator()->createTexture(size, format); |
+ GraphicsContext3D* context3D = context->context3D(); |
+ if (!context3D) |
+ return false; |
+ |
+ GLC(context3D, textureId = context3D->createTexture()); |
+ GLC(context3D, context3D->bindTexture(GraphicsContext3D::TEXTURE_2D, textureId)); |
+ // Do basic linear filtering on resize. |
+ GLC(context3D, context3D->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR)); |
+ GLC(context3D, context3D->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR)); |
+ // NPOT textures in GL ES only work when the wrap mode is set to GraphicsContext3D::CLAMP_TO_EDGE. |
+ GLC(context3D, context3D->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE)); |
+ GLC(context3D, context3D->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE)); |
+ |
+ GLC(context3D, context3D->texImage2DResourceSafe(GraphicsContext3D::TEXTURE_2D, 0, format, size.width(), size.height(), 0, format, GraphicsContext3D::UNSIGNED_BYTE)); |
+ |
return textureId; |
} |
-void CCVideoLayerImpl::FramePlane::freeData(CCRenderer* layerRenderer) |
+void CCVideoLayerImpl::FramePlane::freeData(CCGraphicsContext* context) |
{ |
if (!textureId) |
return; |
- layerRenderer->contentsTextureAllocator()->deleteTexture(textureId, size, format); |
+ GraphicsContext3D* context3D = context->context3D(); |
+ if (!context3D) |
+ return; |
+ |
+ GLC(context3D, context3D->deleteTexture(textureId)); |
textureId = 0; |
} |
-bool CCVideoLayerImpl::allocatePlaneData(CCRenderer* layerRenderer) |
+bool CCVideoLayerImpl::allocatePlaneData(CCRenderer* layerRenderer, CCGraphicsContext* context) |
{ |
int maxTextureSize = layerRenderer->capabilities().maxTextureSize; |
for (unsigned planeIndex = 0; planeIndex < m_frame->planes(); ++planeIndex) { |
@@ -312,13 +330,13 @@ |
return false; |
if (plane.size != requiredTextureSize || plane.format != m_format) { |
- plane.freeData(layerRenderer); |
+ plane.freeData(context); |
plane.size = requiredTextureSize; |
plane.format = m_format; |
} |
if (!plane.textureId) { |
- if (!plane.allocateData(layerRenderer)) |
+ if (!plane.allocateData(context)) |
return false; |
plane.visibleSize = computeVisibleSize(*m_frame, planeIndex); |
} |
@@ -351,17 +369,17 @@ |
return true; |
} |
-void CCVideoLayerImpl::freePlaneData(CCRenderer* layerRenderer) |
+void CCVideoLayerImpl::freePlaneData(CCGraphicsContext* context) |
{ |
for (unsigned i = 0; i < WebKit::WebVideoFrame::maxPlanes; ++i) |
- m_framePlanes[i].freeData(layerRenderer); |
+ m_framePlanes[i].freeData(context); |
} |
-void CCVideoLayerImpl::freeUnusedPlaneData(CCRenderer* layerRenderer) |
+void CCVideoLayerImpl::freeUnusedPlaneData(CCGraphicsContext* context) |
{ |
unsigned firstUnusedPlane = m_frame ? m_frame->planes() : 0; |
for (unsigned i = firstUnusedPlane; i < WebKit::WebVideoFrame::maxPlanes; ++i) |
- m_framePlanes[i].freeData(layerRenderer); |
+ m_framePlanes[i].freeData(context); |
} |
void CCVideoLayerImpl::didReceiveFrame() |
@@ -381,7 +399,7 @@ |
void CCVideoLayerImpl::didLoseContext() |
{ |
- freePlaneData(layerTreeHostImpl()->layerRenderer()); |
+ freePlaneData(layerTreeHostImpl()->context()); |
} |
void CCVideoLayerImpl::setNeedsRedraw() |