| 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 "cc/direct_renderer.h" | 5 #include "cc/direct_renderer.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "cc/math_util.h" | 10 #include "cc/math_util.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 frame.windowMatrix = windowMatrix(0, 0, drawRect.width(), drawRect.height())
; | 88 frame.windowMatrix = windowMatrix(0, 0, drawRect.width(), drawRect.height())
; |
| 89 frame.flippedY = flipY; | 89 frame.flippedY = flipY; |
| 90 } | 90 } |
| 91 | 91 |
| 92 // static | 92 // static |
| 93 gfx::Rect DirectRenderer::moveScissorToWindowSpace(const DrawingFrame& frame, gf
x::RectF scissorRect) | 93 gfx::Rect DirectRenderer::moveScissorToWindowSpace(const DrawingFrame& frame, gf
x::RectF scissorRect) |
| 94 { | 94 { |
| 95 gfx::Rect scissorRectInCanvasSpace = gfx::ToEnclosingRect(scissorRect); | 95 gfx::Rect scissorRectInCanvasSpace = gfx::ToEnclosingRect(scissorRect); |
| 96 // The scissor coordinates must be supplied in viewport space so we need to
offset | 96 // The scissor coordinates must be supplied in viewport space so we need to
offset |
| 97 // by the relative position of the top left corner of the current render pas
s. | 97 // by the relative position of the top left corner of the current render pas
s. |
| 98 gfx::Rect framebufferOutputRect = frame.currentRenderPass->outputRect(); | 98 gfx::Rect framebufferOutputRect = frame.currentRenderPass->output_rect; |
| 99 scissorRectInCanvasSpace.set_x(scissorRectInCanvasSpace.x() - framebufferOut
putRect.x()); | 99 scissorRectInCanvasSpace.set_x(scissorRectInCanvasSpace.x() - framebufferOut
putRect.x()); |
| 100 if (frame.flippedY && !frame.currentTexture) | 100 if (frame.flippedY && !frame.currentTexture) |
| 101 scissorRectInCanvasSpace.set_y(framebufferOutputRect.height() - (scissor
RectInCanvasSpace.bottom() - framebufferOutputRect.y())); | 101 scissorRectInCanvasSpace.set_y(framebufferOutputRect.height() - (scissor
RectInCanvasSpace.bottom() - framebufferOutputRect.y())); |
| 102 else | 102 else |
| 103 scissorRectInCanvasSpace.set_y(scissorRectInCanvasSpace.y() - framebuffe
rOutputRect.y()); | 103 scissorRectInCanvasSpace.set_y(scissorRectInCanvasSpace.y() - framebuffe
rOutputRect.y()); |
| 104 return scissorRectInCanvasSpace; | 104 return scissorRectInCanvasSpace; |
| 105 } | 105 } |
| 106 | 106 |
| 107 DirectRenderer::DirectRenderer(RendererClient* client, ResourceProvider* resourc
eProvider) | 107 DirectRenderer::DirectRenderer(RendererClient* client, ResourceProvider* resourc
eProvider) |
| 108 : Renderer(client) | 108 : Renderer(client) |
| 109 , m_resourceProvider(resourceProvider) | 109 , m_resourceProvider(resourceProvider) |
| 110 { | 110 { |
| 111 } | 111 } |
| 112 | 112 |
| 113 DirectRenderer::~DirectRenderer() | 113 DirectRenderer::~DirectRenderer() |
| 114 { | 114 { |
| 115 } | 115 } |
| 116 | 116 |
| 117 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) | 117 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) |
| 118 { | 118 { |
| 119 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; | 119 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; |
| 120 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) | 120 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) |
| 121 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id(), renderPassesInDrawOrder[i])); | 121 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id, renderPassesInDrawOrder[i])); |
| 122 | 122 |
| 123 std::vector<RenderPass::Id> passesToDelete; | 123 std::vector<RenderPass::Id> passesToDelete; |
| 124 ScopedPtrHashMap<RenderPass::Id, CachedResource>::const_iterator passIterato
r; | 124 ScopedPtrHashMap<RenderPass::Id, CachedResource>::const_iterator passIterato
r; |
| 125 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { | 125 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { |
| 126 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); | 126 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); |
| 127 if (it == renderPassesInFrame.end()) { | 127 if (it == renderPassesInFrame.end()) { |
| 128 passesToDelete.push_back(passIterator->first); | 128 passesToDelete.push_back(passIterator->first); |
| 129 continue; | 129 continue; |
| 130 } | 130 } |
| 131 | 131 |
| 132 const RenderPass* renderPassInFrame = it->second; | 132 const RenderPass* renderPassInFrame = it->second; |
| 133 const gfx::Size& requiredSize = renderPassTextureSize(renderPassInFrame)
; | 133 const gfx::Size& requiredSize = renderPassTextureSize(renderPassInFrame)
; |
| 134 GLenum requiredFormat = renderPassTextureFormat(renderPassInFrame); | 134 GLenum requiredFormat = renderPassTextureFormat(renderPassInFrame); |
| 135 CachedResource* texture = passIterator->second; | 135 CachedResource* texture = passIterator->second; |
| 136 DCHECK(texture); | 136 DCHECK(texture); |
| 137 | 137 |
| 138 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) | 138 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) |
| 139 texture->Free(); | 139 texture->Free(); |
| 140 } | 140 } |
| 141 | 141 |
| 142 // Delete RenderPass textures from the previous frame that will not be used
again. | 142 // Delete RenderPass textures from the previous frame that will not be used
again. |
| 143 for (size_t i = 0; i < passesToDelete.size(); ++i) | 143 for (size_t i = 0; i < passesToDelete.size(); ++i) |
| 144 m_renderPassTextures.erase(passesToDelete[i]); | 144 m_renderPassTextures.erase(passesToDelete[i]); |
| 145 | 145 |
| 146 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { | 146 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { |
| 147 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id())) { | 147 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id)) { |
| 148 scoped_ptr<CachedResource> texture = CachedResource::create(m_resource
Provider); | 148 scoped_ptr<CachedResource> texture = CachedResource::create(m_resource
Provider); |
| 149 m_renderPassTextures.set(renderPassesInDrawOrder[i]->id(), texture.P
ass()); | 149 m_renderPassTextures.set(renderPassesInDrawOrder[i]->id, texture.Pas
s()); |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 } | 152 } |
| 153 | 153 |
| 154 void DirectRenderer::drawFrame(const RenderPassList& renderPassesInDrawOrder, co
nst RenderPassIdHashMap& renderPassesById) | 154 void DirectRenderer::drawFrame(const RenderPassList& renderPassesInDrawOrder, co
nst RenderPassIdHashMap& renderPassesById) |
| 155 { | 155 { |
| 156 TRACE_EVENT0("cc", "DirectRenderer::drawFrame"); | 156 TRACE_EVENT0("cc", "DirectRenderer::drawFrame"); |
| 157 const RenderPass* rootRenderPass = renderPassesInDrawOrder.back(); | 157 const RenderPass* rootRenderPass = renderPassesInDrawOrder.back(); |
| 158 DCHECK(rootRenderPass); | 158 DCHECK(rootRenderPass); |
| 159 | 159 |
| 160 DrawingFrame frame; | 160 DrawingFrame frame; |
| 161 frame.renderPassesById = &renderPassesById; | 161 frame.renderPassesById = &renderPassesById; |
| 162 frame.rootRenderPass = rootRenderPass; | 162 frame.rootRenderPass = rootRenderPass; |
| 163 frame.rootDamageRect = capabilities().usingPartialSwap ? rootRenderPass->dam
ageRect() : rootRenderPass->outputRect(); | 163 frame.rootDamageRect = capabilities().usingPartialSwap ? rootRenderPass->dam
age_rect : rootRenderPass->output_rect; |
| 164 frame.rootDamageRect.Intersect(gfx::Rect(gfx::Point(), viewportSize())); | 164 frame.rootDamageRect.Intersect(gfx::Rect(gfx::Point(), viewportSize())); |
| 165 | 165 |
| 166 beginDrawingFrame(frame); | 166 beginDrawingFrame(frame); |
| 167 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) | 167 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) |
| 168 drawRenderPass(frame, renderPassesInDrawOrder[i]); | 168 drawRenderPass(frame, renderPassesInDrawOrder[i]); |
| 169 finishDrawingFrame(frame); | 169 finishDrawingFrame(frame); |
| 170 } | 170 } |
| 171 | 171 |
| 172 void DirectRenderer::drawRenderPass(DrawingFrame& frame, const RenderPass* rende
rPass) | 172 void DirectRenderer::drawRenderPass(DrawingFrame& frame, const RenderPass* rende
rPass) |
| 173 { | 173 { |
| 174 TRACE_EVENT0("cc", "DirectRenderer::drawRenderPass"); | 174 TRACE_EVENT0("cc", "DirectRenderer::drawRenderPass"); |
| 175 if (!useRenderPass(frame, renderPass)) | 175 if (!useRenderPass(frame, renderPass)) |
| 176 return; | 176 return; |
| 177 | 177 |
| 178 frame.scissorRectInRenderPassSpace = frame.currentRenderPass->outputRect(); | 178 frame.scissorRectInRenderPassSpace = frame.currentRenderPass->output_rect; |
| 179 if (frame.rootDamageRect != frame.rootRenderPass->outputRect()) { | 179 if (frame.rootDamageRect != frame.rootRenderPass->output_rect) { |
| 180 WebTransformationMatrix inverseTransformToRoot = frame.currentRenderPass
->transformToRootTarget().inverse(); | 180 WebTransformationMatrix inverseTransformToRoot = frame.currentRenderPass
->transform_to_root_target.inverse(); |
| 181 gfx::RectF damageRectInRenderPassSpace = MathUtil::projectClippedRect(in
verseTransformToRoot, frame.rootDamageRect); | 181 gfx::RectF damageRectInRenderPassSpace = MathUtil::projectClippedRect(in
verseTransformToRoot, frame.rootDamageRect); |
| 182 frame.scissorRectInRenderPassSpace.Intersect(damageRectInRenderPassSpace
); | 182 frame.scissorRectInRenderPassSpace.Intersect(damageRectInRenderPassSpace
); |
| 183 } | 183 } |
| 184 | 184 |
| 185 setScissorTestRect(moveScissorToWindowSpace(frame, frame.scissorRectInRender
PassSpace)); | 185 setScissorTestRect(moveScissorToWindowSpace(frame, frame.scissorRectInRender
PassSpace)); |
| 186 clearFramebuffer(frame); | 186 clearFramebuffer(frame); |
| 187 | 187 |
| 188 const QuadList& quadList = renderPass->quadList(); | 188 const QuadList& quadList = renderPass->quad_list; |
| 189 for (QuadList::constBackToFrontIterator it = quadList.backToFrontBegin(); it
!= quadList.backToFrontEnd(); ++it) { | 189 for (QuadList::constBackToFrontIterator it = quadList.backToFrontBegin(); it
!= quadList.backToFrontEnd(); ++it) { |
| 190 gfx::RectF quadScissorRect = gfx::IntersectRects(frame.scissorRectInRend
erPassSpace, (*it)->clippedRectInTarget()); | 190 gfx::RectF quadScissorRect = gfx::IntersectRects(frame.scissorRectInRender
PassSpace, (*it)->clippedRectInTarget()); |
| 191 if (!quadScissorRect.IsEmpty()) { | 191 if (!quadScissorRect.IsEmpty()) { |
| 192 setScissorTestRect(moveScissorToWindowSpace(frame, quadScissorRect))
; | 192 setScissorTestRect(moveScissorToWindowSpace(frame, quadScissorRect))
; |
| 193 drawQuad(frame, *it); | 193 drawQuad(frame, *it); |
| 194 } | 194 } |
| 195 } | 195 } |
| 196 | 196 |
| 197 CachedResource* texture = m_renderPassTextures.get(renderPass->id()); | 197 CachedResource* texture = m_renderPassTextures.get(renderPass->id); |
| 198 if (texture) | 198 if (texture) |
| 199 texture->setIsComplete(!renderPass->hasOcclusionFromOutsideTargetSurface
()); | 199 texture->setIsComplete(!renderPass->has_occlusion_from_outside_target_su
rface); |
| 200 } | 200 } |
| 201 | 201 |
| 202 bool DirectRenderer::useRenderPass(DrawingFrame& frame, const RenderPass* render
Pass) | 202 bool DirectRenderer::useRenderPass(DrawingFrame& frame, const RenderPass* render
Pass) |
| 203 { | 203 { |
| 204 frame.currentRenderPass = renderPass; | 204 frame.currentRenderPass = renderPass; |
| 205 frame.currentTexture = 0; | 205 frame.currentTexture = 0; |
| 206 | 206 |
| 207 if (renderPass == frame.rootRenderPass) { | 207 if (renderPass == frame.rootRenderPass) { |
| 208 bindFramebufferToOutputSurface(frame); | 208 bindFramebufferToOutputSurface(frame); |
| 209 initializeMatrices(frame, renderPass->outputRect(), flippedFramebuffer()
); | 209 initializeMatrices(frame, renderPass->output_rect, flippedFramebuffer())
; |
| 210 setDrawViewportSize(renderPass->outputRect().size()); | 210 setDrawViewportSize(renderPass->output_rect.size()); |
| 211 return true; | 211 return true; |
| 212 } | 212 } |
| 213 | 213 |
| 214 CachedResource* texture = m_renderPassTextures.get(renderPass->id()); | 214 CachedResource* texture = m_renderPassTextures.get(renderPass->id); |
| 215 DCHECK(texture); | 215 DCHECK(texture); |
| 216 if (!texture->id() && !texture->Allocate(Renderer::ImplPool, renderPassTextu
reSize(renderPass), renderPassTextureFormat(renderPass), ResourceProvider::Textu
reUsageFramebuffer)) | 216 if (!texture->id() && !texture->Allocate(Renderer::ImplPool, renderPassTextu
reSize(renderPass), renderPassTextureFormat(renderPass), ResourceProvider::Textu
reUsageFramebuffer)) |
| 217 return false; | 217 return false; |
| 218 | 218 |
| 219 return bindFramebufferToTexture(frame, texture, renderPass->outputRect()); | 219 return bindFramebufferToTexture(frame, texture, renderPass->output_rect); |
| 220 } | 220 } |
| 221 | 221 |
| 222 bool DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const | 222 bool DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const |
| 223 { | 223 { |
| 224 CachedResource* texture = m_renderPassTextures.get(id); | 224 CachedResource* texture = m_renderPassTextures.get(id); |
| 225 return texture && texture->id() && texture->isComplete(); | 225 return texture && texture->id() && texture->isComplete(); |
| 226 } | 226 } |
| 227 | 227 |
| 228 // static | 228 // static |
| 229 gfx::Size DirectRenderer::renderPassTextureSize(const RenderPass* pass) | 229 gfx::Size DirectRenderer::renderPassTextureSize(const RenderPass* pass) |
| 230 { | 230 { |
| 231 return pass->outputRect().size(); | 231 return pass->output_rect.size(); |
| 232 } | 232 } |
| 233 | 233 |
| 234 // static | 234 // static |
| 235 GLenum DirectRenderer::renderPassTextureFormat(const RenderPass*) | 235 GLenum DirectRenderer::renderPassTextureFormat(const RenderPass*) |
| 236 { | 236 { |
| 237 return GL_RGBA; | 237 return GL_RGBA; |
| 238 } | 238 } |
| 239 | 239 |
| 240 } // namespace cc | 240 } // namespace cc |
| OLD | NEW |