OLD | NEW |
1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "cc/gl_renderer.h" | 7 #include "cc/gl_renderer.h" |
8 | 8 |
9 #include "CCDamageTracker.h" | 9 #include "CCDamageTracker.h" |
10 #include "CCLayerQuad.h" | 10 #include "CCLayerQuad.h" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 m_capabilities.usingAcceleratedPainting = true; | 103 m_capabilities.usingAcceleratedPainting = true; |
104 else | 104 else |
105 m_capabilities.usingAcceleratedPainting = false; | 105 m_capabilities.usingAcceleratedPainting = false; |
106 | 106 |
107 | 107 |
108 m_capabilities.contextHasCachedFrontBuffer = extensions.count("GL_CHROMIUM_f
ront_buffer_cached"); | 108 m_capabilities.contextHasCachedFrontBuffer = extensions.count("GL_CHROMIUM_f
ront_buffer_cached"); |
109 | 109 |
110 m_capabilities.usingPartialSwap = Settings::partialSwapEnabled() && extensio
ns.count("GL_CHROMIUM_post_sub_buffer"); | 110 m_capabilities.usingPartialSwap = Settings::partialSwapEnabled() && extensio
ns.count("GL_CHROMIUM_post_sub_buffer"); |
111 | 111 |
112 // Use the swapBuffers callback only with the threaded proxy. | 112 // Use the swapBuffers callback only with the threaded proxy. |
113 if (CCProxy::hasImplThread()) | 113 if (m_proxy->hasImplThread()) |
114 m_capabilities.usingSwapCompleteCallback = extensions.count("GL_CHROMIUM
_swapbuffers_complete_callback"); | 114 m_capabilities.usingSwapCompleteCallback = extensions.count("GL_CHROMIUM
_swapbuffers_complete_callback"); |
115 if (m_capabilities.usingSwapCompleteCallback) | 115 if (m_capabilities.usingSwapCompleteCallback) |
116 m_context->setSwapBuffersCompleteCallbackCHROMIUM(this); | 116 m_context->setSwapBuffersCompleteCallbackCHROMIUM(this); |
117 | 117 |
118 m_capabilities.usingSetVisibility = extensions.count("GL_CHROMIUM_set_visibi
lity"); | 118 m_capabilities.usingSetVisibility = extensions.count("GL_CHROMIUM_set_visibi
lity"); |
119 | 119 |
120 if (extensions.count("GL_CHROMIUM_iosurface")) | 120 if (extensions.count("GL_CHROMIUM_iosurface")) |
121 DCHECK(extensions.count("GL_ARB_texture_rectangle")); | 121 DCHECK(extensions.count("GL_ARB_texture_rectangle")); |
122 | 122 |
123 m_capabilities.usingGpuMemoryManager = extensions.count("GL_CHROMIUM_gpu_mem
ory_manager"); | 123 m_capabilities.usingGpuMemoryManager = extensions.count("GL_CHROMIUM_gpu_mem
ory_manager"); |
(...skipping 12 matching lines...) Expand all Loading... |
136 if (!initializeSharedObjects()) | 136 if (!initializeSharedObjects()) |
137 return false; | 137 return false; |
138 | 138 |
139 // Make sure the viewport and context gets initialized, even if it is to zer
o. | 139 // Make sure the viewport and context gets initialized, even if it is to zer
o. |
140 viewportChanged(); | 140 viewportChanged(); |
141 return true; | 141 return true; |
142 } | 142 } |
143 | 143 |
144 CCRendererGL::~CCRendererGL() | 144 CCRendererGL::~CCRendererGL() |
145 { | 145 { |
146 DCHECK(CCProxy::isImplThread()); | 146 DCHECK(m_proxy->isImplThread()); |
147 m_context->setSwapBuffersCompleteCallbackCHROMIUM(0); | 147 m_context->setSwapBuffersCompleteCallbackCHROMIUM(0); |
148 m_context->setMemoryAllocationChangedCallbackCHROMIUM(0); | 148 m_context->setMemoryAllocationChangedCallbackCHROMIUM(0); |
149 m_context->setContextLostCallback(0); | 149 m_context->setContextLostCallback(0); |
150 cleanupSharedObjects(); | 150 cleanupSharedObjects(); |
151 } | 151 } |
152 | 152 |
153 const RendererCapabilities& CCRendererGL::capabilities() const | 153 const RendererCapabilities& CCRendererGL::capabilities() const |
154 { | 154 { |
155 return m_capabilities; | 155 return m_capabilities; |
156 } | 156 } |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 | 329 |
330 // The indices for the line are stored in the same array as the triangle ind
ices. | 330 // The indices for the line are stored in the same array as the triangle ind
ices. |
331 GLC(context(), context()->drawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 6
* sizeof(unsigned short))); | 331 GLC(context(), context()->drawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 6
* sizeof(unsigned short))); |
332 } | 332 } |
333 | 333 |
334 static inline SkBitmap applyFilters(CCRendererGL* renderer, const WebKit::WebFil
terOperations& filters, CCScopedTexture* sourceTexture) | 334 static inline SkBitmap applyFilters(CCRendererGL* renderer, const WebKit::WebFil
terOperations& filters, CCScopedTexture* sourceTexture) |
335 { | 335 { |
336 if (filters.isEmpty()) | 336 if (filters.isEmpty()) |
337 return SkBitmap(); | 337 return SkBitmap(); |
338 | 338 |
339 WebGraphicsContext3D* filterContext = CCProxy::hasImplThread() ? WebSharedGr
aphicsContext3D::compositorThreadContext() : WebSharedGraphicsContext3D::mainThr
eadContext(); | 339 bool hasImplThread = renderer->resourceProvider()->proxy()->hasImplThread(); |
340 GrContext* filterGrContext = CCProxy::hasImplThread() ? WebSharedGraphicsCon
text3D::compositorThreadGrContext() : WebSharedGraphicsContext3D::mainThreadGrCo
ntext(); | 340 WebGraphicsContext3D* filterContext = hasImplThread ? WebSharedGraphicsConte
xt3D::compositorThreadContext() : WebSharedGraphicsContext3D::mainThreadContext(
); |
| 341 GrContext* filterGrContext = hasImplThread ? WebSharedGraphicsContext3D::com
positorThreadGrContext() : WebSharedGraphicsContext3D::mainThreadGrContext(); |
341 | 342 |
342 if (!filterContext || !filterGrContext) | 343 if (!filterContext || !filterGrContext) |
343 return SkBitmap(); | 344 return SkBitmap(); |
344 | 345 |
345 renderer->context()->flush(); | 346 renderer->context()->flush(); |
346 | 347 |
347 CCResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sou
rceTexture->id()); | 348 CCResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sou
rceTexture->id()); |
348 SkBitmap source = CCRenderSurfaceFilters::apply(filters, lock.textureId(), s
ourceTexture->size(), filterContext, filterGrContext); | 349 SkBitmap source = CCRenderSurfaceFilters::apply(filters, lock.textureId(), s
ourceTexture->size(), filterContext, filterGrContext); |
349 return source; | 350 return source; |
350 } | 351 } |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 template<class Program> void set(Program* program) | 865 template<class Program> void set(Program* program) |
865 { | 866 { |
866 TextureProgramBinding::set(program); | 867 TextureProgramBinding::set(program); |
867 texTransformLocation = program->vertexShader().texTransformLocation(); | 868 texTransformLocation = program->vertexShader().texTransformLocation(); |
868 } | 869 } |
869 int texTransformLocation; | 870 int texTransformLocation; |
870 }; | 871 }; |
871 | 872 |
872 void CCRendererGL::drawTextureQuad(const DrawingFrame& frame, const CCTextureDra
wQuad* quad) | 873 void CCRendererGL::drawTextureQuad(const DrawingFrame& frame, const CCTextureDra
wQuad* quad) |
873 { | 874 { |
874 DCHECK(CCProxy::isImplThread()); | 875 DCHECK(m_proxy->isImplThread()); |
875 | 876 |
876 TexTransformTextureProgramBinding binding; | 877 TexTransformTextureProgramBinding binding; |
877 if (quad->flipped()) | 878 if (quad->flipped()) |
878 binding.set(textureProgramFlip()); | 879 binding.set(textureProgramFlip()); |
879 else | 880 else |
880 binding.set(textureProgram()); | 881 binding.set(textureProgram()); |
881 GLC(context(), context()->useProgram(binding.programId)); | 882 GLC(context(), context()->useProgram(binding.programId)); |
882 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); | 883 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); |
883 const gfx::RectF& uvRect = quad->uvRect(); | 884 const gfx::RectF& uvRect = quad->uvRect(); |
884 GLC(context(), context()->uniform4f(binding.texTransformLocation, uvRect.x()
, uvRect.y(), uvRect.width(), uvRect.height())); | 885 GLC(context(), context()->uniform4f(binding.texTransformLocation, uvRect.x()
, uvRect.y(), uvRect.width(), uvRect.height())); |
(...skipping 23 matching lines...) Expand all Loading... |
908 | 909 |
909 setShaderOpacity(quad->opacity(), binding.alphaLocation); | 910 setShaderOpacity(quad->opacity(), binding.alphaLocation); |
910 drawQuadGeometry(frame, quad->quadTransform(), quad->quadRect(), binding.mat
rixLocation); | 911 drawQuadGeometry(frame, quad->quadTransform(), quad->quadRect(), binding.mat
rixLocation); |
911 | 912 |
912 if (!quad->premultipliedAlpha()) | 913 if (!quad->premultipliedAlpha()) |
913 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 914 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
914 } | 915 } |
915 | 916 |
916 void CCRendererGL::drawIOSurfaceQuad(const DrawingFrame& frame, const CCIOSurfac
eDrawQuad* quad) | 917 void CCRendererGL::drawIOSurfaceQuad(const DrawingFrame& frame, const CCIOSurfac
eDrawQuad* quad) |
917 { | 918 { |
918 DCHECK(CCProxy::isImplThread()); | 919 DCHECK(m_proxy->isImplThread()); |
919 TexTransformTextureProgramBinding binding; | 920 TexTransformTextureProgramBinding binding; |
920 binding.set(textureIOSurfaceProgram()); | 921 binding.set(textureIOSurfaceProgram()); |
921 | 922 |
922 GLC(context(), context()->useProgram(binding.programId)); | 923 GLC(context(), context()->useProgram(binding.programId)); |
923 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); | 924 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); |
924 if (quad->orientation() == CCIOSurfaceDrawQuad::Flipped) | 925 if (quad->orientation() == CCIOSurfaceDrawQuad::Flipped) |
925 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, qua
d->ioSurfaceSize().height(), quad->ioSurfaceSize().width(), quad->ioSurfaceSize(
).height() * -1.0)); | 926 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, qua
d->ioSurfaceSize().height(), quad->ioSurfaceSize().width(), quad->ioSurfaceSize(
).height() * -1.0)); |
926 else | 927 else |
927 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, 0,
quad->ioSurfaceSize().width(), quad->ioSurfaceSize().height())); | 928 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, 0,
quad->ioSurfaceSize().width(), quad->ioSurfaceSize().height())); |
928 | 929 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 } | 1052 } |
1052 | 1053 |
1053 void CCRendererGL::onSwapBuffersComplete() | 1054 void CCRendererGL::onSwapBuffersComplete() |
1054 { | 1055 { |
1055 m_client->onSwapBuffersComplete(); | 1056 m_client->onSwapBuffersComplete(); |
1056 } | 1057 } |
1057 | 1058 |
1058 void CCRendererGL::onMemoryAllocationChanged(WebGraphicsMemoryAllocation allocat
ion) | 1059 void CCRendererGL::onMemoryAllocationChanged(WebGraphicsMemoryAllocation allocat
ion) |
1059 { | 1060 { |
1060 // FIXME: This is called on the main thread in single threaded mode, but we
expect it on the impl thread. | 1061 // FIXME: This is called on the main thread in single threaded mode, but we
expect it on the impl thread. |
1061 if (!CCProxy::hasImplThread()) { | 1062 if (!m_proxy->hasImplThread()) { |
1062 DCHECK(CCProxy::isMainThread()); | 1063 DCHECK(m_proxy->isMainThread()); |
1063 DebugScopedSetImplThread impl; | 1064 DebugScopedSetImplThread impl; |
1064 onMemoryAllocationChangedOnImplThread(allocation); | 1065 onMemoryAllocationChangedOnImplThread(allocation); |
1065 } else { | 1066 } else { |
1066 DCHECK(CCProxy::isImplThread()); | 1067 DCHECK(m_proxy->isImplThread()); |
1067 onMemoryAllocationChangedOnImplThread(allocation); | 1068 onMemoryAllocationChangedOnImplThread(allocation); |
1068 } | 1069 } |
1069 } | 1070 } |
1070 | 1071 |
1071 void CCRendererGL::onMemoryAllocationChangedOnImplThread(WebKit::WebGraphicsMemo
ryAllocation allocation) | 1072 void CCRendererGL::onMemoryAllocationChangedOnImplThread(WebKit::WebGraphicsMemo
ryAllocation allocation) |
1072 { | 1073 { |
1073 m_discardFramebufferWhenNotVisible = !allocation.suggestHaveBackbuffer; | 1074 m_discardFramebufferWhenNotVisible = !allocation.suggestHaveBackbuffer; |
1074 // Just ignore the memory manager when it says to set the limit to zero | 1075 // Just ignore the memory manager when it says to set the limit to zero |
1075 // bytes. This will happen when the memory manager thinks that the renderer | 1076 // bytes. This will happen when the memory manager thinks that the renderer |
1076 // is not visible (which the renderer knows better). | 1077 // is not visible (which the renderer knows better). |
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1513 | 1514 |
1514 releaseRenderPassTextures(); | 1515 releaseRenderPassTextures(); |
1515 } | 1516 } |
1516 | 1517 |
1517 bool CCRendererGL::isContextLost() | 1518 bool CCRendererGL::isContextLost() |
1518 { | 1519 { |
1519 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); | 1520 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); |
1520 } | 1521 } |
1521 | 1522 |
1522 } // namespace cc | 1523 } // namespace cc |
OLD | NEW |