GrGLGLSL.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