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 "cc/gl_renderer.h" | 5 #include "cc/gl_renderer.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/string_split.h" | 9 #include "base/string_split.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 } | 234 } |
235 | 235 |
236 makeContextCurrent(); | 236 makeContextCurrent(); |
237 // Bind the common vertex attributes used for drawing all the layers. | 237 // Bind the common vertex attributes used for drawing all the layers. |
238 m_sharedGeometry->prepareForDraw(); | 238 m_sharedGeometry->prepareForDraw(); |
239 | 239 |
240 GLC(m_context, m_context->disable(GL_DEPTH_TEST)); | 240 GLC(m_context, m_context->disable(GL_DEPTH_TEST)); |
241 GLC(m_context, m_context->disable(GL_CULL_FACE)); | 241 GLC(m_context, m_context->disable(GL_CULL_FACE)); |
242 GLC(m_context, m_context->colorMask(true, true, true, true)); | 242 GLC(m_context, m_context->colorMask(true, true, true, true)); |
243 GLC(m_context, m_context->enable(GL_BLEND)); | 243 GLC(m_context, m_context->enable(GL_BLEND)); |
| 244 m_blendShadow = true; |
244 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 245 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
245 GLC(context(), context()->activeTexture(GL_TEXTURE0)); | 246 GLC(context(), context()->activeTexture(GL_TEXTURE0)); |
| 247 m_programShadow = 0; |
246 } | 248 } |
247 | 249 |
248 void GLRenderer::doNoOp() | 250 void GLRenderer::doNoOp() |
249 { | 251 { |
250 GLC(m_context, m_context->bindFramebuffer(GL_FRAMEBUFFER, 0)); | 252 GLC(m_context, m_context->bindFramebuffer(GL_FRAMEBUFFER, 0)); |
251 GLC(m_context, m_context->flush()); | 253 GLC(m_context, m_context->flush()); |
252 } | 254 } |
253 | 255 |
254 void GLRenderer::drawQuad(DrawingFrame& frame, const DrawQuad* quad) | 256 void GLRenderer::drawQuad(DrawingFrame& frame, const DrawQuad* quad) |
255 { | 257 { |
256 DCHECK(quad->rect.Contains(quad->visible_rect)); | 258 DCHECK(quad->rect.Contains(quad->visible_rect)); |
257 | 259 if (quad->material != DrawQuad::TEXTURE_CONTENT) { |
258 if (quad->ShouldDrawWithBlending()) | 260 flushTextureQuadCache(); |
259 GLC(m_context, m_context->enable(GL_BLEND)); | 261 setBlendEnabled(quad->ShouldDrawWithBlending()); |
260 else | 262 } |
261 GLC(m_context, m_context->disable(GL_BLEND)); | |
262 | 263 |
263 switch (quad->material) { | 264 switch (quad->material) { |
264 case DrawQuad::INVALID: | 265 case DrawQuad::INVALID: |
265 NOTREACHED(); | 266 NOTREACHED(); |
266 break; | 267 break; |
267 case DrawQuad::CHECKERBOARD: | 268 case DrawQuad::CHECKERBOARD: |
268 drawCheckerboardQuad(frame, CheckerboardDrawQuad::MaterialCast(quad)); | 269 drawCheckerboardQuad(frame, CheckerboardDrawQuad::MaterialCast(quad)); |
269 break; | 270 break; |
270 case DrawQuad::DEBUG_BORDER: | 271 case DrawQuad::DEBUG_BORDER: |
271 drawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); | 272 drawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); |
272 break; | 273 break; |
273 case DrawQuad::IO_SURFACE_CONTENT: | 274 case DrawQuad::IO_SURFACE_CONTENT: |
274 drawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad)); | 275 drawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad)); |
275 break; | 276 break; |
276 case DrawQuad::RENDER_PASS: | 277 case DrawQuad::RENDER_PASS: |
277 drawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad)); | 278 drawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad)); |
278 break; | 279 break; |
279 case DrawQuad::SOLID_COLOR: | 280 case DrawQuad::SOLID_COLOR: |
280 drawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad)); | 281 drawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad)); |
281 break; | 282 break; |
282 case DrawQuad::STREAM_VIDEO_CONTENT: | 283 case DrawQuad::STREAM_VIDEO_CONTENT: |
283 drawStreamVideoQuad(frame, StreamVideoDrawQuad::MaterialCast(quad)); | 284 drawStreamVideoQuad(frame, StreamVideoDrawQuad::MaterialCast(quad)); |
284 break; | 285 break; |
285 case DrawQuad::TEXTURE_CONTENT: | 286 case DrawQuad::TEXTURE_CONTENT: |
286 drawTextureQuad(frame, TextureDrawQuad::MaterialCast(quad)); | 287 enqueueTextureQuad(frame, TextureDrawQuad::MaterialCast(quad)); |
287 break; | 288 break; |
288 case DrawQuad::TILED_CONTENT: | 289 case DrawQuad::TILED_CONTENT: |
289 drawTileQuad(frame, TileDrawQuad::MaterialCast(quad)); | 290 drawTileQuad(frame, TileDrawQuad::MaterialCast(quad)); |
290 break; | 291 break; |
291 case DrawQuad::YUV_VIDEO_CONTENT: | 292 case DrawQuad::YUV_VIDEO_CONTENT: |
292 drawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad)); | 293 drawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad)); |
293 break; | 294 break; |
294 } | 295 } |
295 } | 296 } |
296 | 297 |
297 void GLRenderer::drawCheckerboardQuad(const DrawingFrame& frame, const Checkerbo
ardDrawQuad* quad) | 298 void GLRenderer::drawCheckerboardQuad(const DrawingFrame& frame, const Checkerbo
ardDrawQuad* quad) |
298 { | 299 { |
299 const TileCheckerboardProgram* program = tileCheckerboardProgram(); | 300 const TileCheckerboardProgram* program = tileCheckerboardProgram(); |
300 DCHECK(program && (program->initialized() || isContextLost())); | 301 DCHECK(program && (program->initialized() || isContextLost())); |
301 GLC(context(), context()->useProgram(program->program())); | 302 setUseProgram(program->program()); |
302 | 303 |
303 SkColor color = quad->color; | 304 SkColor color = quad->color; |
304 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), SkColorGetR(color) / 255.0, SkColorGetG(color) / 255.0, SkColorGetB(color) /
255.0, 1)); | 305 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), SkColorGetR(color) / 255.0, SkColorGetG(color) / 255.0, SkColorGetB(color) /
255.0, 1)); |
305 | 306 |
306 const int checkerboardWidth = 16; | 307 const int checkerboardWidth = 16; |
307 float frequency = 1.0 / checkerboardWidth; | 308 float frequency = 1.0 / checkerboardWidth; |
308 | 309 |
309 gfx::Rect tileRect = quad->rect; | 310 gfx::Rect tileRect = quad->rect; |
310 float texOffsetX = tileRect.x() % checkerboardWidth; | 311 float texOffsetX = tileRect.x() % checkerboardWidth; |
311 float texOffsetY = tileRect.y() % checkerboardWidth; | 312 float texOffsetY = tileRect.y() % checkerboardWidth; |
312 float texScaleX = tileRect.width(); | 313 float texScaleX = tileRect.width(); |
313 float texScaleY = tileRect.height(); | 314 float texScaleY = tileRect.height(); |
314 GLC(context(), context()->uniform4f(program->fragmentShader().texTransformLo
cation(), texOffsetX, texOffsetY, texScaleX, texScaleY)); | 315 GLC(context(), context()->uniform4f(program->fragmentShader().texTransformLo
cation(), texOffsetX, texOffsetY, texScaleX, texScaleY)); |
315 | 316 |
316 GLC(context(), context()->uniform1f(program->fragmentShader().frequencyLocat
ion(), frequency)); | 317 GLC(context(), context()->uniform1f(program->fragmentShader().frequencyLocat
ion(), frequency)); |
317 | 318 |
318 setShaderOpacity(quad->opacity(), program->fragmentShader().alphaLocation())
; | 319 setShaderOpacity(quad->opacity(), program->fragmentShader().alphaLocation())
; |
319 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, program->vertexSh
ader().matrixLocation()); | 320 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, program->vertexSh
ader().matrixLocation()); |
320 } | 321 } |
321 | 322 |
322 void GLRenderer::drawDebugBorderQuad(const DrawingFrame& frame, const DebugBorde
rDrawQuad* quad) | 323 void GLRenderer::drawDebugBorderQuad(const DrawingFrame& frame, const DebugBorde
rDrawQuad* quad) |
323 { | 324 { |
324 static float glMatrix[16]; | 325 static float glMatrix[16]; |
325 const SolidColorProgram* program = solidColorProgram(); | 326 const SolidColorProgram* program = solidColorProgram(); |
326 DCHECK(program && (program->initialized() || isContextLost())); | 327 DCHECK(program && (program->initialized() || isContextLost())); |
327 GLC(context(), context()->useProgram(program->program())); | 328 setUseProgram(program->program()); |
328 | 329 |
329 // Use the full quadRect for debug quads to not move the edges based on part
ial swaps. | 330 // Use the full quadRect for debug quads to not move the edges based on part
ial swaps. |
330 const gfx::Rect& layerRect = quad->rect; | 331 const gfx::Rect& layerRect = quad->rect; |
331 gfx::Transform renderMatrix = quad->quadTransform(); | 332 gfx::Transform renderMatrix = quad->quadTransform(); |
332 renderMatrix.Translate(0.5 * layerRect.width() + layerRect.x(), 0.5 * layerR
ect.height() + layerRect.y()); | 333 renderMatrix.Translate(0.5 * layerRect.width() + layerRect.x(), 0.5 * layerR
ect.height() + layerRect.y()); |
333 renderMatrix.Scale(layerRect.width(), layerRect.height()); | 334 renderMatrix.Scale(layerRect.width(), layerRect.height()); |
334 GLRenderer::toGLMatrix(&glMatrix[0], frame.projectionMatrix * renderMatrix); | 335 GLRenderer::toGLMatrix(&glMatrix[0], frame.projectionMatrix * renderMatrix); |
335 GLC(context(), context()->uniformMatrix4fv(program->vertexShader().matrixLoc
ation(), 1, false, &glMatrix[0])); | 336 GLC(context(), context()->uniformMatrix4fv(program->vertexShader().matrixLoc
ation(), 1, false, &glMatrix[0])); |
336 | 337 |
337 SkColor color = quad->color; | 338 SkColor color = quad->color; |
338 float alpha = SkColorGetA(color) / 255.0; | 339 float alpha = SkColorGetA(color) / 255.0; |
339 | 340 |
340 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), (SkColorGetR(color) / 255.0) * alpha, (SkColorGetG(color) / 255.0) * alpha, (
SkColorGetB(color) / 255.0) * alpha, alpha)); | 341 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), (SkColorGetR(color) / 255.0) * alpha, (SkColorGetG(color) / 255.0) * alpha, (
SkColorGetB(color) / 255.0) * alpha, alpha)); |
341 | 342 |
342 GLC(context(), context()->lineWidth(quad->width)); | 343 GLC(context(), context()->lineWidth(quad->width)); |
343 | 344 |
344 // The indices for the line are stored in the same array as the triangle ind
ices. | 345 // The indices for the line are stored in the same array as the triangle ind
ices. |
345 GLC(context(), context()->drawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 6
* sizeof(unsigned short))); | 346 GLC(context(), context()->drawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0
)); |
346 } | 347 } |
347 | 348 |
348 static WebGraphicsContext3D* getFilterContext(bool hasImplThread) | 349 static WebGraphicsContext3D* getFilterContext(bool hasImplThread) |
349 { | 350 { |
350 if (hasImplThread) | 351 if (hasImplThread) |
351 return WebSharedGraphicsContext3D::compositorThreadContext(); | 352 return WebSharedGraphicsContext3D::compositorThreadContext(); |
352 else | 353 else |
353 return WebSharedGraphicsContext3D::mainThreadContext(); | 354 return WebSharedGraphicsContext3D::mainThreadContext(); |
354 } | 355 } |
355 | 356 |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 | 581 |
581 int shaderQuadLocation = -1; | 582 int shaderQuadLocation = -1; |
582 int shaderEdgeLocation = -1; | 583 int shaderEdgeLocation = -1; |
583 int shaderMaskSamplerLocation = -1; | 584 int shaderMaskSamplerLocation = -1; |
584 int shaderMaskTexCoordScaleLocation = -1; | 585 int shaderMaskTexCoordScaleLocation = -1; |
585 int shaderMaskTexCoordOffsetLocation = -1; | 586 int shaderMaskTexCoordOffsetLocation = -1; |
586 int shaderMatrixLocation = -1; | 587 int shaderMatrixLocation = -1; |
587 int shaderAlphaLocation = -1; | 588 int shaderAlphaLocation = -1; |
588 if (useAA && maskTextureId) { | 589 if (useAA && maskTextureId) { |
589 const RenderPassMaskProgramAA* program = renderPassMaskProgramAA(); | 590 const RenderPassMaskProgramAA* program = renderPassMaskProgramAA(); |
590 GLC(context(), context()->useProgram(program->program())); | 591 setUseProgram(program->program()); |
591 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); | 592 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); |
592 | 593 |
593 shaderQuadLocation = program->vertexShader().pointLocation(); | 594 shaderQuadLocation = program->vertexShader().pointLocation(); |
594 shaderEdgeLocation = program->fragmentShader().edgeLocation(); | 595 shaderEdgeLocation = program->fragmentShader().edgeLocation(); |
595 shaderMaskSamplerLocation = program->fragmentShader().maskSamplerLocatio
n(); | 596 shaderMaskSamplerLocation = program->fragmentShader().maskSamplerLocatio
n(); |
596 shaderMaskTexCoordScaleLocation = program->fragmentShader().maskTexCoord
ScaleLocation(); | 597 shaderMaskTexCoordScaleLocation = program->fragmentShader().maskTexCoord
ScaleLocation(); |
597 shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoor
dOffsetLocation(); | 598 shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoor
dOffsetLocation(); |
598 shaderMatrixLocation = program->vertexShader().matrixLocation(); | 599 shaderMatrixLocation = program->vertexShader().matrixLocation(); |
599 shaderAlphaLocation = program->fragmentShader().alphaLocation(); | 600 shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
600 } else if (!useAA && maskTextureId) { | 601 } else if (!useAA && maskTextureId) { |
601 const RenderPassMaskProgram* program = renderPassMaskProgram(); | 602 const RenderPassMaskProgram* program = renderPassMaskProgram(); |
602 GLC(context(), context()->useProgram(program->program())); | 603 setUseProgram(program->program()); |
603 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); | 604 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); |
604 | 605 |
605 shaderMaskSamplerLocation = program->fragmentShader().maskSamplerLocatio
n(); | 606 shaderMaskSamplerLocation = program->fragmentShader().maskSamplerLocatio
n(); |
606 shaderMaskTexCoordScaleLocation = program->fragmentShader().maskTexCoord
ScaleLocation(); | 607 shaderMaskTexCoordScaleLocation = program->fragmentShader().maskTexCoord
ScaleLocation(); |
607 shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoor
dOffsetLocation(); | 608 shaderMaskTexCoordOffsetLocation = program->fragmentShader().maskTexCoor
dOffsetLocation(); |
608 shaderMatrixLocation = program->vertexShader().matrixLocation(); | 609 shaderMatrixLocation = program->vertexShader().matrixLocation(); |
609 shaderAlphaLocation = program->fragmentShader().alphaLocation(); | 610 shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
610 } else if (useAA && !maskTextureId) { | 611 } else if (useAA && !maskTextureId) { |
611 const RenderPassProgramAA* program = renderPassProgramAA(); | 612 const RenderPassProgramAA* program = renderPassProgramAA(); |
612 GLC(context(), context()->useProgram(program->program())); | 613 setUseProgram(program->program()); |
613 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); | 614 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); |
614 | 615 |
615 shaderQuadLocation = program->vertexShader().pointLocation(); | 616 shaderQuadLocation = program->vertexShader().pointLocation(); |
616 shaderEdgeLocation = program->fragmentShader().edgeLocation(); | 617 shaderEdgeLocation = program->fragmentShader().edgeLocation(); |
617 shaderMatrixLocation = program->vertexShader().matrixLocation(); | 618 shaderMatrixLocation = program->vertexShader().matrixLocation(); |
618 shaderAlphaLocation = program->fragmentShader().alphaLocation(); | 619 shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
619 } else { | 620 } else { |
620 const RenderPassProgram* program = renderPassProgram(); | 621 const RenderPassProgram* program = renderPassProgram(); |
621 GLC(context(), context()->useProgram(program->program())); | 622 setUseProgram(program->program()); |
622 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); | 623 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLoc
ation(), 0)); |
623 | 624 |
624 shaderMatrixLocation = program->vertexShader().matrixLocation(); | 625 shaderMatrixLocation = program->vertexShader().matrixLocation(); |
625 shaderAlphaLocation = program->fragmentShader().alphaLocation(); | 626 shaderAlphaLocation = program->fragmentShader().alphaLocation(); |
626 } | 627 } |
627 | 628 |
628 if (shaderMaskSamplerLocation != -1) { | 629 if (shaderMaskSamplerLocation != -1) { |
629 DCHECK(shaderMaskTexCoordScaleLocation != 1); | 630 DCHECK(shaderMaskTexCoordScaleLocation != 1); |
630 DCHECK(shaderMaskTexCoordOffsetLocation != 1); | 631 DCHECK(shaderMaskTexCoordOffsetLocation != 1); |
631 GLC(context(), context()->activeTexture(GL_TEXTURE1)); | 632 GLC(context(), context()->activeTexture(GL_TEXTURE1)); |
(...skipping 21 matching lines...) Expand all Loading... |
653 | 654 |
654 // Flush the compositor context before the filter bitmap goes out of | 655 // Flush the compositor context before the filter bitmap goes out of |
655 // scope, so the draw gets processed before the filter texture gets deleted. | 656 // scope, so the draw gets processed before the filter texture gets deleted. |
656 if (filterBitmap.getTexture()) | 657 if (filterBitmap.getTexture()) |
657 m_context->flush(); | 658 m_context->flush(); |
658 } | 659 } |
659 | 660 |
660 void GLRenderer::drawSolidColorQuad(const DrawingFrame& frame, const SolidColorD
rawQuad* quad) | 661 void GLRenderer::drawSolidColorQuad(const DrawingFrame& frame, const SolidColorD
rawQuad* quad) |
661 { | 662 { |
662 const SolidColorProgram* program = solidColorProgram(); | 663 const SolidColorProgram* program = solidColorProgram(); |
663 GLC(context(), context()->useProgram(program->program())); | 664 setUseProgram(program->program()); |
664 | 665 |
665 SkColor color = quad->color; | 666 SkColor color = quad->color; |
666 float opacity = quad->opacity(); | 667 float opacity = quad->opacity(); |
667 float alpha = (SkColorGetA(color) / 255.0) * opacity; | 668 float alpha = (SkColorGetA(color) / 255.0) * opacity; |
668 | 669 |
669 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), (SkColorGetR(color) / 255.0) * alpha, (SkColorGetG(color) / 255.0) * alpha, (
SkColorGetB(color) / 255.0) * alpha, alpha)); | 670 GLC(context(), context()->uniform4f(program->fragmentShader().colorLocation(
), (SkColorGetR(color) / 255.0) * alpha, (SkColorGetG(color) / 255.0) * alpha, (
SkColorGetB(color) / 255.0) * alpha, alpha)); |
670 | 671 |
671 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, program->vertexSh
ader().matrixLocation()); | 672 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, program->vertexSh
ader().matrixLocation()); |
672 } | 673 } |
673 | 674 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 else | 772 else |
772 tileUniformLocation(tileProgram(), uniforms); | 773 tileUniformLocation(tileProgram(), uniforms); |
773 } else { | 774 } else { |
774 if (quad->swizzle_contents) | 775 if (quad->swizzle_contents) |
775 tileUniformLocation(tileProgramSwizzleOpaque(), uniforms); | 776 tileUniformLocation(tileProgramSwizzleOpaque(), uniforms); |
776 else | 777 else |
777 tileUniformLocation(tileProgramOpaque(), uniforms); | 778 tileUniformLocation(tileProgramOpaque(), uniforms); |
778 } | 779 } |
779 } | 780 } |
780 | 781 |
781 GLC(context(), context()->useProgram(uniforms.program)); | 782 setUseProgram(uniforms.program); |
782 GLC(context(), context()->uniform1i(uniforms.samplerLocation, 0)); | 783 GLC(context(), context()->uniform1i(uniforms.samplerLocation, 0)); |
783 ResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad
->resource_id); | 784 ResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad
->resource_id); |
784 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, quadResourceLock.textur
eId())); | 785 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, quadResourceLock.textur
eId())); |
785 | 786 |
786 bool useAA = !clipped && quad->IsAntialiased(); | 787 bool useAA = !clipped && quad->IsAntialiased(); |
787 if (useAA) { | 788 if (useAA) { |
788 LayerQuad deviceLayerBounds = LayerQuad(gfx::QuadF(deviceLayerQuad.Bound
ingBox())); | 789 LayerQuad deviceLayerBounds = LayerQuad(gfx::QuadF(deviceLayerQuad.Bound
ingBox())); |
789 deviceLayerBounds.inflateAntiAliasingDistance(); | 790 deviceLayerBounds.inflateAntiAliasingDistance(); |
790 | 791 |
791 LayerQuad deviceLayerEdges = LayerQuad(deviceLayerQuad); | 792 LayerQuad deviceLayerEdges = LayerQuad(deviceLayerQuad); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 ResourceProvider::ScopedReadLockGL yPlaneLock(m_resourceProvider, yPlane.res
ourceId); | 889 ResourceProvider::ScopedReadLockGL yPlaneLock(m_resourceProvider, yPlane.res
ourceId); |
889 ResourceProvider::ScopedReadLockGL uPlaneLock(m_resourceProvider, uPlane.res
ourceId); | 890 ResourceProvider::ScopedReadLockGL uPlaneLock(m_resourceProvider, uPlane.res
ourceId); |
890 ResourceProvider::ScopedReadLockGL vPlaneLock(m_resourceProvider, vPlane.res
ourceId); | 891 ResourceProvider::ScopedReadLockGL vPlaneLock(m_resourceProvider, vPlane.res
ourceId); |
891 GLC(context(), context()->activeTexture(GL_TEXTURE1)); | 892 GLC(context(), context()->activeTexture(GL_TEXTURE1)); |
892 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, yPlaneLock.textureId())
); | 893 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, yPlaneLock.textureId())
); |
893 GLC(context(), context()->activeTexture(GL_TEXTURE2)); | 894 GLC(context(), context()->activeTexture(GL_TEXTURE2)); |
894 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, uPlaneLock.textureId())
); | 895 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, uPlaneLock.textureId())
); |
895 GLC(context(), context()->activeTexture(GL_TEXTURE3)); | 896 GLC(context(), context()->activeTexture(GL_TEXTURE3)); |
896 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, vPlaneLock.textureId())
); | 897 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, vPlaneLock.textureId())
); |
897 | 898 |
898 GLC(context(), context()->useProgram(program->program())); | 899 setUseProgram(program->program()); |
899 | 900 |
900 GLC(context(), context()->uniform2f(program->vertexShader().texScaleLocation
(), quad->tex_scale.width(), quad->tex_scale.height())); | 901 GLC(context(), context()->uniform2f(program->vertexShader().texScaleLocation
(), quad->tex_scale.width(), quad->tex_scale.height())); |
901 GLC(context(), context()->uniform1i(program->fragmentShader().yTextureLocati
on(), 1)); | 902 GLC(context(), context()->uniform1i(program->fragmentShader().yTextureLocati
on(), 1)); |
902 GLC(context(), context()->uniform1i(program->fragmentShader().uTextureLocati
on(), 2)); | 903 GLC(context(), context()->uniform1i(program->fragmentShader().uTextureLocati
on(), 2)); |
903 GLC(context(), context()->uniform1i(program->fragmentShader().vTextureLocati
on(), 3)); | 904 GLC(context(), context()->uniform1i(program->fragmentShader().vTextureLocati
on(), 3)); |
904 | 905 |
905 // These values are magic numbers that are used in the transformation from Y
UV to RGB color values. | 906 // These values are magic numbers that are used in the transformation from Y
UV to RGB color values. |
906 // They are taken from the following webpage: http://www.fourcc.org/fccyvrgb
.php | 907 // They are taken from the following webpage: http://www.fourcc.org/fccyvrgb
.php |
907 float yuv2RGB[9] = { | 908 float yuv2RGB[9] = { |
908 1.164f, 1.164f, 1.164f, | 909 1.164f, 1.164f, 1.164f, |
(...skipping 22 matching lines...) Expand all Loading... |
931 GLC(context(), context()->activeTexture(GL_TEXTURE0)); | 932 GLC(context(), context()->activeTexture(GL_TEXTURE0)); |
932 } | 933 } |
933 | 934 |
934 void GLRenderer::drawStreamVideoQuad(const DrawingFrame& frame, const StreamVide
oDrawQuad* quad) | 935 void GLRenderer::drawStreamVideoQuad(const DrawingFrame& frame, const StreamVide
oDrawQuad* quad) |
935 { | 936 { |
936 static float glMatrix[16]; | 937 static float glMatrix[16]; |
937 | 938 |
938 DCHECK(m_capabilities.usingEglImage); | 939 DCHECK(m_capabilities.usingEglImage); |
939 | 940 |
940 const VideoStreamTextureProgram* program = videoStreamTextureProgram(); | 941 const VideoStreamTextureProgram* program = videoStreamTextureProgram(); |
941 GLC(context(), context()->useProgram(program->program())); | 942 setUseProgram(program->program()); |
942 | 943 |
943 toGLMatrix(&glMatrix[0], quad->matrix); | 944 toGLMatrix(&glMatrix[0], quad->matrix); |
944 GLC(context(), context()->uniformMatrix4fv(program->vertexShader().texMatrix
Location(), 1, false, glMatrix)); | 945 GLC(context(), context()->uniformMatrix4fv(program->vertexShader().texMatrix
Location(), 1, false, glMatrix)); |
945 | 946 |
946 GLC(context(), context()->bindTexture(GL_TEXTURE_EXTERNAL_OES, quad->texture
_id)); | 947 GLC(context(), context()->bindTexture(GL_TEXTURE_EXTERNAL_OES, quad->texture
_id)); |
947 | 948 |
948 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocatio
n(), 0)); | 949 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocatio
n(), 0)); |
949 | 950 |
950 setShaderOpacity(quad->opacity(), program->fragmentShader().alphaLocation())
; | 951 setShaderOpacity(quad->opacity(), program->fragmentShader().alphaLocation())
; |
951 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, program->vertexSh
ader().matrixLocation()); | 952 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, program->vertexSh
ader().matrixLocation()); |
(...skipping 18 matching lines...) Expand all Loading... |
970 struct TexTransformTextureProgramBinding : TextureProgramBinding { | 971 struct TexTransformTextureProgramBinding : TextureProgramBinding { |
971 template<class Program> void set( | 972 template<class Program> void set( |
972 Program* program, WebKit::WebGraphicsContext3D* context) | 973 Program* program, WebKit::WebGraphicsContext3D* context) |
973 { | 974 { |
974 TextureProgramBinding::set(program, context); | 975 TextureProgramBinding::set(program, context); |
975 texTransformLocation = program->vertexShader().texTransformLocation(); | 976 texTransformLocation = program->vertexShader().texTransformLocation(); |
976 } | 977 } |
977 int texTransformLocation; | 978 int texTransformLocation; |
978 }; | 979 }; |
979 | 980 |
| 981 void GLRenderer::flushTextureQuadCache() |
| 982 { |
| 983 // Check to see if we have anything to draw. |
| 984 if (m_drawCache.program_id == 0) |
| 985 return; |
| 986 |
| 987 // Set the correct blending mode. |
| 988 setBlendEnabled(m_drawCache.needs_blending); |
| 989 |
| 990 // Bind the program to the GL state. |
| 991 setUseProgram(m_drawCache.program_id); |
| 992 |
| 993 // Assume the current active textures is 0. |
| 994 ResourceProvider::ScopedReadLockGL lockedQuad(m_resourceProvider, m_drawCach
e.resource_id); |
| 995 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, lockedQuad.textureId())
); |
| 996 |
| 997 // set up premultiplied alpha. |
| 998 if (!m_drawCache.use_premultiplied_alpha) { |
| 999 // As it turns out, the premultiplied alpha blending function (ONE, ONE_MI
NUS_SRC_ALPHA) |
| 1000 // will never cause the alpha channel to be set to anything less than 1.
0 if it is |
| 1001 // initialized to that value! Therefore, premultipliedAlpha being false
is the first |
| 1002 // situation we can generally see an alpha channel less than 1.0 coming
out of the |
| 1003 // compositor. This is causing platform differences in some layout tests
(see |
| 1004 // https://bugs.webkit.org/show_bug.cgi?id=82412), so in this situation,
use a separate |
| 1005 // blend function for the alpha channel to avoid modifying it. Don't use
colorMask for this |
| 1006 // as it has performance implications on some platforms. |
| 1007 GLC(context(), context()->blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_S
RC_ALPHA, GL_ZERO, GL_ONE)); |
| 1008 } |
| 1009 |
| 1010 // Set the shader opacity. |
| 1011 setShaderOpacity(m_drawCache.alpha, m_drawCache.alpha_location); |
| 1012 |
| 1013 COMPILE_ASSERT(sizeof(Float4) == 4 * sizeof(float), struct_is_densely_packed
); |
| 1014 COMPILE_ASSERT(sizeof(Float16) == 16 * sizeof(float), struct_is_densely_pack
ed); |
| 1015 |
| 1016 // Upload the tranforms for both points and uvs. |
| 1017 GLC(m_context, m_context->uniformMatrix4fv((int)m_drawCache.matrix_location,
(int)m_drawCache.matrix_data.size(), false, (float*)&m_drawCache.matrix_data.fr
ont())); |
| 1018 GLC(m_context, m_context->uniform4fv((int)m_drawCache.uv_xform_location, (in
t)m_drawCache.uv_xform_data.size(), (float*)&m_drawCache.uv_xform_data.front()))
; |
| 1019 |
| 1020 // Draw the quads! |
| 1021 GLC(m_context, m_context->drawElements(GL_TRIANGLES, 6 * m_drawCache.matrix_
data.size(), GL_UNSIGNED_SHORT, 0)); |
| 1022 |
| 1023 // Clean up after ourselves (reset state set above). |
| 1024 if (!m_drawCache.use_premultiplied_alpha) |
| 1025 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
| 1026 |
| 1027 // Clear the cache. |
| 1028 m_drawCache.program_id = 0; |
| 1029 m_drawCache.uv_xform_data.resize(0); |
| 1030 m_drawCache.matrix_data.resize(0); |
| 1031 } |
| 1032 |
| 1033 void GLRenderer::enqueueTextureQuad(const DrawingFrame& frame, const TextureDraw
Quad* quad) |
| 1034 { |
| 1035 // Choose the correcte texture program binding |
| 1036 TexTransformTextureProgramBinding binding; |
| 1037 if (quad->flipped) |
| 1038 binding.set(textureProgramFlip(), context()); |
| 1039 else |
| 1040 binding.set(textureProgram(), context()); |
| 1041 |
| 1042 int resourceID = quad->resource_id; |
| 1043 |
| 1044 if (m_drawCache.program_id != binding.programId || |
| 1045 m_drawCache.resource_id != resourceID || |
| 1046 m_drawCache.alpha != quad->opacity() || |
| 1047 m_drawCache.use_premultiplied_alpha != quad->premultiplied_alpha || |
| 1048 m_drawCache.needs_blending != quad->ShouldDrawWithBlending() || |
| 1049 m_drawCache.matrix_data.size() >= 8) { |
| 1050 flushTextureQuadCache(); |
| 1051 m_drawCache.program_id = binding.programId; |
| 1052 m_drawCache.resource_id = resourceID; |
| 1053 m_drawCache.alpha = quad->opacity(); |
| 1054 m_drawCache.use_premultiplied_alpha = quad->premultiplied_alpha; |
| 1055 m_drawCache.needs_blending = quad->ShouldDrawWithBlending(); |
| 1056 |
| 1057 m_drawCache.alpha_location = binding.alphaLocation; |
| 1058 m_drawCache.uv_xform_location = binding.texTransformLocation; |
| 1059 m_drawCache.matrix_location = binding.matrixLocation; |
| 1060 } |
| 1061 |
| 1062 // Generate the uv-transform |
| 1063 const gfx::RectF& uvRect = quad->uv_rect; |
| 1064 Float4 uv = {uvRect.x(), uvRect.y(), uvRect.width(), uvRect.height()}; |
| 1065 m_drawCache.uv_xform_data.push_back(uv); |
| 1066 |
| 1067 // Generate the transform matrix |
| 1068 gfx::Transform quadRectMatrix; |
| 1069 quadRectTransform(&quadRectMatrix, quad->quadTransform(), quad->rect); |
| 1070 quadRectMatrix = frame.projectionMatrix * quadRectMatrix; |
| 1071 |
| 1072 Float16 m; |
| 1073 quadRectMatrix.matrix().asColMajorf(m.data); |
| 1074 m_drawCache.matrix_data.push_back(m); |
| 1075 } |
| 1076 |
980 void GLRenderer::drawTextureQuad(const DrawingFrame& frame, const TextureDrawQua
d* quad) | 1077 void GLRenderer::drawTextureQuad(const DrawingFrame& frame, const TextureDrawQua
d* quad) |
981 { | 1078 { |
982 TexTransformTextureProgramBinding binding; | 1079 TexTransformTextureProgramBinding binding; |
983 if (quad->flipped) | 1080 if (quad->flipped) |
984 binding.set(textureProgramFlip(), context()); | 1081 binding.set(textureProgramFlip(), context()); |
985 else | 1082 else |
986 binding.set(textureProgram(), context()); | 1083 binding.set(textureProgram(), context()); |
987 GLC(context(), context()->useProgram(binding.programId)); | 1084 setUseProgram(binding.programId); |
988 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); | 1085 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); |
989 const gfx::RectF& uvRect = quad->uv_rect; | 1086 const gfx::RectF& uvRect = quad->uv_rect; |
990 GLC(context(), context()->uniform4f(binding.texTransformLocation, uvRect.x()
, uvRect.y(), uvRect.width(), uvRect.height())); | 1087 GLC(context(), context()->uniform4f(binding.texTransformLocation, uvRect.x()
, uvRect.y(), uvRect.width(), uvRect.height())); |
991 | 1088 |
992 ResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad
->resource_id); | 1089 ResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad
->resource_id); |
993 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, quadResourceLock.textur
eId())); | 1090 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, quadResourceLock.textur
eId())); |
994 | 1091 |
995 if (!quad->premultiplied_alpha) { | 1092 if (!quad->premultiplied_alpha) { |
996 // As it turns out, the premultiplied alpha blending function (ONE, ONE_
MINUS_SRC_ALPHA) | 1093 // As it turns out, the premultiplied alpha blending function (ONE, ONE_
MINUS_SRC_ALPHA) |
997 // will never cause the alpha channel to be set to anything less than 1.
0 if it is | 1094 // will never cause the alpha channel to be set to anything less than 1.
0 if it is |
(...skipping 11 matching lines...) Expand all Loading... |
1009 | 1106 |
1010 if (!quad->premultiplied_alpha) | 1107 if (!quad->premultiplied_alpha) |
1011 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 1108 GLC(m_context, m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
1012 } | 1109 } |
1013 | 1110 |
1014 void GLRenderer::drawIOSurfaceQuad(const DrawingFrame& frame, const IOSurfaceDra
wQuad* quad) | 1111 void GLRenderer::drawIOSurfaceQuad(const DrawingFrame& frame, const IOSurfaceDra
wQuad* quad) |
1015 { | 1112 { |
1016 TexTransformTextureProgramBinding binding; | 1113 TexTransformTextureProgramBinding binding; |
1017 binding.set(textureIOSurfaceProgram(), context()); | 1114 binding.set(textureIOSurfaceProgram(), context()); |
1018 | 1115 |
1019 GLC(context(), context()->useProgram(binding.programId)); | 1116 setUseProgram(binding.programId); |
1020 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); | 1117 GLC(context(), context()->uniform1i(binding.samplerLocation, 0)); |
1021 if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) | 1118 if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) |
1022 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, qua
d->io_surface_size.height(), quad->io_surface_size.width(), quad->io_surface_siz
e.height() * -1.0)); | 1119 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, qua
d->io_surface_size.height(), quad->io_surface_size.width(), quad->io_surface_siz
e.height() * -1.0)); |
1023 else | 1120 else |
1024 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, 0,
quad->io_surface_size.width(), quad->io_surface_size.height())); | 1121 GLC(context(), context()->uniform4f(binding.texTransformLocation, 0, 0,
quad->io_surface_size.width(), quad->io_surface_size.height())); |
1025 | 1122 |
1026 GLC(context(), context()->bindTexture(GL_TEXTURE_RECTANGLE_ARB, quad->io_sur
face_texture_id)); | 1123 GLC(context(), context()->bindTexture(GL_TEXTURE_RECTANGLE_ARB, quad->io_sur
face_texture_id)); |
1027 | 1124 |
1028 setShaderOpacity(quad->opacity(), binding.alphaLocation); | 1125 setShaderOpacity(quad->opacity(), binding.alphaLocation); |
1029 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, binding.matrixLoc
ation); | 1126 drawQuadGeometry(frame, quad->quadTransform(), quad->rect, binding.matrixLoc
ation); |
1030 | 1127 |
1031 GLC(context(), context()->bindTexture(GL_TEXTURE_RECTANGLE_ARB, 0)); | 1128 GLC(context(), context()->bindTexture(GL_TEXTURE_RECTANGLE_ARB, 0)); |
1032 } | 1129 } |
1033 | 1130 |
1034 void GLRenderer::finishDrawingFrame(DrawingFrame& frame) | 1131 void GLRenderer::finishDrawingFrame(DrawingFrame& frame) |
1035 { | 1132 { |
1036 m_currentFramebufferLock.reset(); | 1133 m_currentFramebufferLock.reset(); |
1037 m_swapBufferRect.Union(gfx::ToEnclosingRect(frame.rootDamageRect)); | 1134 m_swapBufferRect.Union(gfx::ToEnclosingRect(frame.rootDamageRect)); |
1038 | 1135 |
1039 GLC(m_context, m_context->disable(GL_BLEND)); | 1136 GLC(m_context, m_context->disable(GL_BLEND)); |
| 1137 m_blendShadow = false; |
| 1138 } |
| 1139 |
| 1140 void GLRenderer::finishDrawingQuadList() |
| 1141 { |
| 1142 flushTextureQuadCache(); |
1040 } | 1143 } |
1041 | 1144 |
1042 bool GLRenderer::flippedFramebuffer() const | 1145 bool GLRenderer::flippedFramebuffer() const |
1043 { | 1146 { |
1044 return true; | 1147 return true; |
1045 } | 1148 } |
1046 | 1149 |
1047 void GLRenderer::ensureScissorTestEnabled() | 1150 void GLRenderer::ensureScissorTestEnabled() |
1048 { | 1151 { |
1049 if (m_isScissorEnabled) | 1152 if (m_isScissorEnabled) |
1050 return; | 1153 return; |
1051 | 1154 |
| 1155 flushTextureQuadCache(); |
1052 GLC(m_context, m_context->enable(GL_SCISSOR_TEST)); | 1156 GLC(m_context, m_context->enable(GL_SCISSOR_TEST)); |
1053 m_isScissorEnabled = true; | 1157 m_isScissorEnabled = true; |
1054 } | 1158 } |
1055 | 1159 |
1056 void GLRenderer::ensureScissorTestDisabled() | 1160 void GLRenderer::ensureScissorTestDisabled() |
1057 { | 1161 { |
1058 if (!m_isScissorEnabled) | 1162 if (!m_isScissorEnabled) |
1059 return; | 1163 return; |
1060 | 1164 |
| 1165 flushTextureQuadCache(); |
1061 GLC(m_context, m_context->disable(GL_SCISSOR_TEST)); | 1166 GLC(m_context, m_context->disable(GL_SCISSOR_TEST)); |
1062 m_isScissorEnabled = false; | 1167 m_isScissorEnabled = false; |
1063 } | 1168 } |
1064 | 1169 |
1065 void GLRenderer::toGLMatrix(float* glMatrix, const gfx::Transform& transform) | 1170 void GLRenderer::toGLMatrix(float* glMatrix, const gfx::Transform& transform) |
1066 { | 1171 { |
1067 transform.matrix().asColMajorf(glMatrix); | 1172 transform.matrix().asColMajorf(glMatrix); |
1068 } | 1173 } |
1069 | 1174 |
1070 void GLRenderer::setShaderQuadF(const gfx::QuadF& quad, int quadLocation) | 1175 void GLRenderer::setShaderQuadF(const gfx::QuadF& quad, int quadLocation) |
(...skipping 12 matching lines...) Expand all Loading... |
1083 point[7] = quad.p4().y(); | 1188 point[7] = quad.p4().y(); |
1084 GLC(m_context, m_context->uniform2fv(quadLocation, 4, point)); | 1189 GLC(m_context, m_context->uniform2fv(quadLocation, 4, point)); |
1085 } | 1190 } |
1086 | 1191 |
1087 void GLRenderer::setShaderOpacity(float opacity, int alphaLocation) | 1192 void GLRenderer::setShaderOpacity(float opacity, int alphaLocation) |
1088 { | 1193 { |
1089 if (alphaLocation != -1) | 1194 if (alphaLocation != -1) |
1090 GLC(m_context, m_context->uniform1f(alphaLocation, opacity)); | 1195 GLC(m_context, m_context->uniform1f(alphaLocation, opacity)); |
1091 } | 1196 } |
1092 | 1197 |
| 1198 void GLRenderer::setBlendEnabled(bool enabled) |
| 1199 { |
| 1200 if (enabled == m_blendShadow) |
| 1201 return; |
| 1202 |
| 1203 if (enabled) |
| 1204 GLC(m_context, m_context->enable(GL_BLEND)); |
| 1205 else |
| 1206 GLC(m_context, m_context->disable(GL_BLEND)); |
| 1207 m_blendShadow = enabled; |
| 1208 } |
| 1209 |
| 1210 void GLRenderer::setUseProgram(unsigned program) |
| 1211 { |
| 1212 if (program == m_programShadow) |
| 1213 return; |
| 1214 GLC(m_context, m_context->useProgram(program)); |
| 1215 m_programShadow = program; |
| 1216 } |
| 1217 |
1093 void GLRenderer::drawQuadGeometry(const DrawingFrame& frame, const gfx::Transfor
m& drawTransform, const gfx::RectF& quadRect, int matrixLocation) | 1218 void GLRenderer::drawQuadGeometry(const DrawingFrame& frame, const gfx::Transfor
m& drawTransform, const gfx::RectF& quadRect, int matrixLocation) |
1094 { | 1219 { |
1095 gfx::Transform quadRectMatrix; | 1220 gfx::Transform quadRectMatrix; |
1096 quadRectTransform(&quadRectMatrix, drawTransform, quadRect); | 1221 quadRectTransform(&quadRectMatrix, drawTransform, quadRect); |
1097 static float glMatrix[16]; | 1222 static float glMatrix[16]; |
1098 toGLMatrix(&glMatrix[0], frame.projectionMatrix * quadRectMatrix); | 1223 toGLMatrix(&glMatrix[0], frame.projectionMatrix * quadRectMatrix); |
1099 GLC(m_context, m_context->uniformMatrix4fv(matrixLocation, 1, false, &glMatr
ix[0])); | 1224 GLC(m_context, m_context->uniformMatrix4fv(matrixLocation, 1, false, &glMatr
ix[0])); |
1100 | 1225 |
1101 GLC(m_context, m_context->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0
)); | 1226 GLC(m_context, m_context->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0
)); |
1102 } | 1227 } |
1103 | 1228 |
1104 void GLRenderer::copyTextureToFramebuffer(const DrawingFrame& frame, int texture
Id, const gfx::Rect& rect, const gfx::Transform& drawMatrix) | 1229 void GLRenderer::copyTextureToFramebuffer(const DrawingFrame& frame, int texture
Id, const gfx::Rect& rect, const gfx::Transform& drawMatrix) |
1105 { | 1230 { |
1106 const RenderPassProgram* program = renderPassProgram(); | 1231 const RenderPassProgram* program = renderPassProgram(); |
1107 | 1232 |
1108 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, textureId)); | 1233 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, textureId)); |
1109 | 1234 |
1110 GLC(context(), context()->useProgram(program->program())); | 1235 setUseProgram(program->program()); |
1111 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocatio
n(), 0)); | 1236 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocatio
n(), 0)); |
1112 setShaderOpacity(1, program->fragmentShader().alphaLocation()); | 1237 setShaderOpacity(1, program->fragmentShader().alphaLocation()); |
1113 drawQuadGeometry(frame, drawMatrix, rect, program->vertexShader().matrixLoca
tion()); | 1238 drawQuadGeometry(frame, drawMatrix, rect, program->vertexShader().matrixLoca
tion()); |
1114 } | 1239 } |
1115 | 1240 |
1116 void GLRenderer::finish() | 1241 void GLRenderer::finish() |
1117 { | 1242 { |
1118 TRACE_EVENT0("cc", "GLRenderer::finish"); | 1243 TRACE_EVENT0("cc", "GLRenderer::finish"); |
1119 m_context->finish(); | 1244 m_context->finish(); |
1120 } | 1245 } |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1351 void GLRenderer::setScissorTestRect(const gfx::Rect& scissorRect) | 1476 void GLRenderer::setScissorTestRect(const gfx::Rect& scissorRect) |
1352 { | 1477 { |
1353 ensureScissorTestEnabled(); | 1478 ensureScissorTestEnabled(); |
1354 | 1479 |
1355 // Don't unnecessarily ask the context to change the scissor, because it | 1480 // Don't unnecessarily ask the context to change the scissor, because it |
1356 // may cause undesired GPU pipeline flushes. | 1481 // may cause undesired GPU pipeline flushes. |
1357 if (scissorRect == m_scissorRect) | 1482 if (scissorRect == m_scissorRect) |
1358 return; | 1483 return; |
1359 | 1484 |
1360 m_scissorRect = scissorRect; | 1485 m_scissorRect = scissorRect; |
| 1486 flushTextureQuadCache(); |
1361 GLC(m_context, m_context->scissor(scissorRect.x(), scissorRect.y(), scissorR
ect.width(), scissorRect.height())); | 1487 GLC(m_context, m_context->scissor(scissorRect.x(), scissorRect.y(), scissorR
ect.width(), scissorRect.height())); |
1362 } | 1488 } |
1363 | 1489 |
1364 void GLRenderer::setDrawViewportSize(const gfx::Size& viewportSize) | 1490 void GLRenderer::setDrawViewportSize(const gfx::Size& viewportSize) |
1365 { | 1491 { |
1366 GLC(m_context, m_context->viewport(0, 0, viewportSize.width(), viewportSize.
height())); | 1492 GLC(m_context, m_context->viewport(0, 0, viewportSize.width(), viewportSize.
height())); |
1367 } | 1493 } |
1368 | 1494 |
1369 bool GLRenderer::makeContextCurrent() | 1495 bool GLRenderer::makeContextCurrent() |
1370 { | 1496 { |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 return m_tileProgramSwizzleAA.get(); | 1646 return m_tileProgramSwizzleAA.get(); |
1521 } | 1647 } |
1522 | 1648 |
1523 const GLRenderer::TextureProgram* GLRenderer::textureProgram() | 1649 const GLRenderer::TextureProgram* GLRenderer::textureProgram() |
1524 { | 1650 { |
1525 if (!m_textureProgram) | 1651 if (!m_textureProgram) |
1526 m_textureProgram = make_scoped_ptr(new TextureProgram(m_context)); | 1652 m_textureProgram = make_scoped_ptr(new TextureProgram(m_context)); |
1527 if (!m_textureProgram->initialized()) { | 1653 if (!m_textureProgram->initialized()) { |
1528 TRACE_EVENT0("cc", "GLRenderer::textureProgram::initialize"); | 1654 TRACE_EVENT0("cc", "GLRenderer::textureProgram::initialize"); |
1529 m_textureProgram->initialize(m_context, m_isUsingBindUniform); | 1655 m_textureProgram->initialize(m_context, m_isUsingBindUniform); |
| 1656 GLC(context(), context()->uniform1i(m_textureProgram.get()->fragmentShad
er().samplerLocation(), 0)); |
1530 } | 1657 } |
1531 return m_textureProgram.get(); | 1658 return m_textureProgram.get(); |
1532 } | 1659 } |
1533 | 1660 |
1534 const GLRenderer::TextureProgramFlip* GLRenderer::textureProgramFlip() | 1661 const GLRenderer::TextureProgramFlip* GLRenderer::textureProgramFlip() |
1535 { | 1662 { |
1536 if (!m_textureProgramFlip) | 1663 if (!m_textureProgramFlip) |
1537 m_textureProgramFlip = make_scoped_ptr(new TextureProgramFlip(m_context)
); | 1664 m_textureProgramFlip = make_scoped_ptr(new TextureProgramFlip(m_context)
); |
1538 if (!m_textureProgramFlip->initialized()) { | 1665 if (!m_textureProgramFlip->initialized()) { |
1539 TRACE_EVENT0("cc", "GLRenderer::textureProgramFlip::initialize"); | 1666 TRACE_EVENT0("cc", "GLRenderer::textureProgramFlip::initialize"); |
1540 m_textureProgramFlip->initialize(m_context, m_isUsingBindUniform); | 1667 m_textureProgramFlip->initialize(m_context, m_isUsingBindUniform); |
| 1668 GLC(context(), context()->uniform1i(m_textureProgramFlip.get()->fragment
Shader().samplerLocation(), 0)); |
1541 } | 1669 } |
1542 return m_textureProgramFlip.get(); | 1670 return m_textureProgramFlip.get(); |
1543 } | 1671 } |
1544 | 1672 |
1545 const GLRenderer::TextureIOSurfaceProgram* GLRenderer::textureIOSurfaceProgram() | 1673 const GLRenderer::TextureIOSurfaceProgram* GLRenderer::textureIOSurfaceProgram() |
1546 { | 1674 { |
1547 if (!m_textureIOSurfaceProgram) | 1675 if (!m_textureIOSurfaceProgram) |
1548 m_textureIOSurfaceProgram = make_scoped_ptr(new TextureIOSurfaceProgram(
m_context)); | 1676 m_textureIOSurfaceProgram = make_scoped_ptr(new TextureIOSurfaceProgram(
m_context)); |
1549 if (!m_textureIOSurfaceProgram->initialized()) { | 1677 if (!m_textureIOSurfaceProgram->initialized()) { |
1550 TRACE_EVENT0("cc", "GLRenderer::textureIOSurfaceProgram::initialize"); | 1678 TRACE_EVENT0("cc", "GLRenderer::textureIOSurfaceProgram::initialize"); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1625 | 1753 |
1626 releaseRenderPassTextures(); | 1754 releaseRenderPassTextures(); |
1627 } | 1755 } |
1628 | 1756 |
1629 bool GLRenderer::isContextLost() | 1757 bool GLRenderer::isContextLost() |
1630 { | 1758 { |
1631 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); | 1759 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); |
1632 } | 1760 } |
1633 | 1761 |
1634 } // namespace cc | 1762 } // namespace cc |
OLD | NEW |