| 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 "FloatQuad.h" | 9 #include "FloatQuad.h" |
| 10 #include "NotImplemented.h" | 10 #include "NotImplemented.h" |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 m_capabilities.usingAcceleratedPainting = true; | 105 m_capabilities.usingAcceleratedPainting = true; |
| 106 else | 106 else |
| 107 m_capabilities.usingAcceleratedPainting = false; | 107 m_capabilities.usingAcceleratedPainting = false; |
| 108 | 108 |
| 109 | 109 |
| 110 m_capabilities.contextHasCachedFrontBuffer = extensions.count("GL_CHROMIUM_f
ront_buffer_cached"); | 110 m_capabilities.contextHasCachedFrontBuffer = extensions.count("GL_CHROMIUM_f
ront_buffer_cached"); |
| 111 | 111 |
| 112 m_capabilities.usingPartialSwap = Settings::partialSwapEnabled() && extensio
ns.count("GL_CHROMIUM_post_sub_buffer"); | 112 m_capabilities.usingPartialSwap = Settings::partialSwapEnabled() && extensio
ns.count("GL_CHROMIUM_post_sub_buffer"); |
| 113 | 113 |
| 114 // Use the swapBuffers callback only with the threaded proxy. | 114 // Use the swapBuffers callback only with the threaded proxy. |
| 115 if (Proxy::hasImplThread()) | 115 if (m_client->hasImplThread()) |
| 116 m_capabilities.usingSwapCompleteCallback = extensions.count("GL_CHROMIUM
_swapbuffers_complete_callback"); | 116 m_capabilities.usingSwapCompleteCallback = extensions.count("GL_CHROMIUM
_swapbuffers_complete_callback"); |
| 117 if (m_capabilities.usingSwapCompleteCallback) | 117 if (m_capabilities.usingSwapCompleteCallback) |
| 118 m_context->setSwapBuffersCompleteCallbackCHROMIUM(this); | 118 m_context->setSwapBuffersCompleteCallbackCHROMIUM(this); |
| 119 | 119 |
| 120 m_capabilities.usingSetVisibility = extensions.count("GL_CHROMIUM_set_visibi
lity"); | 120 m_capabilities.usingSetVisibility = extensions.count("GL_CHROMIUM_set_visibi
lity"); |
| 121 | 121 |
| 122 if (extensions.count("GL_CHROMIUM_iosurface")) | 122 if (extensions.count("GL_CHROMIUM_iosurface")) |
| 123 DCHECK(extensions.count("GL_ARB_texture_rectangle")); | 123 DCHECK(extensions.count("GL_ARB_texture_rectangle")); |
| 124 | 124 |
| 125 m_capabilities.usingGpuMemoryManager = extensions.count("GL_CHROMIUM_gpu_mem
ory_manager"); | 125 m_capabilities.usingGpuMemoryManager = extensions.count("GL_CHROMIUM_gpu_mem
ory_manager"); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 138 if (!initializeSharedObjects()) | 138 if (!initializeSharedObjects()) |
| 139 return false; | 139 return false; |
| 140 | 140 |
| 141 // Make sure the viewport and context gets initialized, even if it is to zer
o. | 141 // Make sure the viewport and context gets initialized, even if it is to zer
o. |
| 142 viewportChanged(); | 142 viewportChanged(); |
| 143 return true; | 143 return true; |
| 144 } | 144 } |
| 145 | 145 |
| 146 GLRenderer::~GLRenderer() | 146 GLRenderer::~GLRenderer() |
| 147 { | 147 { |
| 148 DCHECK(Proxy::isImplThread()); | |
| 149 m_context->setSwapBuffersCompleteCallbackCHROMIUM(0); | 148 m_context->setSwapBuffersCompleteCallbackCHROMIUM(0); |
| 150 m_context->setMemoryAllocationChangedCallbackCHROMIUM(0); | 149 m_context->setMemoryAllocationChangedCallbackCHROMIUM(0); |
| 151 m_context->setContextLostCallback(0); | 150 m_context->setContextLostCallback(0); |
| 152 cleanupSharedObjects(); | 151 cleanupSharedObjects(); |
| 153 } | 152 } |
| 154 | 153 |
| 155 const RendererCapabilities& GLRenderer::capabilities() const | 154 const RendererCapabilities& GLRenderer::capabilities() const |
| 156 { | 155 { |
| 157 return m_capabilities; | 156 return m_capabilities; |
| 158 } | 157 } |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 float alpha = SkColorGetA(color) / 255.0; | 335 float alpha = SkColorGetA(color) / 255.0; |
| 337 | 336 |
| 338 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), (SkColorGetR(color) / 255.0) * alpha, (SkColorGetG(color) / 255.0) * alpha, (
SkColorGetB(color) / 255.0) * alpha, alpha)); | 337 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), (SkColorGetR(color) / 255.0) * alpha, (SkColorGetG(color) / 255.0) * alpha, (
SkColorGetB(color) / 255.0) * alpha, alpha)); |
| 339 | 338 |
| 340 GLC(context(), context()->lineWidth(quad->width())); | 339 GLC(context(), context()->lineWidth(quad->width())); |
| 341 | 340 |
| 342 // The indices for the line are stored in the same array as the triangle ind
ices. | 341 // The indices for the line are stored in the same array as the triangle ind
ices. |
| 343 GLC(context(), context()->drawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 6
* sizeof(unsigned short))); | 342 GLC(context(), context()->drawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 6
* sizeof(unsigned short))); |
| 344 } | 343 } |
| 345 | 344 |
| 346 static WebGraphicsContext3D* getFilterContext() | 345 static WebGraphicsContext3D* getFilterContext(bool hasImplThread) |
| 347 { | 346 { |
| 348 if (Proxy::hasImplThread()) | 347 if (hasImplThread) |
| 349 return WebSharedGraphicsContext3D::compositorThreadContext(); | 348 return WebSharedGraphicsContext3D::compositorThreadContext(); |
| 350 else | 349 else |
| 351 return WebSharedGraphicsContext3D::mainThreadContext(); | 350 return WebSharedGraphicsContext3D::mainThreadContext(); |
| 352 } | 351 } |
| 353 | 352 |
| 354 static GrContext* getFilterGrContext() | 353 static GrContext* getFilterGrContext(bool hasImplThread) |
| 355 { | 354 { |
| 356 if (Proxy::hasImplThread()) | 355 if (hasImplThread) |
| 357 return WebSharedGraphicsContext3D::compositorThreadGrContext(); | 356 return WebSharedGraphicsContext3D::compositorThreadGrContext(); |
| 358 else | 357 else |
| 359 return WebSharedGraphicsContext3D::mainThreadGrContext(); | 358 return WebSharedGraphicsContext3D::mainThreadGrContext(); |
| 360 } | 359 } |
| 361 | 360 |
| 362 static inline SkBitmap applyFilters(GLRenderer* renderer, const WebKit::WebFilte
rOperations& filters, ScopedTexture* sourceTexture) | 361 static inline SkBitmap applyFilters(GLRenderer* renderer, const WebKit::WebFilte
rOperations& filters, ScopedTexture* sourceTexture, bool hasImplThread) |
| 363 { | 362 { |
| 364 if (filters.isEmpty()) | 363 if (filters.isEmpty()) |
| 365 return SkBitmap(); | 364 return SkBitmap(); |
| 366 | 365 |
| 367 WebGraphicsContext3D* filterContext = getFilterContext(); | 366 WebGraphicsContext3D* filterContext = getFilterContext(hasImplThread); |
| 368 GrContext* filterGrContext = getFilterGrContext(); | 367 GrContext* filterGrContext = getFilterGrContext(hasImplThread); |
| 369 | 368 |
| 370 if (!filterContext || !filterGrContext) | 369 if (!filterContext || !filterGrContext) |
| 371 return SkBitmap(); | 370 return SkBitmap(); |
| 372 | 371 |
| 373 renderer->context()->flush(); | 372 renderer->context()->flush(); |
| 374 | 373 |
| 375 ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourc
eTexture->id()); | 374 ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourc
eTexture->id()); |
| 376 SkBitmap source = RenderSurfaceFilters::apply(filters, lock.textureId(), sou
rceTexture->size(), filterContext, filterGrContext); | 375 SkBitmap source = RenderSurfaceFilters::apply(filters, lock.textureId(), sou
rceTexture->size(), filterContext, filterGrContext); |
| 377 return source; | 376 return source; |
| 378 } | 377 } |
| 379 | 378 |
| 380 static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, Sc
opedTexture* sourceTexture) | 379 static SkBitmap applyImageFilter(GLRenderer* renderer, SkImageFilter* filter, Sc
opedTexture* sourceTexture, bool hasImplThread) |
| 381 { | 380 { |
| 382 if (!filter) | 381 if (!filter) |
| 383 return SkBitmap(); | 382 return SkBitmap(); |
| 384 | 383 |
| 385 WebGraphicsContext3D* context3d = getFilterContext(); | 384 WebGraphicsContext3D* context3d = getFilterContext(hasImplThread); |
| 386 GrContext* grContext = getFilterGrContext(); | 385 GrContext* grContext = getFilterGrContext(hasImplThread); |
| 387 | 386 |
| 388 if (!context3d || !grContext) | 387 if (!context3d || !grContext) |
| 389 return SkBitmap(); | 388 return SkBitmap(); |
| 390 | 389 |
| 391 renderer->context()->flush(); | 390 renderer->context()->flush(); |
| 392 | 391 |
| 393 ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourc
eTexture->id()); | 392 ResourceProvider::ScopedWriteLockGL lock(renderer->resourceProvider(), sourc
eTexture->id()); |
| 394 | 393 |
| 395 // Wrap the source texture in a Ganesh platform texture. | 394 // Wrap the source texture in a Ganesh platform texture. |
| 396 GrPlatformTextureDesc platformTextureDescription; | 395 GrPlatformTextureDesc platformTextureDescription; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 int top, right, bottom, left; | 461 int top, right, bottom, left; |
| 463 filters.getOutsets(top, right, bottom, left); | 462 filters.getOutsets(top, right, bottom, left); |
| 464 deviceRect.Inset(-left, -top, -right, -bottom); | 463 deviceRect.Inset(-left, -top, -right, -bottom); |
| 465 | 464 |
| 466 deviceRect.Intersect(frame.currentRenderPass->outputRect()); | 465 deviceRect.Intersect(frame.currentRenderPass->outputRect()); |
| 467 | 466 |
| 468 scoped_ptr<ScopedTexture> deviceBackgroundTexture = ScopedTexture::create(m_
resourceProvider); | 467 scoped_ptr<ScopedTexture> deviceBackgroundTexture = ScopedTexture::create(m_
resourceProvider); |
| 469 if (!getFramebufferTexture(deviceBackgroundTexture.get(), cc::IntRect(device
Rect))) | 468 if (!getFramebufferTexture(deviceBackgroundTexture.get(), cc::IntRect(device
Rect))) |
| 470 return scoped_ptr<ScopedTexture>(); | 469 return scoped_ptr<ScopedTexture>(); |
| 471 | 470 |
| 472 SkBitmap filteredDeviceBackground = applyFilters(this, filters, deviceBackgr
oundTexture.get()); | 471 SkBitmap filteredDeviceBackground = applyFilters(this, filters, deviceBackgr
oundTexture.get(), m_client->hasImplThread()); |
| 473 if (!filteredDeviceBackground.getTexture()) | 472 if (!filteredDeviceBackground.getTexture()) |
| 474 return scoped_ptr<ScopedTexture>(); | 473 return scoped_ptr<ScopedTexture>(); |
| 475 | 474 |
| 476 GrTexture* texture = reinterpret_cast<GrTexture*>(filteredDeviceBackground.g
etTexture()); | 475 GrTexture* texture = reinterpret_cast<GrTexture*>(filteredDeviceBackground.g
etTexture()); |
| 477 int filteredDeviceBackgroundTextureId = texture->getTextureHandle(); | 476 int filteredDeviceBackgroundTextureId = texture->getTextureHandle(); |
| 478 | 477 |
| 479 scoped_ptr<ScopedTexture> backgroundTexture = ScopedTexture::create(m_resour
ceProvider); | 478 scoped_ptr<ScopedTexture> backgroundTexture = ScopedTexture::create(m_resour
ceProvider); |
| 480 if (!backgroundTexture->allocate(Renderer::ImplPool, cc::IntSize(quad->quadR
ect().size()), GL_RGBA, ResourceProvider::TextureUsageFramebuffer)) | 479 if (!backgroundTexture->allocate(Renderer::ImplPool, cc::IntSize(quad->quadR
ect().size()), GL_RGBA, ResourceProvider::TextureUsageFramebuffer)) |
| 481 return scoped_ptr<ScopedTexture>(); | 480 return scoped_ptr<ScopedTexture>(); |
| 482 | 481 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 // Can only draw surface if device matrix is invertible. | 516 // Can only draw surface if device matrix is invertible. |
| 518 if (!contentsDeviceTransform.isInvertible()) | 517 if (!contentsDeviceTransform.isInvertible()) |
| 519 return; | 518 return; |
| 520 | 519 |
| 521 scoped_ptr<ScopedTexture> backgroundTexture = drawBackgroundFilters(frame, q
uad, renderPass->backgroundFilters(), contentsDeviceTransform); | 520 scoped_ptr<ScopedTexture> backgroundTexture = drawBackgroundFilters(frame, q
uad, renderPass->backgroundFilters(), contentsDeviceTransform); |
| 522 | 521 |
| 523 // FIXME: Cache this value so that we don't have to do it for both the surfa
ce and its replica. | 522 // FIXME: Cache this value so that we don't have to do it for both the surfa
ce and its replica. |
| 524 // Apply filters to the contents texture. | 523 // Apply filters to the contents texture. |
| 525 SkBitmap filterBitmap; | 524 SkBitmap filterBitmap; |
| 526 if (renderPass->filter()) { | 525 if (renderPass->filter()) { |
| 527 filterBitmap = applyImageFilter(this, renderPass->filter(), contentsText
ure); | 526 filterBitmap = applyImageFilter(this, renderPass->filter(), contentsText
ure, m_client->hasImplThread()); |
| 528 } else { | 527 } else { |
| 529 filterBitmap = applyFilters(this, renderPass->filters(), contentsTexture
); | 528 filterBitmap = applyFilters(this, renderPass->filters(), contentsTexture
, m_client->hasImplThread()); |
| 530 } | 529 } |
| 531 scoped_ptr<ResourceProvider::ScopedReadLockGL> contentsResourceLock; | 530 scoped_ptr<ResourceProvider::ScopedReadLockGL> contentsResourceLock; |
| 532 unsigned contentsTextureId = 0; | 531 unsigned contentsTextureId = 0; |
| 533 if (filterBitmap.getTexture()) { | 532 if (filterBitmap.getTexture()) { |
| 534 GrTexture* texture = reinterpret_cast<GrTexture*>(filterBitmap.getTextur
e()); | 533 GrTexture* texture = reinterpret_cast<GrTexture*>(filterBitmap.getTextur
e()); |
| 535 contentsTextureId = texture->getTextureHandle(); | 534 contentsTextureId = texture->getTextureHandle(); |
| 536 } else { | 535 } else { |
| 537 contentsResourceLock = make_scoped_ptr(new ResourceProvider::ScopedReadL
ockGL(m_resourceProvider, contentsTexture->id())); | 536 contentsResourceLock = make_scoped_ptr(new ResourceProvider::ScopedReadL
ockGL(m_resourceProvider, contentsTexture->id())); |
| 538 contentsTextureId = contentsResourceLock->textureId(); | 537 contentsTextureId = contentsResourceLock->textureId(); |
| 539 } | 538 } |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 template<class Program> void set(Program* program) | 948 template<class Program> void set(Program* program) |
| 950 { | 949 { |
| 951 TextureProgramBinding::set(program); | 950 TextureProgramBinding::set(program); |
| 952 texTransformLocation = program->vertexShader().texTransformLocation(); | 951 texTransformLocation = program->vertexShader().texTransformLocation(); |
| 953 } | 952 } |
| 954 int texTransformLocation; | 953 int texTransformLocation; |
| 955 }; | 954 }; |
| 956 | 955 |
| 957 void GLRenderer::drawTextureQuad(const DrawingFrame& frame, const TextureDrawQua
d* quad) | 956 void GLRenderer::drawTextureQuad(const DrawingFrame& frame, const TextureDrawQua
d* quad) |
| 958 { | 957 { |
| 959 DCHECK(Proxy::isImplThread()); | |
| 960 | |
| 961 TexTransformTextureProgramBinding binding; | 958 TexTransformTextureProgramBinding binding; |
| 962 if (quad->flipped()) | 959 if (quad->flipped()) |
| 963 binding.set(textureProgramFlip()); | 960 binding.set(textureProgramFlip()); |
| 964 else | 961 else |
| 965 binding.set(textureProgram()); | 962 binding.set(textureProgram()); |
| 966 GLC(context(), context()->useProgram(binding.programId)); | 963 GLC(context(), context()->useProgram(binding.programId)); |
| 967 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); | 964 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); |
| 968 const gfx::RectF& uvRect = quad->uvRect(); | 965 const gfx::RectF& uvRect = quad->uvRect(); |
| 969 GLC(context(), context()->uniform4f(binding.texTransformLocation, uvRect.x()
, uvRect.y(), uvRect.width(), uvRect.height())); | 966 GLC(context(), context()->uniform4f(binding.texTransformLocation, uvRect.x()
, uvRect.y(), uvRect.width(), uvRect.height())); |
| 970 | 967 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 993 | 990 |
| 994 setShaderOpacity(quad->opacity(), binding.alphaLocation); | 991 setShaderOpacity(quad->opacity(), binding.alphaLocation); |
| 995 drawQuadGeometry(frame, quad->quadTransform(), quad->quadRect(), binding.mat
rixLocation); | 992 drawQuadGeometry(frame, quad->quadTransform(), quad->quadRect(), binding.mat
rixLocation); |
| 996 | 993 |
| 997 if (!quad->premultipliedAlpha()) | 994 if (!quad->premultipliedAlpha()) |
| 998 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 995 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
| 999 } | 996 } |
| 1000 | 997 |
| 1001 void GLRenderer::drawIOSurfaceQuad(const DrawingFrame& frame, const IOSurfaceDra
wQuad* quad) | 998 void GLRenderer::drawIOSurfaceQuad(const DrawingFrame& frame, const IOSurfaceDra
wQuad* quad) |
| 1002 { | 999 { |
| 1003 DCHECK(Proxy::isImplThread()); | |
| 1004 TexTransformTextureProgramBinding binding; | 1000 TexTransformTextureProgramBinding binding; |
| 1005 binding.set(textureIOSurfaceProgram()); | 1001 binding.set(textureIOSurfaceProgram()); |
| 1006 | 1002 |
| 1007 GLC(context(), context()->useProgram(binding.programId)); | 1003 GLC(context(), context()->useProgram(binding.programId)); |
| 1008 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); | 1004 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); |
| 1009 if (quad->orientation() == IOSurfaceDrawQuad::Flipped) | 1005 if (quad->orientation() == IOSurfaceDrawQuad::Flipped) |
| 1010 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, qua
d->ioSurfaceSize().height(), quad->ioSurfaceSize().width(), quad->ioSurfaceSize(
).height() * -1.0)); | 1006 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, qua
d->ioSurfaceSize().height(), quad->ioSurfaceSize().width(), quad->ioSurfaceSize(
).height() * -1.0)); |
| 1011 else | 1007 else |
| 1012 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, 0,
quad->ioSurfaceSize().width(), quad->ioSurfaceSize().height())); | 1008 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, 0,
quad->ioSurfaceSize().width(), quad->ioSurfaceSize().height())); |
| 1013 | 1009 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 return true; | 1131 return true; |
| 1136 } | 1132 } |
| 1137 | 1133 |
| 1138 void GLRenderer::onSwapBuffersComplete() | 1134 void GLRenderer::onSwapBuffersComplete() |
| 1139 { | 1135 { |
| 1140 m_client->onSwapBuffersComplete(); | 1136 m_client->onSwapBuffersComplete(); |
| 1141 } | 1137 } |
| 1142 | 1138 |
| 1143 void GLRenderer::onMemoryAllocationChanged(WebGraphicsMemoryAllocation allocatio
n) | 1139 void GLRenderer::onMemoryAllocationChanged(WebGraphicsMemoryAllocation allocatio
n) |
| 1144 { | 1140 { |
| 1145 // FIXME: This is called on the main thread in single threaded mode, but we
expect it on the impl thread. | 1141 m_discardFramebufferWhenNotVisible = !allocation.suggestHaveBackbuffer; |
| 1146 if (!Proxy::hasImplThread()) { | |
| 1147 DCHECK(Proxy::isMainThread()); | |
| 1148 DebugScopedSetImplThread impl; | |
| 1149 onMemoryAllocationChangedOnImplThread(allocation); | |
| 1150 } else { | |
| 1151 DCHECK(Proxy::isImplThread()); | |
| 1152 onMemoryAllocationChangedOnImplThread(allocation); | |
| 1153 } | |
| 1154 } | |
| 1155 | |
| 1156 int GLRenderer::priorityCutoffValue(WebKit::WebGraphicsMemoryAllocation::Priorit
yCutoff priorityCutoff) | |
| 1157 { | |
| 1158 switch (priorityCutoff) { | |
| 1159 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowNothing: | |
| 1160 return PriorityCalculator::allowNothingCutoff(); | |
| 1161 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowVisibleOnly: | |
| 1162 return PriorityCalculator::allowVisibleOnlyCutoff(); | |
| 1163 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowVisibleAndNearb
y: | |
| 1164 return PriorityCalculator::allowVisibleAndNearbyCutoff(); | |
| 1165 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowEverything: | |
| 1166 return PriorityCalculator::allowEverythingCutoff(); | |
| 1167 } | |
| 1168 NOTREACHED(); | |
| 1169 return 0; | |
| 1170 } | |
| 1171 | |
| 1172 void GLRenderer::onMemoryAllocationChangedOnImplThread(WebKit::WebGraphicsMemory
Allocation allocation) | |
| 1173 { | |
| 1174 // Just ignore the memory manager when it says to set the limit to zero | 1142 // Just ignore the memory manager when it says to set the limit to zero |
| 1175 // bytes. This will happen when the memory manager thinks that the renderer | 1143 // bytes. This will happen when the memory manager thinks that the renderer |
| 1176 // is not visible (which the renderer knows better). | 1144 // is not visible (which the renderer knows better). |
| 1177 if (allocation.bytesLimitWhenVisible) { | 1145 if (allocation.bytesLimitWhenVisible) { |
| 1178 ManagedMemoryPolicy policy( | 1146 ManagedMemoryPolicy policy( |
| 1179 allocation.bytesLimitWhenVisible, | 1147 allocation.bytesLimitWhenVisible, |
| 1180 priorityCutoffValue(allocation.priorityCutoffWhenVisible), | 1148 priorityCutoffValue(allocation.priorityCutoffWhenVisible), |
| 1181 allocation.bytesLimitWhenNotVisible, | 1149 allocation.bytesLimitWhenNotVisible, |
| 1182 priorityCutoffValue(allocation.priorityCutoffWhenNotVisible)); | 1150 priorityCutoffValue(allocation.priorityCutoffWhenNotVisible)); |
| 1183 | 1151 |
| 1184 if (allocation.enforceButDoNotKeepAsPolicy) | 1152 if (allocation.enforceButDoNotKeepAsPolicy) |
| 1185 m_client->enforceManagedMemoryPolicy(policy); | 1153 m_client->enforceManagedMemoryPolicy(policy); |
| 1186 else | 1154 else |
| 1187 m_client->setManagedMemoryPolicy(policy); | 1155 m_client->setManagedMemoryPolicy(policy); |
| 1188 } | 1156 } |
| 1189 | 1157 |
| 1190 bool oldDiscardFramebufferWhenNotVisible = m_discardFramebufferWhenNotVisibl
e; | 1158 bool oldDiscardFramebufferWhenNotVisible = m_discardFramebufferWhenNotVisibl
e; |
| 1191 m_discardFramebufferWhenNotVisible = !allocation.suggestHaveBackbuffer; | 1159 m_discardFramebufferWhenNotVisible = !allocation.suggestHaveBackbuffer; |
| 1192 enforceMemoryPolicy(); | 1160 enforceMemoryPolicy(); |
| 1193 if (allocation.enforceButDoNotKeepAsPolicy) | 1161 if (allocation.enforceButDoNotKeepAsPolicy) |
| 1194 m_discardFramebufferWhenNotVisible = oldDiscardFramebufferWhenNotVisible
; | 1162 m_discardFramebufferWhenNotVisible = oldDiscardFramebufferWhenNotVisible
; |
| 1195 } | 1163 } |
| 1196 | 1164 |
| 1165 int GLRenderer::priorityCutoffValue(WebKit::WebGraphicsMemoryAllocation::Priorit
yCutoff priorityCutoff) |
| 1166 { |
| 1167 switch (priorityCutoff) { |
| 1168 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowNothing: |
| 1169 return PriorityCalculator::allowNothingCutoff(); |
| 1170 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowVisibleOnly: |
| 1171 return PriorityCalculator::allowVisibleOnlyCutoff(); |
| 1172 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowVisibleAndNearb
y: |
| 1173 return PriorityCalculator::allowVisibleAndNearbyCutoff(); |
| 1174 case WebKit::WebGraphicsMemoryAllocation::PriorityCutoffAllowEverything: |
| 1175 return PriorityCalculator::allowEverythingCutoff(); |
| 1176 } |
| 1177 NOTREACHED(); |
| 1178 return 0; |
| 1179 } |
| 1180 |
| 1197 void GLRenderer::enforceMemoryPolicy() | 1181 void GLRenderer::enforceMemoryPolicy() |
| 1198 { | 1182 { |
| 1199 if (!m_visible) { | 1183 if (!m_visible) { |
| 1200 TRACE_EVENT0("cc", "GLRenderer::enforceMemoryPolicy dropping resources")
; | 1184 TRACE_EVENT0("cc", "GLRenderer::enforceMemoryPolicy dropping resources")
; |
| 1201 releaseRenderPassTextures(); | 1185 releaseRenderPassTextures(); |
| 1202 if (m_discardFramebufferWhenNotVisible) | 1186 if (m_discardFramebufferWhenNotVisible) |
| 1203 discardFramebuffer(); | 1187 discardFramebuffer(); |
| 1204 GLC(m_context, m_context->flush()); | 1188 GLC(m_context, m_context->flush()); |
| 1205 } | 1189 } |
| 1206 } | 1190 } |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1628 | 1612 |
| 1629 releaseRenderPassTextures(); | 1613 releaseRenderPassTextures(); |
| 1630 } | 1614 } |
| 1631 | 1615 |
| 1632 bool GLRenderer::isContextLost() | 1616 bool GLRenderer::isContextLost() |
| 1633 { | 1617 { |
| 1634 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); | 1618 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); |
| 1635 } | 1619 } |
| 1636 | 1620 |
| 1637 } // namespace cc | 1621 } // namespace cc |
| OLD | NEW |