GrGLSL.cpp revision a34995e18b1f0a7d8c9f23451718bb30ff0105b0
1/*
2 * 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.
6 */
7
8#include "GrGLSL.h"
9#include "GrGLShaderVar.h"
10#include "SkString.h"
11
12GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, const GrGLInterface* gl) {
13    GrGLSLVersion ver = GrGLGetGLSLVersion(gl);
14    switch (binding) {
15        case kDesktop_GrGLBinding:
16            SkASSERT(ver >= GR_GLSL_VER(1,10));
17            if (ver >= GR_GLSL_VER(1,50)) {
18                return k150_GrGLSLGeneration;
19            } else if (ver >= GR_GLSL_VER(1,40)) {
20                return k140_GrGLSLGeneration;
21            } else if (ver >= GR_GLSL_VER(1,30)) {
22                return k130_GrGLSLGeneration;
23            } else {
24                return k110_GrGLSLGeneration;
25            }
26        case kES_GrGLBinding:
27            // version 1.00 of ES GLSL based on ver 1.20 of desktop GLSL
28            SkASSERT(ver >= GR_GL_VER(1,00));
29            return k110_GrGLSLGeneration;
30        default:
31            GrCrash("Unknown GL Binding");
32            return k110_GrGLSLGeneration; // suppress warning
33    }
34}
35
36const char* GrGetGLSLVersionDecl(const GrGLContextInfo& info) {
37    switch (info.glslGeneration()) {
38        case k110_GrGLSLGeneration:
39            if (kES_GrGLBinding == info.binding()) {
40                // ES2s shader language is based on version 1.20 but is version
41                // 1.00 of the ES language.
42                return "#version 100\n";
43            } else {
44                SkASSERT(kDesktop_GrGLBinding == info.binding());
45                return "#version 110\n";
46            }
47        case k130_GrGLSLGeneration:
48            SkASSERT(kDesktop_GrGLBinding == info.binding());
49            return "#version 130\n";
50        case k140_GrGLSLGeneration:
51            SkASSERT(kDesktop_GrGLBinding == info.binding());
52            return "#version 140\n";
53        case k150_GrGLSLGeneration:
54            SkASSERT(kDesktop_GrGLBinding == info.binding());
55            if (info.caps()->isCoreProfile()) {
56                return "#version 150\n";
57            } else {
58                return "#version 150 compatibility\n";
59            }
60        default:
61            GrCrash("Unknown GL version.");
62            return ""; // suppress warning
63    }
64}
65
66namespace {
67    void append_tabs(SkString* outAppend, int tabCnt) {
68        static const char kTabs[] = "\t\t\t\t\t\t\t\t";
69        while (tabCnt) {
70            int cnt = GrMin((int)GR_ARRAY_COUNT(kTabs), tabCnt);
71            outAppend->append(kTabs, cnt);
72            tabCnt -= cnt;
73        }
74    }
75}
76
77void GrGLSLMulVarBy4f(SkString* outAppend,
78                      unsigned tabCnt,
79                      const char* vec4VarName,
80                      const GrGLSLExpr4& mulFactor) {
81    if (mulFactor.isOnes()) {
82        *outAppend = SkString();
83    }
84
85    append_tabs(outAppend, tabCnt);
86
87    if (mulFactor.isZeros()) {
88        outAppend->appendf("%s = vec4(0);\n", vec4VarName);
89    }
90    outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor.c_str());
91}
92