GrGLSL.cpp revision 9e90aed5de82732cc9921f01388d3063a41a053b
1086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com/*
2086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com * Copyright 2011 Google Inc.
3086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com *
4086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com * Use of this source code is governed by a BSD-style license that can be
5086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com * found in the LICENSE file.
6086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com */
7086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com
8086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h"
9e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com#include "GrGLShaderVar.h"
104af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com#include "SkString.h"
11086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com
129e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.orgGrGLSLGeneration GrGetGLSLGeneration(const GrGLInterface* gl) {
13086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com    GrGLSLVersion ver = GrGLGetGLSLVersion(gl);
149e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    switch (gl->fStandard) {
159e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org        case kGL_GrGLStandard:
16f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(ver >= GR_GLSL_VER(1,10));
17086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com            if (ver >= GR_GLSL_VER(1,50)) {
18e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com                return k150_GrGLSLGeneration;
19281c726c760c2b0ef957674da0360d5595d52a9cbsalomon@google.com            } else if (ver >= GR_GLSL_VER(1,40)) {
20281c726c760c2b0ef957674da0360d5595d52a9cbsalomon@google.com                return k140_GrGLSLGeneration;
21086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com            } else if (ver >= GR_GLSL_VER(1,30)) {
22e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com                return k130_GrGLSLGeneration;
23086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com            } else {
24e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com                return k110_GrGLSLGeneration;
25086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com            }
269e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org        case kGLES_GrGLStandard:
27086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com            // version 1.00 of ES GLSL based on ver 1.20 of desktop GLSL
28f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(ver >= GR_GL_VER(1,00));
29e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com            return k110_GrGLSLGeneration;
30086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com        default:
319e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org            GrCrash("Unknown GL Standard");
32e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com            return k110_GrGLSLGeneration; // suppress warning
33086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com    }
34086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com}
35086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com
3606f05989570fbf2ced3d2d1690ea1276b7330b5fcommit-bot@chromium.orgconst char* GrGetGLSLVersionDecl(const GrGLContextInfo& info) {
3706f05989570fbf2ced3d2d1690ea1276b7330b5fcommit-bot@chromium.org    switch (info.glslGeneration()) {
38e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com        case k110_GrGLSLGeneration:
399e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org            if (kGLES_GrGLStandard == info.standard()) {
40e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com                // ES2s shader language is based on version 1.20 but is version
41e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com                // 1.00 of the ES language.
42e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com                return "#version 100\n";
43e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com            } else {
449e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org                SkASSERT(kGL_GrGLStandard == info.standard());
45e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com                return "#version 110\n";
46e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com            }
47e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com        case k130_GrGLSLGeneration:
489e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org            SkASSERT(kGL_GrGLStandard == info.standard());
49e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com            return "#version 130\n";
50281c726c760c2b0ef957674da0360d5595d52a9cbsalomon@google.com        case k140_GrGLSLGeneration:
519e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org            SkASSERT(kGL_GrGLStandard == info.standard());
52281c726c760c2b0ef957674da0360d5595d52a9cbsalomon@google.com            return "#version 140\n";
53e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com        case k150_GrGLSLGeneration:
549e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org            SkASSERT(kGL_GrGLStandard == info.standard());
5506f05989570fbf2ced3d2d1690ea1276b7330b5fcommit-bot@chromium.org            if (info.caps()->isCoreProfile()) {
5606f05989570fbf2ced3d2d1690ea1276b7330b5fcommit-bot@chromium.org                return "#version 150\n";
5706f05989570fbf2ced3d2d1690ea1276b7330b5fcommit-bot@chromium.org            } else {
5806f05989570fbf2ced3d2d1690ea1276b7330b5fcommit-bot@chromium.org                return "#version 150 compatibility\n";
5906f05989570fbf2ced3d2d1690ea1276b7330b5fcommit-bot@chromium.org            }
60e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com        default:
61e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com            GrCrash("Unknown GL version.");
62e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com            return ""; // suppress warning
63e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com    }
64e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com}
65e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com
66868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.comnamespace {
67018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com    void append_tabs(SkString* outAppend, int tabCnt) {
68018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com        static const char kTabs[] = "\t\t\t\t\t\t\t\t";
69018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com        while (tabCnt) {
70018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com            int cnt = GrMin((int)GR_ARRAY_COUNT(kTabs), tabCnt);
71018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com            outAppend->append(kTabs, cnt);
72018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com            tabCnt -= cnt;
73018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com        }
74868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com    }
75868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com}
76868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com
77824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.orgvoid GrGLSLMulVarBy4f(SkString* outAppend,
78824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org                      unsigned tabCnt,
79824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org                      const char* vec4VarName,
80a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org                      const GrGLSLExpr4& mulFactor) {
81824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org    if (mulFactor.isOnes()) {
82824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org        *outAppend = SkString();
83868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com    }
84824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org
85868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com    append_tabs(outAppend, tabCnt);
86868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com
87824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org    if (mulFactor.isZeros()) {
88824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org        outAppend->appendf("%s = vec4(0);\n", vec4VarName);
898660783e196dc3cb4ead492253a493844fa43f7acommit-bot@chromium.org    } else {
908660783e196dc3cb4ead492253a493844fa43f7acommit-bot@chromium.org        outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor.c_str());
914af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com    }
924af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com}
93