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

Side by Side Diff: src/gpu/GrInOrderDrawBuffer.cpp

Issue 715903002: Push creation of default GP to the caller (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 1 month 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
OLDNEW
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"
11 #include "GrDefaultGeoProcFactory.h"
11 #include "GrDrawTargetCaps.h" 12 #include "GrDrawTargetCaps.h"
12 #include "GrGpu.h" 13 #include "GrGpu.h"
13 #include "GrOptDrawState.h" 14 #include "GrOptDrawState.h"
14 #include "GrTemplates.h" 15 #include "GrTemplates.h"
15 #include "GrTextStrike.h" 16 #include "GrTextStrike.h"
16 #include "GrTexture.h" 17 #include "GrTexture.h"
17 18
18 GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu, 19 GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu,
19 GrVertexBufferAllocPool* vertexPool, 20 GrVertexBufferAllocPool* vertexPool,
20 GrIndexBufferAllocPool* indexPool) 21 GrIndexBufferAllocPool* indexPool)
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 const SkPoint* point = static_cast<const SkPoint*>(vertices); 65 const SkPoint* point = static_cast<const SkPoint*>(vertices);
65 bounds->fLeft = bounds->fRight = point->fX; 66 bounds->fLeft = bounds->fRight = point->fX;
66 bounds->fTop = bounds->fBottom = point->fY; 67 bounds->fTop = bounds->fBottom = point->fY;
67 for (int i = 1; i < vertexCount; ++i) { 68 for (int i = 1; i < vertexCount; ++i) {
68 point = reinterpret_cast<SkPoint*>(reinterpret_cast<intptr_t>(point) + v ertexSize); 69 point = reinterpret_cast<SkPoint*>(reinterpret_cast<intptr_t>(point) + v ertexSize);
69 bounds->growToInclude(point->fX, point->fY); 70 bounds->growToInclude(point->fX, point->fY);
70 } 71 }
71 } 72 }
72 } 73 }
73 74
74
75 namespace {
76
77 extern const GrVertexAttrib kRectAttribs[] = {
78 {kVec2f_GrVertexAttribType, 0, kPosition_GrVe rtexAttribBinding},
79 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVerte xAttribBinding},
80 {kVec2f_GrVertexAttribType, sizeof(SkPoint)+sizeof(GrColor), kLocalCoord_Gr VertexAttribBinding},
81 };
82 }
83
84 /** We always use per-vertex colors so that rects can be batched across color ch anges. Sometimes we 75 /** We always use per-vertex colors so that rects can be batched across color ch anges. Sometimes we
85 have explicit local coords and sometimes not. We *could* always provide expl icit local coords 76 have explicit local coords and sometimes not. We *could* always provide expl icit local coords
86 and just duplicate the positions when the caller hasn't provided a local coo rd rect, but we 77 and just duplicate the positions when the caller hasn't provided a local coo rd rect, but we
87 haven't seen a use case which frequently switches between local rect and no local rect draws. 78 haven't seen a use case which frequently switches between local rect and no local rect draws.
88 79
89 The color param is used to determine whether the opaque hint can be set on t he draw state. 80 The color param is used to determine whether the opaque hint can be set on t he draw state.
90 The caller must populate the vertex colors itself. 81 The caller must populate the vertex colors itself.
91 82
92 The vertex attrib order is always pos, color, [local coords]. 83 The vertex attrib order is always pos, color, [local coords].
93 */ 84 */
94 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G rColor color) { 85 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G rColor color) {
95 if (hasLocalCoords) { 86 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType |
96 drawState->setVertexAttribs<kRectAttribs>(3, 2 * sizeof(SkPoint) + sizeo f(SkColor)); 87 GrDefaultGeoProcFactory::kColor_GPType;
97 } else { 88 flags |= hasLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPType : 0;
98 drawState->setVertexAttribs<kRectAttribs>(2, sizeof(SkPoint) + sizeof(Sk Color)); 89 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::CreateAndSetAttribs (drawState,
99 } 90 flags))->unref();
100 if (0xFF == GrColorUnpackA(color)) { 91 if (0xFF == GrColorUnpackA(color)) {
101 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 92 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
102 } 93 }
103 } 94 }
104 95
105 enum { 96 enum {
106 kTraceCmdBit = 0x80, 97 kTraceCmdBit = 0x80,
107 kCmdMask = 0x7f, 98 kCmdMask = 0x7f,
108 }; 99 };
109 100
110 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; } 101 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; }
111 102
112 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; } 103 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; }
113 104
114 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr aceCmdBit); } 105 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr aceCmdBit); }
115 106
116 void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect, 107 void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect,
117 const SkRect* localRect, 108 const SkRect* localRect,
118 const SkMatrix* localMatrix) { 109 const SkMatrix* localMatrix) {
119 GrDrawState* drawState = this->drawState(); 110 GrDrawState* drawState = this->drawState();
111 GrDrawState::AutoRestoreEffects are(drawState);
120 112
121 GrColor color = drawState->getColor(); 113 GrColor color = drawState->getColor();
122 114
123 set_vertex_attributes(drawState, SkToBool(localRect), color); 115 set_vertex_attributes(drawState, SkToBool(localRect), color);
124 116
125 AutoReleaseGeometry geo(this, 4, 0); 117 AutoReleaseGeometry geo(this, 4, 0);
126 if (!geo.succeeded()) { 118 if (!geo.succeeded()) {
127 SkDebugf("Failed to get space for vertices!\n"); 119 SkDebugf("Failed to get space for vertices!\n");
128 return; 120 return;
129 } 121 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); 228 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers());
237 draw->fType = add_trace_bit(draw->fType); 229 draw->fType = add_trace_bit(draw->fType);
238 } 230 }
239 } 231 }
240 232
241 return instancesToConcat; 233 return instancesToConcat;
242 } 234 }
243 235
244 void GrInOrderDrawBuffer::onDraw(const DrawInfo& info, 236 void GrInOrderDrawBuffer::onDraw(const DrawInfo& info,
245 const GrClipMaskManager::ScissorState& scissorS tate) { 237 const GrClipMaskManager::ScissorState& scissorS tate) {
246
247 GeometryPoolState& poolState = fGeoPoolStateStack.back(); 238 GeometryPoolState& poolState = fGeoPoolStateStack.back();
248 const GrDrawState& drawState = this->getDrawState(); 239 const GrDrawState& drawState = this->getDrawState();
249 240
250 this->recordStateIfNecessary(GrGpu::PrimTypeToDrawType(info.primitiveType()) , 241 this->recordStateIfNecessary(GrGpu::PrimTypeToDrawType(info.primitiveType()) ,
251 info.getDstCopy()); 242 info.getDstCopy());
252 243
253 const GrVertexBuffer* vb; 244 const GrVertexBuffer* vb;
254 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) { 245 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) {
255 vb = this->getGeomSrc().fVertexBuffer; 246 vb = this->getGeomSrc().fVertexBuffer;
256 } else { 247 } else {
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 739
749 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { 740 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
750 SkASSERT(!fCmdBuffer.empty()); 741 SkASSERT(!fCmdBuffer.empty());
751 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); 742 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType));
752 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); 743 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers();
753 if (activeTraceMarkers.count() > 0) { 744 if (activeTraceMarkers.count() > 0) {
754 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); 745 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType);
755 fGpuCmdMarkers.push_back(activeTraceMarkers); 746 fGpuCmdMarkers.push_back(activeTraceMarkers);
756 } 747 }
757 } 748 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698