blob: 321e507e4be1b817d727327f8ec4033b9801f3bf [file] [log] [blame]
tomhudson@google.comf9ad8862012-05-11 20:38:48 +00001/*
2 * Copyright 2012 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 "gl/GrGLShaderBuilder.h"
9
10namespace {
11
12// number of each input/output type in a single allocation block
13static const int sVarsPerBlock = 8;
14
15// except FS outputs where we expect 2 at most.
16static const int sMaxFSOutputs = 2;
17
18}
19
tomhudson@google.com9c639a42012-05-14 19:58:06 +000020// Architectural assumption: always 2-d input coords.
21// Likely to become non-constant and non-static, perhaps even
22// varying by stage, if we use 1D textures for gradients!
23//const int GrGLShaderBuilder::fCoordDims = 2;
24
tomhudson@google.comf9ad8862012-05-11 20:38:48 +000025GrGLShaderBuilder::GrGLShaderBuilder()
26 : fVSUnis(sVarsPerBlock)
27 , fVSAttrs(sVarsPerBlock)
28 , fVSOutputs(sVarsPerBlock)
29 , fGSInputs(sVarsPerBlock)
30 , fGSOutputs(sVarsPerBlock)
31 , fFSInputs(sVarsPerBlock)
32 , fFSUnis(sVarsPerBlock)
33 , fFSOutputs(sMaxFSOutputs)
tomhudson@google.com040c41a2012-05-18 14:57:40 +000034 , fUsesGS(false)
tomhudson@google.com9c639a42012-05-14 19:58:06 +000035 , fVaryingDims(0)
tomhudson@google.com040c41a2012-05-18 14:57:40 +000036 , fComplexCoord(false) {
tomhudson@google.comf9ad8862012-05-11 20:38:48 +000037
38}
39
40void GrGLShaderBuilder::appendVarying(GrSLType type,
41 const char* name,
42 const char** vsOutName,
43 const char** fsInName) {
44 fVSOutputs.push_back();
45 fVSOutputs.back().setType(type);
46 fVSOutputs.back().setTypeModifier(GrGLShaderVar::kOut_TypeModifier);
47 fVSOutputs.back().accessName()->printf("v%s", name);
48 if (vsOutName) {
49 *vsOutName = fVSOutputs.back().getName().c_str();
50 }
51 // input to FS comes either from VS or GS
52 const GrStringBuilder* fsName;
53 if (fUsesGS) {
54 // if we have a GS take each varying in as an array
55 // and output as non-array.
56 fGSInputs.push_back();
57 fGSInputs.back().setType(type);
58 fGSInputs.back().setTypeModifier(GrGLShaderVar::kIn_TypeModifier);
59 fGSInputs.back().setUnsizedArray();
60 *fGSInputs.back().accessName() = fVSOutputs.back().getName();
61 fGSOutputs.push_back();
62 fGSOutputs.back().setType(type);
63 fGSOutputs.back().setTypeModifier(GrGLShaderVar::kOut_TypeModifier);
64 fGSOutputs.back().accessName()->printf("g%s", name);
65 fsName = fGSOutputs.back().accessName();
66 } else {
67 fsName = fVSOutputs.back().accessName();
68 }
69 fFSInputs.push_back();
70 fFSInputs.back().setType(type);
71 fFSInputs.back().setTypeModifier(GrGLShaderVar::kIn_TypeModifier);
72 fFSInputs.back().setName(*fsName);
73 if (fsInName) {
74 *fsInName = fsName->c_str();
75 }
76}
77
78
79void GrGLShaderBuilder::appendVarying(GrSLType type,
80 const char* name,
81 int stageNum,
82 const char** vsOutName,
83 const char** fsInName) {
84 GrStringBuilder nameWithStage(name);
85 nameWithStage.appendS32(stageNum);
86 this->appendVarying(type, nameWithStage.c_str(), vsOutName, fsInName);
87}