Index: src/gpu/glsl/GrGLSLCaps.cpp |
diff --git a/src/gpu/glsl/GrGLSLCaps.cpp b/src/gpu/glsl/GrGLSLCaps.cpp |
index c2404c6e52a9ffd4a7e51dae909eda9f1361d60e..60bea8663ab3687b0be78f62be946dbd24d203e2 100755 |
--- a/src/gpu/glsl/GrGLSLCaps.cpp |
+++ b/src/gpu/glsl/GrGLSLCaps.cpp |
@@ -92,5 +92,60 @@ SkString GrGLSLCaps::dump() const { |
return r; |
} |
+void GrGLSLCaps::initSamplerPrecisionTable() { |
+ // Determine the largest precision qualifiers that are effectively the same as lowp/mediump. |
+ // e.g. if lowp == mediump, then use mediump instead of lowp. |
+ GrSLPrecision effectiveMediumP[kGrShaderTypeCount]; |
+ GrSLPrecision effectiveLowP[kGrShaderTypeCount]; |
+ for (int s = 0; s < kGrShaderTypeCount; ++s) { |
+ const PrecisionInfo* info = fFloatPrecisions[s]; |
+ effectiveMediumP[s] = info[kHigh_GrSLPrecision] == info[kMedium_GrSLPrecision] ? |
+ kHigh_GrSLPrecision : kMedium_GrSLPrecision; |
+ effectiveLowP[s] = info[kMedium_GrSLPrecision] == info[kLow_GrSLPrecision] ? |
+ effectiveMediumP[s] : kLow_GrSLPrecision; |
+ } |
+ |
+ // Determine which precision qualifiers should be used with samplers. |
+ for (int visibility = 0; visibility < (1 << kGrShaderTypeCount); ++visibility) { |
+ GrSLPrecision mediump = kHigh_GrSLPrecision; |
+ GrSLPrecision lowp = kHigh_GrSLPrecision; |
+ for (int s = 0; s < kGrShaderTypeCount; ++s) { |
+ if (visibility & (1 << s)) { |
+ mediump = SkTMin(mediump, effectiveMediumP[s]); |
+ lowp = SkTMin(lowp, effectiveLowP[s]); |
+ } |
+ |
+ GR_STATIC_ASSERT(0 == kLow_GrSLPrecision); |
+ GR_STATIC_ASSERT(1 == kMedium_GrSLPrecision); |
+ GR_STATIC_ASSERT(2 == kHigh_GrSLPrecision); |
+ |
+ GR_STATIC_ASSERT((1 << kVertex_GrShaderType) == kVertex_GrShaderFlag); |
+ GR_STATIC_ASSERT((1 << kGeometry_GrShaderType) == kGeometry_GrShaderFlag); |
+ GR_STATIC_ASSERT((1 << kFragment_GrShaderType) == kFragment_GrShaderFlag); |
+ GR_STATIC_ASSERT(3 == kGrShaderTypeCount); |
+ } |
+ |
+ uint8_t* table = fSamplerPrecisions[visibility]; |
+ table[kUnknown_GrPixelConfig] = kDefault_GrSLPrecision; |
+ table[kAlpha_8_GrPixelConfig] = lowp; |
+ table[kIndex_8_GrPixelConfig] = lowp; |
+ table[kRGB_565_GrPixelConfig] = lowp; |
+ table[kRGBA_4444_GrPixelConfig] = lowp; |
+ table[kRGBA_8888_GrPixelConfig] = lowp; |
+ table[kBGRA_8888_GrPixelConfig] = lowp; |
+ table[kSRGBA_8888_GrPixelConfig] = lowp; |
+ table[kSBGRA_8888_GrPixelConfig] = lowp; |
+ table[kETC1_GrPixelConfig] = lowp; |
+ table[kLATC_GrPixelConfig] = lowp; |
+ table[kR11_EAC_GrPixelConfig] = lowp; |
+ table[kASTC_12x12_GrPixelConfig] = lowp; |
+ table[kRGBA_float_GrPixelConfig] = kHigh_GrSLPrecision; |
+ table[kAlpha_half_GrPixelConfig] = mediump; |
+ table[kRGBA_half_GrPixelConfig] = mediump; |
+ |
+ GR_STATIC_ASSERT(16 == kGrPixelConfigCnt); |
+ } |
+} |
+ |
void GrGLSLCaps::onApplyOptionsOverrides(const GrContextOptions& options) { |
} |