aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/GrAAConvexPathRenderer.cpp12
-rw-r--r--src/gpu/GrDefaultGeoProcFactory.cpp24
-rw-r--r--src/gpu/GrGeometryProcessor.cpp2
-rw-r--r--src/gpu/GrGeometryProcessor.h79
-rw-r--r--src/gpu/GrInOrderDrawBuffer.cpp11
-rw-r--r--src/gpu/GrInOrderDrawBuffer.h9
-rw-r--r--src/gpu/GrOptDrawState.cpp14
-rw-r--r--src/gpu/GrOptDrawState.h6
-rw-r--r--src/gpu/GrOvalRenderer.cpp48
-rw-r--r--src/gpu/effects/GrBezierEffect.cpp12
-rw-r--r--src/gpu/effects/GrBezierEffect.h24
-rw-r--r--src/gpu/effects/GrBitmapTextGeoProc.cpp6
-rw-r--r--src/gpu/effects/GrBitmapTextGeoProc.h12
-rw-r--r--src/gpu/effects/GrDashingEffect.cpp24
-rwxr-xr-xsrc/gpu/effects/GrDistanceFieldTextureEffect.cpp16
-rw-r--r--src/gpu/effects/GrDistanceFieldTextureEffect.h32
-rw-r--r--src/gpu/gl/GrGLGeometryProcessor.h2
-rw-r--r--src/gpu/gl/GrGLGpu.cpp14
-rw-r--r--src/gpu/gl/GrGLProgram.cpp4
-rw-r--r--src/gpu/gl/GrGLProgram.h5
-rw-r--r--src/gpu/gl/GrGLProgramDesc.cpp9
-rw-r--r--src/gpu/gl/GrGLProgramDesc.h11
-rw-r--r--src/gpu/gl/builders/GrGLProgramBuilder.cpp26
-rw-r--r--src/gpu/gl/builders/GrGLProgramBuilder.h6
-rw-r--r--src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp12
-rw-r--r--src/gpu/gl/builders/GrGLVertexShaderBuilder.h2
26 files changed, 202 insertions, 220 deletions
diff --git a/src/gpu/GrAAConvexPathRenderer.cpp b/src/gpu/GrAAConvexPathRenderer.cpp
index 0690175151..c589f8cb1d 100644
--- a/src/gpu/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/GrAAConvexPathRenderer.cpp
@@ -526,8 +526,8 @@ public:
const char* name() const SK_OVERRIDE { return "QuadEdge"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inQuadEdge() const { return fInQuadEdge; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inQuadEdge() const { return fInQuadEdge; }
class GLProcessor : public GrGLGeometryProcessor {
public:
@@ -651,8 +651,8 @@ private:
QuadEdgeEffect(GrColor color, const SkMatrix& localMatrix)
: INHERITED(color, SkMatrix::I(), localMatrix) {
this->initClassID<QuadEdgeEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInQuadEdge = &this->addVertexAttrib(GrAttribute("inQuadEdge", kVec4f_GrVertexAttribType));
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInQuadEdge = &this->addVertexAttrib(Attribute("inQuadEdge", kVec4f_GrVertexAttribType));
}
bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
@@ -669,8 +669,8 @@ private:
bool fUsesLocalCoords;
};
- const GrAttribute* fInPosition;
- const GrAttribute* fInQuadEdge;
+ const Attribute* fInPosition;
+ const Attribute* fInQuadEdge;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
diff --git a/src/gpu/GrDefaultGeoProcFactory.cpp b/src/gpu/GrDefaultGeoProcFactory.cpp
index a6eaa6d14d..25c34ed929 100644
--- a/src/gpu/GrDefaultGeoProcFactory.cpp
+++ b/src/gpu/GrDefaultGeoProcFactory.cpp
@@ -37,10 +37,10 @@ public:
const char* name() const SK_OVERRIDE { return "DefaultGeometryProcessor"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inColor() const { return fInColor; }
- const GrAttribute* inLocalCoords() const { return fInLocalCoords; }
- const GrAttribute* inCoverage() const { return fInCoverage; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inColor() const { return fInColor; }
+ const Attribute* inLocalCoords() const { return fInLocalCoords; }
+ const Attribute* inCoverage() const { return fInCoverage; }
uint8_t coverage() const { return fCoverage; }
void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE {
@@ -201,18 +201,18 @@ private:
bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_GPType);
bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLocalCoord_GPType);
bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCoverage_GPType);
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
if (hasColor) {
- fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
+ fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
this->setHasVertexColor();
}
if (hasLocalCoord) {
- fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord",
+ fInLocalCoords = &this->addVertexAttrib(Attribute("inLocalCoord",
kVec2f_GrVertexAttribType));
this->setHasLocalCoords();
}
if (hasCoverage) {
- fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage",
+ fInCoverage = &this->addVertexAttrib(Attribute("inCoverage",
kFloat_GrVertexAttribType));
}
}
@@ -239,10 +239,10 @@ private:
bool fUsesLocalCoords;
};
- const GrAttribute* fInPosition;
- const GrAttribute* fInColor;
- const GrAttribute* fInLocalCoords;
- const GrAttribute* fInCoverage;
+ const Attribute* fInPosition;
+ const Attribute* fInColor;
+ const Attribute* fInLocalCoords;
+ const Attribute* fInCoverage;
uint8_t fCoverage;
uint32_t fFlags;
diff --git a/src/gpu/GrGeometryProcessor.cpp b/src/gpu/GrGeometryProcessor.cpp
index b4a9cbef02..2d3f5f44a4 100644
--- a/src/gpu/GrGeometryProcessor.cpp
+++ b/src/gpu/GrGeometryProcessor.cpp
@@ -119,7 +119,7 @@ void
GrGLPrimitiveProcessor::setupColorPassThrough(GrGLGPBuilder* pb,
GrGPInput inputType,
const char* outputName,
- const GrGeometryProcessor::GrAttribute* colorAttr,
+ const GrGeometryProcessor::Attribute* colorAttr,
UniformHandle* colorUniform) {
GrGLGPFragmentBuilder* fs = pb->getFragmentShaderBuilder();
if (kUniform_GrGPInput == inputType) {
diff --git a/src/gpu/GrGeometryProcessor.h b/src/gpu/GrGeometryProcessor.h
index 074fffcfb0..43b6a7e31a 100644
--- a/src/gpu/GrGeometryProcessor.h
+++ b/src/gpu/GrGeometryProcessor.h
@@ -121,6 +121,41 @@ public:
virtual void getInvariantOutputColor(GrInitInvariantOutput* out) const = 0;
virtual void getInvariantOutputCoverage(GrInitInvariantOutput* out) const = 0;
+ // Only the GrGeometryProcessor subclass actually has a geo shader or vertex attributes, but
+ // we put these calls on the base class to prevent having to cast
+ virtual bool willUseGeoShader() const = 0;
+
+ /*
+ * This is a safeguard to prevent GrPrimitiveProcessor's from going beyond platform specific
+ * attribute limits. This number can almost certainly be raised if required.
+ */
+ static const int kMaxVertexAttribs = 6;
+
+ struct Attribute {
+ Attribute()
+ : fName(NULL)
+ , fType(kFloat_GrVertexAttribType)
+ , fOffset(0) {}
+ Attribute(const char* name, GrVertexAttribType type)
+ : fName(name)
+ , fType(type)
+ , fOffset(SkAlign4(GrVertexAttribTypeSize(type))) {}
+ const char* fName;
+ GrVertexAttribType fType;
+ size_t fOffset;
+ };
+
+ int numAttribs() const { return fNumAttribs; }
+ const Attribute& getAttrib(int index) const {
+ SkASSERT(index < fNumAttribs);
+ return fAttribs[index];
+ }
+
+ // Returns the vertex stride of the GP. A common use case is to request geometry from a
+ // drawtarget based off of the stride, and to populate this memory using an implicit array of
+ // structs. In this case, it is best to assert the vertexstride == sizeof(VertexStruct).
+ size_t getVertexStride() const { return fVertexStride; }
+
/**
* Gets a transformKey from an array of coord transforms
*/
@@ -143,7 +178,9 @@ public:
protected:
GrPrimitiveProcessor(const SkMatrix& viewMatrix, const SkMatrix& localMatrix)
- : fViewMatrix(viewMatrix)
+ : fNumAttribs(0)
+ , fVertexStride(0)
+ , fViewMatrix(viewMatrix)
, fLocalMatrix(localMatrix) {}
/*
@@ -176,6 +213,10 @@ protected:
return true;
}
+ Attribute fAttribs[kMaxVertexAttribs];
+ int fNumAttribs;
+ size_t fVertexStride;
+
private:
virtual bool hasExplicitLocalCoords() const = 0;
@@ -201,38 +242,12 @@ public:
const SkMatrix& localMatrix = SkMatrix::I(),
bool opaqueVertexColors = false)
: INHERITED(viewMatrix, localMatrix)
- , fVertexStride(0)
, fColor(color)
, fOpaqueVertexColors(opaqueVertexColors)
, fWillUseGeoShader(false)
, fHasVertexColor(false)
, fHasLocalCoords(false) {}
- /*
- * This is a safeguard to prevent GPs from going beyond platform specific attribute limits.
- * This number can almost certainly be raised if required.
- */
- static const int kMaxVertexAttribs = 6;
-
- struct GrAttribute {
- GrAttribute(const char* name, GrVertexAttribType type)
- : fName(name)
- , fType(type)
- , fOffset(SkAlign4(GrVertexAttribTypeSize(type))) {}
- const char* fName;
- GrVertexAttribType fType;
- size_t fOffset;
- };
-
- typedef SkTArray<GrAttribute, true> VertexAttribArray;
-
- const VertexAttribArray& getAttribs() const { return fAttribs; }
-
- // Returns the vertex stride of the GP. A common use case is to request geometry from a
- // drawtarget based off of the stride, and to populate this memory using an implicit array of
- // structs. In this case, it is best to assert the vertexstride == sizeof(VertexStruct).
- size_t getVertexStride() const { return fVertexStride; }
-
bool willUseGeoShader() const { return fWillUseGeoShader; }
/*
@@ -318,9 +333,11 @@ protected:
* The processor key should reflect the vertex attributes, or there lack thereof in the
* GrGeometryProcessor.
*/
- const GrAttribute& addVertexAttrib(const GrAttribute& attribute) {
+ const Attribute& addVertexAttrib(const Attribute& attribute) {
+ SkASSERT(fNumAttribs < kMaxVertexAttribs);
fVertexStride += attribute.fOffset;
- return fAttribs.push_back(attribute);
+ fAttribs[fNumAttribs] = attribute;
+ return fAttribs[fNumAttribs++];
}
void setWillUseGeoShader() { fWillUseGeoShader = true; }
@@ -342,8 +359,6 @@ private:
bool hasExplicitLocalCoords() const SK_OVERRIDE { return fHasLocalCoords; }
- SkSTArray<kMaxVertexAttribs, GrAttribute, true> fAttribs;
- size_t fVertexStride;
GrColor fColor;
bool fOpaqueVertexColors;
bool fWillUseGeoShader;
@@ -378,6 +393,8 @@ public:
void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE;
void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE;
+ bool willUseGeoShader() const SK_OVERRIDE { return false; }
+
virtual void getGLProcessorKey(const GrBatchTracker& bt,
const GrGLCaps& caps,
GrProcessorKeyBuilder* b) const SK_OVERRIDE;
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
index e6e7b80829..468045c634 100644
--- a/src/gpu/GrInOrderDrawBuffer.cpp
+++ b/src/gpu/GrInOrderDrawBuffer.cpp
@@ -245,7 +245,7 @@ void GrInOrderDrawBuffer::onDraw(const GrDrawState& ds,
const GrDeviceCoordTexture* dstCopy) {
SkASSERT(info.vertexBuffer() && (!info.isIndexed() || info.indexBuffer()));
- if (!this->recordStateAndShouldDraw(ds, gp, NULL,
+ if (!this->recordStateAndShouldDraw(ds, gp,
GrGpu::PrimTypeToDrawType(info.primitiveType()),
scissorState, dstCopy)) {
return;
@@ -287,7 +287,7 @@ void GrInOrderDrawBuffer::onDrawPath(const GrDrawState& ds,
const GrStencilSettings& stencilSettings,
const GrDeviceCoordTexture* dstCopy) {
// TODO: Only compare the subset of GrDrawState relevant to path covering?
- if (!this->recordStateAndShouldDraw(ds, NULL, pathProc, GrGpu::kDrawPath_DrawType,
+ if (!this->recordStateAndShouldDraw(ds, pathProc, GrGpu::kDrawPath_DrawType,
scissorState, dstCopy)) {
return;
}
@@ -311,7 +311,7 @@ void GrInOrderDrawBuffer::onDrawPaths(const GrDrawState& ds,
SkASSERT(indices);
SkASSERT(transformValues);
- if (!this->recordStateAndShouldDraw(ds, NULL, pathProc, GrGpu::kDrawPath_DrawType, scissorState,
+ if (!this->recordStateAndShouldDraw(ds, pathProc, GrGpu::kDrawPath_DrawType, scissorState,
dstCopy)) {
return;
}
@@ -513,13 +513,12 @@ bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst,
}
bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds,
- const GrGeometryProcessor* gp,
- const GrPathProcessor* pathProc,
+ const GrPrimitiveProcessor* primProc,
GrGpu::DrawType drawType,
const GrScissorState& scissor,
const GrDeviceCoordTexture* dstCopy) {
SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState,
- (ds, gp, pathProc, *this->getGpu()->caps(), scissor,
+ (ds, primProc, *this->getGpu()->caps(), scissor,
dstCopy, drawType));
if (ss->fState.mustSkip()) {
fCmdBuffer.pop_back();
diff --git a/src/gpu/GrInOrderDrawBuffer.h b/src/gpu/GrInOrderDrawBuffer.h
index d415e49517..d73354648e 100644
--- a/src/gpu/GrInOrderDrawBuffer.h
+++ b/src/gpu/GrInOrderDrawBuffer.h
@@ -176,12 +176,12 @@ private:
};
struct SetState : public Cmd {
- SetState(const GrDrawState& drawState, const GrGeometryProcessor* gp,
- const GrPathProcessor* pp, const GrDrawTargetCaps& caps,
+ SetState(const GrDrawState& drawState, const GrPrimitiveProcessor* primProc,
+ const GrDrawTargetCaps& caps,
const GrScissorState& scissor, const GrDeviceCoordTexture* dstCopy,
GrGpu::DrawType drawType)
: Cmd(kSetState_Cmd)
- , fState(drawState, gp, pp, caps, scissor, dstCopy, drawType) {}
+ , fState(drawState, primProc, caps, scissor, dstCopy, drawType) {}
void execute(GrInOrderDrawBuffer*, const GrOptDrawState*) SK_OVERRIDE;
@@ -246,8 +246,7 @@ private:
// records it. If the draw can be skipped false is returned and no new GrOptDrawState is
// recorded.
bool SK_WARN_UNUSED_RESULT recordStateAndShouldDraw(const GrDrawState&,
- const GrGeometryProcessor*,
- const GrPathProcessor*,
+ const GrPrimitiveProcessor*,
GrGpu::DrawType,
const GrScissorState&,
const GrDeviceCoordTexture*);
diff --git a/src/gpu/GrOptDrawState.cpp b/src/gpu/GrOptDrawState.cpp
index f9febf445b..a30121256d 100644
--- a/src/gpu/GrOptDrawState.cpp
+++ b/src/gpu/GrOptDrawState.cpp
@@ -14,8 +14,7 @@
#include "GrXferProcessor.h"
GrOptDrawState::GrOptDrawState(const GrDrawState& drawState,
- const GrGeometryProcessor* gp,
- const GrPathProcessor* pathProc,
+ const GrPrimitiveProcessor* primProc,
const GrDrawTargetCaps& caps,
const GrScissorState& scissorState,
const GrDeviceCoordTexture* dstCopy,
@@ -23,16 +22,7 @@ GrOptDrawState::GrOptDrawState(const GrDrawState& drawState,
: fFinalized(false) {
fDrawType = drawType;
- // Copy GeometryProcesssor from DS or ODS
- if (gp) {
- SkASSERT(!pathProc);
- SkASSERT(!GrGpu::IsPathRenderingDrawType(drawType));
- fGeometryProcessor.reset(gp);
- fPrimitiveProcessor.reset(gp);
- } else {
- SkASSERT(!gp && pathProc && GrGpu::IsPathRenderingDrawType(drawType));
- fPrimitiveProcessor.reset(pathProc);
- }
+ fPrimitiveProcessor.reset(primProc);
const GrProcOptInfo& colorPOI = drawState.colorProcInfo(fPrimitiveProcessor);
diff --git a/src/gpu/GrOptDrawState.h b/src/gpu/GrOptDrawState.h
index fa79314551..00e368c66a 100644
--- a/src/gpu/GrOptDrawState.h
+++ b/src/gpu/GrOptDrawState.h
@@ -29,7 +29,7 @@ class GrOptDrawState {
public:
SK_DECLARE_INST_COUNT(GrOptDrawState)
- GrOptDrawState(const GrDrawState& drawState, const GrGeometryProcessor*, const GrPathProcessor*,
+ GrOptDrawState(const GrDrawState& drawState, const GrPrimitiveProcessor*,
const GrDrawTargetCaps&, const GrScissorState&,
const GrDeviceCoordTexture* dstCopy, GrGpu::DrawType);
@@ -62,9 +62,6 @@ public:
int numCoverageStages() const { return fFragmentStages.count() - fNumColorStages; }
int numFragmentStages() const { return fFragmentStages.count(); }
- // TODO remove the GP specific calls when the PathProc can provide the same interface
- bool hasGeometryProcessor() const { return SkToBool(fGeometryProcessor.get()); }
- const GrGeometryProcessor* getGeometryProcessor() const { return fGeometryProcessor.get(); }
const GrPrimitiveProcessor* getPrimitiveProcessor() const { return fPrimitiveProcessor.get(); }
const GrBatchTracker& getBatchTracker() const { return fBatchTracker; }
@@ -178,7 +175,6 @@ private:
GrDrawState::DrawFace fDrawFace;
GrDeviceCoordTexture fDstCopy;
uint32_t fFlags;
- ProgramGeometryProcessor fGeometryProcessor;
ProgramPrimitiveProcessor fPrimitiveProcessor;
GrBatchTracker fBatchTracker;
ProgramXferProcessor fXferProcessor;
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
index b5f3f5a8fe..2f8af8d175 100644
--- a/src/gpu/GrOvalRenderer.cpp
+++ b/src/gpu/GrOvalRenderer.cpp
@@ -69,8 +69,8 @@ public:
return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix));
}
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inCircleEdge() const { return fInCircleEdge; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inCircleEdge() const { return fInCircleEdge; }
virtual ~CircleEdgeEffect() {}
const char* name() const SK_OVERRIDE { return "CircleEdge"; }
@@ -186,8 +186,8 @@ private:
CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix)
: INHERITED(color, SkMatrix::I(), localMatrix) {
this->initClassID<CircleEdgeEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge",
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge",
kVec4f_GrVertexAttribType));
fStroke = stroke;
}
@@ -207,8 +207,8 @@ private:
bool fUsesLocalCoords;
};
- const GrAttribute* fInPosition;
- const GrAttribute* fInCircleEdge;
+ const Attribute* fInPosition;
+ const Attribute* fInCircleEdge;
bool fStroke;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
@@ -247,9 +247,9 @@ public:
const char* name() const SK_OVERRIDE { return "EllipseEdge"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inEllipseOffset() const { return fInEllipseOffset; }
- const GrAttribute* inEllipseRadii() const { return fInEllipseRadii; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inEllipseOffset() const { return fInEllipseOffset; }
+ const Attribute* inEllipseRadii() const { return fInEllipseRadii; }
inline bool isStroked() const { return fStroke; }
@@ -384,10 +384,10 @@ private:
EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix)
: INHERITED(color, SkMatrix::I(), localMatrix) {
this->initClassID<EllipseEdgeEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset",
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset",
kVec2f_GrVertexAttribType));
- fInEllipseRadii = &this->addVertexAttrib(GrAttribute("inEllipseRadii",
+ fInEllipseRadii = &this->addVertexAttrib(Attribute("inEllipseRadii",
kVec4f_GrVertexAttribType));
fStroke = stroke;
}
@@ -407,9 +407,9 @@ private:
bool fUsesLocalCoords;
};
- const GrAttribute* fInPosition;
- const GrAttribute* fInEllipseOffset;
- const GrAttribute* fInEllipseRadii;
+ const Attribute* fInPosition;
+ const Attribute* fInEllipseOffset;
+ const Attribute* fInEllipseRadii;
bool fStroke;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
@@ -451,9 +451,9 @@ public:
const char* name() const SK_OVERRIDE { return "DIEllipseEdge"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inEllipseOffsets0() const { return fInEllipseOffsets0; }
- const GrAttribute* inEllipseOffsets1() const { return fInEllipseOffsets1; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; }
+ const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; }
inline Mode getMode() const { return fMode; }
@@ -603,10 +603,10 @@ private:
DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode)
: INHERITED(color, viewMatrix) {
this->initClassID<DIEllipseEdgeEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffsets0",
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInEllipseOffsets0 = &this->addVertexAttrib(Attribute("inEllipseOffsets0",
kVec2f_GrVertexAttribType));
- fInEllipseOffsets1 = &this->addVertexAttrib(GrAttribute("inEllipseOffsets1",
+ fInEllipseOffsets1 = &this->addVertexAttrib(Attribute("inEllipseOffsets1",
kVec2f_GrVertexAttribType));
fMode = mode;
}
@@ -626,9 +626,9 @@ private:
bool fUsesLocalCoords;
};
- const GrAttribute* fInPosition;
- const GrAttribute* fInEllipseOffsets0;
- const GrAttribute* fInEllipseOffsets1;
+ const Attribute* fInPosition;
+ const Attribute* fInEllipseOffsets0;
+ const Attribute* fInEllipseOffsets1;
Mode fMode;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp
index f674345728..b8e4c0cb18 100644
--- a/src/gpu/effects/GrBezierEffect.cpp
+++ b/src/gpu/effects/GrBezierEffect.cpp
@@ -198,8 +198,8 @@ GrConicEffect::GrConicEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t
, fCoverageScale(coverage)
, fEdgeType(edgeType) {
this->initClassID<GrConicEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInConicCoeffs = &this->addVertexAttrib(GrAttribute("inConicCoeffs",
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInConicCoeffs = &this->addVertexAttrib(Attribute("inConicCoeffs",
kVec4f_GrVertexAttribType));
}
@@ -422,8 +422,8 @@ GrQuadEffect::GrQuadEffect(GrColor color, const SkMatrix& viewMatrix, uint8_t co
, fCoverageScale(coverage)
, fEdgeType(edgeType) {
this->initClassID<GrQuadEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInHairQuadEdge = &this->addVertexAttrib(GrAttribute("inHairQuadEdge",
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInHairQuadEdge = &this->addVertexAttrib(Attribute("inHairQuadEdge",
kVec4f_GrVertexAttribType));
}
@@ -667,8 +667,8 @@ GrCubicEffect::GrCubicEffect(GrColor color, const SkMatrix& viewMatrix,
GrPrimitiveEdgeType edgeType)
: INHERITED(color, viewMatrix), fEdgeType(edgeType) {
this->initClassID<GrCubicEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInCubicCoeffs = &this->addVertexAttrib(GrAttribute("inCubicCoeffs",
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInCubicCoeffs = &this->addVertexAttrib(Attribute("inCubicCoeffs",
kVec4f_GrVertexAttribType));
}
diff --git a/src/gpu/effects/GrBezierEffect.h b/src/gpu/effects/GrBezierEffect.h
index 86f09bc58d..020286fddb 100644
--- a/src/gpu/effects/GrBezierEffect.h
+++ b/src/gpu/effects/GrBezierEffect.h
@@ -92,8 +92,8 @@ public:
const char* name() const SK_OVERRIDE { return "Conic"; }
- inline const GrAttribute* inPosition() const { return fInPosition; }
- inline const GrAttribute* inConicCoeffs() const { return fInConicCoeffs; }
+ inline const Attribute* inPosition() const { return fInPosition; }
+ inline const Attribute* inConicCoeffs() const { return fInConicCoeffs; }
inline bool isAntiAliased() const { return GrProcessorEdgeTypeIsAA(fEdgeType); }
inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); }
inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
@@ -122,8 +122,8 @@ private:
uint8_t fCoverageScale;
GrPrimitiveEdgeType fEdgeType;
- const GrAttribute* fInPosition;
- const GrAttribute* fInConicCoeffs;
+ const Attribute* fInPosition;
+ const Attribute* fInConicCoeffs;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
@@ -177,8 +177,8 @@ public:
const char* name() const SK_OVERRIDE { return "Quad"; }
- inline const GrAttribute* inPosition() const { return fInPosition; }
- inline const GrAttribute* inHairQuadEdge() const { return fInHairQuadEdge; }
+ inline const Attribute* inPosition() const { return fInPosition; }
+ inline const Attribute* inHairQuadEdge() const { return fInHairQuadEdge; }
inline bool isAntiAliased() const { return GrProcessorEdgeTypeIsAA(fEdgeType); }
inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); }
inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
@@ -207,8 +207,8 @@ private:
uint8_t fCoverageScale;
GrPrimitiveEdgeType fEdgeType;
- const GrAttribute* fInPosition;
- const GrAttribute* fInHairQuadEdge;
+ const Attribute* fInPosition;
+ const Attribute* fInHairQuadEdge;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
@@ -258,8 +258,8 @@ public:
const char* name() const SK_OVERRIDE { return "Cubic"; }
- inline const GrAttribute* inPosition() const { return fInPosition; }
- inline const GrAttribute* inCubicCoeffs() const { return fInCubicCoeffs; }
+ inline const Attribute* inPosition() const { return fInPosition; }
+ inline const Attribute* inCubicCoeffs() const { return fInCubicCoeffs; }
inline bool isAntiAliased() const { return GrProcessorEdgeTypeIsAA(fEdgeType); }
inline bool isFilled() const { return GrProcessorEdgeTypeIsFill(fEdgeType); }
inline GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
@@ -286,8 +286,8 @@ private:
}
GrPrimitiveEdgeType fEdgeType;
- const GrAttribute* fInPosition;
- const GrAttribute* fInCubicCoeffs;
+ const Attribute* fInPosition;
+ const Attribute* fInCubicCoeffs;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
diff --git a/src/gpu/effects/GrBitmapTextGeoProc.cpp b/src/gpu/effects/GrBitmapTextGeoProc.cpp
index 0818fc0d8c..146fb0672f 100644
--- a/src/gpu/effects/GrBitmapTextGeoProc.cpp
+++ b/src/gpu/effects/GrBitmapTextGeoProc.cpp
@@ -105,12 +105,12 @@ GrBitmapTextGeoProc::GrBitmapTextGeoProc(GrColor color, GrTexture* texture,
, fTextureAccess(texture, params)
, fInColor(NULL) {
this->initClassID<GrBitmapTextGeoProc>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
if (useColorAttrib) {
- fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
+ fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
this->setHasVertexColor();
}
- fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords",
+ fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
kVec2f_GrVertexAttribType));
this->addTextureAccess(&fTextureAccess);
}
diff --git a/src/gpu/effects/GrBitmapTextGeoProc.h b/src/gpu/effects/GrBitmapTextGeoProc.h
index 399678ab2a..d73fba83e5 100644
--- a/src/gpu/effects/GrBitmapTextGeoProc.h
+++ b/src/gpu/effects/GrBitmapTextGeoProc.h
@@ -32,9 +32,9 @@ public:
const char* name() const SK_OVERRIDE { return "Texture"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inColor() const { return fInColor; }
- const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inColor() const { return fInColor; }
+ const Attribute* inTextureCoords() const { return fInTextureCoords; }
virtual void getGLProcessorKey(const GrBatchTracker& bt,
const GrGLCaps& caps,
@@ -57,9 +57,9 @@ private:
void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
GrTextureAccess fTextureAccess;
- const GrAttribute* fInPosition;
- const GrAttribute* fInColor;
- const GrAttribute* fInTextureCoords;
+ const Attribute* fInPosition;
+ const Attribute* fInColor;
+ const Attribute* fInTextureCoords;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
diff --git a/src/gpu/effects/GrDashingEffect.cpp b/src/gpu/effects/GrDashingEffect.cpp
index 2543145c20..7016ef203e 100644
--- a/src/gpu/effects/GrDashingEffect.cpp
+++ b/src/gpu/effects/GrDashingEffect.cpp
@@ -480,9 +480,9 @@ public:
const char* name() const SK_OVERRIDE { return "DashingCircleEffect"; }
- const GrAttribute* inPosition() const { return fInPosition; }
+ const Attribute* inPosition() const { return fInPosition; }
- const GrAttribute* inCoord() const { return fInCoord; }
+ const Attribute* inCoord() const { return fInCoord; }
GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
@@ -514,8 +514,8 @@ private:
void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
GrPrimitiveEdgeType fEdgeType;
- const GrAttribute* fInPosition;
- const GrAttribute* fInCoord;
+ const Attribute* fInPosition;
+ const Attribute* fInCoord;
SkScalar fIntervalLength;
SkScalar fRadius;
SkScalar fCenterX;
@@ -685,8 +685,8 @@ DashingCircleEffect::DashingCircleEffect(GrColor color,
const SkMatrix& localMatrix)
: INHERITED(color, SkMatrix::I(), localMatrix), fEdgeType(edgeType) {
this->initClassID<DashingCircleEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInCoord = &this->addVertexAttrib(GrAttribute("inCoord", kVec2f_GrVertexAttribType));
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInCoord = &this->addVertexAttrib(Attribute("inCoord", kVec2f_GrVertexAttribType));
SkScalar onLen = info.fIntervals[0];
SkScalar offLen = info.fIntervals[1];
fIntervalLength = onLen + offLen;
@@ -774,9 +774,9 @@ public:
const char* name() const SK_OVERRIDE { return "DashingEffect"; }
- const GrAttribute* inPosition() const { return fInPosition; }
+ const Attribute* inPosition() const { return fInPosition; }
- const GrAttribute* inCoord() const { return fInCoord; }
+ const Attribute* inCoord() const { return fInCoord; }
GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
@@ -806,8 +806,8 @@ private:
void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
GrPrimitiveEdgeType fEdgeType;
- const GrAttribute* fInPosition;
- const GrAttribute* fInCoord;
+ const Attribute* fInPosition;
+ const Attribute* fInCoord;
SkRect fRect;
SkScalar fIntervalLength;
@@ -990,8 +990,8 @@ DashingLineEffect::DashingLineEffect(GrColor color,
const SkMatrix& localMatrix)
: INHERITED(color, SkMatrix::I(), localMatrix), fEdgeType(edgeType) {
this->initClassID<DashingLineEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInCoord = &this->addVertexAttrib(GrAttribute("inCoord", kVec2f_GrVertexAttribType));
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInCoord = &this->addVertexAttrib(Attribute("inCoord", kVec2f_GrVertexAttribType));
SkScalar onLen = info.fIntervals[0];
SkScalar offLen = info.fIntervals[1];
SkScalar halfOffLen = SkScalarHalf(offLen);
diff --git a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
index 24fe001b06..00713d6351 100755
--- a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
+++ b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
@@ -212,12 +212,12 @@ GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrColor color,
, fInColor(NULL) {
SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
this->initClassID<GrDistanceFieldTextureEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
if (flags & kColorAttr_DistanceFieldEffectFlag) {
- fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
+ fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
this->setHasVertexColor();
}
- fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords",
+ fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
kVec2f_GrVertexAttribType));
this->addTextureAccess(&fTextureAccess);
#ifdef SK_GAMMA_APPLY_TO_A8
@@ -472,12 +472,12 @@ GrDistanceFieldNoGammaTextureEffect::GrDistanceFieldNoGammaTextureEffect(
, fInColor(NULL) {
SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
this->initClassID<GrDistanceFieldNoGammaTextureEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
if (flags & kColorAttr_DistanceFieldEffectFlag) {
- fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVertexAttribType));
+ fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexAttribType));
this->setHasVertexColor();
}
- fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords",
+ fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
kVec2f_GrVertexAttribType));
this->addTextureAccess(&fTextureAccess);
}
@@ -789,8 +789,8 @@ GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect(
, fFlags(flags & kLCD_DistanceFieldEffectMask){
SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_DistanceFieldEffectFlag));
this->initClassID<GrDistanceFieldLCDTextureEffect>();
- fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType));
- fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords",
+ fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
+ fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
kVec2f_GrVertexAttribType));
this->addTextureAccess(&fTextureAccess);
this->addTextureAccess(&fGammaTextureAccess);
diff --git a/src/gpu/effects/GrDistanceFieldTextureEffect.h b/src/gpu/effects/GrDistanceFieldTextureEffect.h
index 2fb448b463..5a99d24fb1 100644
--- a/src/gpu/effects/GrDistanceFieldTextureEffect.h
+++ b/src/gpu/effects/GrDistanceFieldTextureEffect.h
@@ -68,9 +68,9 @@ public:
const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inColor() const { return fInColor; }
- const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inColor() const { return fInColor; }
+ const Attribute* inTextureCoords() const { return fInTextureCoords; }
#ifdef SK_GAMMA_APPLY_TO_A8
float getLuminance() const { return fLuminance; }
#endif
@@ -107,9 +107,9 @@ private:
float fLuminance;
#endif
uint32_t fFlags;
- const GrAttribute* fInPosition;
- const GrAttribute* fInColor;
- const GrAttribute* fInTextureCoords;
+ const Attribute* fInPosition;
+ const Attribute* fInColor;
+ const Attribute* fInTextureCoords;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
@@ -136,9 +136,9 @@ public:
const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inColor() const { return fInColor; }
- const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inColor() const { return fInColor; }
+ const Attribute* inTextureCoords() const { return fInTextureCoords; }
uint32_t getFlags() const { return fFlags; }
virtual void getGLProcessorKey(const GrBatchTracker& bt,
@@ -165,9 +165,9 @@ private:
GrTextureAccess fTextureAccess;
uint32_t fFlags;
- const GrAttribute* fInPosition;
- const GrAttribute* fInColor;
- const GrAttribute* fInTextureCoords;
+ const Attribute* fInPosition;
+ const Attribute* fInColor;
+ const Attribute* fInTextureCoords;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
@@ -194,8 +194,8 @@ public:
const char* name() const SK_OVERRIDE { return "DistanceFieldLCDTexture"; }
- const GrAttribute* inPosition() const { return fInPosition; }
- const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
+ const Attribute* inPosition() const { return fInPosition; }
+ const Attribute* inTextureCoords() const { return fInTextureCoords; }
GrColor getTextColor() const { return fTextColor; }
uint32_t getFlags() const { return fFlags; }
@@ -226,8 +226,8 @@ private:
GrTextureAccess fGammaTextureAccess;
GrColor fTextColor;
uint32_t fFlags;
- const GrAttribute* fInPosition;
- const GrAttribute* fInTextureCoords;
+ const Attribute* fInPosition;
+ const Attribute* fInTextureCoords;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
diff --git a/src/gpu/gl/GrGLGeometryProcessor.h b/src/gpu/gl/GrGLGeometryProcessor.h
index 524cdf3aa9..3c95830fb2 100644
--- a/src/gpu/gl/GrGLGeometryProcessor.h
+++ b/src/gpu/gl/GrGLGeometryProcessor.h
@@ -81,7 +81,7 @@ protected:
void setupColorPassThrough(GrGLGPBuilder* pb,
GrGPInput inputType,
const char* inputName,
- const GrGeometryProcessor::GrAttribute* colorAttr,
+ const GrGeometryProcessor::Attribute* colorAttr,
UniformHandle* colorUniform);
const char* uViewM() const { return fViewMatrixName; }
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 92512ac10c..b99d30ed64 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1408,23 +1408,23 @@ void GrGLGpu::setupGeometry(const GrOptDrawState& optState,
GrGLAttribArrayState* attribState =
fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf);
- if (fCurrentProgram->hasVertexShader()) {
- const GrGeometryProcessor* gp = optState.getGeometryProcessor();
+ const GrPrimitiveProcessor* primProc = optState.getPrimitiveProcessor();
+ int vaCount = primProc->numAttribs();
+ if (vaCount > 0) {
- GrGLsizei stride = static_cast<GrGLsizei>(gp->getVertexStride());
+ GrGLsizei stride = static_cast<GrGLsizei>(primProc->getVertexStride());
size_t vertexOffsetInBytes = stride * info.startVertex();
vertexOffsetInBytes += vbuf->baseOffset();
- const SkTArray<GrGeometryProcessor::GrAttribute, true>& attribs = gp->getAttribs();
- int vaCount = attribs.count();
uint32_t usedAttribArraysMask = 0;
size_t offset = 0;
for (int attribIndex = 0; attribIndex < vaCount; attribIndex++) {
+ const GrGeometryProcessor::Attribute& attrib = primProc->getAttrib(attribIndex);
usedAttribArraysMask |= (1 << attribIndex);
- GrVertexAttribType attribType = attribs[attribIndex].fType;
+ GrVertexAttribType attribType = attrib.fType;
attribState->set(this,
attribIndex,
vbuf,
@@ -1433,7 +1433,7 @@ void GrGLGpu::setupGeometry(const GrOptDrawState& optState,
GrGLAttribTypeToLayout(attribType).fNormalized,
stride,
reinterpret_cast<GrGLvoid*>(vertexOffsetInBytes + offset));
- offset += attribs[attribIndex].fOffset;
+ offset += attrib.fOffset;
}
attribState->disableUnusedArrays(this, usedAttribArraysMask);
}
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 1af3e56c49..e1f0310bca 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -231,7 +231,9 @@ void GrGLNvprProgram::setTransformData(const GrPrimitiveProcessor* primProc,
}
void GrGLNvprProgram::onSetRenderTargetState(const GrOptDrawState& optState) {
- SkASSERT(GrGpu::IsPathRenderingDrawType(optState.drawType()));
+ SkASSERT(GrGpu::IsPathRenderingDrawType(optState.drawType()) &&
+ !optState.getPrimitiveProcessor()->willUseGeoShader() &&
+ optState.getPrimitiveProcessor()->numAttribs() == 0);
const GrRenderTarget* rt = optState.getRenderTarget();
SkISize size;
size.set(rt->width(), rt->height());
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h
index d18a92daf0..cd4aa9688f 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -53,11 +53,6 @@ public:
*/
GrGLuint programID() const { return fProgramID; }
- /*
- * The base class always has a vertex shader, only the NVPR variants may omit a vertex shader
- */
- virtual bool hasVertexShader() const { return true; }
-
/**
* We use the RT's size and origin to adjust from Skia device space to OpenGL normalized device
* space and to make device space positions have the correct origin for processors that require
diff --git a/src/gpu/gl/GrGLProgramDesc.cpp b/src/gpu/gl/GrGLProgramDesc.cpp
index 631cf42adc..299e0473ad 100644
--- a/src/gpu/gl/GrGLProgramDesc.cpp
+++ b/src/gpu/gl/GrGLProgramDesc.cpp
@@ -130,18 +130,11 @@ bool GrGLProgramDescBuilder::Build(const GrOptDrawState& optState,
// --------DO NOT MOVE HEADER ABOVE THIS LINE--------------------------------------------------
// Because header is a pointer into the dynamic array, we can't push any new data into the key
// below here.
- GLKeyHeader* header = desc->atOffset<GLKeyHeader, kHeaderOffset>();
+ KeyHeader* header = desc->atOffset<KeyHeader, kHeaderOffset>();
// make sure any padding in the header is zeroed.
memset(header, 0, kHeaderSize);
- bool isPathRendering = GrGpu::IsPathRenderingDrawType(drawType);
- if (gpu->caps()->pathRenderingSupport() && isPathRendering) {
- header->fUseNvpr = true;
- } else {
- header->fUseNvpr = false;
- }
-
if (descInfo.fReadsDst) {
const GrDeviceCoordTexture* dstCopy = optState.getDstCopy();
SkASSERT(dstCopy || gpu->caps()->dstReadInShaderSupport());
diff --git a/src/gpu/gl/GrGLProgramDesc.h b/src/gpu/gl/GrGLProgramDesc.h
index 401ce222fb..edf139e3a8 100644
--- a/src/gpu/gl/GrGLProgramDesc.h
+++ b/src/gpu/gl/GrGLProgramDesc.h
@@ -21,10 +21,7 @@ class GrGLGpu;
*/
class GrGLProgramDescBuilder {
public:
- struct GLKeyHeader : public GrProgramDesc::KeyHeader {
- SkBool8 fUseNvpr;
- };
-
+ typedef GrProgramDesc::KeyHeader KeyHeader;
// The key, stored in fKey, is composed of five parts(first 2 are defined in the key itself):
// 1. uint32_t for total key length.
// 2. uint32_t for a checksum.
@@ -34,7 +31,7 @@ public:
enum {
// Part 3.
kHeaderOffset = GrProgramDesc::kHeaderOffset,
- kHeaderSize = SkAlign4(sizeof(GLKeyHeader)),
+ kHeaderSize = SkAlign4(sizeof(KeyHeader)),
// Part 4.
// This is the offset into the backenend specific part of the key, which includes
// per-processor keys.
@@ -63,10 +60,6 @@ public:
GrGpu::DrawType,
GrGLGpu*,
GrProgramDesc*);
-
- static const GLKeyHeader& GetHeader(const GrProgramDesc& desc) {
- return *desc.atOffset<GLKeyHeader, kHeaderOffset>();
- }
};
#endif
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 147723b9d3..8ec0d2ddbe 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -54,11 +54,9 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, G
SkAutoTDelete<GrGLProgramBuilder> builder(CreateProgramBuilder(optState, gpu));
GrGLProgramBuilder* pb = builder.get();
- const GrGLProgramDescBuilder::GLKeyHeader& header =
- GrGLProgramDescBuilder::GetHeader(pb->desc());
// emit code to read the dst copy texture, if necessary
- if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != header.fDstReadKey &&
+ if (GrGLFragmentShaderBuilder::kNoDstRead_DstReadKey != pb->header().fDstReadKey &&
!gpu->glCaps().fbFetchSupport()) {
pb->fFS.emitCodeToReadDstTexture();
}
@@ -75,10 +73,10 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState, G
GrGLProgramBuilder* GrGLProgramBuilder::CreateProgramBuilder(const GrOptDrawState& optState,
GrGLGpu* gpu) {
- const GrProgramDesc& desc = optState.programDesc();
- if (GrGLProgramDescBuilder::GetHeader(desc).fUseNvpr) {
- SkASSERT(gpu->glCaps().pathRenderingSupport());
- SkASSERT(!optState.hasGeometryProcessor());
+ if (GrGpu::IsPathRenderingDrawType(optState.drawType())) {
+ SkASSERT(gpu->glCaps().pathRenderingSupport() &&
+ !optState.getPrimitiveProcessor()->willUseGeoShader() &&
+ optState.getPrimitiveProcessor()->numAttribs() == 0);
return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, optState));
} else {
return SkNEW_ARGS(GrGLProgramBuilder, (gpu, optState));
@@ -108,7 +106,7 @@ void GrGLProgramBuilder::addVarying(const char* name,
if (varying->vsVarying()) {
fVS.addVarying(name, varying);
}
- if (fOptState.hasGeometryProcessor() && fOptState.getGeometryProcessor()->willUseGeoShader()) {
+ if (fOptState.getPrimitiveProcessor()->willUseGeoShader()) {
fGS.addVarying(name, varying);
}
if (varying->fsVarying()) {
@@ -116,7 +114,7 @@ void GrGLProgramBuilder::addVarying(const char* name,
}
}
-void GrGLProgramBuilder::addPassThroughAttribute(const GrGeometryProcessor::GrAttribute* input,
+void GrGLProgramBuilder::addPassThroughAttribute(const GrPrimitiveProcessor::Attribute* input,
const char* output) {
GrSLType type = GrVertexAttribTypeToSLType(input->fType);
GrGLVertToFrag v(type);
@@ -398,16 +396,18 @@ GrGLProgram* GrGLProgramBuilder::finalize() {
// compile shaders and bind attributes / uniforms
SkTDArray<GrGLuint> shadersToDelete;
- if (!(GrGLProgramDescBuilder::GetHeader(fDesc).fUseNvpr &&
- fGpu->glPathRendering()->texturingMode() ==
- GrGLPathRendering::FixedFunction_TexturingMode)) {
+
+ // Legacy nvpr will not compile with a vertex shader, but newer nvpr requires a dummy vertex
+ // shader
+ bool useNvpr = GrGpu::IsPathRenderingDrawType(fOptState.drawType());
+ if (!(useNvpr && fGpu->glCaps().nvprSupport() == GrGLCaps::kLegacy_NvprSupport)) {
if (!fVS.compileAndAttachShaders(programID, &shadersToDelete)) {
this->cleanupProgram(programID, shadersToDelete);
return NULL;
}
// Non fixed function NVPR actually requires a vertex shader to compile
- if (fOptState.hasGeometryProcessor()) {
+ if (!useNvpr) {
fVS.bindVertexAttributes(programID);
}
}
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
index 37e678fefb..ddca6e6008 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
@@ -151,7 +151,7 @@ public:
* it expects 'output' to be defined in the fragment shader before this call is made.
* TODO it might be nicer behavior to have a flag to declare output inside this call
*/
- virtual void addPassThroughAttribute(const GrGeometryProcessor::GrAttribute*,
+ virtual void addPassThroughAttribute(const GrGeometryProcessor::Attribute*,
const char* output) = 0;
// TODO rename getFragmentBuilder
@@ -255,8 +255,8 @@ public:
GrGLVarying*,
GrSLPrecision fsPrecision = kDefault_GrSLPrecision) SK_OVERRIDE;
- void addPassThroughAttribute(const GrGeometryProcessor::GrAttribute*,
- const char* output) SK_OVERRIDE;
+ void addPassThroughAttribute(const GrPrimitiveProcessor::Attribute*,
+ const char* output) SK_OVERRIDE;
// Handles for program uniforms (other than per-effect uniforms)
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
index ead0edfaea..d67a476c68 100644
--- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
@@ -27,10 +27,9 @@ void GrGLVertexBuilder::addVarying(const char* name, GrGLVarying* v) {
}
void GrGLVertexBuilder::emitAttributes(const GrGeometryProcessor& gp) {
- const GrGeometryProcessor::VertexAttribArray& v = gp.getAttribs();
- int vaCount = v.count();
+ int vaCount = gp.numAttribs();
for (int i = 0; i < vaCount; i++) {
- this->addAttribute(&v[i]);
+ this->addAttribute(&gp.getAttrib(i));
}
return;
}
@@ -55,12 +54,11 @@ void GrGLVertexBuilder::transformToNormalizedDeviceSpace(const char* pos3) {
}
void GrGLVertexBuilder::bindVertexAttributes(GrGLuint programID) {
- const GrGeometryProcessor* gp = fProgramBuilder->fOptState.getGeometryProcessor();
+ const GrPrimitiveProcessor* primProc = fProgramBuilder->fOptState.getPrimitiveProcessor();
- const GrGeometryProcessor::VertexAttribArray& v = gp->getAttribs();
- int vaCount = v.count();
+ int vaCount = primProc->numAttribs();
for (int i = 0; i < vaCount; i++) {
- GL_CALL(BindAttribLocation(programID, i, v[i].fName));
+ GL_CALL(BindAttribLocation(programID, i, primProc->getAttrib(i).fName));
}
return;
}
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.h b/src/gpu/gl/builders/GrGLVertexShaderBuilder.h
index da094b507f..355f37e361 100644
--- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.h
+++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.h
@@ -19,7 +19,7 @@ public:
void transformToNormalizedDeviceSpace(const char* pos3);
void emitAttributes(const GrGeometryProcessor& gp);
- void addAttribute(const GrGeometryProcessor::GrAttribute* attr) {
+ void addAttribute(const GrGeometryProcessor::Attribute* attr) {
this->addAttribute(GrShaderVar(attr->fName,
GrVertexAttribTypeToSLType(attr->fType),
GrShaderVar::kAttribute_TypeModifier));