Chromium Code Reviews| 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 25 matching lines...) Expand all Loading... | |
| 36 #include <public/WebGraphicsContext3D.h> | 36 #include <public/WebGraphicsContext3D.h> |
| 37 #include <public/WebSharedGraphicsContext3D.h> | 37 #include <public/WebSharedGraphicsContext3D.h> |
| 38 #include <set> | 38 #include <set> |
| 39 #include <string> | 39 #include <string> |
| 40 #include <vector> | 40 #include <vector> |
| 41 | 41 |
| 42 using namespace std; | 42 using namespace std; |
| 43 using WebKit::WebGraphicsContext3D; | 43 using WebKit::WebGraphicsContext3D; |
| 44 using WebKit::WebGraphicsMemoryAllocation; | 44 using WebKit::WebGraphicsMemoryAllocation; |
| 45 using WebKit::WebSharedGraphicsContext3D; | 45 using WebKit::WebSharedGraphicsContext3D; |
| 46 using WebKit::WebTransformationMatrix; | 46 using gfx::Transform; |
| 47 | 47 |
| 48 namespace cc { | 48 namespace cc { |
| 49 | 49 |
| 50 namespace { | 50 namespace { |
| 51 | 51 |
| 52 bool needsIOSurfaceReadbackWorkaround() | 52 bool needsIOSurfaceReadbackWorkaround() |
| 53 { | 53 { |
| 54 #if defined(OS_MACOSX) | 54 #if defined(OS_MACOSX) |
| 55 return true; | 55 return true; |
| 56 #else | 56 #else |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 318 | 318 |
| 319 void GLRenderer::drawDebugBorderQuad(const DrawingFrame& frame, const DebugBorde rDrawQuad* quad) | 319 void GLRenderer::drawDebugBorderQuad(const DrawingFrame& frame, const DebugBorde rDrawQuad* quad) |
| 320 { | 320 { |
| 321 static float glMatrix[16]; | 321 static float glMatrix[16]; |
| 322 const SolidColorProgram* program = solidColorProgram(); | 322 const SolidColorProgram* program = solidColorProgram(); |
| 323 DCHECK(program && (program->initialized() || isContextLost())); | 323 DCHECK(program && (program->initialized() || isContextLost())); |
| 324 GLC(context(), context()->useProgram(program->program())); | 324 GLC(context(), context()->useProgram(program->program())); |
| 325 | 325 |
| 326 // Use the full quadRect for debug quads to not move the edges based on part ial swaps. | 326 // Use the full quadRect for debug quads to not move the edges based on part ial swaps. |
| 327 const gfx::Rect& layerRect = quad->rect; | 327 const gfx::Rect& layerRect = quad->rect; |
| 328 WebTransformationMatrix renderMatrix = quad->quadTransform(); | 328 Transform renderMatrix = quad->quadTransform(); |
| 329 renderMatrix.translate(0.5 * layerRect.width() + layerRect.x(), 0.5 * layerR ect.height() + layerRect.y()); | 329 renderMatrix.PreconcatTranslate(0.5 * layerRect.width() + layerRect.x(), 0.5 * layerRect.height() + layerRect.y()); |
| 330 renderMatrix.scaleNonUniform(layerRect.width(), layerRect.height()); | 330 renderMatrix.PreconcatScale(layerRect.width(), layerRect.height()); |
| 331 GLRenderer::toGLMatrix(&glMatrix[0], frame.projectionMatrix * renderMatrix); | 331 GLRenderer::toGLMatrix(&glMatrix[0], frame.projectionMatrix * renderMatrix); |
| 332 GLC(context(), context()->uniformMatrix4fv(program->vertexShader().matrixLoc ation(), 1, false, &glMatrix[0])); | 332 GLC(context(), context()->uniformMatrix4fv(program->vertexShader().matrixLoc ation(), 1, false, &glMatrix[0])); |
| 333 | 333 |
| 334 SkColor color = quad->color; | 334 SkColor color = quad->color; |
| 335 float alpha = SkColorGetA(color) / 255.0; | 335 float alpha = SkColorGetA(color) / 255.0; |
| 336 | 336 |
| 337 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)); |
| 338 | 338 |
| 339 GLC(context(), context()->lineWidth(quad->width)); | 339 GLC(context(), context()->lineWidth(quad->width)); |
| 340 | 340 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 424 canvas.clear(0x0); | 424 canvas.clear(0x0); |
| 425 canvas.drawSprite(source, 0, 0, &paint); | 425 canvas.drawSprite(source, 0, 0, &paint); |
| 426 canvas.flush(); | 426 canvas.flush(); |
| 427 context3d->flush(); | 427 context3d->flush(); |
| 428 return device.accessBitmap(false); | 428 return device.accessBitmap(false); |
| 429 } | 429 } |
| 430 | 430 |
| 431 scoped_ptr<ScopedResource> GLRenderer::drawBackgroundFilters( | 431 scoped_ptr<ScopedResource> GLRenderer::drawBackgroundFilters( |
| 432 DrawingFrame& frame, const RenderPassDrawQuad* quad, | 432 DrawingFrame& frame, const RenderPassDrawQuad* quad, |
| 433 const WebKit::WebFilterOperations& filters, | 433 const WebKit::WebFilterOperations& filters, |
| 434 const WebTransformationMatrix& contentsDeviceTransform, | 434 const Transform& contentsDeviceTransform, |
| 435 const WebTransformationMatrix& contentsDeviceTransformInverse) | 435 const Transform& contentsDeviceTransformInverse) |
| 436 { | 436 { |
| 437 // This method draws a background filter, which applies a filter to any pixe ls behind the quad and seen through its background. | 437 // This method draws a background filter, which applies a filter to any pixe ls behind the quad and seen through its background. |
| 438 // The algorithm works as follows: | 438 // The algorithm works as follows: |
| 439 // 1. Compute a bounding box around the pixels that will be visible through the quad. | 439 // 1. Compute a bounding box around the pixels that will be visible through the quad. |
| 440 // 2. Read the pixels in the bounding box into a buffer R. | 440 // 2. Read the pixels in the bounding box into a buffer R. |
| 441 // 3. Apply the background filter to R, so that it is applied in the pixels' coordinate space. | 441 // 3. Apply the background filter to R, so that it is applied in the pixels' coordinate space. |
| 442 // 4. Apply the quad's inverse transform to map the pixels in R into the qua d's content space. This implicitly | 442 // 4. Apply the quad's inverse transform to map the pixels in R into the qua d's content space. This implicitly |
| 443 // clips R by the content bounds of the quad since the destination texture h as bounds matching the quad's content. | 443 // clips R by the content bounds of the quad since the destination texture h as bounds matching the quad's content. |
| 444 // 5. Draw the background texture for the contents using the same transform as used to draw the contents itself. This is done | 444 // 5. Draw the background texture for the contents using the same transform as used to draw the contents itself. This is done |
| 445 // without blending to replace the current background pixels with the new fi ltered background. | 445 // without blending to replace the current background pixels with the new fi ltered background. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 481 | 481 |
| 482 scoped_ptr<ScopedResource> backgroundTexture = ScopedResource::create(m_reso urceProvider); | 482 scoped_ptr<ScopedResource> backgroundTexture = ScopedResource::create(m_reso urceProvider); |
| 483 if (!backgroundTexture->Allocate(Renderer::ImplPool, quad->rect.size(), GL_R GBA, ResourceProvider::TextureUsageFramebuffer)) | 483 if (!backgroundTexture->Allocate(Renderer::ImplPool, quad->rect.size(), GL_R GBA, ResourceProvider::TextureUsageFramebuffer)) |
| 484 return scoped_ptr<ScopedResource>(); | 484 return scoped_ptr<ScopedResource>(); |
| 485 | 485 |
| 486 const RenderPass* targetRenderPass = frame.currentRenderPass; | 486 const RenderPass* targetRenderPass = frame.currentRenderPass; |
| 487 bool usingBackgroundTexture = useScopedTexture(frame, backgroundTexture.get( ), quad->rect); | 487 bool usingBackgroundTexture = useScopedTexture(frame, backgroundTexture.get( ), quad->rect); |
| 488 | 488 |
| 489 if (usingBackgroundTexture) { | 489 if (usingBackgroundTexture) { |
| 490 // Copy the readback pixels from device to the background texture for th e surface. | 490 // Copy the readback pixels from device to the background texture for th e surface. |
| 491 WebTransformationMatrix deviceToFramebufferTransform; | 491 Transform deviceToFramebufferTransform; |
| 492 deviceToFramebufferTransform.translate(quad->rect.width() / 2.0, quad->r ect.height() / 2.0); | 492 deviceToFramebufferTransform.PreconcatTranslate(quad->rect.width() / 2.0 , quad->rect.height() / 2.0); |
| 493 deviceToFramebufferTransform.scale3d(quad->rect.width(), quad->rect.heig ht(), 1); | 493 deviceToFramebufferTransform.PreconcatScale3d(quad->rect.width(), quad-> rect.height(), 1); |
| 494 deviceToFramebufferTransform.multiply(contentsDeviceTransformInverse); | 494 deviceToFramebufferTransform.PreconcatTransform(contentsDeviceTransformI nverse); |
| 495 copyTextureToFramebuffer(frame, filteredDeviceBackgroundTextureId, devic eRect, deviceToFramebufferTransform); | 495 copyTextureToFramebuffer(frame, filteredDeviceBackgroundTextureId, devic eRect, deviceToFramebufferTransform); |
| 496 } | 496 } |
| 497 | 497 |
| 498 useRenderPass(frame, targetRenderPass); | 498 useRenderPass(frame, targetRenderPass); |
| 499 | 499 |
| 500 if (!usingBackgroundTexture) | 500 if (!usingBackgroundTexture) |
| 501 return scoped_ptr<ScopedResource>(); | 501 return scoped_ptr<ScopedResource>(); |
| 502 return backgroundTexture.Pass(); | 502 return backgroundTexture.Pass(); |
| 503 } | 503 } |
| 504 | 504 |
| 505 void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua d* quad) | 505 void GLRenderer::drawRenderPassQuad(DrawingFrame& frame, const RenderPassDrawQua d* quad) |
| 506 { | 506 { |
| 507 CachedResource* contentsTexture = m_renderPassTextures.get(quad->render_pass _id); | 507 CachedResource* contentsTexture = m_renderPassTextures.get(quad->render_pass _id); |
| 508 if (!contentsTexture || !contentsTexture->id()) | 508 if (!contentsTexture || !contentsTexture->id()) |
| 509 return; | 509 return; |
| 510 | 510 |
| 511 const RenderPass* renderPass = frame.renderPassesById->get(quad->render_pass _id); | 511 const RenderPass* renderPass = frame.renderPassesById->get(quad->render_pass _id); |
| 512 DCHECK(renderPass); | 512 DCHECK(renderPass); |
| 513 if (!renderPass) | 513 if (!renderPass) |
| 514 return; | 514 return; |
| 515 | 515 |
| 516 WebTransformationMatrix quadRectMatrix; | 516 Transform quadRectMatrix; |
| 517 quadRectTransform(&quadRectMatrix, quad->quadTransform(), quad->rect); | 517 quadRectTransform(&quadRectMatrix, quad->quadTransform(), quad->rect); |
| 518 WebTransformationMatrix contentsDeviceTransform = (frame.windowMatrix * fram e.projectionMatrix * quadRectMatrix).to2dTransform(); | 518 Transform contentsDeviceTransform = MathUtil::to2dTransform(frame.windowMatr ix * frame.projectionMatrix * quadRectMatrix); |
| 519 | 519 |
| 520 // Can only draw surface if device matrix is invertible. | 520 // Can only draw surface if device matrix is invertible. |
| 521 if (!contentsDeviceTransform.isInvertible()) | 521 if (!contentsDeviceTransform.IsInvertible()) |
| 522 return; | 522 return; |
| 523 | 523 |
| 524 WebTransformationMatrix contentsDeviceTransformInverse = contentsDeviceTrans form.inverse(); | 524 Transform contentsDeviceTransformInverse = MathUtil::inverse(contentsDeviceT ransform); |
| 525 scoped_ptr<ScopedResource> backgroundTexture = drawBackgroundFilters( | 525 scoped_ptr<ScopedResource> backgroundTexture = drawBackgroundFilters( |
| 526 frame, quad, renderPass->background_filters, | 526 frame, quad, renderPass->background_filters, |
| 527 contentsDeviceTransform, contentsDeviceTransformInverse); | 527 contentsDeviceTransform, contentsDeviceTransformInverse); |
| 528 | 528 |
| 529 // FIXME: Cache this value so that we don't have to do it for both the surfa ce and its replica. | 529 // FIXME: Cache this value so that we don't have to do it for both the surfa ce and its replica. |
| 530 // Apply filters to the contents texture. | 530 // Apply filters to the contents texture. |
| 531 SkBitmap filterBitmap; | 531 SkBitmap filterBitmap; |
| 532 if (renderPass->filter) { | 532 if (renderPass->filter) { |
| 533 filterBitmap = applyImageFilter(this, renderPass->filter, contentsTextur e, m_client->hasImplThread()); | 533 filterBitmap = applyImageFilter(this, renderPass->filter, contentsTextur e, m_client->hasImplThread()); |
| 534 } else { | 534 } else { |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 738 | 738 |
| 739 // Map to normalized texture coordinates. | 739 // Map to normalized texture coordinates. |
| 740 const gfx::Size& textureSize = quad->texture_size; | 740 const gfx::Size& textureSize = quad->texture_size; |
| 741 float fragmentTexTranslateX = clampTexRect.x() / textureSize.width(); | 741 float fragmentTexTranslateX = clampTexRect.x() / textureSize.width(); |
| 742 float fragmentTexTranslateY = clampTexRect.y() / textureSize.height(); | 742 float fragmentTexTranslateY = clampTexRect.y() / textureSize.height(); |
| 743 float fragmentTexScaleX = clampTexRect.width() / textureSize.width(); | 743 float fragmentTexScaleX = clampTexRect.width() / textureSize.width(); |
| 744 float fragmentTexScaleY = clampTexRect.height() / textureSize.height(); | 744 float fragmentTexScaleY = clampTexRect.height() / textureSize.height(); |
| 745 | 745 |
| 746 | 746 |
| 747 gfx::QuadF localQuad; | 747 gfx::QuadF localQuad; |
| 748 WebTransformationMatrix deviceTransform = WebTransformationMatrix(frame.wind owMatrix * frame.projectionMatrix * quad->quadTransform()).to2dTransform(); | 748 Transform deviceTransform = MathUtil::to2dTransform(frame.windowMatrix * fra me.projectionMatrix * quad->quadTransform()); |
| 749 if (!deviceTransform.isInvertible()) | 749 if (!deviceTransform.IsInvertible()) |
| 750 return; | 750 return; |
| 751 | 751 |
| 752 bool clipped = false; | 752 bool clipped = false; |
| 753 gfx::QuadF deviceLayerQuad = MathUtil::mapQuad(deviceTransform, gfx::QuadF(q uad->visibleContentRect()), clipped); | 753 gfx::QuadF deviceLayerQuad = MathUtil::mapQuad(deviceTransform, gfx::QuadF(q uad->visibleContentRect()), clipped); |
| 754 DCHECK(!clipped); | 754 DCHECK(!clipped); |
| 755 | 755 |
| 756 TileProgramUniforms uniforms; | 756 TileProgramUniforms uniforms; |
| 757 // For now, we simply skip anti-aliasing with the quad is clipped. This only happens | 757 // For now, we simply skip anti-aliasing with the quad is clipped. This only happens |
| 758 // on perspective transformed layers that go partially behind the camera. | 758 // on perspective transformed layers that go partially behind the camera. |
| 759 if (quad->IsAntialiased() && !clipped) { | 759 if (quad->IsAntialiased() && !clipped) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 829 float sign = gfx::QuadF(tileRect).IsCounterClockwise() ? -1 : 1; | 829 float sign = gfx::QuadF(tileRect).IsCounterClockwise() ? -1 : 1; |
| 830 bottomEdge.scale(sign); | 830 bottomEdge.scale(sign); |
| 831 leftEdge.scale(sign); | 831 leftEdge.scale(sign); |
| 832 topEdge.scale(sign); | 832 topEdge.scale(sign); |
| 833 rightEdge.scale(sign); | 833 rightEdge.scale(sign); |
| 834 | 834 |
| 835 // Create device space quad. | 835 // Create device space quad. |
| 836 LayerQuad deviceQuad(leftEdge, topEdge, rightEdge, bottomEdge); | 836 LayerQuad deviceQuad(leftEdge, topEdge, rightEdge, bottomEdge); |
| 837 | 837 |
| 838 // Map device space quad to local space. deviceTransform has no 3d compo nent since it was generated with to2dTransform() so we don't need to project. | 838 // Map device space quad to local space. deviceTransform has no 3d compo nent since it was generated with to2dTransform() so we don't need to project. |
| 839 WebTransformationMatrix deviceTransformInverse = deviceTransform.inverse (); | 839 Transform deviceTransformInverse = MathUtil::inverse(deviceTransform); |
| 840 localQuad = MathUtil::mapQuad(deviceTransformInverse, deviceQuad.ToQuadF (), clipped); | 840 localQuad = MathUtil::mapQuad(deviceTransformInverse, deviceQuad.ToQuadF (), clipped); |
| 841 | 841 |
| 842 // We should not DCHECK(!clipped) here, because anti-aliasing inflation may cause deviceQuad to become | 842 // We should not DCHECK(!clipped) here, because anti-aliasing inflation may cause deviceQuad to become |
| 843 // clipped. To our knowledge this scenario does not need to be handled d ifferently than the unclipped case. | 843 // clipped. To our knowledge this scenario does not need to be handled d ifferently than the unclipped case. |
| 844 } else { | 844 } else { |
| 845 // Move fragment shader transform to vertex shader. We can do this while | 845 // Move fragment shader transform to vertex shader. We can do this while |
| 846 // still producing correct results as fragmentTexTransformLocation | 846 // still producing correct results as fragmentTexTransformLocation |
| 847 // should always be non-negative when tiles are transformed in a way | 847 // should always be non-negative when tiles are transformed in a way |
| 848 // that could result in sampling outside the layer. | 848 // that could result in sampling outside the layer. |
| 849 vertexTexScaleX *= fragmentTexScaleX; | 849 vertexTexScaleX *= fragmentTexScaleX; |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1034 m_swapBufferRect.Union(gfx::ToEnclosingRect(frame.rootDamageRect)); | 1034 m_swapBufferRect.Union(gfx::ToEnclosingRect(frame.rootDamageRect)); |
| 1035 | 1035 |
| 1036 GLC(m_context, m_context->disable(GL_BLEND)); | 1036 GLC(m_context, m_context->disable(GL_BLEND)); |
| 1037 } | 1037 } |
| 1038 | 1038 |
| 1039 bool GLRenderer::flippedFramebuffer() const | 1039 bool GLRenderer::flippedFramebuffer() const |
| 1040 { | 1040 { |
| 1041 return true; | 1041 return true; |
| 1042 } | 1042 } |
| 1043 | 1043 |
| 1044 void GLRenderer::toGLMatrix(float* flattened, const WebTransformationMatrix& m) | 1044 void GLRenderer::toGLMatrix(float* flattened, const Transform& m) |
| 1045 { | 1045 { |
|
Ian Vollick
2012/11/21 22:07:09
use SkMatrix44::asColMajorf
| |
| 1046 flattened[0] = m.m11(); | 1046 flattened[0] = m.matrix().getDouble(0, 0); |
| 1047 flattened[1] = m.m12(); | 1047 flattened[1] = m.matrix().getDouble(1, 0); |
| 1048 flattened[2] = m.m13(); | 1048 flattened[2] = m.matrix().getDouble(2, 0); |
| 1049 flattened[3] = m.m14(); | 1049 flattened[3] = m.matrix().getDouble(3, 0); |
| 1050 flattened[4] = m.m21(); | 1050 flattened[4] = m.matrix().getDouble(0, 1); |
| 1051 flattened[5] = m.m22(); | 1051 flattened[5] = m.matrix().getDouble(1, 1); |
| 1052 flattened[6] = m.m23(); | 1052 flattened[6] = m.matrix().getDouble(2, 1); |
| 1053 flattened[7] = m.m24(); | 1053 flattened[7] = m.matrix().getDouble(3, 1); |
| 1054 flattened[8] = m.m31(); | 1054 flattened[8] = m.matrix().getDouble(0, 2); |
| 1055 flattened[9] = m.m32(); | 1055 flattened[9] = m.matrix().getDouble(1, 2); |
| 1056 flattened[10] = m.m33(); | 1056 flattened[10] = m.matrix().getDouble(2, 2); |
| 1057 flattened[11] = m.m34(); | 1057 flattened[11] = m.matrix().getDouble(3, 2); |
| 1058 flattened[12] = m.m41(); | 1058 flattened[12] = m.matrix().getDouble(0, 3); |
| 1059 flattened[13] = m.m42(); | 1059 flattened[13] = m.matrix().getDouble(1, 3); |
| 1060 flattened[14] = m.m43(); | 1060 flattened[14] = m.matrix().getDouble(2, 3); |
| 1061 flattened[15] = m.m44(); | 1061 flattened[15] = m.matrix().getDouble(3, 3); |
| 1062 } | 1062 } |
| 1063 | 1063 |
| 1064 void GLRenderer::setShaderQuadF(const gfx::QuadF& quad, int quadLocation) | 1064 void GLRenderer::setShaderQuadF(const gfx::QuadF& quad, int quadLocation) |
| 1065 { | 1065 { |
| 1066 if (quadLocation == -1) | 1066 if (quadLocation == -1) |
| 1067 return; | 1067 return; |
| 1068 | 1068 |
| 1069 float point[8]; | 1069 float point[8]; |
| 1070 point[0] = quad.p1().x(); | 1070 point[0] = quad.p1().x(); |
| 1071 point[1] = quad.p1().y(); | 1071 point[1] = quad.p1().y(); |
| 1072 point[2] = quad.p2().x(); | 1072 point[2] = quad.p2().x(); |
| 1073 point[3] = quad.p2().y(); | 1073 point[3] = quad.p2().y(); |
| 1074 point[4] = quad.p3().x(); | 1074 point[4] = quad.p3().x(); |
| 1075 point[5] = quad.p3().y(); | 1075 point[5] = quad.p3().y(); |
| 1076 point[6] = quad.p4().x(); | 1076 point[6] = quad.p4().x(); |
| 1077 point[7] = quad.p4().y(); | 1077 point[7] = quad.p4().y(); |
| 1078 GLC(m_context, m_context->uniform2fv(quadLocation, 4, point)); | 1078 GLC(m_context, m_context->uniform2fv(quadLocation, 4, point)); |
| 1079 } | 1079 } |
| 1080 | 1080 |
| 1081 void GLRenderer::setShaderOpacity(float opacity, int alphaLocation) | 1081 void GLRenderer::setShaderOpacity(float opacity, int alphaLocation) |
| 1082 { | 1082 { |
| 1083 if (alphaLocation != -1) | 1083 if (alphaLocation != -1) |
| 1084 GLC(m_context, m_context->uniform1f(alphaLocation, opacity)); | 1084 GLC(m_context, m_context->uniform1f(alphaLocation, opacity)); |
| 1085 } | 1085 } |
| 1086 | 1086 |
| 1087 void GLRenderer::drawQuadGeometry(const DrawingFrame& frame, const WebKit::WebTr ansformationMatrix& drawTransform, const gfx::RectF& quadRect, int matrixLocatio n) | 1087 void GLRenderer::drawQuadGeometry(const DrawingFrame& frame, const gfx::Transfor m& drawTransform, const gfx::RectF& quadRect, int matrixLocation) |
| 1088 { | 1088 { |
| 1089 WebTransformationMatrix quadRectMatrix; | 1089 Transform quadRectMatrix; |
| 1090 quadRectTransform(&quadRectMatrix, drawTransform, quadRect); | 1090 quadRectTransform(&quadRectMatrix, drawTransform, quadRect); |
| 1091 static float glMatrix[16]; | 1091 static float glMatrix[16]; |
| 1092 toGLMatrix(&glMatrix[0], frame.projectionMatrix * quadRectMatrix); | 1092 toGLMatrix(&glMatrix[0], frame.projectionMatrix * quadRectMatrix); |
| 1093 GLC(m_context, m_context->uniformMatrix4fv(matrixLocation, 1, false, &glMatr ix[0])); | 1093 GLC(m_context, m_context->uniformMatrix4fv(matrixLocation, 1, false, &glMatr ix[0])); |
| 1094 | 1094 |
| 1095 GLC(m_context, m_context->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 )); | 1095 GLC(m_context, m_context->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 )); |
| 1096 } | 1096 } |
| 1097 | 1097 |
| 1098 void GLRenderer::copyTextureToFramebuffer(const DrawingFrame& frame, int texture Id, const gfx::Rect& rect, const WebTransformationMatrix& drawMatrix) | 1098 void GLRenderer::copyTextureToFramebuffer(const DrawingFrame& frame, int texture Id, const gfx::Rect& rect, const Transform& drawMatrix) |
| 1099 { | 1099 { |
| 1100 const RenderPassProgram* program = renderPassProgram(); | 1100 const RenderPassProgram* program = renderPassProgram(); |
| 1101 | 1101 |
| 1102 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, textureId)); | 1102 GLC(context(), context()->bindTexture(GL_TEXTURE_2D, textureId)); |
| 1103 | 1103 |
| 1104 GLC(context(), context()->useProgram(program->program())); | 1104 GLC(context(), context()->useProgram(program->program())); |
| 1105 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocatio n(), 0)); | 1105 GLC(context(), context()->uniform1i(program->fragmentShader().samplerLocatio n(), 0)); |
| 1106 setShaderOpacity(1, program->fragmentShader().alphaLocation()); | 1106 setShaderOpacity(1, program->fragmentShader().alphaLocation()); |
| 1107 drawQuadGeometry(frame, drawMatrix, rect, program->vertexShader().matrixLoca tion()); | 1107 drawQuadGeometry(frame, drawMatrix, rect, program->vertexShader().matrixLoca tion()); |
| 1108 } | 1108 } |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1611 | 1611 |
| 1612 releaseRenderPassTextures(); | 1612 releaseRenderPassTextures(); |
| 1613 } | 1613 } |
| 1614 | 1614 |
| 1615 bool GLRenderer::isContextLost() | 1615 bool GLRenderer::isContextLost() |
| 1616 { | 1616 { |
| 1617 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); | 1617 return (m_context->getGraphicsResetStatusARB() != GL_NO_ERROR); |
| 1618 } | 1618 } |
| 1619 | 1619 |
| 1620 } // namespace cc | 1620 } // namespace cc |
| OLD | NEW |