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

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: added comment 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
« no previous file with comments | « src/gpu/GrDrawTarget.cpp ('k') | src/gpu/GrOptDrawState.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 const SkPoint* point = static_cast<const SkPoint*>(vertices); 68 const SkPoint* point = static_cast<const SkPoint*>(vertices);
68 bounds->fLeft = bounds->fRight = point->fX; 69 bounds->fLeft = bounds->fRight = point->fX;
69 bounds->fTop = bounds->fBottom = point->fY; 70 bounds->fTop = bounds->fBottom = point->fY;
70 for (int i = 1; i < vertexCount; ++i) { 71 for (int i = 1; i < vertexCount; ++i) {
71 point = reinterpret_cast<SkPoint*>(reinterpret_cast<intptr_t>(point) + v ertexSize); 72 point = reinterpret_cast<SkPoint*>(reinterpret_cast<intptr_t>(point) + v ertexSize);
72 bounds->growToInclude(point->fX, point->fY); 73 bounds->growToInclude(point->fX, point->fY);
73 } 74 }
74 } 75 }
75 } 76 }
76 77
77
78 namespace {
79
80 extern const GrVertexAttrib kRectAttribs[] = {
81 {kVec2f_GrVertexAttribType, 0, kPosition_GrVe rtexAttribBinding},
82 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVerte xAttribBinding},
83 {kVec2f_GrVertexAttribType, sizeof(SkPoint)+sizeof(GrColor), kLocalCoord_Gr VertexAttribBinding},
84 };
85 }
86
87 /** We always use per-vertex colors so that rects can be batched across color ch anges. Sometimes we 78 /** We always use per-vertex colors so that rects can be batched across color ch anges. Sometimes we
88 have explicit local coords and sometimes not. We *could* always provide expl icit local coords 79 have explicit local coords and sometimes not. We *could* always provide expl icit local coords
89 and just duplicate the positions when the caller hasn't provided a local coo rd rect, but we 80 and just duplicate the positions when the caller hasn't provided a local coo rd rect, but we
90 haven't seen a use case which frequently switches between local rect and no local rect draws. 81 haven't seen a use case which frequently switches between local rect and no local rect draws.
91 82
92 The color param is used to determine whether the opaque hint can be set on t he draw state. 83 The color param is used to determine whether the opaque hint can be set on t he draw state.
93 The caller must populate the vertex colors itself. 84 The caller must populate the vertex colors itself.
94 85
95 The vertex attrib order is always pos, color, [local coords]. 86 The vertex attrib order is always pos, color, [local coords].
96 */ 87 */
97 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G rColor color) { 88 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G rColor color) {
98 if (hasLocalCoords) { 89 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType |
99 drawState->setVertexAttribs<kRectAttribs>(3, 2 * sizeof(SkPoint) + sizeo f(SkColor)); 90 GrDefaultGeoProcFactory::kColor_GPType;
100 } else { 91 flags |= hasLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPType : 0;
101 drawState->setVertexAttribs<kRectAttribs>(2, sizeof(SkPoint) + sizeof(Sk Color)); 92 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::CreateAndSetAttribs (drawState,
102 } 93 flags))->unref();
103 if (0xFF == GrColorUnpackA(color)) { 94 if (0xFF == GrColorUnpackA(color)) {
104 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 95 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
105 } 96 }
106 } 97 }
107 98
108 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin gs) { 99 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin gs) {
109 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa ce; 100 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa ce;
110 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace); 101 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace);
111 if (isWinding) { 102 if (isWinding) {
112 // Double check that it is in fact winding. 103 // Double check that it is in fact winding.
(...skipping 26 matching lines...) Expand all
139 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; } 130 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; }
140 131
141 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; } 132 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; }
142 133
143 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr aceCmdBit); } 134 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr aceCmdBit); }
144 135
145 void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect, 136 void GrInOrderDrawBuffer::onDrawRect(const SkRect& rect,
146 const SkRect* localRect, 137 const SkRect* localRect,
147 const SkMatrix* localMatrix) { 138 const SkMatrix* localMatrix) {
148 GrDrawState* drawState = this->drawState(); 139 GrDrawState* drawState = this->drawState();
140 GrDrawState::AutoRestoreEffects are(drawState);
149 141
150 GrColor color = drawState->getColor(); 142 GrColor color = drawState->getColor();
151 143
152 set_vertex_attributes(drawState, SkToBool(localRect), color); 144 set_vertex_attributes(drawState, SkToBool(localRect), color);
153 145
154 AutoReleaseGeometry geo(this, 4, 0); 146 AutoReleaseGeometry geo(this, 4, 0);
155 if (!geo.succeeded()) { 147 if (!geo.succeeded()) {
156 SkDebugf("Failed to get space for vertices!\n"); 148 SkDebugf("Failed to get space for vertices!\n");
157 return; 149 return;
158 } 150 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); 257 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers());
266 draw->fType = add_trace_bit(draw->fType); 258 draw->fType = add_trace_bit(draw->fType);
267 } 259 }
268 } 260 }
269 261
270 return instancesToConcat; 262 return instancesToConcat;
271 } 263 }
272 264
273 void GrInOrderDrawBuffer::onDraw(const DrawInfo& info, 265 void GrInOrderDrawBuffer::onDraw(const DrawInfo& info,
274 const GrClipMaskManager::ScissorState& scissorS tate) { 266 const GrClipMaskManager::ScissorState& scissorS tate) {
275
276 GeometryPoolState& poolState = fGeoPoolStateStack.back(); 267 GeometryPoolState& poolState = fGeoPoolStateStack.back();
277 const GrDrawState& drawState = this->getDrawState(); 268 const GrDrawState& drawState = this->getDrawState();
278 269
279 this->recordStateIfNecessary(GrGpu::PrimTypeToDrawType(info.primitiveType()) , 270 this->recordStateIfNecessary(GrGpu::PrimTypeToDrawType(info.primitiveType()) ,
280 info.getDstCopy()); 271 info.getDstCopy());
281 272
282 const GrVertexBuffer* vb; 273 const GrVertexBuffer* vb;
283 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) { 274 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) {
284 vb = this->getGeomSrc().fVertexBuffer; 275 vb = this->getGeomSrc().fVertexBuffer;
285 } else { 276 } else {
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 796
806 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { 797 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
807 SkASSERT(!fCmdBuffer.empty()); 798 SkASSERT(!fCmdBuffer.empty());
808 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); 799 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType));
809 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); 800 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers();
810 if (activeTraceMarkers.count() > 0) { 801 if (activeTraceMarkers.count() > 0) {
811 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); 802 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType);
812 fGpuCmdMarkers.push_back(activeTraceMarkers); 803 fGpuCmdMarkers.push_back(activeTraceMarkers);
813 } 804 }
814 } 805 }
OLDNEW
« no previous file with comments | « src/gpu/GrDrawTarget.cpp ('k') | src/gpu/GrOptDrawState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698