diff options
Diffstat (limited to 'src/gpu')
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)); |