blob: 3d991a2e2c63a977c9ad9f924252fc416ff8a8c4 [file] [log] [blame]
joshualitt47bb3822014-10-07 16:43:25 -07001/*
2 * Copyright 2014 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.
6 */
7
8#include "GrGLNvprProgramBuilder.h"
9#include "../GrGpuGL.h"
10
11#define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X)
12#define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X)
13
14GrGLNvprProgramBuilder::GrGLNvprProgramBuilder(GrGpuGL* gpu,
15 const GrOptDrawState& optState,
16 const GrGLProgramDesc& desc)
17 : INHERITED(gpu, optState, desc)
18 , fSeparableVaryingInfos(kVarsPerBlock) {
19}
20
joshualitta5305a12014-10-10 17:47:00 -070021void GrGLNvprProgramBuilder::emitTransforms(const GrFragmentStage& processorStage,
joshualitt47bb3822014-10-07 16:43:25 -070022 GrGLProcessor::TransformedCoordsArray* outCoords,
joshualitta5305a12014-10-10 17:47:00 -070023 GrGLInstalledFragProc* ifp) {
24 const GrFragmentProcessor* effect = processorStage.getProcessor();
joshualitt47bb3822014-10-07 16:43:25 -070025 int numTransforms = effect->numTransforms();
26
joshualitta5305a12014-10-10 17:47:00 -070027 ifp->fTransforms.push_back_n(numTransforms);
joshualitt47bb3822014-10-07 16:43:25 -070028
29 for (int t = 0; t < numTransforms; t++) {
30 GrSLType varyingType =
31 processorStage.isPerspectiveCoordTransform(t, false) ?
32 kVec3f_GrSLType :
33 kVec2f_GrSLType;
34
35 const char* varyingName = "MatrixCoord";
36 SkString suffixedVaryingName;
37 if (0 != t) {
38 suffixedVaryingName.append(varyingName);
39 suffixedVaryingName.appendf("_%i", t);
40 varyingName = suffixedVaryingName.c_str();
41 }
joshualittd3de40d2014-10-24 15:02:11 -070042 GrGLVertToFrag v(varyingType);
43 ifp->fTransforms[t].fHandle = this->addSeparableVarying(varyingName, &v);
joshualitta5305a12014-10-10 17:47:00 -070044 ifp->fTransforms[t].fType = varyingType;
joshualitt47bb3822014-10-07 16:43:25 -070045
46 SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords,
joshualittd3de40d2014-10-24 15:02:11 -070047 (SkString(v.fsIn()), varyingType));
joshualitt47bb3822014-10-07 16:43:25 -070048 }
49}
50
joshualitta5305a12014-10-10 17:47:00 -070051GrGLInstalledFragProc::ShaderVarHandle
joshualittd3de40d2014-10-24 15:02:11 -070052GrGLNvprProgramBuilder::addSeparableVarying(const char* name, GrGLVarying* v) {
53 this->addVarying(name, v);
joshualitt47bb3822014-10-07 16:43:25 -070054 SeparableVaryingInfo& varying = fSeparableVaryingInfos.push_back();
55 varying.fVariable = fFS.fInputs.back();
joshualitta5305a12014-10-10 17:47:00 -070056 return GrGLInstalledFragProc::ShaderVarHandle(fSeparableVaryingInfos.count() - 1);
joshualitt47bb3822014-10-07 16:43:25 -070057}
58
59void GrGLNvprProgramBuilder::resolveSeparableVaryings(GrGLuint programId) {
60 int count = fSeparableVaryingInfos.count();
61 for (int i = 0; i < count; ++i) {
62 GrGLint location;
63 GL_CALL_RET(location,
64 GetProgramResourceLocation(programId,
65 GR_GL_FRAGMENT_INPUT,
66 fSeparableVaryingInfos[i].fVariable.c_str()));
67 fSeparableVaryingInfos[i].fLocation = location;
68 }
69}
70
71GrGLProgram* GrGLNvprProgramBuilder::createProgram(GrGLuint programID) {
72 // this is just for nvpr es, which has separable varyings that are plugged in after
73 // building
74 this->resolveSeparableVaryings(programID);
75 return SkNEW_ARGS(GrGLNvprProgram, (fGpu, fDesc, fUniformHandles, programID, fUniforms,
joshualitta5305a12014-10-10 17:47:00 -070076 fFragmentProcessors.get(), fSeparableVaryingInfos));
joshualitt47bb3822014-10-07 16:43:25 -070077}