Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrNonAAFillRectBatch.h" | 8 #include "GrNonAAFillRectBatch.h" |
| 9 | 9 |
| 10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 } | 27 } |
| 28 | 28 |
| 29 static const GrIndexBuffer* GetIndexBuffer(GrResourceProvider* rp) { | 29 static const GrIndexBuffer* GetIndexBuffer(GrResourceProvider* rp) { |
| 30 return rp->refQuadIndexBuffer(); | 30 return rp->refQuadIndexBuffer(); |
| 31 } | 31 } |
| 32 | 32 |
| 33 template <typename Geometry> | 33 template <typename Geometry> |
| 34 static void SetBounds(const Geometry& geo, SkRect* outBounds) { | 34 static void SetBounds(const Geometry& geo, SkRect* outBounds) { |
| 35 geo.fViewMatrix.mapRect(outBounds, geo.fRect); | 35 geo.fViewMatrix.mapRect(outBounds, geo.fRect); |
| 36 } | 36 } |
| 37 | |
| 38 template <typename Geometry> | |
| 39 static void UpdateBounds(const Geometry& geo, SkRect* outBounds) { | |
| 40 SkRect bounds = geo.fRect; | |
| 41 geo.fViewMatrix.mapRect(&bounds); | |
| 42 outBounds->join(bounds); | |
| 43 } | |
| 37 }; | 44 }; |
| 38 | 45 |
| 39 /** We always use per-vertex colors so that rects can be batched across color ch anges. Sometimes | 46 /** We always use per-vertex colors so that rects can be batched across color ch anges. Sometimes |
| 40 we have explicit local coords and sometimes not. We *could* always provide explicit local | 47 we have explicit local coords and sometimes not. We *could* always provide explicit local |
| 41 coords and just duplicate the positions when the caller hasn't provided a lo cal coord rect, | 48 coords and just duplicate the positions when the caller hasn't provided a lo cal coord rect, |
| 42 but we haven't seen a use case which frequently switches between local rect and no local | 49 but we haven't seen a use case which frequently switches between local rect and no local |
| 43 rect draws. | 50 rect draws. |
| 44 | 51 |
| 45 The vertex attrib order is always pos, color, [local coords]. | 52 The vertex attrib order is always pos, color, [local coords]. |
| 46 */ | 53 */ |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 180 tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.f Rect, &quad); | 187 tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.f Rect, &quad); |
| 181 } else { | 188 } else { |
| 182 tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.f Rect, nullptr); | 189 tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.f Rect, nullptr); |
| 183 } | 190 } |
| 184 } | 191 } |
| 185 }; | 192 }; |
| 186 | 193 |
| 187 typedef GrTInstanceBatch<NonAAFillRectBatchImp> NonAAFillRectBatchSimple; | 194 typedef GrTInstanceBatch<NonAAFillRectBatchImp> NonAAFillRectBatchSimple; |
| 188 typedef GrTInstanceBatch<NonAAFillRectBatchPerspectiveImp> NonAAFillRectBatchPer spective; | 195 typedef GrTInstanceBatch<NonAAFillRectBatchPerspectiveImp> NonAAFillRectBatchPer spective; |
| 189 | 196 |
| 190 namespace GrNonAAFillRectBatch { | 197 static void append_to_batch(NonAAFillRectBatchSimple* batch, GrColor color, |
| 191 | 198 const SkMatrix& viewMatrix, const SkRect& rect, cons t SkRect* localRect, |
| 192 GrDrawBatch* Create(GrColor color, | 199 const SkMatrix* localMatrix) { |
| 193 const SkMatrix& viewMatrix, | |
| 194 const SkRect& rect, | |
| 195 const SkRect* localRect, | |
| 196 const SkMatrix* localMatrix) { | |
| 197 SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasP erspective())); | 200 SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasP erspective())); |
| 198 NonAAFillRectBatchSimple* batch = NonAAFillRectBatchSimple::Create(); | 201 NonAAFillRectBatchSimple::Geometry& geo = batch->geoData()->push_back(); |
| 199 NonAAFillRectBatchSimple::Geometry& geo = *batch->geometry(); | |
| 200 | 202 |
| 201 geo.fColor = color; | 203 geo.fColor = color; |
| 202 geo.fViewMatrix = viewMatrix; | 204 geo.fViewMatrix = viewMatrix; |
| 203 geo.fRect = rect; | 205 geo.fRect = rect; |
| 204 | 206 |
| 205 if (localRect && localMatrix) { | 207 if (localRect && localMatrix) { |
| 206 geo.fLocalQuad.setFromMappedRect(*localRect, *localMatrix); | 208 geo.fLocalQuad.setFromMappedRect(*localRect, *localMatrix); |
| 207 } else if (localRect) { | 209 } else if (localRect) { |
| 208 geo.fLocalQuad.set(*localRect); | 210 geo.fLocalQuad.set(*localRect); |
| 209 } else if (localMatrix) { | 211 } else if (localMatrix) { |
| 210 geo.fLocalQuad.setFromMappedRect(rect, *localMatrix); | 212 geo.fLocalQuad.setFromMappedRect(rect, *localMatrix); |
| 211 } else { | 213 } else { |
| 212 geo.fLocalQuad.set(rect); | 214 geo.fLocalQuad.set(rect); |
| 213 } | 215 } |
| 214 | |
| 215 batch->init(); | |
| 216 return batch; | |
| 217 } | 216 } |
| 218 | 217 |
| 219 GrDrawBatch* CreateWithPerspective(GrColor color, | 218 static void append_to_batch(NonAAFillRectBatchPerspective* batch, GrColor color, |
| 220 const SkMatrix& viewMatrix, | 219 const SkMatrix& viewMatrix, const SkRect& rect, cons t SkRect* localRect, |
| 221 const SkRect& rect, | 220 const SkMatrix* localMatrix) { |
| 222 const SkRect* localRect, | |
| 223 const SkMatrix* localMatrix) { | |
| 224 SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPers pective())); | 221 SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPers pective())); |
| 225 NonAAFillRectBatchPerspective* batch = NonAAFillRectBatchPerspective::Create (); | 222 NonAAFillRectBatchPerspective::Geometry& geo = batch->geoData()->push_back() ; |
| 226 NonAAFillRectBatchPerspective::Geometry& geo = *batch->geometry(); | |
| 227 | 223 |
| 228 geo.fColor = color; | 224 geo.fColor = color; |
| 229 geo.fViewMatrix = viewMatrix; | 225 geo.fViewMatrix = viewMatrix; |
| 230 geo.fRect = rect; | 226 geo.fRect = rect; |
| 231 geo.fHasLocalRect = SkToBool(localRect); | 227 geo.fHasLocalRect = SkToBool(localRect); |
| 232 geo.fHasLocalMatrix = SkToBool(localMatrix); | 228 geo.fHasLocalMatrix = SkToBool(localMatrix); |
| 233 if (localMatrix) { | 229 if (localMatrix) { |
| 234 geo.fLocalMatrix = *localMatrix; | 230 geo.fLocalMatrix = *localMatrix; |
| 235 } | 231 } |
| 236 if (localRect) { | 232 if (localRect) { |
| 237 geo.fLocalRect = *localRect; | 233 geo.fLocalRect = *localRect; |
| 238 } | 234 } |
| 239 | 235 |
| 236 } | |
| 237 | |
| 238 namespace GrNonAAFillRectBatch { | |
| 239 | |
| 240 GrDrawBatch* Create(GrColor color, | |
| 241 const SkMatrix& viewMatrix, | |
| 242 const SkRect& rect, | |
| 243 const SkRect* localRect, | |
| 244 const SkMatrix* localMatrix) { | |
| 245 NonAAFillRectBatchSimple* batch = NonAAFillRectBatchSimple::Create(); | |
| 246 append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); | |
| 240 batch->init(); | 247 batch->init(); |
| 241 return batch; | 248 return batch; |
| 242 } | 249 } |
| 243 | 250 |
| 251 GrDrawBatch* CreateWithPerspective(GrColor color, | |
| 252 const SkMatrix& viewMatrix, | |
| 253 const SkRect& rect, | |
| 254 const SkRect* localRect, | |
| 255 const SkMatrix* localMatrix) { | |
| 256 NonAAFillRectBatchPerspective* batch = NonAAFillRectBatchPerspective::Create (); | |
| 257 append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); | |
| 258 batch->init(); | |
| 259 return batch; | |
| 260 } | |
| 261 | |
| 262 bool Append(GrBatch* origBatch, | |
| 263 GrColor color, | |
| 264 const SkMatrix& viewMatrix, | |
| 265 const SkRect& rect, | |
| 266 const SkRect* localRect, | |
| 267 const SkMatrix* localMatrix) { | |
| 268 bool usePerspective = viewMatrix.hasPerspective() || | |
| 269 (localMatrix && localMatrix->hasPerspective()); | |
| 270 | |
| 271 if (usePerspective && origBatch->classID() != NonAAFillRectBatchPerspective: :ClassID()) { | |
| 272 return false; | |
| 273 } | |
| 274 | |
| 275 if (!usePerspective) { | |
| 276 NonAAFillRectBatchSimple* batch = origBatch->cast<NonAAFillRectBatchSimp le>(); | |
| 277 append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); | |
| 278 batch->updateBounds(); | |
| 279 } else { | |
| 280 NonAAFillRectBatchPerspective* batch = origBatch->cast<NonAAFillRectBatc hPerspective>(); | |
| 281 const NonAAFillRectBatchPerspective::Geometry& geo = batch->geoData()->b ack(); | |
| 282 | |
| 283 if (!geo.fViewMatrix.cheapEqualTo(viewMatrix) || | |
|
robertphillips
2015/09/18 17:42:25
What happens if localMatrix is NULL but geo has on
joshualitt
2015/09/18 18:34:10
Acknowledged.
| |
| 284 (geo.fHasLocalMatrix && !geo.fLocalMatrix.cheapEqualTo(*localMatrix) )) { | |
| 285 return false; | |
| 286 } | |
| 287 | |
| 288 append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); | |
| 289 batch->updateBounds(); | |
| 290 } | |
| 291 | |
| 292 return true; | |
| 293 } | |
| 294 | |
| 244 }; | 295 }; |
| 245 | 296 |
| 246 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 297 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 247 | 298 |
| 248 #ifdef GR_TEST_UTILS | 299 #ifdef GR_TEST_UTILS |
| 249 | 300 |
| 250 #include "GrBatchTest.h" | 301 #include "GrBatchTest.h" |
| 251 | 302 |
| 252 DRAW_BATCH_TEST_DEFINE(RectBatch) { | 303 DRAW_BATCH_TEST_DEFINE(RectBatch) { |
| 253 GrColor color = GrRandomColor(random); | 304 GrColor color = GrRandomColor(random); |
| 254 SkRect rect = GrTest::TestRect(random); | 305 SkRect rect = GrTest::TestRect(random); |
| 255 SkRect localRect = GrTest::TestRect(random); | 306 SkRect localRect = GrTest::TestRect(random); |
| 256 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); | 307 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); |
| 257 SkMatrix localMatrix = GrTest::TestMatrix(random); | 308 SkMatrix localMatrix = GrTest::TestMatrix(random); |
| 258 | 309 |
| 259 bool hasLocalRect = random->nextBool(); | 310 bool hasLocalRect = random->nextBool(); |
| 260 bool hasLocalMatrix = random->nextBool(); | 311 bool hasLocalMatrix = random->nextBool(); |
| 261 return GrNonAAFillRectBatch::Create(color, viewMatrix, rect, | 312 return GrNonAAFillRectBatch::Create(color, viewMatrix, rect, |
| 262 hasLocalRect ? &localRect : nullptr, | 313 hasLocalRect ? &localRect : nullptr, |
| 263 hasLocalMatrix ? &localMatrix : nullptr) ; | 314 hasLocalMatrix ? &localMatrix : nullptr) ; |
| 264 } | 315 } |
| 265 | 316 |
| 266 #endif | 317 #endif |
| OLD | NEW |