/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrShaderCaps.h" #include "SkString.h" #include "../private/GrGLSL.h" bool GrGLSLSupportsNamedFragmentShaderOutputs(GrGLSLGeneration gen) { switch (gen) { case k110_GrGLSLGeneration: return false; case k130_GrGLSLGeneration: case k140_GrGLSLGeneration: case k150_GrGLSLGeneration: case k330_GrGLSLGeneration: case k400_GrGLSLGeneration: case k420_GrGLSLGeneration: case k310es_GrGLSLGeneration: case k320es_GrGLSLGeneration: return true; } return false; } const char* GrGLSLTypeString(const GrShaderCaps* shaderCaps, GrSLType t) { switch (t) { case kVoid_GrSLType: return "void"; case kHalf_GrSLType: return "half"; case kHalf2_GrSLType: return "half2"; case kHalf3_GrSLType: return "half3"; case kHalf4_GrSLType: return "half4"; case kFloat_GrSLType: return "float"; case kFloat2_GrSLType: return "float2"; case kFloat3_GrSLType: return "float3"; case kFloat4_GrSLType: return "float4"; case kUint2_GrSLType: return "uint2"; case kInt2_GrSLType: return "int2"; case kInt3_GrSLType: return "int3"; case kInt4_GrSLType: return "int4"; case kFloat2x2_GrSLType: return "float2x2"; case kFloat3x3_GrSLType: return "float3x3"; case kFloat4x4_GrSLType: return "float4x4"; case kHalf2x2_GrSLType: return "half2x2"; case kHalf3x3_GrSLType: return "half3x3"; case kHalf4x4_GrSLType: return "half4x4"; case kTexture2DSampler_GrSLType: return "sampler2D"; case kTextureExternalSampler_GrSLType: return "samplerExternalOES"; case kTexture2DRectSampler_GrSLType: return "sampler2DRect"; case kBufferSampler_GrSLType: return "samplerBuffer"; case kBool_GrSLType: return "bool"; case kInt_GrSLType: return "int"; case kUint_GrSLType: return "uint"; case kShort_GrSLType: return "short"; case kShort2_GrSLType: return "short2"; case kShort3_GrSLType: return "short3"; case kShort4_GrSLType: return "short4"; case kUShort_GrSLType: return "ushort"; case kUShort2_GrSLType: if (shaderCaps->integerSupport()) { return "ushort2"; } else { // uint2 (aka uvec2) isn't supported in GLSL ES 1.00/GLSL 1.20 // FIXME: this should be handled by the client code rather than relying on // unconventional ushort2 behavior. return "float2"; } case kUShort3_GrSLType: return "ushort3"; case kUShort4_GrSLType: return "ushort4"; case kTexture2D_GrSLType: return "texture2D"; case kSampler_GrSLType: return "sampler"; } SK_ABORT("Unknown shader var type."); return ""; // suppress warning } void GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision p, const GrShaderCaps& shaderCaps, SkString* out) { if (shaderCaps.usesPrecisionModifiers()) { switch (p) { case kHigh_GrSLPrecision: out->append("precision highp float;\n"); break; case kMedium_GrSLPrecision: out->append("precision mediump float;\n"); break; case kLow_GrSLPrecision: out->append("precision lowp float;\n"); break; default: SK_ABORT("Unknown precision value."); } } }