| 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 "FloatRect.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/string_split.h" | 12 #include "base/string_split.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "cc/damage_tracker.h" | 14 #include "cc/damage_tracker.h" |
| 15 #include "cc/geometry_binding.h" | 15 #include "cc/geometry_binding.h" |
| 16 #include "cc/layer_quad.h" | 16 #include "cc/layer_quad.h" |
| 17 #include "cc/math_util.h" | 17 #include "cc/math_util.h" |
| 18 #include "cc/platform_color.h" | 18 #include "cc/platform_color.h" |
| 19 #include "cc/priority_calculator.h" | 19 #include "cc/priority_calculator.h" |
| 20 #include "cc/proxy.h" | 20 #include "cc/proxy.h" |
| 21 #include "cc/render_pass.h" | 21 #include "cc/render_pass.h" |
| 22 #include "cc/render_surface_filters.h" | 22 #include "cc/render_surface_filters.h" |
| 23 #include "cc/scoped_texture.h" | 23 #include "cc/scoped_texture.h" |
| 24 #include "cc/settings.h" | 24 #include "cc/settings.h" |
| 25 #include "cc/single_thread_proxy.h" | 25 #include "cc/single_thread_proxy.h" |
| 26 #include "cc/stream_video_draw_quad.h" | 26 #include "cc/stream_video_draw_quad.h" |
| 27 #include "cc/texture_draw_quad.h" | 27 #include "cc/texture_draw_quad.h" |
| 28 #include "cc/video_layer_impl.h" | 28 #include "cc/video_layer_impl.h" |
| 29 #include "third_party/khronos/GLES2/gl2.h" | 29 #include "third_party/khronos/GLES2/gl2.h" |
| 30 #include "third_party/khronos/GLES2/gl2ext.h" | 30 #include "third_party/khronos/GLES2/gl2ext.h" |
| 31 #include "third_party/skia/include/core/SkBitmap.h" | 31 #include "third_party/skia/include/core/SkBitmap.h" |
| 32 #include "third_party/skia/include/core/SkColor.h" | 32 #include "third_party/skia/include/core/SkColor.h" |
| 33 #include "third_party/skia/include/gpu/GrContext.h" | 33 #include "third_party/skia/include/gpu/GrContext.h" |
| 34 #include "third_party/skia/include/gpu/GrTexture.h" | 34 #include "third_party/skia/include/gpu/GrTexture.h" |
| 35 #include "third_party/skia/include/gpu/SkGpuDevice.h" | 35 #include "third_party/skia/include/gpu/SkGpuDevice.h" |
| 36 #include "third_party/skia/include/gpu/SkGrTexturePixelRef.h" | 36 #include "third_party/skia/include/gpu/SkGrTexturePixelRef.h" |
| 37 #include "ui/gfx/quad_f.h" |
| 37 #include "ui/gfx/rect_conversions.h" | 38 #include "ui/gfx/rect_conversions.h" |
| 38 #include <public/WebGraphicsContext3D.h> | 39 #include <public/WebGraphicsContext3D.h> |
| 39 #include <public/WebSharedGraphicsContext3D.h> | 40 #include <public/WebSharedGraphicsContext3D.h> |
| 40 #include <set> | 41 #include <set> |
| 41 #include <string> | 42 #include <string> |
| 42 #include <vector> | 43 #include <vector> |
| 43 | 44 |
| 44 using namespace std; | 45 using namespace std; |
| 45 using WebKit::WebGraphicsContext3D; | 46 using WebKit::WebGraphicsContext3D; |
| 46 using WebKit::WebGraphicsMemoryAllocation; | 47 using WebKit::WebGraphicsMemoryAllocation; |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 if (filters.isEmpty()) | 450 if (filters.isEmpty()) |
| 450 return scoped_ptr<ScopedTexture>(); | 451 return scoped_ptr<ScopedTexture>(); |
| 451 | 452 |
| 452 // FIXME: We only allow background filters on an opaque render surface becau
se other surfaces may contain | 453 // FIXME: We only allow background filters on an opaque render surface becau
se other surfaces may contain |
| 453 // translucent pixels, and the contents behind those translucent pixels woul
dn't have the filter applied. | 454 // translucent pixels, and the contents behind those translucent pixels woul
dn't have the filter applied. |
| 454 if (frame.currentRenderPass->hasTransparentBackground()) | 455 if (frame.currentRenderPass->hasTransparentBackground()) |
| 455 return scoped_ptr<ScopedTexture>(); | 456 return scoped_ptr<ScopedTexture>(); |
| 456 DCHECK(!frame.currentTexture); | 457 DCHECK(!frame.currentTexture); |
| 457 | 458 |
| 458 // FIXME: Do a single readback for both the surface and replica and cache th
e filtered results (once filter textures are not reused). | 459 // FIXME: Do a single readback for both the surface and replica and cache th
e filtered results (once filter textures are not reused). |
| 459 gfx::Rect deviceRect = gfx::ToEnclosingRect(MathUtil::mapClippedRect(content
sDeviceTransform, sharedGeometryQuad().boundingBox())); | 460 gfx::Rect deviceRect = gfx::ToEnclosingRect(MathUtil::mapClippedRect(content
sDeviceTransform, sharedGeometryQuad().BoundingBox())); |
| 460 | 461 |
| 461 int top, right, bottom, left; | 462 int top, right, bottom, left; |
| 462 filters.getOutsets(top, right, bottom, left); | 463 filters.getOutsets(top, right, bottom, left); |
| 463 deviceRect.Inset(-left, -top, -right, -bottom); | 464 deviceRect.Inset(-left, -top, -right, -bottom); |
| 464 | 465 |
| 465 deviceRect.Intersect(frame.currentRenderPass->outputRect()); | 466 deviceRect.Intersect(frame.currentRenderPass->outputRect()); |
| 466 | 467 |
| 467 scoped_ptr<ScopedTexture> deviceBackgroundTexture = ScopedTexture::create(m_
resourceProvider); | 468 scoped_ptr<ScopedTexture> deviceBackgroundTexture = ScopedTexture::create(m_
resourceProvider); |
| 468 if (!getFramebufferTexture(deviceBackgroundTexture.get(), deviceRect)) | 469 if (!getFramebufferTexture(deviceBackgroundTexture.get(), deviceRect)) |
| 469 return scoped_ptr<ScopedTexture>(); | 470 return scoped_ptr<ScopedTexture>(); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 } | 539 } |
| 539 | 540 |
| 540 // Draw the background texture if there is one. | 541 // Draw the background texture if there is one. |
| 541 if (backgroundTexture) { | 542 if (backgroundTexture) { |
| 542 DCHECK(backgroundTexture->size() == quad->quadRect().size()); | 543 DCHECK(backgroundTexture->size() == quad->quadRect().size()); |
| 543 ResourceProvider::ScopedReadLockGL lock(m_resourceProvider, backgroundTe
xture->id()); | 544 ResourceProvider::ScopedReadLockGL lock(m_resourceProvider, backgroundTe
xture->id()); |
| 544 copyTextureToFramebuffer(frame, lock.textureId(), quad->quadRect(), quad
->quadTransform()); | 545 copyTextureToFramebuffer(frame, lock.textureId(), quad->quadRect(), quad
->quadTransform()); |
| 545 } | 546 } |
| 546 | 547 |
| 547 bool clipped = false; | 548 bool clipped = false; |
| 548 FloatQuad deviceQuad = MathUtil::mapQuad(contentsDeviceTransform, sharedGeom
etryQuad(), clipped); | 549 gfx::QuadF deviceQuad = MathUtil::mapQuad(contentsDeviceTransform, sharedGeo
metryQuad(), clipped); |
| 549 DCHECK(!clipped); | 550 DCHECK(!clipped); |
| 550 LayerQuad deviceLayerBounds = LayerQuad(FloatQuad(deviceQuad.boundingBox()))
; | 551 LayerQuad deviceLayerBounds = LayerQuad(gfx::QuadF(deviceQuad.BoundingBox())
); |
| 551 LayerQuad deviceLayerEdges = LayerQuad(deviceQuad); | 552 LayerQuad deviceLayerEdges = LayerQuad(deviceQuad); |
| 552 | 553 |
| 553 // Use anti-aliasing programs only when necessary. | 554 // Use anti-aliasing programs only when necessary. |
| 554 bool useAA = (!deviceQuad.isRectilinear() || !cc::FloatRect(deviceQuad.bound
ingBox()).isExpressibleAsIntRect()); | 555 bool useAA = (!deviceQuad.IsRectilinear() || !cc::FloatRect(deviceQuad.Bound
ingBox()).isExpressibleAsIntRect()); |
| 555 if (useAA) { | 556 if (useAA) { |
| 556 deviceLayerBounds.inflateAntiAliasingDistance(); | 557 deviceLayerBounds.inflateAntiAliasingDistance(); |
| 557 deviceLayerEdges.inflateAntiAliasingDistance(); | 558 deviceLayerEdges.inflateAntiAliasingDistance(); |
| 558 } | 559 } |
| 559 | 560 |
| 560 scoped_ptr<ResourceProvider::ScopedReadLockGL> maskResourceLock; | 561 scoped_ptr<ResourceProvider::ScopedReadLockGL> maskResourceLock; |
| 561 unsigned maskTextureId = 0; | 562 unsigned maskTextureId = 0; |
| 562 if (quad->maskResourceId()) { | 563 if (quad->maskResourceId()) { |
| 563 maskResourceLock.reset(new ResourceProvider::ScopedReadLockGL(m_resource
Provider, quad->maskResourceId())); | 564 maskResourceLock.reset(new ResourceProvider::ScopedReadLockGL(m_resource
Provider, quad->maskResourceId())); |
| 564 maskTextureId = maskResourceLock->textureId(); | 565 maskTextureId = maskResourceLock->textureId(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 } | 629 } |
| 629 | 630 |
| 630 if (shaderEdgeLocation != -1) { | 631 if (shaderEdgeLocation != -1) { |
| 631 float edge[24]; | 632 float edge[24]; |
| 632 deviceLayerEdges.toFloatArray(edge); | 633 deviceLayerEdges.toFloatArray(edge); |
| 633 deviceLayerBounds.toFloatArray(&edge[12]); | 634 deviceLayerBounds.toFloatArray(&edge[12]); |
| 634 GLC(context(), context()->uniform3fv(shaderEdgeLocation, 8, edge)); | 635 GLC(context(), context()->uniform3fv(shaderEdgeLocation, 8, edge)); |
| 635 } | 636 } |
| 636 | 637 |
| 637 // Map device space quad to surface space. contentsDeviceTransform has no 3d
component since it was generated with to2dTransform() so we don't need to proje
ct. | 638 // Map device space quad to surface space. contentsDeviceTransform has no 3d
component since it was generated with to2dTransform() so we don't need to proje
ct. |
| 638 FloatQuad surfaceQuad = MathUtil::mapQuad(contentsDeviceTransform.inverse(),
deviceLayerEdges.floatQuad(), clipped); | 639 gfx::QuadF surfaceQuad = MathUtil::mapQuad(contentsDeviceTransform.inverse()
, deviceLayerEdges.ToQuadF(), clipped); |
| 639 DCHECK(!clipped); | 640 DCHECK(!clipped); |
| 640 | 641 |
| 641 setShaderOpacity(quad->opacity(), shaderAlphaLocation); | 642 setShaderOpacity(quad->opacity(), shaderAlphaLocation); |
| 642 setShaderFloatQuad(surfaceQuad, shaderQuadLocation); | 643 setShaderQuadF(surfaceQuad, shaderQuadLocation); |
| 643 drawQuadGeometry(frame, quad->quadTransform(), quad->quadRect(), shaderMatri
xLocation); | 644 drawQuadGeometry(frame, quad->quadTransform(), quad->quadRect(), shaderMatri
xLocation); |
| 644 } | 645 } |
| 645 | 646 |
| 646 void GLRenderer::drawSolidColorQuad(const DrawingFrame& frame, const SolidColorD
rawQuad* quad) | 647 void GLRenderer::drawSolidColorQuad(const DrawingFrame& frame, const SolidColorD
rawQuad* quad) |
| 647 { | 648 { |
| 648 const SolidColorProgram* program = solidColorProgram(); | 649 const SolidColorProgram* program = solidColorProgram(); |
| 649 GLC(context(), context()->useProgram(program->program())); | 650 GLC(context(), context()->useProgram(program->program())); |
| 650 | 651 |
| 651 SkColor color = quad->color(); | 652 SkColor color = quad->color(); |
| 652 float opacity = quad->opacity(); | 653 float opacity = quad->opacity(); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 float vertexTexScaleY = tileRect.height() / clampRect.height(); | 708 float vertexTexScaleY = tileRect.height() / clampRect.height(); |
| 708 | 709 |
| 709 // Map to normalized texture coordinates. | 710 // Map to normalized texture coordinates. |
| 710 const gfx::Size& textureSize = quad->textureSize(); | 711 const gfx::Size& textureSize = quad->textureSize(); |
| 711 float fragmentTexTranslateX = textureOffset.x() / textureSize.width(); | 712 float fragmentTexTranslateX = textureOffset.x() / textureSize.width(); |
| 712 float fragmentTexTranslateY = textureOffset.y() / textureSize.height(); | 713 float fragmentTexTranslateY = textureOffset.y() / textureSize.height(); |
| 713 float fragmentTexScaleX = clampRect.width() / textureSize.width(); | 714 float fragmentTexScaleX = clampRect.width() / textureSize.width(); |
| 714 float fragmentTexScaleY = clampRect.height() / textureSize.height(); | 715 float fragmentTexScaleY = clampRect.height() / textureSize.height(); |
| 715 | 716 |
| 716 | 717 |
| 717 FloatQuad localQuad; | 718 gfx::QuadF localQuad; |
| 718 WebTransformationMatrix deviceTransform = WebTransformationMatrix(frame.wind
owMatrix * frame.projectionMatrix * quad->quadTransform()).to2dTransform(); | 719 WebTransformationMatrix deviceTransform = WebTransformationMatrix(frame.wind
owMatrix * frame.projectionMatrix * quad->quadTransform()).to2dTransform(); |
| 719 if (!deviceTransform.isInvertible()) | 720 if (!deviceTransform.isInvertible()) |
| 720 return; | 721 return; |
| 721 | 722 |
| 722 bool clipped = false; | 723 bool clipped = false; |
| 723 FloatQuad deviceLayerQuad = MathUtil::mapQuad(deviceTransform, FloatQuad(qua
d->visibleContentRect()), clipped); | 724 gfx::QuadF deviceLayerQuad = MathUtil::mapQuad(deviceTransform, gfx::QuadF(q
uad->visibleContentRect()), clipped); |
| 724 DCHECK(!clipped); | 725 DCHECK(!clipped); |
| 725 | 726 |
| 726 TileProgramUniforms uniforms; | 727 TileProgramUniforms uniforms; |
| 727 // For now, we simply skip anti-aliasing with the quad is clipped. This only
happens | 728 // For now, we simply skip anti-aliasing with the quad is clipped. This only
happens |
| 728 // on perspective transformed layers that go partially behind the camera. | 729 // on perspective transformed layers that go partially behind the camera. |
| 729 if (quad->isAntialiased() && !clipped) { | 730 if (quad->isAntialiased() && !clipped) { |
| 730 if (quad->swizzleContents()) | 731 if (quad->swizzleContents()) |
| 731 tileUniformLocation(tileProgramSwizzleAA(), uniforms); | 732 tileUniformLocation(tileProgramSwizzleAA(), uniforms); |
| 732 else | 733 else |
| 733 tileUniformLocation(tileProgramAA(), uniforms); | 734 tileUniformLocation(tileProgramAA(), uniforms); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 748 GLC(context(), context()->useProgram(uniforms.program)); | 749 GLC(context(), context()->useProgram(uniforms.program)); |
| 749 GLC(context(), context()->uniform1i(uniforms.samplerLocation, 0)); | 750 GLC(context(), context()->uniform1i(uniforms.samplerLocation, 0)); |
| 750 GLC(context(), context()->activeTexture(GL_TEXTURE0)); | 751 GLC(context(), context()->activeTexture(GL_TEXTURE0)); |
| 751 ResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad
->resourceId()); | 752 ResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad
->resourceId()); |
| 752 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, quadResourceLock.textur
eId())); | 753 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, quadResourceLock.textur
eId())); |
| 753 GLC(context(), context()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, quad->textureFilter())); | 754 GLC(context(), context()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER
, quad->textureFilter())); |
| 754 GLC(context(), context()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, quad->textureFilter())); | 755 GLC(context(), context()->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER
, quad->textureFilter())); |
| 755 | 756 |
| 756 bool useAA = !clipped && quad->isAntialiased(); | 757 bool useAA = !clipped && quad->isAntialiased(); |
| 757 if (useAA) { | 758 if (useAA) { |
| 758 LayerQuad deviceLayerBounds = LayerQuad(FloatQuad(deviceLayerQuad.boundi
ngBox())); | 759 LayerQuad deviceLayerBounds = LayerQuad(gfx::QuadF(deviceLayerQuad.Bound
ingBox())); |
| 759 deviceLayerBounds.inflateAntiAliasingDistance(); | 760 deviceLayerBounds.inflateAntiAliasingDistance(); |
| 760 | 761 |
| 761 LayerQuad deviceLayerEdges = LayerQuad(deviceLayerQuad); | 762 LayerQuad deviceLayerEdges = LayerQuad(deviceLayerQuad); |
| 762 deviceLayerEdges.inflateAntiAliasingDistance(); | 763 deviceLayerEdges.inflateAntiAliasingDistance(); |
| 763 | 764 |
| 764 float edge[24]; | 765 float edge[24]; |
| 765 deviceLayerEdges.toFloatArray(edge); | 766 deviceLayerEdges.toFloatArray(edge); |
| 766 deviceLayerBounds.toFloatArray(&edge[12]); | 767 deviceLayerBounds.toFloatArray(&edge[12]); |
| 767 GLC(context(), context()->uniform3fv(uniforms.edgeLocation, 8, edge)); | 768 GLC(context(), context()->uniform3fv(uniforms.edgeLocation, 8, edge)); |
| 768 | 769 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 792 // Only apply anti-aliasing to edges not clipped by culling or scissorin
g. | 793 // Only apply anti-aliasing to edges not clipped by culling or scissorin
g. |
| 793 if (quad->topEdgeAA() && tileRect.y() == quad->quadRect().y()) | 794 if (quad->topEdgeAA() && tileRect.y() == quad->quadRect().y()) |
| 794 topEdge = deviceLayerEdges.top(); | 795 topEdge = deviceLayerEdges.top(); |
| 795 if (quad->leftEdgeAA() && tileRect.x() == quad->quadRect().x()) | 796 if (quad->leftEdgeAA() && tileRect.x() == quad->quadRect().x()) |
| 796 leftEdge = deviceLayerEdges.left(); | 797 leftEdge = deviceLayerEdges.left(); |
| 797 if (quad->rightEdgeAA() && tileRect.right() == quad->quadRect().right()) | 798 if (quad->rightEdgeAA() && tileRect.right() == quad->quadRect().right()) |
| 798 rightEdge = deviceLayerEdges.right(); | 799 rightEdge = deviceLayerEdges.right(); |
| 799 if (quad->bottomEdgeAA() && tileRect.bottom() == quad->quadRect().bottom
()) | 800 if (quad->bottomEdgeAA() && tileRect.bottom() == quad->quadRect().bottom
()) |
| 800 bottomEdge = deviceLayerEdges.bottom(); | 801 bottomEdge = deviceLayerEdges.bottom(); |
| 801 | 802 |
| 802 float sign = FloatQuad(tileRect).isCounterclockwise() ? -1 : 1; | 803 float sign = gfx::QuadF(tileRect).IsCounterClockwise() ? -1 : 1; |
| 803 bottomEdge.scale(sign); | 804 bottomEdge.scale(sign); |
| 804 leftEdge.scale(sign); | 805 leftEdge.scale(sign); |
| 805 topEdge.scale(sign); | 806 topEdge.scale(sign); |
| 806 rightEdge.scale(sign); | 807 rightEdge.scale(sign); |
| 807 | 808 |
| 808 // Create device space quad. | 809 // Create device space quad. |
| 809 LayerQuad deviceQuad(leftEdge, topEdge, rightEdge, bottomEdge); | 810 LayerQuad deviceQuad(leftEdge, topEdge, rightEdge, bottomEdge); |
| 810 | 811 |
| 811 // Map device space quad to local space. contentsDeviceTransform has no
3d component since it was generated with to2dTransform() so we don't need to pro
ject. | 812 // Map device space quad to local space. contentsDeviceTransform has no
3d component since it was generated with to2dTransform() so we don't need to pro
ject. |
| 812 WebTransformationMatrix inverseDeviceTransform = deviceTransform.inverse
(); | 813 WebTransformationMatrix inverseDeviceTransform = deviceTransform.inverse
(); |
| 813 localQuad = MathUtil::mapQuad(inverseDeviceTransform, deviceQuad.floatQu
ad(), clipped); | 814 localQuad = MathUtil::mapQuad(inverseDeviceTransform, deviceQuad.ToQuadF
(), clipped); |
| 814 | 815 |
| 815 // We should not DCHECK(!clipped) here, because anti-aliasing inflation
may cause deviceQuad to become | 816 // We should not DCHECK(!clipped) here, because anti-aliasing inflation
may cause deviceQuad to become |
| 816 // clipped. To our knowledge this scenario does not need to be handled d
ifferently than the unclipped case. | 817 // clipped. To our knowledge this scenario does not need to be handled d
ifferently than the unclipped case. |
| 817 } else { | 818 } else { |
| 818 // Move fragment shader transform to vertex shader. We can do this while | 819 // Move fragment shader transform to vertex shader. We can do this while |
| 819 // still producing correct results as fragmentTexTransformLocation | 820 // still producing correct results as fragmentTexTransformLocation |
| 820 // should always be non-negative when tiles are transformed in a way | 821 // should always be non-negative when tiles are transformed in a way |
| 821 // that could result in sampling outside the layer. | 822 // that could result in sampling outside the layer. |
| 822 vertexTexScaleX *= fragmentTexScaleX; | 823 vertexTexScaleX *= fragmentTexScaleX; |
| 823 vertexTexScaleY *= fragmentTexScaleY; | 824 vertexTexScaleY *= fragmentTexScaleY; |
| 824 vertexTexTranslateX *= fragmentTexScaleX; | 825 vertexTexTranslateX *= fragmentTexScaleX; |
| 825 vertexTexTranslateY *= fragmentTexScaleY; | 826 vertexTexTranslateY *= fragmentTexScaleY; |
| 826 vertexTexTranslateX += fragmentTexTranslateX; | 827 vertexTexTranslateX += fragmentTexTranslateX; |
| 827 vertexTexTranslateY += fragmentTexTranslateY; | 828 vertexTexTranslateY += fragmentTexTranslateY; |
| 828 | 829 |
| 829 GLC(context(), context()->uniform4f(uniforms.vertexTexTransformLocation,
vertexTexTranslateX, vertexTexTranslateY, vertexTexScaleX, vertexTexScaleY)); | 830 GLC(context(), context()->uniform4f(uniforms.vertexTexTransformLocation,
vertexTexTranslateX, vertexTexTranslateY, vertexTexScaleX, vertexTexScaleY)); |
| 830 | 831 |
| 831 localQuad = gfx::RectF(tileRect); | 832 localQuad = gfx::RectF(tileRect); |
| 832 } | 833 } |
| 833 | 834 |
| 834 // Normalize to tileRect. | 835 // Normalize to tileRect. |
| 835 localQuad.scale(1.0f / tileRect.width(), 1.0f / tileRect.height()); | 836 localQuad.Scale(1.0f / tileRect.width(), 1.0f / tileRect.height()); |
| 836 | 837 |
| 837 setShaderOpacity(quad->opacity(), uniforms.alphaLocation); | 838 setShaderOpacity(quad->opacity(), uniforms.alphaLocation); |
| 838 setShaderFloatQuad(localQuad, uniforms.pointLocation); | 839 setShaderQuadF(localQuad, uniforms.pointLocation); |
| 839 | 840 |
| 840 // The tile quad shader behaves differently compared to all other shaders. | 841 // The tile quad shader behaves differently compared to all other shaders. |
| 841 // The transform and vertex data are used to figure out the extents that the | 842 // The transform and vertex data are used to figure out the extents that the |
| 842 // un-antialiased quad should have and which vertex this is and the float | 843 // un-antialiased quad should have and which vertex this is and the float |
| 843 // quad passed in via uniform is the actual geometry that gets used to draw | 844 // quad passed in via uniform is the actual geometry that gets used to draw |
| 844 // it. This is why this centered rect is used and not the original quadRect. | 845 // it. This is why this centered rect is used and not the original quadRect. |
| 845 gfx::RectF centeredRect(gfx::PointF(-0.5 * tileRect.width(), -0.5 * tileRect
.height()), tileRect.size()); | 846 gfx::RectF centeredRect(gfx::PointF(-0.5 * tileRect.width(), -0.5 * tileRect
.height()), tileRect.size()); |
| 846 drawQuadGeometry(frame, quad->quadTransform(), centeredRect, uniforms.matrix
Location); | 847 drawQuadGeometry(frame, quad->quadTransform(), centeredRect, uniforms.matrix
Location); |
| 847 } | 848 } |
| 848 | 849 |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 flattened[8] = m.m31(); | 1045 flattened[8] = m.m31(); |
| 1045 flattened[9] = m.m32(); | 1046 flattened[9] = m.m32(); |
| 1046 flattened[10] = m.m33(); | 1047 flattened[10] = m.m33(); |
| 1047 flattened[11] = m.m34(); | 1048 flattened[11] = m.m34(); |
| 1048 flattened[12] = m.m41(); | 1049 flattened[12] = m.m41(); |
| 1049 flattened[13] = m.m42(); | 1050 flattened[13] = m.m42(); |
| 1050 flattened[14] = m.m43(); | 1051 flattened[14] = m.m43(); |
| 1051 flattened[15] = m.m44(); | 1052 flattened[15] = m.m44(); |
| 1052 } | 1053 } |
| 1053 | 1054 |
| 1054 void GLRenderer::setShaderFloatQuad(const FloatQuad& quad, int quadLocation) | 1055 void GLRenderer::setShaderQuadF(const gfx::QuadF& quad, int quadLocation) |
| 1055 { | 1056 { |
| 1056 if (quadLocation == -1) | 1057 if (quadLocation == -1) |
| 1057 return; | 1058 return; |
| 1058 | 1059 |
| 1059 float point[8]; | 1060 float point[8]; |
| 1060 point[0] = quad.p1().x(); | 1061 point[0] = quad.p1().x(); |
| 1061 point[1] = quad.p1().y(); | 1062 point[1] = quad.p1().y(); |
| 1062 point[2] = quad.p2().x(); | 1063 point[2] = quad.p2().x(); |
| 1063 point[3] = quad.p2().y(); | 1064 point[3] = quad.p2().y(); |
| 1064 point[4] = quad.p3().x(); | 1065 point[4] = quad.p3().x(); |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1625 | 1626 |
| 1626 releaseRenderPassTextures(); | 1627 releaseRenderPassTextures(); |
| 1627 } | 1628 } |
| 1628 | 1629 |
| 1629 bool GLRenderer::isContextLost() | 1630 bool GLRenderer::isContextLost() |
| 1630 { | 1631 { |
| 1631 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); | 1632 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); |
| 1632 } | 1633 } |
| 1633 | 1634 |
| 1634 } // namespace cc | 1635 } // namespace cc |
| OLD | NEW |