| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "CCDirectRenderer.h" | 7 #include "CCDirectRenderer.h" |
| 8 | 8 |
| 9 #include "CCMathUtil.h" | 9 #include "CCMathUtil.h" |
| 10 #include <public/WebTransformationMatrix.h> | 10 #include <public/WebTransformationMatrix.h> |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 | 43 |
| 44 // Map from ([-1, -1] to [1, 1]) -> ([0, 0] to [1, 1]) | 44 // Map from ([-1, -1] to [1, 1]) -> ([0, 0] to [1, 1]) |
| 45 canvas.translate3d(0.5, 0.5, 0.5); | 45 canvas.translate3d(0.5, 0.5, 0.5); |
| 46 canvas.scale3d(0.5, 0.5, 0.5); | 46 canvas.scale3d(0.5, 0.5, 0.5); |
| 47 | 47 |
| 48 return canvas; | 48 return canvas; |
| 49 } | 49 } |
| 50 | 50 |
| 51 namespace cc { | 51 namespace cc { |
| 52 | 52 |
| 53 CCDirectRenderer::DrawingFrame::DrawingFrame() | 53 DirectRenderer::DrawingFrame::DrawingFrame() |
| 54 : rootRenderPass(0) | 54 : rootRenderPass(0) |
| 55 , currentRenderPass(0) | 55 , currentRenderPass(0) |
| 56 , currentTexture(0) | 56 , currentTexture(0) |
| 57 , flippedY(false) | 57 , flippedY(false) |
| 58 { | 58 { |
| 59 } | 59 } |
| 60 | 60 |
| 61 CCDirectRenderer::DrawingFrame::~DrawingFrame() | 61 DirectRenderer::DrawingFrame::~DrawingFrame() |
| 62 { | 62 { |
| 63 } | 63 } |
| 64 | 64 |
| 65 // | 65 // |
| 66 // static | 66 // static |
| 67 FloatRect CCDirectRenderer::quadVertexRect() | 67 FloatRect DirectRenderer::quadVertexRect() |
| 68 { | 68 { |
| 69 return FloatRect(-0.5, -0.5, 1, 1); | 69 return FloatRect(-0.5, -0.5, 1, 1); |
| 70 } | 70 } |
| 71 | 71 |
| 72 // static | 72 // static |
| 73 void CCDirectRenderer::quadRectTransform(WebKit::WebTransformationMatrix* quadRe
ctTransform, const WebKit::WebTransformationMatrix& quadTransform, const FloatRe
ct& quadRect) | 73 void DirectRenderer::quadRectTransform(WebKit::WebTransformationMatrix* quadRect
Transform, const WebKit::WebTransformationMatrix& quadTransform, const FloatRect
& quadRect) |
| 74 { | 74 { |
| 75 *quadRectTransform = quadTransform; | 75 *quadRectTransform = quadTransform; |
| 76 quadRectTransform->translate(0.5 * quadRect.width() + quadRect.x(), 0.5 * qu
adRect.height() + quadRect.y()); | 76 quadRectTransform->translate(0.5 * quadRect.width() + quadRect.x(), 0.5 * qu
adRect.height() + quadRect.y()); |
| 77 quadRectTransform->scaleNonUniform(quadRect.width(), quadRect.height()); | 77 quadRectTransform->scaleNonUniform(quadRect.width(), quadRect.height()); |
| 78 } | 78 } |
| 79 | 79 |
| 80 // static | 80 // static |
| 81 void CCDirectRenderer::initializeMatrices(DrawingFrame& frame, const IntRect& dr
awRect, bool flipY) | 81 void DirectRenderer::initializeMatrices(DrawingFrame& frame, const IntRect& draw
Rect, bool flipY) |
| 82 { | 82 { |
| 83 if (flipY) | 83 if (flipY) |
| 84 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.maxY(), drawRect.y()); | 84 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.maxY(), drawRect.y()); |
| 85 else | 85 else |
| 86 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.y(), drawRect.maxY()); | 86 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.y(), drawRect.maxY()); |
| 87 frame.windowMatrix = windowMatrix(0, 0, drawRect.width(), drawRect.height())
; | 87 frame.windowMatrix = windowMatrix(0, 0, drawRect.width(), drawRect.height())
; |
| 88 frame.flippedY = flipY; | 88 frame.flippedY = flipY; |
| 89 } | 89 } |
| 90 | 90 |
| 91 // static | 91 // static |
| 92 IntRect CCDirectRenderer::moveScissorToWindowSpace(const DrawingFrame& frame, Fl
oatRect scissorRect) | 92 IntRect DirectRenderer::moveScissorToWindowSpace(const DrawingFrame& frame, Floa
tRect scissorRect) |
| 93 { | 93 { |
| 94 IntRect scissorRectInCanvasSpace = enclosingIntRect(scissorRect); | 94 IntRect scissorRectInCanvasSpace = enclosingIntRect(scissorRect); |
| 95 // The scissor coordinates must be supplied in viewport space so we need to
offset | 95 // The scissor coordinates must be supplied in viewport space so we need to
offset |
| 96 // by the relative position of the top left corner of the current render pas
s. | 96 // by the relative position of the top left corner of the current render pas
s. |
| 97 IntRect framebufferOutputRect = frame.currentRenderPass->outputRect(); | 97 IntRect framebufferOutputRect = frame.currentRenderPass->outputRect(); |
| 98 scissorRectInCanvasSpace.setX(scissorRectInCanvasSpace.x() - framebufferOutp
utRect.x()); | 98 scissorRectInCanvasSpace.setX(scissorRectInCanvasSpace.x() - framebufferOutp
utRect.x()); |
| 99 if (frame.flippedY && !frame.currentTexture) | 99 if (frame.flippedY && !frame.currentTexture) |
| 100 scissorRectInCanvasSpace.setY(framebufferOutputRect.height() - (scissorR
ectInCanvasSpace.maxY() - framebufferOutputRect.y())); | 100 scissorRectInCanvasSpace.setY(framebufferOutputRect.height() - (scissorR
ectInCanvasSpace.maxY() - framebufferOutputRect.y())); |
| 101 else | 101 else |
| 102 scissorRectInCanvasSpace.setY(scissorRectInCanvasSpace.y() - framebuffer
OutputRect.y()); | 102 scissorRectInCanvasSpace.setY(scissorRectInCanvasSpace.y() - framebuffer
OutputRect.y()); |
| 103 return scissorRectInCanvasSpace; | 103 return scissorRectInCanvasSpace; |
| 104 } | 104 } |
| 105 | 105 |
| 106 CCDirectRenderer::CCDirectRenderer(CCRendererClient* client, CCResourceProvider*
resourceProvider) | 106 DirectRenderer::DirectRenderer(RendererClient* client, ResourceProvider* resourc
eProvider) |
| 107 : CCRenderer(client) | 107 : Renderer(client) |
| 108 , m_resourceProvider(resourceProvider) | 108 , m_resourceProvider(resourceProvider) |
| 109 { | 109 { |
| 110 } | 110 } |
| 111 | 111 |
| 112 CCDirectRenderer::~CCDirectRenderer() | 112 DirectRenderer::~DirectRenderer() |
| 113 { | 113 { |
| 114 } | 114 } |
| 115 | 115 |
| 116 void CCDirectRenderer::decideRenderPassAllocationsForFrame(const CCRenderPassLis
t& renderPassesInDrawOrder) | 116 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) |
| 117 { | 117 { |
| 118 base::hash_map<CCRenderPass::Id, const CCRenderPass*> renderPassesInFrame; | 118 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; |
| 119 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) | 119 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) |
| 120 renderPassesInFrame.insert(std::pair<CCRenderPass::Id, const CCRenderPas
s*>(renderPassesInDrawOrder[i]->id(), renderPassesInDrawOrder[i])); | 120 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id(), renderPassesInDrawOrder[i])); |
| 121 | 121 |
| 122 std::vector<CCRenderPass::Id> passesToDelete; | 122 std::vector<RenderPass::Id> passesToDelete; |
| 123 ScopedPtrHashMap<CCRenderPass::Id, CachedTexture>::const_iterator passIterat
or; | 123 ScopedPtrHashMap<RenderPass::Id, CachedTexture>::const_iterator passIterator
; |
| 124 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { | 124 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { |
| 125 base::hash_map<CCRenderPass::Id, const CCRenderPass*>::const_iterator it
= renderPassesInFrame.find(passIterator->first); | 125 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); |
| 126 if (it == renderPassesInFrame.end()) { | 126 if (it == renderPassesInFrame.end()) { |
| 127 passesToDelete.push_back(passIterator->first); | 127 passesToDelete.push_back(passIterator->first); |
| 128 continue; | 128 continue; |
| 129 } | 129 } |
| 130 | 130 |
| 131 const CCRenderPass* renderPassInFrame = it->second; | 131 const RenderPass* renderPassInFrame = it->second; |
| 132 const IntSize& requiredSize = renderPassTextureSize(renderPassInFrame); | 132 const IntSize& requiredSize = renderPassTextureSize(renderPassInFrame); |
| 133 GC3Denum requiredFormat = renderPassTextureFormat(renderPassInFrame); | 133 GC3Denum requiredFormat = renderPassTextureFormat(renderPassInFrame); |
| 134 CachedTexture* texture = passIterator->second; | 134 CachedTexture* texture = passIterator->second; |
| 135 ASSERT(texture); | 135 ASSERT(texture); |
| 136 | 136 |
| 137 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) | 137 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) |
| 138 texture->free(); | 138 texture->free(); |
| 139 } | 139 } |
| 140 | 140 |
| 141 // Delete RenderPass textures from the previous frame that will not be used
again. | 141 // Delete RenderPass textures from the previous frame that will not be used
again. |
| 142 for (size_t i = 0; i < passesToDelete.size(); ++i) | 142 for (size_t i = 0; i < passesToDelete.size(); ++i) |
| 143 m_renderPassTextures.erase(passesToDelete[i]); | 143 m_renderPassTextures.erase(passesToDelete[i]); |
| 144 | 144 |
| 145 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { | 145 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { |
| 146 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id())) { | 146 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id())) { |
| 147 scoped_ptr<CachedTexture> texture = CachedTexture::create(m_resourcePr
ovider); | 147 scoped_ptr<CachedTexture> texture = CachedTexture::create(m_resourcePr
ovider); |
| 148 m_renderPassTextures.set(renderPassesInDrawOrder[i]->id(), texture.P
ass()); | 148 m_renderPassTextures.set(renderPassesInDrawOrder[i]->id(), texture.P
ass()); |
| 149 } | 149 } |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 | 152 |
| 153 void CCDirectRenderer::drawFrame(const CCRenderPassList& renderPassesInDrawOrder
, const CCRenderPassIdHashMap& renderPassesById) | 153 void DirectRenderer::drawFrame(const RenderPassList& renderPassesInDrawOrder, co
nst RenderPassIdHashMap& renderPassesById) |
| 154 { | 154 { |
| 155 const CCRenderPass* rootRenderPass = renderPassesInDrawOrder.back(); | 155 const RenderPass* rootRenderPass = renderPassesInDrawOrder.back(); |
| 156 ASSERT(rootRenderPass); | 156 ASSERT(rootRenderPass); |
| 157 | 157 |
| 158 DrawingFrame frame; | 158 DrawingFrame frame; |
| 159 frame.renderPassesById = &renderPassesById; | 159 frame.renderPassesById = &renderPassesById; |
| 160 frame.rootRenderPass = rootRenderPass; | 160 frame.rootRenderPass = rootRenderPass; |
| 161 frame.rootDamageRect = capabilities().usingPartialSwap ? rootRenderPass->dam
ageRect() : rootRenderPass->outputRect(); | 161 frame.rootDamageRect = capabilities().usingPartialSwap ? rootRenderPass->dam
ageRect() : rootRenderPass->outputRect(); |
| 162 frame.rootDamageRect.intersect(IntRect(IntPoint::zero(), viewportSize())); | 162 frame.rootDamageRect.intersect(IntRect(IntPoint::zero(), viewportSize())); |
| 163 | 163 |
| 164 beginDrawingFrame(frame); | 164 beginDrawingFrame(frame); |
| 165 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) | 165 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) |
| 166 drawRenderPass(frame, renderPassesInDrawOrder[i]); | 166 drawRenderPass(frame, renderPassesInDrawOrder[i]); |
| 167 finishDrawingFrame(frame); | 167 finishDrawingFrame(frame); |
| 168 } | 168 } |
| 169 | 169 |
| 170 void CCDirectRenderer::drawRenderPass(DrawingFrame& frame, const CCRenderPass* r
enderPass) | 170 void DirectRenderer::drawRenderPass(DrawingFrame& frame, const RenderPass* rende
rPass) |
| 171 { | 171 { |
| 172 if (!useRenderPass(frame, renderPass)) | 172 if (!useRenderPass(frame, renderPass)) |
| 173 return; | 173 return; |
| 174 | 174 |
| 175 frame.scissorRectInRenderPassSpace = frame.currentRenderPass->outputRect(); | 175 frame.scissorRectInRenderPassSpace = frame.currentRenderPass->outputRect(); |
| 176 if (frame.rootDamageRect != frame.rootRenderPass->outputRect()) { | 176 if (frame.rootDamageRect != frame.rootRenderPass->outputRect()) { |
| 177 WebTransformationMatrix inverseTransformToRoot = frame.currentRenderPass
->transformToRootTarget().inverse(); | 177 WebTransformationMatrix inverseTransformToRoot = frame.currentRenderPass
->transformToRootTarget().inverse(); |
| 178 frame.scissorRectInRenderPassSpace.intersect(CCMathUtil::projectClippedR
ect(inverseTransformToRoot, frame.rootDamageRect)); | 178 frame.scissorRectInRenderPassSpace.intersect(MathUtil::projectClippedRec
t(inverseTransformToRoot, frame.rootDamageRect)); |
| 179 } | 179 } |
| 180 | 180 |
| 181 enableScissorTestRect(moveScissorToWindowSpace(frame, frame.scissorRectInRen
derPassSpace)); | 181 enableScissorTestRect(moveScissorToWindowSpace(frame, frame.scissorRectInRen
derPassSpace)); |
| 182 clearFramebuffer(frame); | 182 clearFramebuffer(frame); |
| 183 | 183 |
| 184 const CCQuadList& quadList = renderPass->quadList(); | 184 const QuadList& quadList = renderPass->quadList(); |
| 185 for (CCQuadList::constBackToFrontIterator it = quadList.backToFrontBegin();
it != quadList.backToFrontEnd(); ++it) { | 185 for (QuadList::constBackToFrontIterator it = quadList.backToFrontBegin(); it
!= quadList.backToFrontEnd(); ++it) { |
| 186 FloatRect quadScissorRect = frame.scissorRectInRenderPassSpace; | 186 FloatRect quadScissorRect = frame.scissorRectInRenderPassSpace; |
| 187 quadScissorRect.intersect((*it)->clippedRectInTarget()); | 187 quadScissorRect.intersect((*it)->clippedRectInTarget()); |
| 188 if (!quadScissorRect.isEmpty()) { | 188 if (!quadScissorRect.isEmpty()) { |
| 189 enableScissorTestRect(moveScissorToWindowSpace(frame, quadScissorRec
t)); | 189 enableScissorTestRect(moveScissorToWindowSpace(frame, quadScissorRec
t)); |
| 190 drawQuad(frame, *it); | 190 drawQuad(frame, *it); |
| 191 } | 191 } |
| 192 } | 192 } |
| 193 | 193 |
| 194 CachedTexture* texture = m_renderPassTextures.get(renderPass->id()); | 194 CachedTexture* texture = m_renderPassTextures.get(renderPass->id()); |
| 195 if (texture) | 195 if (texture) |
| 196 texture->setIsComplete(!renderPass->hasOcclusionFromOutsideTargetSurface
()); | 196 texture->setIsComplete(!renderPass->hasOcclusionFromOutsideTargetSurface
()); |
| 197 } | 197 } |
| 198 | 198 |
| 199 bool CCDirectRenderer::useRenderPass(DrawingFrame& frame, const CCRenderPass* re
nderPass) | 199 bool DirectRenderer::useRenderPass(DrawingFrame& frame, const RenderPass* render
Pass) |
| 200 { | 200 { |
| 201 frame.currentRenderPass = renderPass; | 201 frame.currentRenderPass = renderPass; |
| 202 frame.currentTexture = 0; | 202 frame.currentTexture = 0; |
| 203 | 203 |
| 204 if (renderPass == frame.rootRenderPass) { | 204 if (renderPass == frame.rootRenderPass) { |
| 205 bindFramebufferToOutputSurface(frame); | 205 bindFramebufferToOutputSurface(frame); |
| 206 initializeMatrices(frame, renderPass->outputRect(), flippedFramebuffer()
); | 206 initializeMatrices(frame, renderPass->outputRect(), flippedFramebuffer()
); |
| 207 setDrawViewportSize(renderPass->outputRect().size()); | 207 setDrawViewportSize(renderPass->outputRect().size()); |
| 208 return true; | 208 return true; |
| 209 } | 209 } |
| 210 | 210 |
| 211 CachedTexture* texture = m_renderPassTextures.get(renderPass->id()); | 211 CachedTexture* texture = m_renderPassTextures.get(renderPass->id()); |
| 212 ASSERT(texture); | 212 ASSERT(texture); |
| 213 if (!texture->id() && !texture->allocate(CCRenderer::ImplPool, renderPassTex
tureSize(renderPass), renderPassTextureFormat(renderPass), CCResourceProvider::T
extureUsageFramebuffer)) | 213 if (!texture->id() && !texture->allocate(Renderer::ImplPool, renderPassTextu
reSize(renderPass), renderPassTextureFormat(renderPass), ResourceProvider::Textu
reUsageFramebuffer)) |
| 214 return false; | 214 return false; |
| 215 | 215 |
| 216 return bindFramebufferToTexture(frame, texture, renderPass->outputRect()); | 216 return bindFramebufferToTexture(frame, texture, renderPass->outputRect()); |
| 217 } | 217 } |
| 218 | 218 |
| 219 bool CCDirectRenderer::haveCachedResourcesForRenderPassId(CCRenderPass::Id id) c
onst | 219 bool DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const |
| 220 { | 220 { |
| 221 CachedTexture* texture = m_renderPassTextures.get(id); | 221 CachedTexture* texture = m_renderPassTextures.get(id); |
| 222 return texture && texture->id() && texture->isComplete(); | 222 return texture && texture->id() && texture->isComplete(); |
| 223 } | 223 } |
| 224 | 224 |
| 225 // static | 225 // static |
| 226 IntSize CCDirectRenderer::renderPassTextureSize(const CCRenderPass* pass) | 226 IntSize DirectRenderer::renderPassTextureSize(const RenderPass* pass) |
| 227 { | 227 { |
| 228 return pass->outputRect().size(); | 228 return pass->outputRect().size(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 // static | 231 // static |
| 232 GC3Denum CCDirectRenderer::renderPassTextureFormat(const CCRenderPass*) | 232 GC3Denum DirectRenderer::renderPassTextureFormat(const RenderPass*) |
| 233 { | 233 { |
| 234 return GraphicsContext3D::RGBA; | 234 return GraphicsContext3D::RGBA; |
| 235 } | 235 } |
| 236 | 236 |
| 237 } | 237 } |
| OLD | NEW |