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