| 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 UpdateBoundsAfterAppend(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 inline static void append_to_batch(NonAAFillRectBatchSimple* batch, GrColor colo
r, |
| 191 | 198 const SkMatrix& viewMatrix, const SkRect& rec
t, |
| 192 GrDrawBatch* Create(GrColor color, | 199 const SkRect* localRect, const SkMatrix* loca
lMatrix) { |
| 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 inline static void append_to_batch(NonAAFillRectBatchPerspective* batch, GrColor
color, |
| 220 const SkMatrix& viewMatrix, | 219 const SkMatrix& viewMatrix, const SkRect& rec
t, |
| 221 const SkRect& rect, | 220 const SkRect* localRect, const SkMatrix* loca
lMatrix) { |
| 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->updateBoundsAfterAppend(); |
| 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) || |
| 284 geo.fHasLocalRect != SkToBool(localRect) || |
| 285 geo.fHasLocalMatrix != SkToBool(localMatrix) || |
| 286 (geo.fHasLocalMatrix && !geo.fLocalMatrix.cheapEqualTo(*localMatrix)
)) { |
| 287 return false; |
| 288 } |
| 289 |
| 290 append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); |
| 291 batch->updateBoundsAfterAppend(); |
| 292 } |
| 293 |
| 294 return true; |
| 295 } |
| 296 |
| 244 }; | 297 }; |
| 245 | 298 |
| 246 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 299 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 247 | 300 |
| 248 #ifdef GR_TEST_UTILS | 301 #ifdef GR_TEST_UTILS |
| 249 | 302 |
| 250 #include "GrBatchTest.h" | 303 #include "GrBatchTest.h" |
| 251 | 304 |
| 252 DRAW_BATCH_TEST_DEFINE(RectBatch) { | 305 DRAW_BATCH_TEST_DEFINE(RectBatch) { |
| 253 GrColor color = GrRandomColor(random); | 306 GrColor color = GrRandomColor(random); |
| 254 SkRect rect = GrTest::TestRect(random); | 307 SkRect rect = GrTest::TestRect(random); |
| 255 SkRect localRect = GrTest::TestRect(random); | 308 SkRect localRect = GrTest::TestRect(random); |
| 256 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); | 309 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); |
| 257 SkMatrix localMatrix = GrTest::TestMatrix(random); | 310 SkMatrix localMatrix = GrTest::TestMatrix(random); |
| 258 | 311 |
| 259 bool hasLocalRect = random->nextBool(); | 312 bool hasLocalRect = random->nextBool(); |
| 260 bool hasLocalMatrix = random->nextBool(); | 313 bool hasLocalMatrix = random->nextBool(); |
| 261 return GrNonAAFillRectBatch::Create(color, viewMatrix, rect, | 314 return GrNonAAFillRectBatch::Create(color, viewMatrix, rect, |
| 262 hasLocalRect ? &localRect : nullptr, | 315 hasLocalRect ? &localRect : nullptr, |
| 263 hasLocalMatrix ? &localMatrix : nullptr)
; | 316 hasLocalMatrix ? &localMatrix : nullptr)
; |
| 264 } | 317 } |
| 265 | 318 |
| 266 #endif | 319 #endif |
| OLD | NEW |