blob: 2d9b569333a03c7ac11f13c9f8606074b9dcc677 [file] [log] [blame]
junov@google.comf93e7172011-03-31 21:26:24 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
junov@google.comf93e7172011-03-31 21:26:24 +00006 */
joshualitt23e280d2014-09-18 12:26:38 -07007
junov@google.comf93e7172011-03-31 21:26:24 +00008#include "GrGLProgram.h"
9
tomhudson@google.comd8f856c2012-05-10 12:13:36 +000010#include "GrAllocator.h"
joshualittb0a8a372014-09-23 09:50:21 -070011#include "GrProcessor.h"
bsalomon@google.com77af6802013-10-02 13:04:56 +000012#include "GrCoordTransform.h"
joshualitta5305a12014-10-10 17:47:00 -070013#include "GrGLGeometryProcessor.h"
joshualittb0a8a372014-09-23 09:50:21 -070014#include "GrGLProcessor.h"
bsalomon@google.com34cccde2013-01-04 18:34:30 +000015#include "GrGpuGL.h"
kkinnunenec56e452014-08-25 22:21:16 -070016#include "GrGLPathRendering.h"
bsalomon@google.com4fa66942011-09-20 19:06:12 +000017#include "GrGLShaderVar.h"
bsalomon@google.com018f1792013-04-18 19:36:09 +000018#include "GrGLSL.h"
egdaniel170f90b2014-09-16 12:54:40 -070019#include "GrOptDrawState.h"
Scroggo97c88c22011-05-11 14:05:25 +000020#include "SkXfermode.h"
21
commit-bot@chromium.org9188a152013-09-05 18:28:24 +000022#define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X)
23#define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X)
bsalomon@google.comecb60aa2012-07-18 13:20:29 +000024
joshualitt47bb3822014-10-07 16:43:25 -070025/**
26 * Retrieves the final matrix that a transform needs to apply to its source coords.
27 */
joshualitta5305a12014-10-10 17:47:00 -070028static SkMatrix get_transform_matrix(const GrFragmentStage& processorStage,
joshualitt47bb3822014-10-07 16:43:25 -070029 bool useExplicitLocalCoords,
30 int transformIdx) {
31 const GrCoordTransform& coordTransform =
32 processorStage.getProcessor()->coordTransform(transformIdx);
33 SkMatrix combined;
34
35 if (kLocal_GrCoordSet == coordTransform.sourceCoords()) {
36 // If we have explicit local coords then we shouldn't need a coord change.
37 const SkMatrix& ccm =
38 useExplicitLocalCoords ? SkMatrix::I() : processorStage.getCoordChangeMatrix();
39 combined.setConcat(coordTransform.getMatrix(), ccm);
kkinnunenec56e452014-08-25 22:21:16 -070040 } else {
joshualitt47bb3822014-10-07 16:43:25 -070041 combined = coordTransform.getMatrix();
kkinnunendddc18a2014-08-03 23:19:46 -070042 }
joshualitt47bb3822014-10-07 16:43:25 -070043 if (coordTransform.reverseY()) {
44 // combined.postScale(1,-1);
45 // combined.postTranslate(0,1);
46 combined.set(SkMatrix::kMSkewY,
47 combined[SkMatrix::kMPersp0] - combined[SkMatrix::kMSkewY]);
48 combined.set(SkMatrix::kMScaleY,
49 combined[SkMatrix::kMPersp1] - combined[SkMatrix::kMScaleY]);
50 combined.set(SkMatrix::kMTransY,
51 combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY]);
bsalomon@google.comecb60aa2012-07-18 13:20:29 +000052 }
joshualitt47bb3822014-10-07 16:43:25 -070053 return combined;
bsalomon@google.comecb60aa2012-07-18 13:20:29 +000054}
55
joshualitt47bb3822014-10-07 16:43:25 -070056///////////////////////////////////////////////////////////////////////////////////////////////////
57
commit-bot@chromium.org9188a152013-09-05 18:28:24 +000058GrGLProgram::GrGLProgram(GrGpuGL* gpu,
bsalomon@google.com31ec7982013-03-27 18:14:57 +000059 const GrGLProgramDesc& desc,
joshualitt47bb3822014-10-07 16:43:25 -070060 const BuiltinUniformHandles& builtinUniforms,
61 GrGLuint programID,
62 const UniformInfoArray& uniforms,
joshualitta5305a12014-10-10 17:47:00 -070063 GrGLInstalledGeoProc* geometryProcessor,
64 GrGLInstalledFragProcs* fragmentProcessors)
commit-bot@chromium.orga05fa062014-05-30 18:55:03 +000065 : fColor(GrColor_ILLEGAL)
commit-bot@chromium.org6eac42e2014-05-29 21:29:51 +000066 , fCoverage(GrColor_ILLEGAL)
67 , fDstCopyTexUnit(-1)
joshualitt47bb3822014-10-07 16:43:25 -070068 , fBuiltinUniformHandles(builtinUniforms)
69 , fProgramID(programID)
joshualitta5305a12014-10-10 17:47:00 -070070 , fGeometryProcessor(geometryProcessor)
71 , fFragmentProcessors(SkRef(fragmentProcessors))
commit-bot@chromium.org6eac42e2014-05-29 21:29:51 +000072 , fDesc(desc)
73 , fGpu(gpu)
joshualitt47bb3822014-10-07 16:43:25 -070074 , fProgramDataManager(gpu, uniforms) {
commit-bot@chromium.org6eac42e2014-05-29 21:29:51 +000075 this->initSamplerUniforms();
junov@google.comf93e7172011-03-31 21:26:24 +000076}
77
78GrGLProgram::~GrGLProgram() {
kkinnunendddc18a2014-08-03 23:19:46 -070079 if (fProgramID) {
80 GL_CALL(DeleteProgram(fProgramID));
bsalomon@google.comecb60aa2012-07-18 13:20:29 +000081 }
junov@google.comf93e7172011-03-31 21:26:24 +000082}
83
bsalomon@google.comecb60aa2012-07-18 13:20:29 +000084void GrGLProgram::abandon() {
kkinnunendddc18a2014-08-03 23:19:46 -070085 fProgramID = 0;
bsalomon@google.comecb60aa2012-07-18 13:20:29 +000086}
87
bsalomon@google.comdbbc4e22012-07-25 17:48:39 +000088void GrGLProgram::initSamplerUniforms() {
kkinnunendddc18a2014-08-03 23:19:46 -070089 GL_CALL(UseProgram(fProgramID));
bsalomon@google.com34cccde2013-01-04 18:34:30 +000090 GrGLint texUnitIdx = 0;
kkinnunendddc18a2014-08-03 23:19:46 -070091 if (fBuiltinUniformHandles.fDstCopySamplerUni.isValid()) {
92 fProgramDataManager.setSampler(fBuiltinUniformHandles.fDstCopySamplerUni, texUnitIdx);
bsalomon@google.com804e9942013-06-06 18:04:38 +000093 fDstCopyTexUnit = texUnitIdx++;
bsalomon@google.com26e18b52013-03-29 19:22:36 +000094 }
bsalomon49f085d2014-09-05 13:34:00 -070095 if (fGeometryProcessor.get()) {
joshualitt47bb3822014-10-07 16:43:25 -070096 this->initSamplers(fGeometryProcessor.get(), &texUnitIdx);
joshualittbd769d02014-09-04 08:56:46 -070097 }
joshualitta5305a12014-10-10 17:47:00 -070098 int numProcs = fFragmentProcessors->fProcs.count();
99 for (int i = 0; i < numProcs; i++) {
100 this->initSamplers(fFragmentProcessors->fProcs[i], &texUnitIdx);
joshualitt47bb3822014-10-07 16:43:25 -0700101 }
102}
103
joshualitta5305a12014-10-10 17:47:00 -0700104void GrGLProgram::initSamplers(GrGLInstalledProc* ip, int* texUnitIdx) {
105 SkTArray<GrGLInstalledProc::Sampler, true>& samplers = ip->fSamplers;
106 int numSamplers = samplers.count();
107 for (int s = 0; s < numSamplers; ++s) {
108 SkASSERT(samplers[s].fUniform.isValid());
109 fProgramDataManager.setSampler(samplers[s].fUniform, *texUnitIdx);
110 samplers[s].fTextureUnit = (*texUnitIdx)++;
111 }
112}
113
114void GrGLProgram::bindTextures(const GrGLInstalledProc* ip, const GrProcessor& processor) {
115 const SkTArray<GrGLInstalledProc::Sampler, true>& samplers = ip->fSamplers;
joshualitt47bb3822014-10-07 16:43:25 -0700116 int numSamplers = samplers.count();
117 SkASSERT(numSamplers == processor.numTextures());
118 for (int s = 0; s < numSamplers; ++s) {
119 SkASSERT(samplers[s].fTextureUnit >= 0);
120 const GrTextureAccess& textureAccess = processor.textureAccess(s);
121 fGpu->bindTexture(samplers[s].fTextureUnit,
122 textureAccess.getParams(),
123 static_cast<GrGLTexture*>(textureAccess.getTexture()));
124 }
125}
126
127
bsalomon@google.comeb715c82012-07-11 15:03:31 +0000128///////////////////////////////////////////////////////////////////////////////
junov@google.comf93e7172011-03-31 21:26:24 +0000129
egdaniel170f90b2014-09-16 12:54:40 -0700130void GrGLProgram::setData(const GrOptDrawState& optState,
131 GrGpu::DrawType drawType,
joshualitt98102a82014-10-28 09:08:35 -0700132 const GrDeviceCoordTexture* dstCopy,
133 SharedGLState* sharedState) {
egdaniel170f90b2014-09-16 12:54:40 -0700134 GrColor color = optState.getColor();
135 GrColor coverage = optState.getCoverageColor();
bsalomon@google.com9ba4fa62012-07-16 17:36:28 +0000136
joshualitt98102a82014-10-28 09:08:35 -0700137 this->setColor(optState, color, sharedState);
138 this->setCoverage(optState, coverage, sharedState);
egdaniel170f90b2014-09-16 12:54:40 -0700139 this->setMatrixAndRenderTargetHeight(drawType, optState);
bsalomon@google.com91207482013-02-12 21:45:24 +0000140
bsalomon49f085d2014-09-05 13:34:00 -0700141 if (dstCopy) {
kkinnunendddc18a2014-08-03 23:19:46 -0700142 if (fBuiltinUniformHandles.fDstCopyTopLeftUni.isValid()) {
143 fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyTopLeftUni,
kkinnunen7510b222014-07-30 00:04:16 -0700144 static_cast<GrGLfloat>(dstCopy->offset().fX),
145 static_cast<GrGLfloat>(dstCopy->offset().fY));
kkinnunendddc18a2014-08-03 23:19:46 -0700146 fProgramDataManager.set2f(fBuiltinUniformHandles.fDstCopyScaleUni,
kkinnunen7510b222014-07-30 00:04:16 -0700147 1.f / dstCopy->texture()->width(),
148 1.f / dstCopy->texture()->height());
bsalomon@google.com26e18b52013-03-29 19:22:36 +0000149 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture());
150 static GrTextureParams kParams; // the default is clamp, nearest filtering.
commit-bot@chromium.org9188a152013-09-05 18:28:24 +0000151 fGpu->bindTexture(fDstCopyTexUnit, kParams, texture);
bsalomon@google.com26e18b52013-03-29 19:22:36 +0000152 } else {
kkinnunendddc18a2014-08-03 23:19:46 -0700153 SkASSERT(!fBuiltinUniformHandles.fDstCopyScaleUni.isValid());
154 SkASSERT(!fBuiltinUniformHandles.fDstCopySamplerUni.isValid());
bsalomon@google.com26e18b52013-03-29 19:22:36 +0000155 }
156 } else {
kkinnunendddc18a2014-08-03 23:19:46 -0700157 SkASSERT(!fBuiltinUniformHandles.fDstCopyTopLeftUni.isValid());
158 SkASSERT(!fBuiltinUniformHandles.fDstCopyScaleUni.isValid());
159 SkASSERT(!fBuiltinUniformHandles.fDstCopySamplerUni.isValid());
bsalomon@google.com26e18b52013-03-29 19:22:36 +0000160 }
bsalomon@google.comc7818882013-03-20 19:19:53 +0000161
joshualitt47bb3822014-10-07 16:43:25 -0700162 // we set the textures, and uniforms for installed processors in a generic way, but subclasses
163 // of GLProgram determine how to set coord transforms
bsalomon49f085d2014-09-05 13:34:00 -0700164 if (fGeometryProcessor.get()) {
joshualitta5305a12014-10-10 17:47:00 -0700165 SkASSERT(optState.hasGeometryProcessor());
166 const GrGeometryProcessor& gp = *optState.getGeometryProcessor();
167 fGeometryProcessor->fGLProc->setData(fProgramDataManager, gp);
168 this->bindTextures(fGeometryProcessor, gp);
joshualittbd769d02014-09-04 08:56:46 -0700169 }
joshualitta5305a12014-10-10 17:47:00 -0700170 this->setFragmentData(optState);
commit-bot@chromium.org20807222013-11-01 11:54:54 +0000171
joshualitt47bb3822014-10-07 16:43:25 -0700172 // Some of GrGLProgram subclasses need to update state here
173 this->didSetData(drawType);
174}
175
joshualitta5305a12014-10-10 17:47:00 -0700176void GrGLProgram::setFragmentData(const GrOptDrawState& optState) {
177 int numProcessors = fFragmentProcessors->fProcs.count();
178 for (int e = 0; e < numProcessors; ++e) {
179 const GrFragmentStage& stage = optState.getFragmentStage(e);
180 const GrProcessor& processor = *stage.getProcessor();
181 fFragmentProcessors->fProcs[e]->fGLProc->setData(fProgramDataManager, processor);
182 this->setTransformData(stage, fFragmentProcessors->fProcs[e]);
183 this->bindTextures(fFragmentProcessors->fProcs[e], processor);
184 }
185}
186void GrGLProgram::setTransformData(const GrFragmentStage& processor, GrGLInstalledFragProc* ip) {
187 SkTArray<GrGLInstalledFragProc::Transform, true>& transforms = ip->fTransforms;
joshualitt47bb3822014-10-07 16:43:25 -0700188 int numTransforms = transforms.count();
189 SkASSERT(numTransforms == processor.getProcessor()->numTransforms());
190 for (int t = 0; t < numTransforms; ++t) {
191 SkASSERT(transforms[t].fHandle.isValid());
joshualitta5305a12014-10-10 17:47:00 -0700192 const SkMatrix& matrix = get_transform_matrix(processor, ip->fLocalCoordAttrib, t);
joshualitt47bb3822014-10-07 16:43:25 -0700193 if (!transforms[t].fCurrentValue.cheapEqualTo(matrix)) {
194 fProgramDataManager.setSkMatrix(transforms[t].fHandle.convertToUniformHandle(), matrix);
195 transforms[t].fCurrentValue = matrix;
196 }
commit-bot@chromium.org6b30e452013-10-04 20:02:53 +0000197 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +0000198}
bsalomon@google.com91207482013-02-12 21:45:24 +0000199
joshualitt47bb3822014-10-07 16:43:25 -0700200void GrGLProgram::didSetData(GrGpu::DrawType drawType) {
201 SkASSERT(!GrGpu::IsPathRenderingDrawType(drawType));
202}
203
joshualitt98102a82014-10-28 09:08:35 -0700204void GrGLProgram::setColor(const GrOptDrawState& optState,
205 GrColor color,
206 SharedGLState* sharedState) {
bsalomon@google.com2db3ded2013-05-22 14:34:04 +0000207 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
joshualitt98102a82014-10-28 09:08:35 -0700208 if (!optState.hasColorVertexAttribute()) {
209 switch (header.fColorInput) {
210 case GrGLProgramDesc::kAttribute_ColorInput:
211 SkASSERT(-1 != header.fColorAttributeIndex);
212 if (sharedState->fConstAttribColor != color ||
213 sharedState->fConstAttribColorIndex != header.fColorAttributeIndex) {
214 // OpenGL ES only supports the float varieties of glVertexAttrib
215 GrGLfloat c[4];
216 GrColorToRGBAFloat(color, c);
217 GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c));
218 sharedState->fConstAttribColor = color;
219 sharedState->fConstAttribColorIndex = header.fColorAttributeIndex;
220 }
221 break;
222 case GrGLProgramDesc::kUniform_ColorInput:
223 if (fColor != color && fBuiltinUniformHandles.fColorUni.isValid()) {
224 // OpenGL ES doesn't support unsigned byte varieties of glUniform
225 GrGLfloat c[4];
226 GrColorToRGBAFloat(color, c);
227 fProgramDataManager.set4fv(fBuiltinUniformHandles.fColorUni, 1, c);
228 fColor = color;
229 }
230 sharedState->fConstAttribColorIndex = -1;
231 break;
232 case GrGLProgramDesc::kAllOnes_ColorInput:
233 sharedState->fConstAttribColorIndex = -1;
234 break;
235 default:
236 SkFAIL("Unexpected color type.");
237 }
238 } else {
239 sharedState->fConstAttribColorIndex = -1;
bsalomon@google.com91207482013-02-12 21:45:24 +0000240 }
241}
242
joshualitt98102a82014-10-28 09:08:35 -0700243void GrGLProgram::setCoverage(const GrOptDrawState& optState,
244 GrColor coverage,
245 SharedGLState* sharedState) {
bsalomon@google.com2db3ded2013-05-22 14:34:04 +0000246 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
joshualitt98102a82014-10-28 09:08:35 -0700247 if (!optState.hasCoverageVertexAttribute()) {
248 switch (header.fCoverageInput) {
249 case GrGLProgramDesc::kAttribute_ColorInput:
250 if (sharedState->fConstAttribCoverage != coverage ||
251 sharedState->fConstAttribCoverageIndex != header.fCoverageAttributeIndex) {
252 // OpenGL ES only supports the float varieties of glVertexAttrib
253 GrGLfloat c[4];
254 GrColorToRGBAFloat(coverage, c);
255 GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c));
256 sharedState->fConstAttribCoverage = coverage;
257 sharedState->fConstAttribCoverageIndex = header.fCoverageAttributeIndex;
258 }
259 break;
260 case GrGLProgramDesc::kUniform_ColorInput:
261 if (fCoverage != coverage) {
262 // OpenGL ES doesn't support unsigned byte varieties of glUniform
263 GrGLfloat c[4];
264 GrColorToRGBAFloat(coverage, c);
265 fProgramDataManager.set4fv(fBuiltinUniformHandles.fCoverageUni, 1, c);
266 fCoverage = coverage;
267 }
268 sharedState->fConstAttribCoverageIndex = -1;
269 break;
270 case GrGLProgramDesc::kAllOnes_ColorInput:
271 sharedState->fConstAttribCoverageIndex = -1;
272 break;
273 default:
274 SkFAIL("Unexpected coverage type.");
275 }
276 } else {
277 sharedState->fConstAttribCoverageIndex = -1;
bsalomon@google.com91207482013-02-12 21:45:24 +0000278 }
279}
bsalomon@google.com6a51dcb2013-02-13 16:03:51 +0000280
kkinnunenec56e452014-08-25 22:21:16 -0700281void GrGLProgram::setMatrixAndRenderTargetHeight(GrGpu::DrawType drawType,
egdaniel170f90b2014-09-16 12:54:40 -0700282 const GrOptDrawState& optState) {
joshualitt47bb3822014-10-07 16:43:25 -0700283 // Load the RT height uniform if it is needed to y-flip gl_FragCoord.
284 if (fBuiltinUniformHandles.fRTHeightUni.isValid() &&
285 fMatrixState.fRenderTargetSize.fHeight != optState.getRenderTarget()->height()) {
286 fProgramDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni,
287 SkIntToScalar(optState.getRenderTarget()->height()));
288 }
289
290 // call subclasses to set the actual view matrix
291 this->onSetMatrixAndRenderTargetHeight(drawType, optState);
292}
293
294void GrGLProgram::onSetMatrixAndRenderTargetHeight(GrGpu::DrawType drawType,
295 const GrOptDrawState& optState) {
egdaniel170f90b2014-09-16 12:54:40 -0700296 const GrRenderTarget* rt = optState.getRenderTarget();
bsalomon@google.com6a51dcb2013-02-13 16:03:51 +0000297 SkISize size;
298 size.set(rt->width(), rt->height());
joshualitt47bb3822014-10-07 16:43:25 -0700299 if (fMatrixState.fRenderTargetOrigin != rt->origin() ||
300 fMatrixState.fRenderTargetSize != size ||
301 !fMatrixState.fViewMatrix.cheapEqualTo(optState.getViewMatrix())) {
kkinnunendddc18a2014-08-03 23:19:46 -0700302 SkASSERT(fBuiltinUniformHandles.fViewMatrixUni.isValid());
bsalomon@google.com6a51dcb2013-02-13 16:03:51 +0000303
egdaniel170f90b2014-09-16 12:54:40 -0700304 fMatrixState.fViewMatrix = optState.getViewMatrix();
bsalomon@google.com6a51dcb2013-02-13 16:03:51 +0000305 fMatrixState.fRenderTargetSize = size;
306 fMatrixState.fRenderTargetOrigin = rt->origin();
commit-bot@chromium.org215a6822013-09-05 18:28:42 +0000307
308 GrGLfloat viewMatrix[3 * 3];
309 fMatrixState.getGLMatrix<3>(viewMatrix);
kkinnunendddc18a2014-08-03 23:19:46 -0700310 fProgramDataManager.setMatrix3f(fBuiltinUniformHandles.fViewMatrixUni, viewMatrix);
commit-bot@chromium.org47c66dd2014-05-29 01:12:10 +0000311
312 GrGLfloat rtAdjustmentVec[4];
313 fMatrixState.getRTAdjustmentVec(rtAdjustmentVec);
kkinnunendddc18a2014-08-03 23:19:46 -0700314 fProgramDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, rtAdjustmentVec);
bsalomon@google.com6a51dcb2013-02-13 16:03:51 +0000315 }
316}
joshualitt47bb3822014-10-07 16:43:25 -0700317
318/////////////////////////////////////////////////////////////////////////////////////////
319
320GrGLNvprProgramBase::GrGLNvprProgramBase(GrGpuGL* gpu,
321 const GrGLProgramDesc& desc,
322 const BuiltinUniformHandles& builtinUniforms,
323 GrGLuint programID,
324 const UniformInfoArray& uniforms,
joshualitta5305a12014-10-10 17:47:00 -0700325 GrGLInstalledFragProcs* fragmentProcessors)
326 : INHERITED(gpu, desc, builtinUniforms, programID, uniforms, NULL, fragmentProcessors) {
joshualitt47bb3822014-10-07 16:43:25 -0700327}
328
329void GrGLNvprProgramBase::onSetMatrixAndRenderTargetHeight(GrGpu::DrawType drawType,
330 const GrOptDrawState& optState) {
331 SkASSERT(GrGpu::IsPathRenderingDrawType(drawType));
332 const GrRenderTarget* rt = optState.getRenderTarget();
333 SkISize size;
334 size.set(rt->width(), rt->height());
335 fGpu->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), size, rt->origin());
336}
337
338/////////////////////////////////////////////////////////////////////////////////////////
339
340GrGLNvprProgram::GrGLNvprProgram(GrGpuGL* gpu,
341 const GrGLProgramDesc& desc,
342 const BuiltinUniformHandles& builtinUniforms,
343 GrGLuint programID,
344 const UniformInfoArray& uniforms,
joshualitta5305a12014-10-10 17:47:00 -0700345 GrGLInstalledFragProcs* fragmentProcessors,
joshualitt47bb3822014-10-07 16:43:25 -0700346 const SeparableVaryingInfoArray& separableVaryings)
joshualitta5305a12014-10-10 17:47:00 -0700347 : INHERITED(gpu, desc, builtinUniforms, programID, uniforms, fragmentProcessors) {
joshualitt47bb3822014-10-07 16:43:25 -0700348 int count = separableVaryings.count();
349 fVaryings.push_back_n(count);
350 for (int i = 0; i < count; i++) {
351 Varying& varying = fVaryings[i];
352 const SeparableVaryingInfo& builderVarying = separableVaryings[i];
353 SkASSERT(GrGLShaderVar::kNonArray == builderVarying.fVariable.getArrayCount());
354 SkDEBUGCODE(
355 varying.fType = builderVarying.fVariable.getType();
356 );
357 varying.fLocation = builderVarying.fLocation;
358 }
359}
360
361void GrGLNvprProgram::didSetData(GrGpu::DrawType drawType) {
362 SkASSERT(GrGpu::IsPathRenderingDrawType(drawType));
363}
364
joshualitta5305a12014-10-10 17:47:00 -0700365void GrGLNvprProgram::setTransformData(const GrFragmentStage& proc, GrGLInstalledFragProc* ip) {
366 SkTArray<GrGLInstalledFragProc::Transform, true>& transforms = ip->fTransforms;
joshualitt47bb3822014-10-07 16:43:25 -0700367 int numTransforms = transforms.count();
joshualitta5305a12014-10-10 17:47:00 -0700368 SkASSERT(numTransforms == proc.getProcessor()->numTransforms());
joshualitt47bb3822014-10-07 16:43:25 -0700369 for (int t = 0; t < numTransforms; ++t) {
370 SkASSERT(transforms[t].fHandle.isValid());
joshualitta5305a12014-10-10 17:47:00 -0700371 const SkMatrix& transform = get_transform_matrix(proc, false, t);
joshualitt47bb3822014-10-07 16:43:25 -0700372 if (transforms[t].fCurrentValue.cheapEqualTo(transform)) {
373 continue;
374 }
375 transforms[t].fCurrentValue = transform;
376 const Varying& fragmentInput = fVaryings[transforms[t].fHandle.handle()];
377 SkASSERT(transforms[t].fType == kVec2f_GrSLType || transforms[t].fType == kVec3f_GrSLType);
378 unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3;
379 fGpu->glPathRendering()->setProgramPathFragmentInputTransform(fProgramID,
380 fragmentInput.fLocation,
381 GR_GL_OBJECT_LINEAR,
382 components,
383 transform);
384 }
385}
386
387//////////////////////////////////////////////////////////////////////////////////////
388
389GrGLLegacyNvprProgram::GrGLLegacyNvprProgram(GrGpuGL* gpu,
joshualitta5305a12014-10-10 17:47:00 -0700390 const GrGLProgramDesc& desc,
391 const BuiltinUniformHandles& builtinUniforms,
392 GrGLuint programID,
393 const UniformInfoArray& uniforms,
394 GrGLInstalledFragProcs* fps,
395 int texCoordSetCnt)
396 : INHERITED(gpu, desc, builtinUniforms, programID, uniforms, fps)
joshualitt47bb3822014-10-07 16:43:25 -0700397 , fTexCoordSetCnt(texCoordSetCnt) {
398}
399
400void GrGLLegacyNvprProgram::didSetData(GrGpu::DrawType drawType) {
401 SkASSERT(GrGpu::IsPathRenderingDrawType(drawType));
402 fGpu->glPathRendering()->flushPathTexGenSettings(fTexCoordSetCnt);
403}
404
joshualitta5305a12014-10-10 17:47:00 -0700405void
406GrGLLegacyNvprProgram::setTransformData(const GrFragmentStage& proc, GrGLInstalledFragProc* ip) {
joshualitt47bb3822014-10-07 16:43:25 -0700407 // We've hidden the texcoord index in the first entry of the transforms array for each effect
joshualitta5305a12014-10-10 17:47:00 -0700408 int texCoordIndex = ip->fTransforms[0].fHandle.handle();
409 int numTransforms = proc.getProcessor()->numTransforms();
joshualitt47bb3822014-10-07 16:43:25 -0700410 for (int t = 0; t < numTransforms; ++t) {
joshualitta5305a12014-10-10 17:47:00 -0700411 const SkMatrix& transform = get_transform_matrix(proc, false, t);
joshualitt47bb3822014-10-07 16:43:25 -0700412 GrGLPathRendering::PathTexGenComponents components =
413 GrGLPathRendering::kST_PathTexGenComponents;
joshualitta5305a12014-10-10 17:47:00 -0700414 if (proc.isPerspectiveCoordTransform(t, false)) {
joshualitt47bb3822014-10-07 16:43:25 -0700415 components = GrGLPathRendering::kSTR_PathTexGenComponents;
416 }
417 fGpu->glPathRendering()->enablePathTexGen(texCoordIndex++, components, transform);
418 }
419}