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 |