Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: cc/direct_renderer.cc

Issue 11413106: cc: Make RenderPass into a struct-like class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/delegated_renderer_layer_impl_unittest.cc ('k') | cc/gl_renderer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « cc/delegated_renderer_layer_impl_unittest.cc ('k') | cc/gl_renderer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698