aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrAAHairLinePathRenderer.cpp2
-rw-r--r--src/gpu/GrAARectRenderer.cpp2
-rw-r--r--src/gpu/GrDrawState.cpp4
-rw-r--r--src/gpu/GrPaint.cpp2
-rw-r--r--src/gpu/gl/GrGLProgram.cpp12
-rw-r--r--src/gpu/gl/GrGLProgram.h4
-rw-r--r--src/gpu/gl/GrGLVertexArray.h4
-rw-r--r--src/gpu/gl/builders/GrGLProgramBuilder.cpp21
-rw-r--r--src/gpu/gl/builders/GrGLProgramBuilder.h2
-rw-r--r--src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp13
-rw-r--r--src/gpu/gl/builders/GrGLVertexShaderBuilder.h1
11 files changed, 44 insertions, 23 deletions
diff --git a/src/gpu/GrAAHairLinePathRenderer.cpp b/src/gpu/GrAAHairLinePathRenderer.cpp
index 6990b7e9fb..0ffbc9dbcd 100644
--- a/src/gpu/GrAAHairLinePathRenderer.cpp
+++ b/src/gpu/GrAAHairLinePathRenderer.cpp
@@ -650,7 +650,7 @@ extern const GrVertexAttrib gHairlineBezierAttribs[] = {
// position + coverage
extern const GrVertexAttrib gHairlineLineAttribs[] = {
{kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
- {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBinding},
+ {kUByte_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBinding},
};
};
diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp
index ae8a06c08d..6843acad7a 100644
--- a/src/gpu/GrAARectRenderer.cpp
+++ b/src/gpu/GrAARectRenderer.cpp
@@ -265,7 +265,7 @@ namespace {
extern const GrVertexAttrib gAARectAttribs[] = {
{kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
{kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding},
- {kVec4ub_GrVertexAttribType, sizeof(SkPoint) + sizeof(SkColor), kCoverage_GrVertexAttribBinding},
+ {kUByte_GrVertexAttribType, sizeof(SkPoint) + sizeof(SkColor), kCoverage_GrVertexAttribBinding},
};
// Should the coverage be multiplied into the color attrib or use a separate attrib.
diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp
index c4b8154852..d300f2b9bb 100644
--- a/src/gpu/GrDrawState.cpp
+++ b/src/gpu/GrDrawState.cpp
@@ -389,7 +389,7 @@ bool GrDrawState::hasSolidCoverage() const {
}
GrProcessor::InvariantOutput inout;
- inout.fIsSingleComponent = false;
+ inout.fIsSingleComponent = true;
// Initialize to an unknown starting coverage if per-vertex coverage is specified.
if (this->hasCoverageVertexAttribute()) {
inout.fValidFlags = 0;
@@ -738,7 +738,7 @@ bool GrDrawState::srcAlphaWillBeOne() const {
// The shader generated for coverage drawing runs the full coverage computation and then
// makes the shader output be the multiplication of color and coverage. We mirror that here.
GrProcessor::InvariantOutput inoutCoverage;
- inoutCoverage.fIsSingleComponent = false;
+ inoutCoverage.fIsSingleComponent = true;
if (this->hasCoverageVertexAttribute()) {
inoutCoverage.fValidFlags = 0;
inoutCoverage.fColor = 0; // suppresses any warnings.
diff --git a/src/gpu/GrPaint.cpp b/src/gpu/GrPaint.cpp
index ffde5f99e4..94ea29195d 100644
--- a/src/gpu/GrPaint.cpp
+++ b/src/gpu/GrPaint.cpp
@@ -55,7 +55,7 @@ bool GrPaint::getOpaqueAndKnownColor(GrColor* solidColor,
GrProcessor::InvariantOutput inout;
inout.fColor = GrColorPackRGBA(fCoverage, fCoverage, fCoverage, fCoverage);
inout.fValidFlags = kRGBA_GrColorComponentFlags;
- inout.fIsSingleComponent = false;
+ inout.fIsSingleComponent = true;
int count = fCoverageStages.count();
for (int i = 0; i < count; ++i) {
fCoverageStages[i].getProcessor()->computeInvariantOutput(&inout);
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index f152173e99..319dcceff1 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -63,7 +63,7 @@ GrGLProgram::GrGLProgram(GrGpuGL* gpu,
GrGLInstalledGeoProc* geometryProcessor,
GrGLInstalledFragProcs* fragmentProcessors)
: fColor(GrColor_ILLEGAL)
- , fCoverage(GrColor_ILLEGAL)
+ , fCoverage(0)
, fDstCopyTexUnit(-1)
, fBuiltinUniformHandles(builtinUniforms)
, fProgramID(programID)
@@ -131,7 +131,7 @@ void GrGLProgram::setData(const GrOptDrawState& optState,
GrGpu::DrawType drawType,
const GrDeviceCoordTexture* dstCopy) {
GrColor color = optState.getColor();
- GrColor coverage = optState.getCoverageColor();
+ uint8_t coverage = optState.getCoverage();
this->setColor(optState, color);
this->setCoverage(optState, coverage);
@@ -223,7 +223,7 @@ void GrGLProgram::setColor(const GrOptDrawState& optState, GrColor color) {
}
}
-void GrGLProgram::setCoverage(const GrOptDrawState& optState, GrColor coverage) {
+void GrGLProgram::setCoverage(const GrOptDrawState& optState, uint8_t coverage) {
const GrProgramDesc::KeyHeader& header = fDesc.header();
switch (header.fCoverageInput) {
case GrProgramDesc::kAttribute_ColorInput:
@@ -232,9 +232,9 @@ void GrGLProgram::setCoverage(const GrOptDrawState& optState, GrColor coverage)
case GrProgramDesc::kUniform_ColorInput:
if (fCoverage != coverage) {
// OpenGL ES doesn't support unsigned byte varieties of glUniform
- GrGLfloat c[4];
- GrColorToRGBAFloat(coverage, c);
- fProgramDataManager.set4fv(fBuiltinUniformHandles.fCoverageUni, 1, c);
+ static const float ONE_OVER_255 = 1.f / 255.f;
+ GrGLfloat c = coverage * ONE_OVER_255;
+ fProgramDataManager.set1f(fBuiltinUniformHandles.fCoverageUni, c);
fCoverage = coverage;
}
break;
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h
index d7a7cf8fc7..e37d54d124 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -155,7 +155,7 @@ protected:
// Helper for setData(). Makes GL calls to specify the initial coverage when there is not
// per-vertex coverages.
- void setCoverage(const GrOptDrawState&, GrColor coverage);
+ void setCoverage(const GrOptDrawState&, uint8_t coverage);
// A templated helper to loop over effects, set the transforms(via subclass) and bind textures
void setFragmentData(const GrOptDrawState&);
@@ -175,7 +175,7 @@ protected:
// these reflect the current values of uniforms (GL uniform values travel with program)
MatrixState fMatrixState;
GrColor fColor;
- GrColor fCoverage;
+ uint8_t fCoverage;
int fDstCopyTexUnit;
BuiltinUniformHandles fBuiltinUniformHandles;
GrGLuint fProgramID;
diff --git a/src/gpu/gl/GrGLVertexArray.h b/src/gpu/gl/GrGLVertexArray.h
index f4eb3d52ca..96e90bc81f 100644
--- a/src/gpu/gl/GrGLVertexArray.h
+++ b/src/gpu/gl/GrGLVertexArray.h
@@ -32,13 +32,15 @@ static inline const GrGLAttribLayout& GrGLAttribTypeToLayout(GrVertexAttribType
{2, GR_GL_FLOAT, false}, // kVec2f_GrVertexAttribType
{3, GR_GL_FLOAT, false}, // kVec3f_GrVertexAttribType
{4, GR_GL_FLOAT, false}, // kVec4f_GrVertexAttribType
+ {1, GR_GL_UNSIGNED_BYTE, true}, // kUByte_GrVertexAttribType
{4, GR_GL_UNSIGNED_BYTE, true}, // kVec4ub_GrVertexAttribType
};
GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType);
GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType);
GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType);
GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType);
- GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType);
+ GR_STATIC_ASSERT(4 == kUByte_GrVertexAttribType);
+ GR_STATIC_ASSERT(5 == kVec4ub_GrVertexAttribType);
GR_STATIC_ASSERT(SK_ARRAY_COUNT(kLayouts) == kGrVertexAttribTypeCount);
return kLayouts[type];
}
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 569fd2e605..8fc6020121 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -48,7 +48,8 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState,
}
// get the initial color and coverage to feed into the first effect in each effect chain
- GrGLSLExpr4 inputColor, inputCoverage;
+ GrGLSLExpr4 inputColor;
+ GrGLSLExpr1 inputCoverage;
pb->setupUniformColorAndCoverageIfNeeded(&inputColor, &inputCoverage);
// if we have a vertex shader(we don't only if we are using NVPR or NVPR ES), then we may have
@@ -70,7 +71,11 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState,
}
}
- pb->emitAndInstallProcs(optState, &inputColor, &inputCoverage);
+ // TODO: Once all stages can handle taking a float or vec4 and correctly handling them we can
+ // remove this cast to a vec4.
+ GrGLSLExpr4 inputCoverageVec4 = GrGLSLExpr4::VectorCast(inputCoverage);
+
+ pb->emitAndInstallProcs(optState, &inputColor, &inputCoverageVec4);
if (hasVertexShader) {
pb->fVS.transformSkiaToGLCoords();
@@ -78,10 +83,10 @@ GrGLProgram* GrGLProgramBuilder::CreateProgram(const GrOptDrawState& optState,
// write the secondary color output if necessary
if (GrProgramDesc::kNone_SecondaryOutputType != header.fSecondaryOutputType) {
- pb->fFS.enableSecondaryOutput(inputColor, inputCoverage);
+ pb->fFS.enableSecondaryOutput(inputColor, inputCoverageVec4);
}
- pb->fFS.combineColorAndCoverage(inputColor, inputCoverage);
+ pb->fFS.combineColorAndCoverage(inputColor, inputCoverageVec4);
return pb->finalize();
}
@@ -199,7 +204,7 @@ const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const {
}
void GrGLProgramBuilder::setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* inputColor,
- GrGLSLExpr4* inputCoverage) {
+ GrGLSLExpr1* inputCoverage) {
const GrProgramDesc::KeyHeader& header = this->header();
if (GrProgramDesc::kUniform_ColorInput == header.fColorInput) {
const char* name;
@@ -216,12 +221,12 @@ void GrGLProgramBuilder::setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* input
const char* name;
fUniformHandles.fCoverageUni =
this->addUniform(GrGLProgramBuilder::kFragment_Visibility,
- kVec4f_GrSLType,
+ kFloat_GrSLType,
"Coverage",
&name);
- *inputCoverage = GrGLSLExpr4(name);
+ *inputCoverage = GrGLSLExpr1(name);
} else if (GrProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) {
- *inputCoverage = GrGLSLExpr4(1);
+ *inputCoverage = GrGLSLExpr1(1);
}
}
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
index 0abdf0a122..4bcf50be6a 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
@@ -240,7 +240,7 @@ protected:
// char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
// generating stage code.
void nameVariable(SkString* out, char prefix, const char* name);
- void setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage);
+ void setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* inputColor, GrGLSLExpr1* inputCoverage);
void emitAndInstallProcs(const GrOptDrawState& optState,
GrGLSLExpr4* inputColor,
GrGLSLExpr4* inputCoverage);
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
index 5a65f71fcc..2bef113410 100644
--- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
@@ -57,6 +57,19 @@ void GrGLVertexBuilder::transformGLToSkiaCoords() {
this->codeAppendf("vec3 pos3 = %s * vec3(%s, 1);", viewMName, fPositionVar->c_str());
}
+void GrGLVertexBuilder::setupBuiltinVertexAttribute(const char* inName, GrGLSLExpr1* out) {
+ GrGLVertToFrag v(kFloat_GrSLType);
+ fProgramBuilder->addVarying(inName, &v);
+ SkString name(inName);
+ name.prepend("in");
+ this->addAttribute(GrShaderVar(name.c_str(),
+ kFloat_GrSLType,
+ GrShaderVar::kAttribute_TypeModifier));
+ this->codeAppendf("%s = %s;", v.vsOut(), name.c_str());
+ *out = v.fsIn();
+ fEffectAttribOffset++;
+}
+
void GrGLVertexBuilder::setupBuiltinVertexAttribute(const char* inName, GrGLSLExpr4* out) {
GrGLVertToFrag v(kVec4f_GrSLType);
fProgramBuilder->addVarying(inName, &v);
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.h b/src/gpu/gl/builders/GrGLVertexShaderBuilder.h
index 31b4ad4cd9..2f14bd7702 100644
--- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.h
+++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.h
@@ -42,6 +42,7 @@ private:
*/
void setupLocalCoords();
void transformGLToSkiaCoords();
+ void setupBuiltinVertexAttribute(const char* inName, GrGLSLExpr1* out);
void setupBuiltinVertexAttribute(const char* inName, GrGLSLExpr4* out);
void emitAttributes(const GrGeometryProcessor& gp);
void transformSkiaToGLCoords();