blob: 77ae42536c1b271cb9c14837a2b533844a309969 [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
20GrGLShaderBuilder::GrGLShaderBuilder()
21 : fVSUnis(sVarsPerBlock)
22 , fVSAttrs(sVarsPerBlock)
23 , fVSOutputs(sVarsPerBlock)
24 , fGSInputs(sVarsPerBlock)
25 , fGSOutputs(sVarsPerBlock)
26 , fFSInputs(sVarsPerBlock)
27 , fFSUnis(sVarsPerBlock)
28 , fFSOutputs(sMaxFSOutputs)
29 , fUsesGS(false) {
30
31}
32
33void GrGLShaderBuilder::appendVarying(GrSLType type,
34 const char* name,
35 const char** vsOutName,
36 const char** fsInName) {
37 fVSOutputs.push_back();
38 fVSOutputs.back().setType(type);
39 fVSOutputs.back().setTypeModifier(GrGLShaderVar::kOut_TypeModifier);
40 fVSOutputs.back().accessName()->printf("v%s", name);
41 if (vsOutName) {
42 *vsOutName = fVSOutputs.back().getName().c_str();
43 }
44 // input to FS comes either from VS or GS
45 const GrStringBuilder* fsName;
46 if (fUsesGS) {
47 // if we have a GS take each varying in as an array
48 // and output as non-array.
49 fGSInputs.push_back();
50 fGSInputs.back().setType(type);
51 fGSInputs.back().setTypeModifier(GrGLShaderVar::kIn_TypeModifier);
52 fGSInputs.back().setUnsizedArray();
53 *fGSInputs.back().accessName() = fVSOutputs.back().getName();
54 fGSOutputs.push_back();
55 fGSOutputs.back().setType(type);
56 fGSOutputs.back().setTypeModifier(GrGLShaderVar::kOut_TypeModifier);
57 fGSOutputs.back().accessName()->printf("g%s", name);
58 fsName = fGSOutputs.back().accessName();
59 } else {
60 fsName = fVSOutputs.back().accessName();
61 }
62 fFSInputs.push_back();
63 fFSInputs.back().setType(type);
64 fFSInputs.back().setTypeModifier(GrGLShaderVar::kIn_TypeModifier);
65 fFSInputs.back().setName(*fsName);
66 if (fsInName) {
67 *fsInName = fsName->c_str();
68 }
69}
70
71
72void GrGLShaderBuilder::appendVarying(GrSLType type,
73 const char* name,
74 int stageNum,
75 const char** vsOutName,
76 const char** fsInName) {
77 GrStringBuilder nameWithStage(name);
78 nameWithStage.appendS32(stageNum);
79 this->appendVarying(type, nameWithStage.c_str(), vsOutName, fsInName);
80}