| Index: src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| index 147723b9d3bb4cf8656ca030493cacd5005d3bb9..8ec0d2ddbe471955fd686175a31a51a6476ff921 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);
|
| }
|
| }
|
|
|