OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "GrGLCaps.h" | 9 #include "GrGLCaps.h" |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 fUnpackFlipYSupport = false; | 32 fUnpackFlipYSupport = false; |
33 fPackRowLengthSupport = false; | 33 fPackRowLengthSupport = false; |
34 fPackFlipYSupport = false; | 34 fPackFlipYSupport = false; |
35 fTextureUsageSupport = false; | 35 fTextureUsageSupport = false; |
36 fTexStorageSupport = false; | 36 fTexStorageSupport = false; |
37 fTextureRedSupport = false; | 37 fTextureRedSupport = false; |
38 fImagingSupport = false; | 38 fImagingSupport = false; |
39 fTwoFormatLimit = false; | 39 fTwoFormatLimit = false; |
40 fFragCoordsConventionSupport = false; | 40 fFragCoordsConventionSupport = false; |
41 fVertexArrayObjectSupport = false; | 41 fVertexArrayObjectSupport = false; |
| 42 fInstancedDrawingSupport = false; |
| 43 fDirectStateAccessSupport = false; |
| 44 fDebugSupport = false; |
42 fES2CompatibilitySupport = false; | 45 fES2CompatibilitySupport = false; |
43 fMultisampleDisableSupport = false; | 46 fMultisampleDisableSupport = false; |
44 fUseNonVBOVertexAndIndexDynamicData = false; | 47 fUseNonVBOVertexAndIndexDynamicData = false; |
45 fIsCoreProfile = false; | 48 fIsCoreProfile = false; |
46 fFullClearIsFree = false; | 49 fFullClearIsFree = false; |
47 | 50 |
48 fReadPixelsSupportedCache.reset(); | 51 fReadPixelsSupportedCache.reset(); |
49 | 52 |
50 fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions, | 53 fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions, |
51 ctxInfo, glInterface, *this))); | 54 ctxInfo, glInterface, *this))); |
(...skipping 30 matching lines...) Expand all Loading... |
82 } | 85 } |
83 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) { | 86 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) { |
84 // The arm extension also requires an additional flag which we will
set onResetContext | 87 // The arm extension also requires an additional flag which we will
set onResetContext |
85 glslCaps->fFBFetchNeedsCustomOutput = false; | 88 glslCaps->fFBFetchNeedsCustomOutput = false; |
86 glslCaps->fFBFetchSupport = true; | 89 glslCaps->fFBFetchSupport = true; |
87 glslCaps->fFBFetchColorName = "gl_LastFragColorARM"; | 90 glslCaps->fFBFetchColorName = "gl_LastFragColorARM"; |
88 glslCaps->fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch
"; | 91 glslCaps->fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch
"; |
89 } | 92 } |
90 } | 93 } |
91 | 94 |
| 95 glslCaps->fBindlessTextureSupport = ctxInfo.hasExtension("GL_NV_bindless_tex
ture"); |
| 96 |
92 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero
in a shader | 97 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero
in a shader |
93 glslCaps->fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor(); | 98 glslCaps->fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor(); |
94 | 99 |
95 /************************************************************************** | 100 /************************************************************************** |
96 * Caps specific to GrGLCaps | 101 * Caps specific to GrGLCaps |
97 **************************************************************************/ | 102 **************************************************************************/ |
98 | 103 |
99 if (kGLES_GrGLStandard == standard) { | 104 if (kGLES_GrGLStandard == standard) { |
100 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, | 105 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, |
101 &fMaxFragmentUniformVectors); | 106 &fMaxFragmentUniformVectors); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 | 228 |
224 if (kGL_GrGLStandard == standard) { | 229 if (kGL_GrGLStandard == standard) { |
225 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || | 230 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || |
226 ctxInfo.hasExtension("GL_ARB_vertex_array_ob
ject") || | 231 ctxInfo.hasExtension("GL_ARB_vertex_array_ob
ject") || |
227 ctxInfo.hasExtension("GL_APPLE_vertex_array_
object"); | 232 ctxInfo.hasExtension("GL_APPLE_vertex_array_
object"); |
228 } else { | 233 } else { |
229 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || | 234 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || |
230 ctxInfo.hasExtension("GL_OES_vertex_array_ob
ject"); | 235 ctxInfo.hasExtension("GL_OES_vertex_array_ob
ject"); |
231 } | 236 } |
232 | 237 |
| 238 if ((kGL_GrGLStandard == standard && version >= GR_GL_VER(3,2)) || |
| 239 (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3,0))) { |
| 240 fInstancedDrawingSupport = true; |
| 241 } else { |
| 242 fInstancedDrawingSupport = (ctxInfo.hasExtension("GL_ARB_draw_instanced"
) || |
| 243 ctxInfo.hasExtension("GL_EXT_draw_instanced"
)) && |
| 244 (ctxInfo.hasExtension("GL_ARB_instanced_array
s") || |
| 245 ctxInfo.hasExtension("GL_EXT_instanced_array
s")); |
| 246 } |
| 247 |
| 248 if (kGL_GrGLStandard == standard) { |
| 249 fDirectStateAccessSupport = ctxInfo.hasExtension("GL_EXT_direct_state_ac
cess"); |
| 250 } else { |
| 251 fDirectStateAccessSupport = false; |
| 252 } |
| 253 |
| 254 if (kGL_GrGLStandard == standard && version >= GR_GL_VER(4,3)) { |
| 255 fDebugSupport = true; |
| 256 } else { |
| 257 fDebugSupport = ctxInfo.hasExtension("GL_KHR_debug"); |
| 258 } |
| 259 |
233 if (kGL_GrGLStandard == standard) { | 260 if (kGL_GrGLStandard == standard) { |
234 fES2CompatibilitySupport = ctxInfo.hasExtension("GL_ARB_ES2_compatibilit
y"); | 261 fES2CompatibilitySupport = ctxInfo.hasExtension("GL_ARB_ES2_compatibilit
y"); |
235 } | 262 } |
236 else { | 263 else { |
237 fES2CompatibilitySupport = true; | 264 fES2CompatibilitySupport = true; |
238 } | 265 } |
239 | 266 |
240 if (kGL_GrGLStandard == standard) { | 267 if (kGL_GrGLStandard == standard) { |
241 fMultisampleDisableSupport = true; | 268 fMultisampleDisableSupport = true; |
242 } else { | 269 } else { |
243 fMultisampleDisableSupport = false; | 270 fMultisampleDisableSupport = false; |
244 } | 271 } |
245 | 272 |
246 /************************************************************************** | 273 /************************************************************************** |
247 * GrShaderCaps fields | 274 * GrShaderCaps fields |
248 **************************************************************************/ | 275 **************************************************************************/ |
249 | 276 |
250 glslCaps->fPathRenderingSupport = ctxInfo.hasExtension("GL_NV_path_rendering
"); | 277 glslCaps->fPathRenderingSupport = ctxInfo.hasExtension("GL_NV_path_rendering
"); |
251 | 278 |
252 if (glslCaps->fPathRenderingSupport) { | 279 if (glslCaps->fPathRenderingSupport) { |
253 if (kGL_GrGLStandard == standard) { | 280 if (kGL_GrGLStandard == standard) { |
254 // We only support v1.3+ of GL_NV_path_rendering which allows us to | 281 // We only support v1.3+ of GL_NV_path_rendering which allows us to |
255 // set individual fragment inputs with ProgramPathFragmentInputGen.
The API | 282 // set individual fragment inputs with ProgramPathFragmentInputGen.
The API |
256 // additions are detected by checking the existence of the function. | 283 // additions are detected by checking the existence of the function. |
257 glslCaps->fPathRenderingSupport = | 284 glslCaps->fPathRenderingSupport = ((ctxInfo.version() >= GR_GL_VER(4
, 3) || |
258 ctxInfo.hasExtension("GL_EXT_direct_state_access") && | |
259 ((ctxInfo.version() >= GR_GL_VER(4, 3) || | |
260 ctxInfo.hasExtension("GL_ARB_program_interface_query")) && | 285 ctxInfo.hasExtension("GL_ARB_program_interface_query")) && |
261 gli->fFunctions.fProgramPathFragmentInputGen); | 286 gli->fFunctions.fProgramPathFragmentInputGen); |
262 } | 287 } |
263 else { | 288 else { |
264 glslCaps->fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3,
1); | 289 glslCaps->fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3,
1); |
265 } | 290 } |
266 } | 291 } |
267 | 292 |
268 // For now these two are equivalent but we could have dst read in shader via
some other method | 293 // For now these two are equivalent but we could have dst read in shader via
some other method |
269 glslCaps->fDstReadInShaderSupport = glslCaps->fFBFetchSupport; | 294 glslCaps->fDstReadInShaderSupport = glslCaps->fFBFetchSupport; |
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 r.appendf("Pack Flip Y support: %s\n", (fPackFlipYSupport ? "YES": "NO")); | 1041 r.appendf("Pack Flip Y support: %s\n", (fPackFlipYSupport ? "YES": "NO")); |
1017 | 1042 |
1018 r.appendf("Texture Usage support: %s\n", (fTextureUsageSupport ? "YES": "NO"
)); | 1043 r.appendf("Texture Usage support: %s\n", (fTextureUsageSupport ? "YES": "NO"
)); |
1019 r.appendf("Texture Storage support: %s\n", (fTexStorageSupport ? "YES": "NO"
)); | 1044 r.appendf("Texture Storage support: %s\n", (fTexStorageSupport ? "YES": "NO"
)); |
1020 r.appendf("GL_R support: %s\n", (fTextureRedSupport ? "YES": "NO")); | 1045 r.appendf("GL_R support: %s\n", (fTextureRedSupport ? "YES": "NO")); |
1021 r.appendf("GL_ARB_imaging support: %s\n", (fImagingSupport ? "YES": "NO")); | 1046 r.appendf("GL_ARB_imaging support: %s\n", (fImagingSupport ? "YES": "NO")); |
1022 r.appendf("Two Format Limit: %s\n", (fTwoFormatLimit ? "YES": "NO")); | 1047 r.appendf("Two Format Limit: %s\n", (fTwoFormatLimit ? "YES": "NO")); |
1023 r.appendf("Fragment coord conventions support: %s\n", | 1048 r.appendf("Fragment coord conventions support: %s\n", |
1024 (fFragCoordsConventionSupport ? "YES": "NO")); | 1049 (fFragCoordsConventionSupport ? "YES": "NO")); |
1025 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ?
"YES": "NO")); | 1050 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ?
"YES": "NO")); |
| 1051 r.appendf("Instanced drawing support: %s\n", (fInstancedDrawingSupport ? "YE
S": "NO")); |
| 1052 r.appendf("Direct state access support: %s\n", (fDirectStateAccessSupport ?
"YES": "NO")); |
| 1053 r.appendf("Debug support: %s\n", (fDebugSupport ? "YES": "NO")); |
1026 r.appendf("Multisample disable support: %s\n", (fMultisampleDisableSupport ?
"YES" : "NO")); | 1054 r.appendf("Multisample disable support: %s\n", (fMultisampleDisableSupport ?
"YES" : "NO")); |
1027 r.appendf("Use non-VBO for dynamic data: %s\n", | 1055 r.appendf("Use non-VBO for dynamic data: %s\n", |
1028 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO")); | 1056 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO")); |
1029 r.appendf("Full screen clear is free: %s\n", (fFullClearIsFree ? "YES" : "NO
")); | 1057 r.appendf("Full screen clear is free: %s\n", (fFullClearIsFree ? "YES" : "NO
")); |
1030 return r; | 1058 return r; |
1031 } | 1059 } |
1032 | 1060 |
1033 ////////////////////////////////////////////////////////////////////////////////
//////////// | 1061 ////////////////////////////////////////////////////////////////////////////////
//////////// |
1034 | 1062 |
1035 GrGLSLCaps::GrGLSLCaps(const GrContextOptions& options, | 1063 GrGLSLCaps::GrGLSLCaps(const GrContextOptions& options, |
1036 const GrGLContextInfo& ctxInfo, | 1064 const GrGLContextInfo& ctxInfo, |
1037 const GrGLInterface* gli, | 1065 const GrGLInterface* gli, |
1038 const GrGLCaps& glCaps) { | 1066 const GrGLCaps& glCaps) { |
1039 fDropsTileOnZeroDivide = false; | 1067 fDropsTileOnZeroDivide = false; |
1040 fFBFetchSupport = false; | 1068 fFBFetchSupport = false; |
1041 fFBFetchNeedsCustomOutput = false; | 1069 fFBFetchNeedsCustomOutput = false; |
| 1070 fBindlessTextureSupport = false; |
1042 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; | 1071 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; |
1043 fFBFetchColorName = NULL; | 1072 fFBFetchColorName = NULL; |
1044 fFBFetchExtensionString = NULL; | 1073 fFBFetchExtensionString = NULL; |
1045 } | 1074 } |
1046 | 1075 |
1047 SkString GrGLSLCaps::dump() const { | 1076 SkString GrGLSLCaps::dump() const { |
1048 SkString r = INHERITED::dump(); | 1077 SkString r = INHERITED::dump(); |
1049 | 1078 |
1050 static const char* kAdvBlendEqInteractionStr[] = { | 1079 static const char* kAdvBlendEqInteractionStr[] = { |
1051 "Not Supported", | 1080 "Not Supported", |
1052 "Automatic", | 1081 "Automatic", |
1053 "General Enable", | 1082 "General Enable", |
1054 "Specific Enables", | 1083 "Specific Enables", |
1055 }; | 1084 }; |
1056 GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction); | 1085 GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction); |
1057 GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction); | 1086 GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction); |
1058 GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction); | 1087 GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction); |
1059 GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction); | 1088 GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction); |
1060 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlend
EqInteraction + 1); | 1089 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlend
EqInteraction + 1); |
1061 | 1090 |
1062 r.appendf("--- GLSL-Specific ---\n"); | 1091 r.appendf("--- GLSL-Specific ---\n"); |
1063 | 1092 |
1064 r.appendf("FB Fetch Support: %s\n", (fFBFetchSupport ? "YES" : "NO")); | 1093 r.appendf("FB Fetch Support: %s\n", (fFBFetchSupport ? "YES" : "NO")); |
1065 r.appendf("Drops tile on zero divide: %s\n", (fDropsTileOnZeroDivide ? "YES"
: "NO")); | 1094 r.appendf("Drops tile on zero divide: %s\n", (fDropsTileOnZeroDivide ? "YES"
: "NO")); |
| 1095 r.appendf("Bindless texture support: %s\n", (fBindlessTextureSupport ? "YES"
: "NO")); |
1066 r.appendf("Advanced blend equation interaction: %s\n", | 1096 r.appendf("Advanced blend equation interaction: %s\n", |
1067 kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]); | 1097 kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]); |
1068 return r; | 1098 return r; |
1069 } | 1099 } |
1070 | 1100 |
1071 static GrGLenum precision_to_gl_float_type(GrSLPrecision p) { | 1101 static GrGLenum precision_to_gl_float_type(GrSLPrecision p) { |
1072 switch (p) { | 1102 switch (p) { |
1073 case kLow_GrSLPrecision: | 1103 case kLow_GrSLPrecision: |
1074 return GR_GL_LOW_FLOAT; | 1104 return GR_GL_LOW_FLOAT; |
1075 case kMedium_GrSLPrecision: | 1105 case kMedium_GrSLPrecision: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 if (fGeometryShaderSupport) { | 1175 if (fGeometryShaderSupport) { |
1146 for (int p = 0; p < kGrSLPrecisionCount; ++p) { | 1176 for (int p = 0; p < kGrSLPrecisionCount; ++p) { |
1147 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert
ex_GrShaderType][p]; | 1177 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert
ex_GrShaderType][p]; |
1148 } | 1178 } |
1149 } | 1179 } |
1150 } | 1180 } |
1151 | 1181 |
1152 | 1182 |
1153 | 1183 |
1154 | 1184 |
OLD | NEW |