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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 | 43 |
44 // Map from ([-1, -1] to [1, 1]) -> ([0, 0] to [1, 1]) | 44 // Map from ([-1, -1] to [1, 1]) -> ([0, 0] to [1, 1]) |
45 canvas.translate3d(0.5, 0.5, 0.5); | 45 canvas.translate3d(0.5, 0.5, 0.5); |
46 canvas.scale3d(0.5, 0.5, 0.5); | 46 canvas.scale3d(0.5, 0.5, 0.5); |
47 | 47 |
48 return canvas; | 48 return canvas; |
49 } | 49 } |
50 | 50 |
51 namespace cc { | 51 namespace cc { |
52 | 52 |
53 CCDirectRenderer::DrawingFrame::DrawingFrame() | 53 DirectRenderer::DrawingFrame::DrawingFrame() |
54 : rootRenderPass(0) | 54 : rootRenderPass(0) |
55 , currentRenderPass(0) | 55 , currentRenderPass(0) |
56 , currentTexture(0) | 56 , currentTexture(0) |
57 , flippedY(false) | 57 , flippedY(false) |
58 { | 58 { |
59 } | 59 } |
60 | 60 |
61 CCDirectRenderer::DrawingFrame::~DrawingFrame() | 61 DirectRenderer::DrawingFrame::~DrawingFrame() |
62 { | 62 { |
63 } | 63 } |
64 | 64 |
65 // | 65 // |
66 // static | 66 // static |
67 FloatRect CCDirectRenderer::quadVertexRect() | 67 FloatRect DirectRenderer::quadVertexRect() |
68 { | 68 { |
69 return FloatRect(-0.5, -0.5, 1, 1); | 69 return FloatRect(-0.5, -0.5, 1, 1); |
70 } | 70 } |
71 | 71 |
72 // static | 72 // static |
73 void CCDirectRenderer::quadRectTransform(WebKit::WebTransformationMatrix* quadRe
ctTransform, const WebKit::WebTransformationMatrix& quadTransform, const FloatRe
ct& quadRect) | 73 void DirectRenderer::quadRectTransform(WebKit::WebTransformationMatrix* quadRect
Transform, const WebKit::WebTransformationMatrix& quadTransform, const FloatRect
& quadRect) |
74 { | 74 { |
75 *quadRectTransform = quadTransform; | 75 *quadRectTransform = quadTransform; |
76 quadRectTransform->translate(0.5 * quadRect.width() + quadRect.x(), 0.5 * qu
adRect.height() + quadRect.y()); | 76 quadRectTransform->translate(0.5 * quadRect.width() + quadRect.x(), 0.5 * qu
adRect.height() + quadRect.y()); |
77 quadRectTransform->scaleNonUniform(quadRect.width(), quadRect.height()); | 77 quadRectTransform->scaleNonUniform(quadRect.width(), quadRect.height()); |
78 } | 78 } |
79 | 79 |
80 // static | 80 // static |
81 void CCDirectRenderer::initializeMatrices(DrawingFrame& frame, const IntRect& dr
awRect, bool flipY) | 81 void DirectRenderer::initializeMatrices(DrawingFrame& frame, const IntRect& draw
Rect, bool flipY) |
82 { | 82 { |
83 if (flipY) | 83 if (flipY) |
84 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.maxY(), drawRect.y()); | 84 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.maxY(), drawRect.y()); |
85 else | 85 else |
86 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.y(), drawRect.maxY()); | 86 frame.projectionMatrix = orthoProjectionMatrix(drawRect.x(), drawRect.ma
xX(), drawRect.y(), drawRect.maxY()); |
87 frame.windowMatrix = windowMatrix(0, 0, drawRect.width(), drawRect.height())
; | 87 frame.windowMatrix = windowMatrix(0, 0, drawRect.width(), drawRect.height())
; |
88 frame.flippedY = flipY; | 88 frame.flippedY = flipY; |
89 } | 89 } |
90 | 90 |
91 // static | 91 // static |
92 IntRect CCDirectRenderer::moveScissorToWindowSpace(const DrawingFrame& frame, Fl
oatRect scissorRect) | 92 IntRect DirectRenderer::moveScissorToWindowSpace(const DrawingFrame& frame, Floa
tRect scissorRect) |
93 { | 93 { |
94 IntRect scissorRectInCanvasSpace = enclosingIntRect(scissorRect); | 94 IntRect scissorRectInCanvasSpace = enclosingIntRect(scissorRect); |
95 // The scissor coordinates must be supplied in viewport space so we need to
offset | 95 // The scissor coordinates must be supplied in viewport space so we need to
offset |
96 // by the relative position of the top left corner of the current render pas
s. | 96 // by the relative position of the top left corner of the current render pas
s. |
97 IntRect framebufferOutputRect = frame.currentRenderPass->outputRect(); | 97 IntRect framebufferOutputRect = frame.currentRenderPass->outputRect(); |
98 scissorRectInCanvasSpace.setX(scissorRectInCanvasSpace.x() - framebufferOutp
utRect.x()); | 98 scissorRectInCanvasSpace.setX(scissorRectInCanvasSpace.x() - framebufferOutp
utRect.x()); |
99 if (frame.flippedY && !frame.currentTexture) | 99 if (frame.flippedY && !frame.currentTexture) |
100 scissorRectInCanvasSpace.setY(framebufferOutputRect.height() - (scissorR
ectInCanvasSpace.maxY() - framebufferOutputRect.y())); | 100 scissorRectInCanvasSpace.setY(framebufferOutputRect.height() - (scissorR
ectInCanvasSpace.maxY() - framebufferOutputRect.y())); |
101 else | 101 else |
102 scissorRectInCanvasSpace.setY(scissorRectInCanvasSpace.y() - framebuffer
OutputRect.y()); | 102 scissorRectInCanvasSpace.setY(scissorRectInCanvasSpace.y() - framebuffer
OutputRect.y()); |
103 return scissorRectInCanvasSpace; | 103 return scissorRectInCanvasSpace; |
104 } | 104 } |
105 | 105 |
106 CCDirectRenderer::CCDirectRenderer(CCRendererClient* client, CCResourceProvider*
resourceProvider) | 106 DirectRenderer::DirectRenderer(RendererClient* client, ResourceProvider* resourc
eProvider) |
107 : CCRenderer(client) | 107 : Renderer(client) |
108 , m_resourceProvider(resourceProvider) | 108 , m_resourceProvider(resourceProvider) |
109 { | 109 { |
110 } | 110 } |
111 | 111 |
112 CCDirectRenderer::~CCDirectRenderer() | 112 DirectRenderer::~DirectRenderer() |
113 { | 113 { |
114 } | 114 } |
115 | 115 |
116 void CCDirectRenderer::decideRenderPassAllocationsForFrame(const CCRenderPassLis
t& renderPassesInDrawOrder) | 116 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) |
117 { | 117 { |
118 base::hash_map<CCRenderPass::Id, const CCRenderPass*> renderPassesInFrame; | 118 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; |
119 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) | 119 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) |
120 renderPassesInFrame.insert(std::pair<CCRenderPass::Id, const CCRenderPas
s*>(renderPassesInDrawOrder[i]->id(), renderPassesInDrawOrder[i])); | 120 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id(), renderPassesInDrawOrder[i])); |
121 | 121 |
122 std::vector<CCRenderPass::Id> passesToDelete; | 122 std::vector<RenderPass::Id> passesToDelete; |
123 ScopedPtrHashMap<CCRenderPass::Id, CachedTexture>::const_iterator passIterat
or; | 123 ScopedPtrHashMap<RenderPass::Id, CachedTexture>::const_iterator passIterator
; |
124 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { | 124 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { |
125 base::hash_map<CCRenderPass::Id, const CCRenderPass*>::const_iterator it
= renderPassesInFrame.find(passIterator->first); | 125 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); |
126 if (it == renderPassesInFrame.end()) { | 126 if (it == renderPassesInFrame.end()) { |
127 passesToDelete.push_back(passIterator->first); | 127 passesToDelete.push_back(passIterator->first); |
128 continue; | 128 continue; |
129 } | 129 } |
130 | 130 |
131 const CCRenderPass* renderPassInFrame = it->second; | 131 const RenderPass* renderPassInFrame = it->second; |
132 const IntSize& requiredSize = renderPassTextureSize(renderPassInFrame); | 132 const IntSize& requiredSize = renderPassTextureSize(renderPassInFrame); |
133 GC3Denum requiredFormat = renderPassTextureFormat(renderPassInFrame); | 133 GC3Denum requiredFormat = renderPassTextureFormat(renderPassInFrame); |
134 CachedTexture* texture = passIterator->second; | 134 CachedTexture* texture = passIterator->second; |
135 ASSERT(texture); | 135 ASSERT(texture); |
136 | 136 |
137 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) | 137 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) |
138 texture->free(); | 138 texture->free(); |
139 } | 139 } |
140 | 140 |
141 // Delete RenderPass textures from the previous frame that will not be used
again. | 141 // Delete RenderPass textures from the previous frame that will not be used
again. |
142 for (size_t i = 0; i < passesToDelete.size(); ++i) | 142 for (size_t i = 0; i < passesToDelete.size(); ++i) |
143 m_renderPassTextures.erase(passesToDelete[i]); | 143 m_renderPassTextures.erase(passesToDelete[i]); |
144 | 144 |
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 DirectRenderer::drawFrame(const RenderPassList& renderPassesInDrawOrder, co
nst RenderPassIdHashMap& renderPassesById) |
154 { | 154 { |
155 const CCRenderPass* rootRenderPass = renderPassesInDrawOrder.back(); | 155 const RenderPass* 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 ? rootRenderPass->dam
ageRect() : rootRenderPass->outputRect(); |
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 DirectRenderer::drawRenderPass(DrawingFrame& frame, const RenderPass* rende
rPass) |
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 != frame.rootRenderPass->outputRect()) { |
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(MathUtil::projectClippedRec
t(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 QuadList& quadList = renderPass->quadList(); |
185 for (CCQuadList::constBackToFrontIterator it = quadList.backToFrontBegin();
it != quadList.backToFrontEnd(); ++it) { | 185 for (QuadList::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((*it)->clippedRectInTarget()); |
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 DirectRenderer::useRenderPass(DrawingFrame& frame, const RenderPass* render
Pass) |
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(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(Renderer::ImplPool, renderPassTextu
reSize(renderPass), renderPassTextureFormat(renderPass), ResourceProvider::Textu
reUsageFramebuffer)) |
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 DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const |
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 DirectRenderer::renderPassTextureSize(const RenderPass* pass) |
227 { | 227 { |
228 return pass->outputRect().size(); | 228 return pass->outputRect().size(); |
229 } | 229 } |
230 | 230 |
231 // static | 231 // static |
232 GC3Denum CCDirectRenderer::renderPassTextureFormat(const CCRenderPass*) | 232 GC3Denum DirectRenderer::renderPassTextureFormat(const RenderPass*) |
233 { | 233 { |
234 return GraphicsContext3D::RGBA; | 234 return GraphicsContext3D::RGBA; |
235 } | 235 } |
236 | 236 |
237 } | 237 } |
OLD | NEW |