GrGLGLSL.cpp revision 899ba37db336c20a06bce65d952e0664596a26ef
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 "GrGLGLSL.h" 9#include "GrGLContext.h" 10#include "GrGLUtil.h" 11#include "SkString.h" 12 13bool GrGLGetGLSLGeneration(const GrGLInterface* gl, GrGLSLGeneration* generation) { 14 SkASSERT(generation); 15 GrGLSLVersion ver = GrGLGetGLSLVersion(gl); 16 if (GR_GLSL_INVALID_VER == ver) { 17 return false; 18 } 19 switch (gl->fStandard) { 20 case kGL_GrGLStandard: 21 SkASSERT(ver >= GR_GLSL_VER(1,10)); 22 if (ver >= GR_GLSL_VER(3,30)) { 23 *generation = k330_GrGLSLGeneration; 24 } else if (ver >= GR_GLSL_VER(1,50)) { 25 *generation = k150_GrGLSLGeneration; 26 } else if (ver >= GR_GLSL_VER(1,40)) { 27 *generation = k140_GrGLSLGeneration; 28 } else if (ver >= GR_GLSL_VER(1,30)) { 29 *generation = k130_GrGLSLGeneration; 30 } else { 31 *generation = k110_GrGLSLGeneration; 32 } 33 return true; 34 case kGLES_GrGLStandard: 35 SkASSERT(ver >= GR_GL_VER(1,00)); 36 if (ver >= GR_GLSL_VER(3,1)) { 37 *generation = k310es_GrGLSLGeneration; 38 } 39 else if (ver >= GR_GLSL_VER(3,0)) { 40 *generation = k330_GrGLSLGeneration; 41 } else { 42 *generation = k110_GrGLSLGeneration; 43 } 44 return true; 45 default: 46 SkFAIL("Unknown GL Standard"); 47 return false; 48 } 49} 50 51const char* GrGLGetGLSLVersionDecl(const GrGLContextInfo& info) { 52 switch (info.glslGeneration()) { 53 case k110_GrGLSLGeneration: 54 if (kGLES_GrGLStandard == info.standard()) { 55 // ES2s shader language is based on version 1.20 but is version 56 // 1.00 of the ES language. 57 return "#version 100\n"; 58 } else { 59 SkASSERT(kGL_GrGLStandard == info.standard()); 60 return "#version 110\n"; 61 } 62 case k130_GrGLSLGeneration: 63 SkASSERT(kGL_GrGLStandard == info.standard()); 64 return "#version 130\n"; 65 case k140_GrGLSLGeneration: 66 SkASSERT(kGL_GrGLStandard == info.standard()); 67 return "#version 140\n"; 68 case k150_GrGLSLGeneration: 69 SkASSERT(kGL_GrGLStandard == info.standard()); 70 if (info.caps()->isCoreProfile()) { 71 return "#version 150\n"; 72 } else { 73 return "#version 150 compatibility\n"; 74 } 75 case k330_GrGLSLGeneration: 76 if (kGLES_GrGLStandard == info.standard()) { 77 return "#version 300 es\n"; 78 } else { 79 SkASSERT(kGL_GrGLStandard == info.standard()); 80 if (info.caps()->isCoreProfile()) { 81 return "#version 330\n"; 82 } else { 83 return "#version 330 compatibility\n"; 84 } 85 } 86 case k310es_GrGLSLGeneration: 87 SkASSERT(kGLES_GrGLStandard == info.standard()); 88 return "#version 310 es\n"; 89 } 90 return "<no version>"; 91} 92 93void GrGLAppendGLSLDefaultFloatPrecisionDeclaration(GrSLPrecision p, GrGLStandard s, SkString* out) { 94 // Desktop GLSL has added precision qualifiers but they don't do anything. 95 if (kGLES_GrGLStandard == s) { 96 switch (p) { 97 case kHigh_GrSLPrecision: 98 out->append("precision highp float;\n"); 99 break; 100 case kMedium_GrSLPrecision: 101 out->append("precision mediump float;\n"); 102 break; 103 case kLow_GrSLPrecision: 104 out->append("precision lowp float;\n"); 105 break; 106 default: 107 SkFAIL("Unknown precision value."); 108 } 109 } 110} 111