| 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 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 CCDirectRenderer::drawFrame(const CCRenderPassList& renderPassesInDrawOrder
, const CCRenderPassIdHashMap& renderPassesById) |
| 154 { | 154 { |
| 155 const CCRenderPass* rootRenderPass = renderPassesInDrawOrder.last(); | 155 const CCRenderPass* 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 ? static_cast<FloatRe
ct>(rootRenderPass->damageRect()) : static_cast<IntRect>(rootRenderPass->outputR
ect()); |
| 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 CCDirectRenderer::drawRenderPass(DrawingFrame& frame, const CCRenderPass* r
enderPass) |
| 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 != static_cast<IntRect>(frame.rootRenderPass->outpu
tRect())) { |
| 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(CCMathUtil::projectClippedR
ect(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 CCQuadList& quadList = renderPass->quadList(); |
| 185 for (CCQuadList::constBackToFrontIterator it = quadList.backToFrontBegin();
it != quadList.backToFrontEnd(); ++it) { | 185 for (CCQuadList::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(static_cast<FloatRect>((*it)->clippedRectInTar
get())); |
| 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 CCDirectRenderer::useRenderPass(DrawingFrame& frame, const CCRenderPass* re
nderPass) |
| 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(static_cast<IntRect>(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(CCRenderer::ImplPool, renderPassTex
tureSize(renderPass), renderPassTextureFormat(renderPass), CCResourceProvider::T
extureUsageFramebuffer)) |
| 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 CCDirectRenderer::haveCachedResourcesForRenderPassId(CCRenderPass::Id id) c
onst |
| 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 CCDirectRenderer::renderPassTextureSize(const CCRenderPass* pass) |
| 227 { | 227 { |
| 228 return pass->outputRect().size(); | 228 return static_cast<IntRect>(pass->outputRect()).size(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 // static | 231 // static |
| 232 GC3Denum CCDirectRenderer::renderPassTextureFormat(const CCRenderPass*) | 232 GC3Denum CCDirectRenderer::renderPassTextureFormat(const CCRenderPass*) |
| 233 { | 233 { |
| 234 return GraphicsContext3D::RGBA; | 234 return GraphicsContext3D::RGBA; |
| 235 } | 235 } |
| 236 | 236 |
| 237 } | 237 } |
| OLD | NEW |