| /* |
| * 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."); |
| } |
| } |
| } |