OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "GrInOrderDrawBuffer.h" | 8 #include "GrInOrderDrawBuffer.h" |
9 | 9 |
10 #include "GrBufferAllocPool.h" | 10 #include "GrBufferAllocPool.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 fDstGpu->unref(); | 55 fDstGpu->unref(); |
56 } | 56 } |
57 | 57 |
58 //////////////////////////////////////////////////////////////////////////////// | 58 //////////////////////////////////////////////////////////////////////////////// |
59 | 59 |
60 namespace { | 60 namespace { |
61 void get_vertex_bounds(const void* vertices, | 61 void get_vertex_bounds(const void* vertices, |
62 size_t vertexSize, | 62 size_t vertexSize, |
63 int vertexCount, | 63 int vertexCount, |
64 SkRect* bounds) { | 64 SkRect* bounds) { |
65 SkASSERT(vertexSize >= sizeof(GrPoint)); | 65 SkASSERT(vertexSize >= sizeof(SkPoint)); |
66 SkASSERT(vertexCount > 0); | 66 SkASSERT(vertexCount > 0); |
67 const GrPoint* point = static_cast<const GrPoint*>(vertices); | 67 const SkPoint* point = static_cast<const SkPoint*>(vertices); |
68 bounds->fLeft = bounds->fRight = point->fX; | 68 bounds->fLeft = bounds->fRight = point->fX; |
69 bounds->fTop = bounds->fBottom = point->fY; | 69 bounds->fTop = bounds->fBottom = point->fY; |
70 for (int i = 1; i < vertexCount; ++i) { | 70 for (int i = 1; i < vertexCount; ++i) { |
71 point = reinterpret_cast<GrPoint*>(reinterpret_cast<intptr_t>(point) + v
ertexSize); | 71 point = reinterpret_cast<SkPoint*>(reinterpret_cast<intptr_t>(point) + v
ertexSize); |
72 bounds->growToInclude(point->fX, point->fY); | 72 bounds->growToInclude(point->fX, point->fY); |
73 } | 73 } |
74 } | 74 } |
75 } | 75 } |
76 | 76 |
77 | 77 |
78 namespace { | 78 namespace { |
79 | 79 |
80 extern const GrVertexAttrib kRectPosColorUVAttribs[] = { | 80 extern const GrVertexAttrib kRectPosColorUVAttribs[] = { |
81 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, | 81 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, |
82 {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kColor_GrVertexAttribBinding}, | 82 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding}, |
83 {kVec2f_GrVertexAttribType, sizeof(GrPoint)+sizeof(GrColor), | 83 {kVec2f_GrVertexAttribType, sizeof(SkPoint)+sizeof(GrColor), |
84 kLocalCoord_GrVertexAttribBind
ing}, | 84 kLocalCoord_GrVertexAttribBind
ing}, |
85 }; | 85 }; |
86 | 86 |
87 extern const GrVertexAttrib kRectPosUVAttribs[] = { | 87 extern const GrVertexAttrib kRectPosUVAttribs[] = { |
88 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding
}, | 88 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding
}, |
89 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBindi
ng}, | 89 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttribBindi
ng}, |
90 }; | 90 }; |
91 | 91 |
92 static void set_vertex_attributes(GrDrawState* drawState, | 92 static void set_vertex_attributes(GrDrawState* drawState, |
93 bool hasColor, bool hasUVs, | 93 bool hasColor, bool hasUVs, |
94 int* colorOffset, int* localOffset) { | 94 int* colorOffset, int* localOffset) { |
95 *colorOffset = -1; | 95 *colorOffset = -1; |
96 *localOffset = -1; | 96 *localOffset = -1; |
97 | 97 |
98 // Using per-vertex colors allows batching across colors. (A lot of rects in
a row differing | 98 // Using per-vertex colors allows batching across colors. (A lot of rects in
a row differing |
99 // only in color is a common occurrence in tables). However, having per-vert
ex colors disables | 99 // only in color is a common occurrence in tables). However, having per-vert
ex colors disables |
100 // blending optimizations because we don't know if the color will be solid o
r not. These | 100 // blending optimizations because we don't know if the color will be solid o
r not. These |
101 // optimizations help determine whether coverage and color can be blended co
rrectly when | 101 // optimizations help determine whether coverage and color can be blended co
rrectly when |
102 // dual-source blending isn't available. This comes into play when there is
coverage. If colors | 102 // dual-source blending isn't available. This comes into play when there is
coverage. If colors |
103 // were a stage it could take a hint that every vertex's color will be opaqu
e. | 103 // were a stage it could take a hint that every vertex's color will be opaqu
e. |
104 if (hasColor && hasUVs) { | 104 if (hasColor && hasUVs) { |
105 *colorOffset = sizeof(GrPoint); | 105 *colorOffset = sizeof(SkPoint); |
106 *localOffset = sizeof(GrPoint) + sizeof(GrColor); | 106 *localOffset = sizeof(SkPoint) + sizeof(GrColor); |
107 drawState->setVertexAttribs<kRectPosColorUVAttribs>(3); | 107 drawState->setVertexAttribs<kRectPosColorUVAttribs>(3); |
108 } else if (hasColor) { | 108 } else if (hasColor) { |
109 *colorOffset = sizeof(GrPoint); | 109 *colorOffset = sizeof(SkPoint); |
110 drawState->setVertexAttribs<kRectPosColorUVAttribs>(2); | 110 drawState->setVertexAttribs<kRectPosColorUVAttribs>(2); |
111 } else if (hasUVs) { | 111 } else if (hasUVs) { |
112 *localOffset = sizeof(GrPoint); | 112 *localOffset = sizeof(SkPoint); |
113 drawState->setVertexAttribs<kRectPosUVAttribs>(2); | 113 drawState->setVertexAttribs<kRectPosUVAttribs>(2); |
114 } else { | 114 } else { |
115 drawState->setVertexAttribs<kRectPosUVAttribs>(1); | 115 drawState->setVertexAttribs<kRectPosUVAttribs>(1); |
116 } | 116 } |
117 } | 117 } |
118 | 118 |
119 }; | 119 }; |
120 | 120 |
121 enum { | 121 enum { |
122 kTraceCmdBit = 0x80, | 122 kTraceCmdBit = 0x80, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 | 185 |
186 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom
, vsize); | 186 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom
, vsize); |
187 combinedMatrix.mapPointsWithStride(geo.positions(), vsize, 4); | 187 combinedMatrix.mapPointsWithStride(geo.positions(), vsize, 4); |
188 | 188 |
189 SkRect devBounds; | 189 SkRect devBounds; |
190 // since we already computed the dev verts, set the bounds hint. This will h
elp us avoid | 190 // since we already computed the dev verts, set the bounds hint. This will h
elp us avoid |
191 // unnecessary clipping in our onDraw(). | 191 // unnecessary clipping in our onDraw(). |
192 get_vertex_bounds(geo.vertices(), vsize, 4, &devBounds); | 192 get_vertex_bounds(geo.vertices(), vsize, 4, &devBounds); |
193 | 193 |
194 if (localOffset >= 0) { | 194 if (localOffset >= 0) { |
195 GrPoint* coords = GrTCast<GrPoint*>(GrTCast<intptr_t>(geo.vertices()) +
localOffset); | 195 SkPoint* coords = GrTCast<SkPoint*>(GrTCast<intptr_t>(geo.vertices()) +
localOffset); |
196 coords->setRectFan(localRect->fLeft, localRect->fTop, | 196 coords->setRectFan(localRect->fLeft, localRect->fTop, |
197 localRect->fRight, localRect->fBottom, | 197 localRect->fRight, localRect->fBottom, |
198 vsize); | 198 vsize); |
199 if (NULL != localMatrix) { | 199 if (NULL != localMatrix) { |
200 localMatrix->mapPointsWithStride(coords, vsize, 4); | 200 localMatrix->mapPointsWithStride(coords, vsize, 4); |
201 } | 201 } |
202 } | 202 } |
203 | 203 |
204 if (colorOffset >= 0) { | 204 if (colorOffset >= 0) { |
205 GrColor* vertColor = GrTCast<GrColor*>(GrTCast<intptr_t>(geo.vertices())
+ colorOffset); | 205 GrColor* vertColor = GrTCast<GrColor*>(GrTCast<intptr_t>(geo.vertices())
+ colorOffset); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); | 293 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); |
294 if (draw->startVertex() + draw->vertexCount() != adjustedStartVertex) { | 294 if (draw->startVertex() + draw->vertexCount() != adjustedStartVertex) { |
295 return 0; | 295 return 0; |
296 } | 296 } |
297 | 297 |
298 SkASSERT(poolState.fPoolStartVertex == draw->startVertex() + draw->vertexCou
nt()); | 298 SkASSERT(poolState.fPoolStartVertex == draw->startVertex() + draw->vertexCou
nt()); |
299 | 299 |
300 // how many instances can be concat'ed onto draw given the size of the index
buffer | 300 // how many instances can be concat'ed onto draw given the size of the index
buffer |
301 int instancesToConcat = this->indexCountInCurrentSource() / info.indicesPerI
nstance(); | 301 int instancesToConcat = this->indexCountInCurrentSource() / info.indicesPerI
nstance(); |
302 instancesToConcat -= draw->instanceCount(); | 302 instancesToConcat -= draw->instanceCount(); |
303 instancesToConcat = GrMin(instancesToConcat, info.instanceCount()); | 303 instancesToConcat = SkTMin(instancesToConcat, info.instanceCount()); |
304 | 304 |
305 // update the amount of reserved vertex data actually referenced in draws | 305 // update the amount of reserved vertex data actually referenced in draws |
306 size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * | 306 size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * |
307 drawState.getVertexSize(); | 307 drawState.getVertexSize(); |
308 poolState.fUsedPoolVertexBytes = GrMax(poolState.fUsedPoolVertexBytes, verte
xBytes); | 308 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes, vert
exBytes); |
309 | 309 |
310 draw->adjustInstanceCount(instancesToConcat); | 310 draw->adjustInstanceCount(instancesToConcat); |
311 | 311 |
312 // update last fGpuCmdMarkers to include any additional trace markers that h
ave been added | 312 // update last fGpuCmdMarkers to include any additional trace markers that h
ave been added |
313 if (this->getActiveTraceMarkers().count() > 0) { | 313 if (this->getActiveTraceMarkers().count() > 0) { |
314 if (cmd_has_trace_marker(fCmds.back())) { | 314 if (cmd_has_trace_marker(fCmds.back())) { |
315 fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); | 315 fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); |
316 } else { | 316 } else { |
317 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); | 317 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); |
318 fCmds.back() = add_trace_bit(fCmds.back()); | 318 fCmds.back() = add_trace_bit(fCmds.back()); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 } | 373 } |
374 | 374 |
375 switch (this->getGeomSrc().fVertexSrc) { | 375 switch (this->getGeomSrc().fVertexSrc) { |
376 case kBuffer_GeometrySrcType: | 376 case kBuffer_GeometrySrcType: |
377 draw->fVertexBuffer = this->getGeomSrc().fVertexBuffer; | 377 draw->fVertexBuffer = this->getGeomSrc().fVertexBuffer; |
378 break; | 378 break; |
379 case kReserved_GeometrySrcType: // fallthrough | 379 case kReserved_GeometrySrcType: // fallthrough |
380 case kArray_GeometrySrcType: { | 380 case kArray_GeometrySrcType: { |
381 size_t vertexBytes = (info.vertexCount() + info.startVertex()) * | 381 size_t vertexBytes = (info.vertexCount() + info.startVertex()) * |
382 drawState.getVertexSize(); | 382 drawState.getVertexSize(); |
383 poolState.fUsedPoolVertexBytes = GrMax(poolState.fUsedPoolVertexByte
s, vertexBytes); | 383 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexByt
es, vertexBytes); |
384 draw->fVertexBuffer = poolState.fPoolVertexBuffer; | 384 draw->fVertexBuffer = poolState.fPoolVertexBuffer; |
385 draw->adjustStartVertex(poolState.fPoolStartVertex); | 385 draw->adjustStartVertex(poolState.fPoolStartVertex); |
386 break; | 386 break; |
387 } | 387 } |
388 default: | 388 default: |
389 GrCrash("unknown geom src type"); | 389 GrCrash("unknown geom src type"); |
390 } | 390 } |
391 draw->fVertexBuffer->ref(); | 391 draw->fVertexBuffer->ref(); |
392 | 392 |
393 if (info.isIndexed()) { | 393 if (info.isIndexed()) { |
394 switch (this->getGeomSrc().fIndexSrc) { | 394 switch (this->getGeomSrc().fIndexSrc) { |
395 case kBuffer_GeometrySrcType: | 395 case kBuffer_GeometrySrcType: |
396 draw->fIndexBuffer = this->getGeomSrc().fIndexBuffer; | 396 draw->fIndexBuffer = this->getGeomSrc().fIndexBuffer; |
397 break; | 397 break; |
398 case kReserved_GeometrySrcType: // fallthrough | 398 case kReserved_GeometrySrcType: // fallthrough |
399 case kArray_GeometrySrcType: { | 399 case kArray_GeometrySrcType: { |
400 size_t indexBytes = (info.indexCount() + info.startIndex()) * si
zeof(uint16_t); | 400 size_t indexBytes = (info.indexCount() + info.startIndex()) * si
zeof(uint16_t); |
401 poolState.fUsedPoolIndexBytes = GrMax(poolState.fUsedPoolIndexBy
tes, indexBytes); | 401 poolState.fUsedPoolIndexBytes = SkTMax(poolState.fUsedPoolIndexB
ytes, indexBytes); |
402 draw->fIndexBuffer = poolState.fPoolIndexBuffer; | 402 draw->fIndexBuffer = poolState.fPoolIndexBuffer; |
403 draw->adjustStartIndex(poolState.fPoolStartIndex); | 403 draw->adjustStartIndex(poolState.fPoolStartIndex); |
404 break; | 404 break; |
405 } | 405 } |
406 default: | 406 default: |
407 GrCrash("unknown geom src type"); | 407 GrCrash("unknown geom src type"); |
408 } | 408 } |
409 draw->fIndexBuffer->ref(); | 409 draw->fIndexBuffer->ref(); |
410 } else { | 410 } else { |
411 draw->fIndexBuffer = NULL; | 411 draw->fIndexBuffer = NULL; |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
963 this->addToCmdBuffer(kCopySurface_Cmd); | 963 this->addToCmdBuffer(kCopySurface_Cmd); |
964 return &fCopySurfaces.push_back(); | 964 return &fCopySurfaces.push_back(); |
965 } | 965 } |
966 | 966 |
967 | 967 |
968 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 968 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
969 INHERITED::clipWillBeSet(newClipData); | 969 INHERITED::clipWillBeSet(newClipData); |
970 fClipSet = true; | 970 fClipSet = true; |
971 fClipProxyState = kUnknown_ClipProxyState; | 971 fClipProxyState = kUnknown_ClipProxyState; |
972 } | 972 } |
OLD | NEW |