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

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

Issue 14328009: Vertex Attrib configurations now handled as pointers vs. SkSTArrays (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Added "extern const" & removed comment Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrDrawTarget.cpp ('k') | src/gpu/GrOvalRenderer.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 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "GrInOrderDrawBuffer.h" 10 #include "GrInOrderDrawBuffer.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 const GrPoint* point = static_cast<const GrPoint*>(vertices); 66 const GrPoint* point = static_cast<const GrPoint*>(vertices);
67 bounds->fLeft = bounds->fRight = point->fX; 67 bounds->fLeft = bounds->fRight = point->fX;
68 bounds->fTop = bounds->fBottom = point->fY; 68 bounds->fTop = bounds->fBottom = point->fY;
69 for (int i = 1; i < vertexCount; ++i) { 69 for (int i = 1; i < vertexCount; ++i) {
70 point = reinterpret_cast<GrPoint*>(reinterpret_cast<intptr_t>(point) + v ertexSize); 70 point = reinterpret_cast<GrPoint*>(reinterpret_cast<intptr_t>(point) + v ertexSize);
71 bounds->growToInclude(point->fX, point->fY); 71 bounds->growToInclude(point->fX, point->fY);
72 } 72 }
73 } 73 }
74 } 74 }
75 75
76 void GrInOrderDrawBuffer::onDrawRect(const GrRect& rect,
77 const SkMatrix* matrix,
78 const GrRect* localRect,
79 const SkMatrix* localMatrix) {
80 GrDrawState::AutoColorRestore acr;
81 76
82 GrDrawState* drawState = this->drawState(); 77 namespace {
83 78
84 GrColor color = drawState->getColor(); 79 extern const GrVertexAttrib kRectPosColorUVAttribs[] = {
85 GrVertexAttribArray<3> attribs; 80 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin g},
81 {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kColor_GrVertexAttribBinding},
82 {kVec2f_GrVertexAttribType, sizeof(GrPoint)+sizeof(GrColor),
83 kLocalCoord_GrVertexAttribBind ing},
84 };
86 85
87 // set position attrib 86 extern const GrVertexAttrib kRectPosUVAttribs[] = {
88 static const GrVertexAttrib kPosAttrib = 87 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding },
89 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; 88 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBindi ng},
90 attribs.push_back(kPosAttrib); 89 };
91 90
92 size_t currentOffset = sizeof(GrPoint); 91 static void set_vertex_attributes(GrDrawState* drawState,
93 int colorOffset = -1; 92 bool hasColor, bool hasUVs,
94 int localOffset = -1; 93 int* colorOffset, int* localOffset) {
94 *colorOffset = -1;
95 *localOffset = -1;
95 96
96 // Using per-vertex colors allows batching across colors. (A lot of rects in a row differing 97 // Using per-vertex colors allows batching across colors. (A lot of rects in a row differing
97 // only in color is a common occurrence in tables). However, having per-vert ex colors disables 98 // only in color is a common occurrence in tables). However, having per-vert ex colors disables
98 // blending optimizations because we don't know if the color will be solid o r not. These 99 // blending optimizations because we don't know if the color will be solid o r not. These
99 // optimizations help determine whether coverage and color can be blended co rrectly when 100 // optimizations help determine whether coverage and color can be blended co rrectly when
100 // dual-source blending isn't available. This comes into play when there is coverage. If colors 101 // dual-source blending isn't available. This comes into play when there is coverage. If colors
101 // were a stage it could take a hint that every vertex's color will be opaqu e. 102 // were a stage it could take a hint that every vertex's color will be opaqu e.
102 if (this->caps()->dualSourceBlendingSupport() || drawState->hasSolidCoverage ()) { 103 if (hasColor && hasUVs) {
103 colorOffset = currentOffset; 104 *colorOffset = sizeof(GrPoint);
104 GrVertexAttrib colorAttrib = 105 *localOffset = sizeof(GrPoint) + sizeof(GrColor);
105 {kVec4ub_GrVertexAttribType, currentOffset, kColor_GrVertexAttribBin ding}; 106 drawState->setVertexAttribs<kRectPosColorUVAttribs>(3);
106 attribs.push_back(colorAttrib); 107 } else if (hasColor) {
107 currentOffset += sizeof(GrColor); 108 *colorOffset = sizeof(GrPoint);
109 drawState->setVertexAttribs<kRectPosColorUVAttribs>(2);
110 } else if (hasUVs) {
111 *localOffset = sizeof(GrPoint);
112 drawState->setVertexAttribs<kRectPosUVAttribs>(2);
113 } else {
114 drawState->setVertexAttribs<kRectPosUVAttribs>(1);
115 }
116 }
117
118 };
119
120 void GrInOrderDrawBuffer::onDrawRect(const GrRect& rect,
121 const SkMatrix* matrix,
122 const GrRect* localRect,
123 const SkMatrix* localMatrix) {
124 GrDrawState::AutoColorRestore acr;
125
126 GrDrawState* drawState = this->drawState();
127
128 GrColor color = drawState->getColor();
129
130 int colorOffset, localOffset;
131 set_vertex_attributes(drawState,
132 this->caps()->dualSourceBlendingSupport() || drawState->hasSo lidCoverage(),
133 NULL != localRect,
134 &colorOffset, &localOffset);
135 if (colorOffset >= 0) {
108 // We set the draw state's color to white here. This is done so that any batching performed 136 // We set the draw state's color to white here. This is done so that any batching performed
109 // in our subclass's onDraw() won't get a false from GrDrawState::op== d ue to a color 137 // in our subclass's onDraw() won't get a false from GrDrawState::op== d ue to a color
110 // mismatch. TODO: Once vertex layout is owned by GrDrawState it should skip comparing the 138 // mismatch. TODO: Once vertex layout is owned by GrDrawState it should skip comparing the
111 // constant color in its op== when the kColor layout bit is set and then we can remove this. 139 // constant color in its op== when the kColor layout bit is set and then we can remove
140 // this.
112 acr.set(drawState, 0xFFFFFFFF); 141 acr.set(drawState, 0xFFFFFFFF);
113 } 142 }
114 143
115 if (NULL != localRect) {
116 localOffset = currentOffset;
117 GrVertexAttrib localCoordAttrib =
118 {kVec2f_GrVertexAttribType, currentOffset, kLocalCoord_GrVertexAttri bBinding};
119 attribs.push_back(localCoordAttrib);
120 currentOffset += sizeof(GrPoint);
121 }
122
123 drawState->setVertexAttribs(attribs.begin(), attribs.count());
124 AutoReleaseGeometry geo(this, 4, 0); 144 AutoReleaseGeometry geo(this, 4, 0);
125 if (!geo.succeeded()) { 145 if (!geo.succeeded()) {
126 GrPrintf("Failed to get space for vertices!\n"); 146 GrPrintf("Failed to get space for vertices!\n");
127 return; 147 return;
128 } 148 }
129 149
130 // Go to device coords to allow batching across matrix changes 150 // Go to device coords to allow batching across matrix changes
131 SkMatrix combinedMatrix; 151 SkMatrix combinedMatrix;
132 if (NULL != matrix) { 152 if (NULL != matrix) {
133 combinedMatrix = *matrix; 153 combinedMatrix = *matrix;
134 } else { 154 } else {
135 combinedMatrix.reset(); 155 combinedMatrix.reset();
136 } 156 }
137 combinedMatrix.postConcat(drawState->getViewMatrix()); 157 combinedMatrix.postConcat(drawState->getViewMatrix());
138 // 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
139 // 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
140 // 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 change.
141 GrDrawState::AutoDeviceCoordDraw adcd(drawState); 161 GrDrawState::AutoDeviceCoordDraw adcd(drawState);
142 if (!adcd.succeeded()) { 162 if (!adcd.succeeded()) {
143 return; 163 return;
144 } 164 }
145 165
146 size_t vsize = drawState->getVertexSize(); 166 size_t vsize = drawState->getVertexSize();
147 GrAssert(vsize == currentOffset);
148 167
149 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom , vsize); 168 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom , vsize);
150 combinedMatrix.mapPointsWithStride(geo.positions(), vsize, 4); 169 combinedMatrix.mapPointsWithStride(geo.positions(), vsize, 4);
151 170
152 SkRect devBounds; 171 SkRect devBounds;
153 // since we already computed the dev verts, set the bounds hint. This will h elp us avoid 172 // since we already computed the dev verts, set the bounds hint. This will h elp us avoid
154 // unnecessary clipping in our onDraw(). 173 // unnecessary clipping in our onDraw().
155 get_vertex_bounds(geo.vertices(), vsize, 4, &devBounds); 174 get_vertex_bounds(geo.vertices(), vsize, 4, &devBounds);
156 175
157 if (localOffset >= 0) { 176 if (localOffset >= 0) {
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 fCmds.push_back(kCopySurface_Cmd); 816 fCmds.push_back(kCopySurface_Cmd);
798 return &fCopySurfaces.push_back(); 817 return &fCopySurfaces.push_back();
799 } 818 }
800 819
801 820
802 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { 821 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) {
803 INHERITED::clipWillBeSet(newClipData); 822 INHERITED::clipWillBeSet(newClipData);
804 fClipSet = true; 823 fClipSet = true;
805 fClipProxyState = kUnknown_ClipProxyState; 824 fClipProxyState = kUnknown_ClipProxyState;
806 } 825 }
OLDNEW
« no previous file with comments | « src/gpu/GrDrawTarget.cpp ('k') | src/gpu/GrOvalRenderer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698