180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLSL.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLShaderVar.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerGrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, const GrGLInterface* gl) {
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrGLSLVersion ver = GrGLGetGLSLVersion(gl);
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (binding) {
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case kDesktop_GrGLBinding:
160a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(ver >= GR_GLSL_VER(1,10));
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (ver >= GR_GLSL_VER(1,50)) {
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return k150_GrGLSLGeneration;
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            } else if (ver >= GR_GLSL_VER(1,40)) {
20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                return k140_GrGLSLGeneration;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } else if (ver >= GR_GLSL_VER(1,30)) {
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return k130_GrGLSLGeneration;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } else {
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return k110_GrGLSLGeneration;
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        case kES_GrGLBinding:
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            // version 1.00 of ES GLSL based on ver 1.20 of desktop GLSL
280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(ver >= GR_GL_VER(1,00));
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return k110_GrGLSLGeneration;
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            GrCrash("Unknown GL Binding");
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return k110_GrGLSLGeneration; // suppress warning
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerconst char* GrGetGLSLVersionDecl(const GrGLContextInfo& info) {
370a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    switch (info.glslGeneration()) {
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case k110_GrGLSLGeneration:
390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            if (kES_GrGLBinding == info.binding()) {
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                // ES2s shader language is based on version 1.20 but is version
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                // 1.00 of the ES language.
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return "#version 100\n";
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } else {
440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                SkASSERT(kDesktop_GrGLBinding == info.binding());
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return "#version 110\n";
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case k130_GrGLSLGeneration:
480a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(kDesktop_GrGLBinding == info.binding());
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return "#version 130\n";
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        case k140_GrGLSLGeneration:
510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(kDesktop_GrGLBinding == info.binding());
52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            return "#version 140\n";
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case k150_GrGLSLGeneration:
540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(kDesktop_GrGLBinding == info.binding());
550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            if (info.caps()->isCoreProfile()) {
560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                return "#version 150\n";
570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            } else {
580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                return "#version 150 compatibility\n";
590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            }
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            GrCrash("Unknown GL version.");
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return ""; // suppress warning
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querunamespace {
677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void append_tabs(SkString* outAppend, int tabCnt) {
687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        static const char kTabs[] = "\t\t\t\t\t\t\t\t";
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        while (tabCnt) {
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            int cnt = GrMin((int)GR_ARRAY_COUNT(kTabs), tabCnt);
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            outAppend->append(kTabs, cnt);
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            tabCnt -= cnt;
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
770a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid GrGLSLMulVarBy4f(SkString* outAppend,
780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                      unsigned tabCnt,
790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                      const char* vec4VarName,
800a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                      const GrGLSLExpr4& mulFactor) {
810a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    if (mulFactor.isOnes()) {
820a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        *outAppend = SkString();
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
840a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    append_tabs(outAppend, tabCnt);
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
870a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    if (mulFactor.isZeros()) {
880a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        outAppend->appendf("%s = vec4(0);\n", vec4VarName);
89910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    } else {
90910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor.c_str());
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
93