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

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

Issue 815553003: Move ViewMatrix off of drawstate (Closed) Base URL: https://skia.googlesource.com/skia.git@remove-fragment-stage
Patch Set: more cleaning Created 5 years, 11 months 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/GrInOrderDrawBuffer.h ('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 "GrDefaultGeoProcFactory.h" 10 #include "GrDefaultGeoProcFactory.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 62
63 The vertex attrib order is always pos, color, [local coords]. 63 The vertex attrib order is always pos, color, [local coords].
64 */ 64 */
65 static const GrGeometryProcessor* create_rect_gp(bool hasExplicitLocalCoords, 65 static const GrGeometryProcessor* create_rect_gp(bool hasExplicitLocalCoords,
66 GrColor color, 66 GrColor color,
67 const SkMatrix* localMatrix) { 67 const SkMatrix* localMatrix) {
68 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | 68 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType |
69 GrDefaultGeoProcFactory::kColor_GPType; 69 GrDefaultGeoProcFactory::kColor_GPType;
70 flags |= hasExplicitLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPTyp e : 0; 70 flags |= hasExplicitLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPTyp e : 0;
71 if (localMatrix) { 71 if (localMatrix) {
72 return GrDefaultGeoProcFactory::Create(color, flags, GrColorIsOpaque(col or), 0xff, 72 return GrDefaultGeoProcFactory::Create(flags, color, SkMatrix::I(), *loc alMatrix,
73 *localMatrix); 73 GrColorIsOpaque(color));
74 } else { 74 } else {
75 return GrDefaultGeoProcFactory::Create(color, flags, GrColorIsOpaque(col or)); 75 return GrDefaultGeoProcFactory::Create(flags, color, SkMatrix::I(), SkMa trix::I(),
76 GrColorIsOpaque(color));
76 } 77 }
77 } 78 }
78 79
79 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin gs) { 80 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin gs) {
80 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa ce; 81 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa ce;
81 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace); 82 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace);
82 if (isWinding) { 83 if (isWinding) {
83 // Double check that it is in fact winding. 84 // Double check that it is in fact winding.
84 SkASSERT(kIncClamp_StencilOp == pathStencilSettings.passOp(pathFace)); 85 SkASSERT(kIncClamp_StencilOp == pathStencilSettings.passOp(pathFace));
85 SkASSERT(kIncClamp_StencilOp == pathStencilSettings.failOp(pathFace)); 86 SkASSERT(kIncClamp_StencilOp == pathStencilSettings.failOp(pathFace));
(...skipping 22 matching lines...) Expand all
108 }; 109 };
109 110
110 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; } 111 static inline uint8_t add_trace_bit(uint8_t cmd) { return cmd | kTraceCmdBit; }
111 112
112 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; } 113 static inline uint8_t strip_trace_bit(uint8_t cmd) { return cmd & kCmdMask; }
113 114
114 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr aceCmdBit); } 115 static inline bool cmd_has_trace_marker(uint8_t cmd) { return SkToBool(cmd & kTr aceCmdBit); }
115 116
116 void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds, 117 void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds,
117 GrColor color, 118 GrColor color,
119 const SkMatrix& viewMatrix,
118 const SkRect& rect, 120 const SkRect& rect,
119 const SkRect* localRect, 121 const SkRect* localRect,
120 const SkMatrix* localMatrix) { 122 const SkMatrix* localMatrix) {
121 GrDrawState::AutoRestoreEffects are(ds); 123 GrDrawState::AutoRestoreEffects are(ds);
122 124
123 // Go to device coords to allow batching across matrix changes 125 // Go to device coords to allow batching across matrix changes
124 SkMatrix matrix = ds->getViewMatrix();
125 SkMatrix invert = SkMatrix::I(); 126 SkMatrix invert = SkMatrix::I();
126 127
127 // if we have a local rect, then we apply the localMatrix directly to the lo calRect to generate 128 // if we have a local rect, then we apply the localMatrix directly to the lo calRect to generate
128 // vertex local coords 129 // vertex local coords
129 bool hasExplicitLocalCoords = SkToBool(localRect); 130 bool hasExplicitLocalCoords = SkToBool(localRect);
130 if (!hasExplicitLocalCoords) { 131 if (!hasExplicitLocalCoords) {
131 if (!matrix.isIdentity() && !matrix.invert(&invert)) { 132 if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) {
132 SkDebugf("Could not invert\n"); 133 SkDebugf("Could not invert\n");
133 return; 134 return;
134 } 135 }
135 136
136 if (localMatrix) { 137 if (localMatrix) {
137 invert.preConcat(*localMatrix); 138 invert.preConcat(*localMatrix);
138 } 139 }
139 } 140 }
140 141
141 SkAutoTUnref<const GrGeometryProcessor> gp(create_rect_gp(hasExplicitLocalCo ords, 142 SkAutoTUnref<const GrGeometryProcessor> gp(create_rect_gp(hasExplicitLocalCo ords,
142 color, 143 color,
143 &invert)); 144 &invert));
144 145
145 size_t vstride = gp->getVertexStride(); 146 size_t vstride = gp->getVertexStride();
146 SkASSERT(vstride == sizeof(SkPoint) + sizeof(GrColor) + (SkToBool(localRect) ? sizeof(SkPoint) : 147 SkASSERT(vstride == sizeof(SkPoint) + sizeof(GrColor) + (SkToBool(localRect) ? sizeof(SkPoint) :
147 0)); 148 0));
148 AutoReleaseGeometry geo(this, 4, vstride, 0); 149 AutoReleaseGeometry geo(this, 4, vstride, 0);
149 if (!geo.succeeded()) { 150 if (!geo.succeeded()) {
150 SkDebugf("Failed to get space for vertices!\n"); 151 SkDebugf("Failed to get space for vertices!\n");
151 return; 152 return;
152 } 153 }
153 154
155 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom , vstride);
156 viewMatrix.mapPointsWithStride(geo.positions(), vstride, 4);
157
154 // When the caller has provided an explicit source rect for a stage then we don't want to 158 // When the caller has provided an explicit source rect for a stage then we don't want to
155 // modify that stage's matrix. Otherwise if the effect is generating its sou rce rect from 159 // modify that stage's matrix. Otherwise if the effect is generating its sou rce rect from
156 // the vertex positions then we have to account for the view matrix change. 160 // the vertex positions then we have to account for the view matrix
157 GrDrawState::AutoViewMatrixRestore avmr(ds); 161 SkRect devBounds;
158 162
159 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom , vstride);
160 matrix.mapPointsWithStride(geo.positions(), vstride, 4);
161
162 SkRect devBounds;
163 // since we already computed the dev verts, set the bounds hint. This will h elp us avoid 163 // since we already computed the dev verts, set the bounds hint. This will h elp us avoid
164 // unnecessary clipping in our onDraw(). 164 // unnecessary clipping in our onDraw().
165 get_vertex_bounds(geo.vertices(), vstride, 4, &devBounds); 165 get_vertex_bounds(geo.vertices(), vstride, 4, &devBounds);
166 166
167 if (localRect) { 167 if (localRect) {
168 static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); 168 static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor);
169 SkPoint* coords = GrTCast<SkPoint*>(GrTCast<intptr_t>(geo.vertices()) + kLocalOffset); 169 SkPoint* coords = GrTCast<SkPoint*>(GrTCast<intptr_t>(geo.vertices()) + kLocalOffset);
170 coords->setRectFan(localRect->fLeft, localRect->fTop, 170 coords->setRectFan(localRect->fLeft, localRect->fTop,
171 localRect->fRight, localRect->fBottom, 171 localRect->fRight, localRect->fBottom,
172 vstride); 172 vstride);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 268
269 void GrInOrderDrawBuffer::onStencilPath(const GrDrawState& ds, 269 void GrInOrderDrawBuffer::onStencilPath(const GrDrawState& ds,
270 const GrPathProcessor* pathProc, 270 const GrPathProcessor* pathProc,
271 const GrPath* path, 271 const GrPath* path,
272 const GrScissorState& scissorState, 272 const GrScissorState& scissorState,
273 const GrStencilSettings& stencilSettings ) { 273 const GrStencilSettings& stencilSettings ) {
274 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, 274 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath,
275 (path, ds.getRenderTarget())); 275 (path, ds.getRenderTarget()));
276 sp->fScissor = scissorState; 276 sp->fScissor = scissorState;
277 sp->fUseHWAA = ds.isHWAntialias(); 277 sp->fUseHWAA = ds.isHWAntialias();
278 sp->fViewMatrix = ds.getViewMatrix(); 278 sp->fViewMatrix = pathProc->viewMatrix();
279 sp->fStencil = stencilSettings; 279 sp->fStencil = stencilSettings;
280 this->recordTraceMarkersIfNecessary(); 280 this->recordTraceMarkersIfNecessary();
281 } 281 }
282 282
283 void GrInOrderDrawBuffer::onDrawPath(const GrDrawState& ds, 283 void GrInOrderDrawBuffer::onDrawPath(const GrDrawState& ds,
284 const GrPathProcessor* pathProc, 284 const GrPathProcessor* pathProc,
285 const GrPath* path, 285 const GrPath* path,
286 const GrScissorState& scissorState, 286 const GrScissorState& scissorState,
287 const GrStencilSettings& stencilSettings, 287 const GrStencilSettings& stencilSettings,
288 const GrDeviceCoordTexture* dstCopy) { 288 const GrDeviceCoordTexture* dstCopy) {
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 536
537 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { 537 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
538 SkASSERT(!fCmdBuffer.empty()); 538 SkASSERT(!fCmdBuffer.empty());
539 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); 539 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType));
540 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); 540 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers();
541 if (activeTraceMarkers.count() > 0) { 541 if (activeTraceMarkers.count() > 0) {
542 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); 542 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType);
543 fGpuCmdMarkers.push_back(activeTraceMarkers); 543 fGpuCmdMarkers.push_back(activeTraceMarkers);
544 } 544 }
545 } 545 }
OLDNEW
« no previous file with comments | « src/gpu/GrInOrderDrawBuffer.h ('k') | src/gpu/GrOptDrawState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698