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

Side by Side Diff: cc/delegated_renderer_layer_impl.cc

Issue 11821015: cc: Use the size of the source frame along with the source frame's renderpasses (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add displaySize() Created 7 years, 11 months 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
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/delegated_renderer_layer_impl.h" 5 #include "cc/delegated_renderer_layer_impl.h"
6 6
7 #include "cc/append_quads_data.h" 7 #include "cc/append_quads_data.h"
8 #include "cc/math_util.h" 8 #include "cc/math_util.h"
9 #include "cc/quad_sink.h" 9 #include "cc/quad_sink.h"
10 #include "cc/render_pass_draw_quad.h" 10 #include "cc/render_pass_draw_quad.h"
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 } 100 }
101 } 101 }
102 102
103 void DelegatedRendererLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData & appendQuadsData) 103 void DelegatedRendererLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData & appendQuadsData)
104 { 104 {
105 if (m_renderPassesInDrawOrder.empty()) 105 if (m_renderPassesInDrawOrder.empty())
106 return; 106 return;
107 107
108 RenderPass::Id targetRenderPassId = appendQuadsData.renderPassId; 108 RenderPass::Id targetRenderPassId = appendQuadsData.renderPassId;
109 109
110 const RenderPass* rootDelegatedRenderPass = m_renderPassesInDrawOrder.back() ;
111
112 DCHECK(rootDelegatedRenderPass->output_rect.origin().IsOrigin());
113 gfx::Size frameSize = rootDelegatedRenderPass->output_rect.size();
114
110 // If the index of the renderPassId is 0, then it is a renderPass generated for a layer 115 // If the index of the renderPassId is 0, then it is a renderPass generated for a layer
111 // in this compositor, not the delegated renderer. Then we want to merge our root renderPass with 116 // in this compositor, not the delegated renderer. Then we want to merge our root renderPass with
112 // the target renderPass. Otherwise, it is some renderPass which we added fr om the delegated 117 // the target renderPass. Otherwise, it is some renderPass which we added fr om the delegated
113 // renderer. 118 // renderer.
114 bool shouldMergeRootRenderPassWithTarget = !targetRenderPassId.index; 119 bool shouldMergeRootRenderPassWithTarget = !targetRenderPassId.index;
115 if (shouldMergeRootRenderPassWithTarget) { 120 if (shouldMergeRootRenderPassWithTarget) {
116 // Verify that the renderPass we are appending to is created our renderT arget. 121 // Verify that the renderPass we are appending to is created our renderT arget.
117 DCHECK(targetRenderPassId.layer_id == renderTarget()->id()); 122 DCHECK(targetRenderPassId.layer_id == renderTarget()->id());
118 123
119 const RenderPass* rootDelegatedRenderPass = m_renderPassesInDrawOrder.ba ck(); 124 appendRenderPassQuads(quadSink, appendQuadsData, rootDelegatedRenderPass , frameSize);
120 appendRenderPassQuads(quadSink, appendQuadsData, rootDelegatedRenderPass );
121 } else { 125 } else {
122 // Verify that the renderPass we are appending to was created by us. 126 // Verify that the renderPass we are appending to was created by us.
123 DCHECK(targetRenderPassId.layer_id == id()); 127 DCHECK(targetRenderPassId.layer_id == id());
124 128
125 int renderPassIndex = idToIndex(targetRenderPassId.index); 129 int renderPassIndex = idToIndex(targetRenderPassId.index);
126 const RenderPass* delegatedRenderPass = m_renderPassesInDrawOrder[render PassIndex]; 130 const RenderPass* delegatedRenderPass = m_renderPassesInDrawOrder[render PassIndex];
127 appendRenderPassQuads(quadSink, appendQuadsData, delegatedRenderPass); 131 appendRenderPassQuads(quadSink, appendQuadsData, delegatedRenderPass, fr ameSize);
128 } 132 }
129 } 133 }
130 134
131 void DelegatedRendererLayerImpl::appendRenderPassQuads(QuadSink& quadSink, Appen dQuadsData& appendQuadsData, const RenderPass* delegatedRenderPass) const 135 void DelegatedRendererLayerImpl::appendRenderPassQuads(QuadSink& quadSink, Appen dQuadsData& appendQuadsData, const RenderPass* delegatedRenderPass, gfx::Size fr ameSize) const
132 { 136 {
133 const SharedQuadState* currentSharedQuadState = 0; 137 const SharedQuadState* currentSharedQuadState = 0;
134 SharedQuadState* copiedSharedQuadState = 0; 138 SharedQuadState* copiedSharedQuadState = 0;
135 for (size_t i = 0; i < delegatedRenderPass->quad_list.size(); ++i) { 139 for (size_t i = 0; i < delegatedRenderPass->quad_list.size(); ++i) {
136 const DrawQuad* quad = delegatedRenderPass->quad_list[i]; 140 const DrawQuad* quad = delegatedRenderPass->quad_list[i];
137 141
138 if (quad->shared_quad_state != currentSharedQuadState) { 142 if (quad->shared_quad_state != currentSharedQuadState) {
139 currentSharedQuadState = quad->shared_quad_state; 143 currentSharedQuadState = quad->shared_quad_state;
140 copiedSharedQuadState = quadSink.useSharedQuadState(currentSharedQua dState->Copy()); 144 copiedSharedQuadState = quadSink.useSharedQuadState(currentSharedQua dState->Copy());
141 bool targetIsFromDelegatedRendererLayer = appendQuadsData.renderPass Id.layer_id == id(); 145 bool targetIsFromDelegatedRendererLayer = appendQuadsData.renderPass Id.layer_id == id();
142 if (!targetIsFromDelegatedRendererLayer) { 146 if (!targetIsFromDelegatedRendererLayer) {
143 // Should be the root render pass. 147 // Should be the root render pass.
144 DCHECK(delegatedRenderPass == m_renderPassesInDrawOrder.back()); 148 DCHECK(delegatedRenderPass == m_renderPassesInDrawOrder.back());
145 // This layer must be drawing to a renderTarget other than itself. 149 // This layer must be drawing to a renderTarget other than itself.
146 DCHECK(renderTarget() != this); 150 DCHECK(renderTarget() != this);
147 151
148 copiedSharedQuadState->content_to_target_transform = drawTransform () * copiedSharedQuadState->content_to_target_transform; 152 // Don't allow areas inside the bounds that are empty.
149 copiedSharedQuadState->clipped_rect_in_target = MathUtil::mapClipp edRect(drawTransform(), copiedSharedQuadState->clipped_rect_in_target); 153 DCHECK(m_displaySize.IsEmpty() || gfx::Rect(m_displaySize).Contain s(gfx::Rect(bounds())));
150 copiedSharedQuadState->clip_rect = MathUtil::mapClippedRect(drawTr ansform(), copiedSharedQuadState->clip_rect); 154 gfx::Size displaySize = m_displaySize.IsEmpty() ? bounds() : m_dis playSize;
155
156 gfx::Transform delegatedFrameToLayerSpaceTransform;
157 delegatedFrameToLayerSpaceTransform.Scale(
158 static_cast<double>(displaySize.width()) / frameSize.width(),
159 static_cast<double>(displaySize.height()) / frameSize.height() );
piman 2013/01/19 02:02:47 perf nit: should we factor out drawTransform() * d
160
161 copiedSharedQuadState->content_to_target_transform = drawTransform () * delegatedFrameToLayerSpaceTransform * copiedSharedQuadState->content_to_tar get_transform;
162 copiedSharedQuadState->clipped_rect_in_target = MathUtil::mapClipp edRect(drawTransform() * delegatedFrameToLayerSpaceTransform, copiedSharedQuadSt ate->clipped_rect_in_target);
163 copiedSharedQuadState->clip_rect = MathUtil::mapClippedRect(drawTr ansform() * delegatedFrameToLayerSpaceTransform, copiedSharedQuadState->clip_rec t);
151 copiedSharedQuadState->opacity *= drawOpacity(); 164 copiedSharedQuadState->opacity *= drawOpacity();
152 } 165 }
153 } 166 }
154 DCHECK(copiedSharedQuadState); 167 DCHECK(copiedSharedQuadState);
155 168
156 scoped_ptr<DrawQuad> copyQuad; 169 scoped_ptr<DrawQuad> copyQuad;
157 if (quad->material != DrawQuad::RENDER_PASS) 170 if (quad->material != DrawQuad::RENDER_PASS)
158 copyQuad = quad->Copy(copiedSharedQuadState); 171 copyQuad = quad->Copy(copiedSharedQuadState);
159 else { 172 else {
160 RenderPass::Id contributingDelegatedRenderPassId = RenderPassDrawQua d::MaterialCast(quad)->render_pass_id; 173 RenderPass::Id contributingDelegatedRenderPassId = RenderPassDrawQua d::MaterialCast(quad)->render_pass_id;
161 RenderPass::Id contributingRenderPassId = convertDelegatedRenderPass Id(contributingDelegatedRenderPassId); 174 RenderPass::Id contributingRenderPassId = convertDelegatedRenderPass Id(contributingDelegatedRenderPassId);
162 DCHECK(contributingRenderPassId != appendQuadsData.renderPassId); 175 DCHECK(contributingRenderPassId != appendQuadsData.renderPassId);
163 176
164 copyQuad = RenderPassDrawQuad::MaterialCast(quad)->Copy(copiedShared QuadState, contributingRenderPassId).PassAs<DrawQuad>(); 177 copyQuad = RenderPassDrawQuad::MaterialCast(quad)->Copy(copiedShared QuadState, contributingRenderPassId).PassAs<DrawQuad>();
165 } 178 }
166 DCHECK(copyQuad.get()); 179 DCHECK(copyQuad.get());
167 180
168 quadSink.append(copyQuad.Pass(), appendQuadsData); 181 quadSink.append(copyQuad.Pass(), appendQuadsData);
169 } 182 }
170 } 183 }
171 184
172 const char* DelegatedRendererLayerImpl::layerTypeAsString() const 185 const char* DelegatedRendererLayerImpl::layerTypeAsString() const
173 { 186 {
174 return "DelegatedRendererLayer"; 187 return "DelegatedRendererLayer";
175 } 188 }
176 189
177 } // namespace cc 190 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698