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 |
11 #include "GrGLContext.h" | 11 #include "GrGLContext.h" |
12 #include "SkTSearch.h" | 12 #include "SkTSearch.h" |
13 #include "SkTSort.h" | 13 #include "SkTSort.h" |
14 | 14 |
15 GrGLCaps::GrGLCaps() { | 15 GrGLCaps::GrGLCaps(const GrGLContextInfo& ctxInfo, const GrGLInterface* glInterf
ace) { |
16 this->reset(); | |
17 } | |
18 | |
19 void GrGLCaps::reset() { | |
20 INHERITED::reset(); | |
21 | |
22 fVerifiedColorConfigs.reset(); | 16 fVerifiedColorConfigs.reset(); |
23 fStencilFormats.reset(); | 17 fStencilFormats.reset(); |
24 fStencilVerifiedColorConfigs.reset(); | 18 fStencilVerifiedColorConfigs.reset(); |
25 fMSFBOType = kNone_MSFBOType; | 19 fMSFBOType = kNone_MSFBOType; |
26 fInvalidateFBType = kNone_InvalidateFBType; | 20 fInvalidateFBType = kNone_InvalidateFBType; |
27 fLATCAlias = kLATC_LATCAlias; | 21 fLATCAlias = kLATC_LATCAlias; |
28 fMapBufferType = kNone_MapBufferType; | 22 fMapBufferType = kNone_MapBufferType; |
29 fMaxFragmentUniformVectors = 0; | 23 fMaxFragmentUniformVectors = 0; |
30 fMaxVertexAttributes = 0; | 24 fMaxVertexAttributes = 0; |
31 fMaxFragmentTextureUnits = 0; | 25 fMaxFragmentTextureUnits = 0; |
(...skipping 12 matching lines...) Expand all Loading... |
44 fFragCoordsConventionSupport = false; | 38 fFragCoordsConventionSupport = false; |
45 fVertexArrayObjectSupport = false; | 39 fVertexArrayObjectSupport = false; |
46 fES2CompatibilitySupport = false; | 40 fES2CompatibilitySupport = false; |
47 fMultisampleDisableSupport = false; | 41 fMultisampleDisableSupport = false; |
48 fUseNonVBOVertexAndIndexDynamicData = false; | 42 fUseNonVBOVertexAndIndexDynamicData = false; |
49 fIsCoreProfile = false; | 43 fIsCoreProfile = false; |
50 fFullClearIsFree = false; | 44 fFullClearIsFree = false; |
51 | 45 |
52 fReadPixelsSupportedCache.reset(); | 46 fReadPixelsSupportedCache.reset(); |
53 | 47 |
54 fShaderCaps.reset(SkNEW(GrGLSLCaps)); | 48 this->init(ctxInfo, glInterface); |
55 | 49 |
| 50 fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (ctxInfo, glInterface, *this))); |
56 } | 51 } |
57 | 52 |
58 GrGLCaps::GrGLCaps(const GrGLCaps& caps) : GrCaps() { | 53 void GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |
59 *this = caps; | |
60 } | |
61 | |
62 GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) { | |
63 INHERITED::operator=(caps); | |
64 fVerifiedColorConfigs = caps.fVerifiedColorConfigs; | |
65 fStencilFormats = caps.fStencilFormats; | |
66 fStencilVerifiedColorConfigs = caps.fStencilVerifiedColorConfigs; | |
67 fLATCAlias = caps.fLATCAlias; | |
68 fMaxFragmentUniformVectors = caps.fMaxFragmentUniformVectors; | |
69 fMaxVertexAttributes = caps.fMaxVertexAttributes; | |
70 fMaxFragmentTextureUnits = caps.fMaxFragmentTextureUnits; | |
71 fMSFBOType = caps.fMSFBOType; | |
72 fInvalidateFBType = caps.fInvalidateFBType; | |
73 fMapBufferType = caps.fMapBufferType; | |
74 fRGBA8RenderbufferSupport = caps.fRGBA8RenderbufferSupport; | |
75 fBGRAIsInternalFormat = caps.fBGRAIsInternalFormat; | |
76 fTextureSwizzleSupport = caps.fTextureSwizzleSupport; | |
77 fUnpackRowLengthSupport = caps.fUnpackRowLengthSupport; | |
78 fUnpackFlipYSupport = caps.fUnpackFlipYSupport; | |
79 fPackRowLengthSupport = caps.fPackRowLengthSupport; | |
80 fPackFlipYSupport = caps.fPackFlipYSupport; | |
81 fTextureUsageSupport = caps.fTextureUsageSupport; | |
82 fTexStorageSupport = caps.fTexStorageSupport; | |
83 fTextureRedSupport = caps.fTextureRedSupport; | |
84 fImagingSupport = caps.fImagingSupport; | |
85 fTwoFormatLimit = caps.fTwoFormatLimit; | |
86 fFragCoordsConventionSupport = caps.fFragCoordsConventionSupport; | |
87 fVertexArrayObjectSupport = caps.fVertexArrayObjectSupport; | |
88 fES2CompatibilitySupport = caps.fES2CompatibilitySupport; | |
89 fMultisampleDisableSupport = caps.fMultisampleDisableSupport; | |
90 fUseNonVBOVertexAndIndexDynamicData = caps.fUseNonVBOVertexAndIndexDynamicDa
ta; | |
91 fIsCoreProfile = caps.fIsCoreProfile; | |
92 fFullClearIsFree = caps.fFullClearIsFree; | |
93 | |
94 *(reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get())) = | |
95 *(reinterpret_cast<GrGLSLCaps*>(caps.f
ShaderCaps.get())); | |
96 | |
97 return *this; | |
98 } | |
99 | |
100 bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { | |
101 | |
102 this->reset(); | |
103 if (!ctxInfo.isInitialized()) { | |
104 return false; | |
105 } | |
106 | |
107 GrGLStandard standard = ctxInfo.standard(); | 54 GrGLStandard standard = ctxInfo.standard(); |
108 GrGLVersion version = ctxInfo.version(); | 55 GrGLVersion version = ctxInfo.version(); |
109 | 56 |
110 /************************************************************************** | 57 /************************************************************************** |
111 * Caps specific to GrGLCaps | 58 * Caps specific to GrGLCaps |
112 **************************************************************************/ | 59 **************************************************************************/ |
113 | 60 |
114 if (kGLES_GrGLStandard == standard) { | 61 if (kGLES_GrGLStandard == standard) { |
115 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, | 62 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, |
116 &fMaxFragmentUniformVectors); | 63 &fMaxFragmentUniformVectors); |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 } else { | 315 } else { |
369 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object")); | 316 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object")); |
370 } | 317 } |
371 } else { | 318 } else { |
372 // ES 3.0 supports mixed size FBO attachments, 2.0 does not. | 319 // ES 3.0 supports mixed size FBO attachments, 2.0 does not. |
373 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0); | 320 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0); |
374 } | 321 } |
375 | 322 |
376 this->initConfigTexturableTable(ctxInfo, gli); | 323 this->initConfigTexturableTable(ctxInfo, gli); |
377 this->initConfigRenderableTable(ctxInfo); | 324 this->initConfigRenderableTable(ctxInfo); |
378 | |
379 reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get())->init(ctxInfo, gli, *this); | |
380 | |
381 return true; | |
382 } | 325 } |
383 | 326 |
384 void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { | 327 void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { |
385 // OpenGL < 3.0 | 328 // OpenGL < 3.0 |
386 // no support for render targets unless the GL_ARB_framebuffer_object | 329 // no support for render targets unless the GL_ARB_framebuffer_object |
387 // extension is supported (in which case we get ALPHA, RED, RG, RGB, | 330 // extension is supported (in which case we get ALPHA, RED, RG, RGB, |
388 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we | 331 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we |
389 // probably don't get R8 in this case. | 332 // probably don't get R8 in this case. |
390 | 333 |
391 // OpenGL 3.0 | 334 // OpenGL 3.0 |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ?
"YES": "NO")); | 884 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ?
"YES": "NO")); |
942 r.appendf("Multisample disable support: %s\n", (fMultisampleDisableSupport ?
"YES" : "NO")); | 885 r.appendf("Multisample disable support: %s\n", (fMultisampleDisableSupport ?
"YES" : "NO")); |
943 r.appendf("Use non-VBO for dynamic data: %s\n", | 886 r.appendf("Use non-VBO for dynamic data: %s\n", |
944 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO")); | 887 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO")); |
945 r.appendf("Full screen clear is free: %s\n", (fFullClearIsFree ? "YES" : "NO
")); | 888 r.appendf("Full screen clear is free: %s\n", (fFullClearIsFree ? "YES" : "NO
")); |
946 return r; | 889 return r; |
947 } | 890 } |
948 | 891 |
949 ////////////////////////////////////////////////////////////////////////////////
//////////// | 892 ////////////////////////////////////////////////////////////////////////////////
//////////// |
950 | 893 |
951 GrGLSLCaps::GrGLSLCaps() { | 894 GrGLSLCaps::GrGLSLCaps(const GrGLContextInfo& ctxInfo, |
952 this->reset(); | 895 const GrGLInterface* gli, |
953 } | 896 const GrGLCaps& glCaps) { |
954 | |
955 | |
956 void GrGLSLCaps::reset() { | |
957 INHERITED::reset(); | |
958 | |
959 fDropsTileOnZeroDivide = false; | 897 fDropsTileOnZeroDivide = false; |
960 fFBFetchSupport = false; | 898 fFBFetchSupport = false; |
961 fFBFetchNeedsCustomOutput = false; | 899 fFBFetchNeedsCustomOutput = false; |
962 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; | 900 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; |
963 fFBFetchColorName = NULL; | 901 fFBFetchColorName = NULL; |
964 fFBFetchExtensionString = NULL; | 902 fFBFetchExtensionString = NULL; |
| 903 this->init(ctxInfo, gli, glCaps); |
965 } | 904 } |
966 | 905 |
967 GrGLSLCaps::GrGLSLCaps(const GrGLSLCaps& caps) : GrShaderCaps() { | 906 void GrGLSLCaps::init(const GrGLContextInfo& ctxInfo, |
968 *this = caps; | |
969 } | |
970 | |
971 GrGLSLCaps& GrGLSLCaps::operator= (const GrGLSLCaps& caps) { | |
972 INHERITED::operator=(caps); | |
973 fDropsTileOnZeroDivide = caps.fDropsTileOnZeroDivide; | |
974 fFBFetchSupport = caps.fFBFetchSupport; | |
975 fFBFetchNeedsCustomOutput = caps.fFBFetchNeedsCustomOutput; | |
976 fAdvBlendEqInteraction = caps.fAdvBlendEqInteraction; | |
977 fFBFetchColorName = caps.fFBFetchColorName; | |
978 fFBFetchExtensionString = caps.fFBFetchExtensionString; | |
979 | |
980 return *this; | |
981 } | |
982 | |
983 bool GrGLSLCaps::init(const GrGLContextInfo& ctxInfo, | |
984 const GrGLInterface* gli, | 907 const GrGLInterface* gli, |
985 const GrGLCaps& glCaps) { | 908 const GrGLCaps& glCaps) { |
986 this->reset(); | |
987 if (!ctxInfo.isInitialized()) { | |
988 return false; | |
989 } | |
990 | |
991 GrGLStandard standard = ctxInfo.standard(); | 909 GrGLStandard standard = ctxInfo.standard(); |
992 GrGLVersion version = ctxInfo.version(); | 910 GrGLVersion version = ctxInfo.version(); |
993 | 911 |
994 /************************************************************************** | 912 /************************************************************************** |
995 * Caps specific to GrGLSLCaps | 913 * Caps specific to GrGLSLCaps |
996 **************************************************************************/ | 914 **************************************************************************/ |
997 | 915 |
998 if (kGLES_GrGLStandard == standard) { | 916 if (kGLES_GrGLStandard == standard) { |
999 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { | 917 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { |
1000 fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0)); | 918 fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0)); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 : "GL_NV_blend_equation_advanced")) { | 992 : "GL_NV_blend_equation_advanced")) { |
1075 fAdvBlendEqInteraction = kAutomatic_AdvBlendEqInteraction; | 993 fAdvBlendEqInteraction = kAutomatic_AdvBlendEqInteraction; |
1076 } else { | 994 } else { |
1077 fAdvBlendEqInteraction = kGeneralEnable_AdvBlendEqInteraction; | 995 fAdvBlendEqInteraction = kGeneralEnable_AdvBlendEqInteraction; |
1078 // TODO: Use the following on any platform where "blend_support_all_
equations" is slow. | 996 // TODO: Use the following on any platform where "blend_support_all_
equations" is slow. |
1079 //fAdvBlendEqInteraction = kSpecificEnables_AdvBlendEqInteraction; | 997 //fAdvBlendEqInteraction = kSpecificEnables_AdvBlendEqInteraction; |
1080 } | 998 } |
1081 } | 999 } |
1082 | 1000 |
1083 this->initShaderPrecisionTable(ctxInfo, gli); | 1001 this->initShaderPrecisionTable(ctxInfo, gli); |
1084 | |
1085 return true; | |
1086 } | 1002 } |
1087 | 1003 |
1088 SkString GrGLSLCaps::dump() const { | 1004 SkString GrGLSLCaps::dump() const { |
1089 SkString r = INHERITED::dump(); | 1005 SkString r = INHERITED::dump(); |
1090 | 1006 |
1091 static const char* kAdvBlendEqInteractionStr[] = { | 1007 static const char* kAdvBlendEqInteractionStr[] = { |
1092 "Not Supported", | 1008 "Not Supported", |
1093 "Automatic", | 1009 "Automatic", |
1094 "General Enable", | 1010 "General Enable", |
1095 "Specific Enables", | 1011 "Specific Enables", |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1186 if (fGeometryShaderSupport) { | 1102 if (fGeometryShaderSupport) { |
1187 for (int p = 0; p < kGrSLPrecisionCount; ++p) { | 1103 for (int p = 0; p < kGrSLPrecisionCount; ++p) { |
1188 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert
ex_GrShaderType][p]; | 1104 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert
ex_GrShaderType][p]; |
1189 } | 1105 } |
1190 } | 1106 } |
1191 } | 1107 } |
1192 | 1108 |
1193 | 1109 |
1194 | 1110 |
1195 | 1111 |
OLD | NEW |