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 #include "GrGLContext.h" | 10 #include "GrGLContext.h" |
11 #include "SkTSearch.h" | 11 #include "SkTSearch.h" |
12 #include "SkTSort.h" | 12 #include "SkTSort.h" |
13 | 13 |
14 GrGLCaps::GrGLCaps() { | 14 GrGLCaps::GrGLCaps() { |
15 this->reset(); | 15 this->reset(); |
16 } | 16 } |
17 | 17 |
18 void GrGLCaps::reset() { | 18 void GrGLCaps::reset() { |
19 INHERITED::reset(); | 19 INHERITED::reset(); |
20 | 20 |
21 fVerifiedColorConfigs.reset(); | 21 fVerifiedColorConfigs.reset(); |
22 fStencilFormats.reset(); | 22 fStencilFormats.reset(); |
23 fStencilVerifiedColorConfigs.reset(); | 23 fStencilVerifiedColorConfigs.reset(); |
24 fMSFBOType = kNone_MSFBOType; | 24 fMSFBOType = kNone_MSFBOType; |
25 fFBFetchType = kNone_FBFetchType; | |
26 fInvalidateFBType = kNone_InvalidateFBType; | 25 fInvalidateFBType = kNone_InvalidateFBType; |
27 fLATCAlias = kLATC_LATCAlias; | 26 fLATCAlias = kLATC_LATCAlias; |
28 fMapBufferType = kNone_MapBufferType; | 27 fMapBufferType = kNone_MapBufferType; |
29 fMaxFragmentUniformVectors = 0; | 28 fMaxFragmentUniformVectors = 0; |
30 fMaxVertexAttributes = 0; | 29 fMaxVertexAttributes = 0; |
31 fMaxFragmentTextureUnits = 0; | 30 fMaxFragmentTextureUnits = 0; |
32 fMaxFixedFunctionTextureCoords = 0; | 31 fMaxFixedFunctionTextureCoords = 0; |
33 fRGBA8RenderbufferSupport = false; | 32 fRGBA8RenderbufferSupport = false; |
34 fBGRAIsInternalFormat = false; | 33 fBGRAIsInternalFormat = false; |
35 fTextureSwizzleSupport = false; | 34 fTextureSwizzleSupport = false; |
36 fUnpackRowLengthSupport = false; | 35 fUnpackRowLengthSupport = false; |
37 fUnpackFlipYSupport = false; | 36 fUnpackFlipYSupport = false; |
38 fPackRowLengthSupport = false; | 37 fPackRowLengthSupport = false; |
39 fPackFlipYSupport = false; | 38 fPackFlipYSupport = false; |
40 fTextureUsageSupport = false; | 39 fTextureUsageSupport = false; |
41 fTexStorageSupport = false; | 40 fTexStorageSupport = false; |
42 fTextureRedSupport = false; | 41 fTextureRedSupport = false; |
43 fImagingSupport = false; | 42 fImagingSupport = false; |
44 fTwoFormatLimit = false; | 43 fTwoFormatLimit = false; |
45 fFragCoordsConventionSupport = false; | 44 fFragCoordsConventionSupport = false; |
46 fVertexArrayObjectSupport = false; | 45 fVertexArrayObjectSupport = false; |
47 fUseNonVBOVertexAndIndexDynamicData = false; | 46 fUseNonVBOVertexAndIndexDynamicData = false; |
48 fIsCoreProfile = false; | 47 fIsCoreProfile = false; |
49 fFullClearIsFree = false; | 48 fFullClearIsFree = false; |
50 fDropsTileOnZeroDivide = false; | 49 fDropsTileOnZeroDivide = false; |
| 50 fFBFetchSupport = false; |
| 51 fFBFetchColorName = NULL; |
| 52 fFBFetchExtensionString = NULL; |
51 } | 53 } |
52 | 54 |
53 GrGLCaps::GrGLCaps(const GrGLCaps& caps) : GrDrawTargetCaps() { | 55 GrGLCaps::GrGLCaps(const GrGLCaps& caps) : GrDrawTargetCaps() { |
54 *this = caps; | 56 *this = caps; |
55 } | 57 } |
56 | 58 |
57 GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) { | 59 GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) { |
58 INHERITED::operator=(caps); | 60 INHERITED::operator=(caps); |
59 fVerifiedColorConfigs = caps.fVerifiedColorConfigs; | 61 fVerifiedColorConfigs = caps.fVerifiedColorConfigs; |
60 fStencilFormats = caps.fStencilFormats; | 62 fStencilFormats = caps.fStencilFormats; |
61 fStencilVerifiedColorConfigs = caps.fStencilVerifiedColorConfigs; | 63 fStencilVerifiedColorConfigs = caps.fStencilVerifiedColorConfigs; |
62 fLATCAlias = caps.fLATCAlias; | 64 fLATCAlias = caps.fLATCAlias; |
63 fMaxFragmentUniformVectors = caps.fMaxFragmentUniformVectors; | 65 fMaxFragmentUniformVectors = caps.fMaxFragmentUniformVectors; |
64 fMaxVertexAttributes = caps.fMaxVertexAttributes; | 66 fMaxVertexAttributes = caps.fMaxVertexAttributes; |
65 fMaxFragmentTextureUnits = caps.fMaxFragmentTextureUnits; | 67 fMaxFragmentTextureUnits = caps.fMaxFragmentTextureUnits; |
66 fMaxFixedFunctionTextureCoords = caps.fMaxFixedFunctionTextureCoords; | 68 fMaxFixedFunctionTextureCoords = caps.fMaxFixedFunctionTextureCoords; |
67 fMSFBOType = caps.fMSFBOType; | 69 fMSFBOType = caps.fMSFBOType; |
68 fFBFetchType = caps.fFBFetchType; | |
69 fInvalidateFBType = caps.fInvalidateFBType; | 70 fInvalidateFBType = caps.fInvalidateFBType; |
70 fMapBufferType = caps.fMapBufferType; | 71 fMapBufferType = caps.fMapBufferType; |
71 fRGBA8RenderbufferSupport = caps.fRGBA8RenderbufferSupport; | 72 fRGBA8RenderbufferSupport = caps.fRGBA8RenderbufferSupport; |
72 fBGRAIsInternalFormat = caps.fBGRAIsInternalFormat; | 73 fBGRAIsInternalFormat = caps.fBGRAIsInternalFormat; |
73 fTextureSwizzleSupport = caps.fTextureSwizzleSupport; | 74 fTextureSwizzleSupport = caps.fTextureSwizzleSupport; |
74 fUnpackRowLengthSupport = caps.fUnpackRowLengthSupport; | 75 fUnpackRowLengthSupport = caps.fUnpackRowLengthSupport; |
75 fUnpackFlipYSupport = caps.fUnpackFlipYSupport; | 76 fUnpackFlipYSupport = caps.fUnpackFlipYSupport; |
76 fPackRowLengthSupport = caps.fPackRowLengthSupport; | 77 fPackRowLengthSupport = caps.fPackRowLengthSupport; |
77 fPackFlipYSupport = caps.fPackFlipYSupport; | 78 fPackFlipYSupport = caps.fPackFlipYSupport; |
78 fTextureUsageSupport = caps.fTextureUsageSupport; | 79 fTextureUsageSupport = caps.fTextureUsageSupport; |
79 fTexStorageSupport = caps.fTexStorageSupport; | 80 fTexStorageSupport = caps.fTexStorageSupport; |
80 fTextureRedSupport = caps.fTextureRedSupport; | 81 fTextureRedSupport = caps.fTextureRedSupport; |
81 fImagingSupport = caps.fImagingSupport; | 82 fImagingSupport = caps.fImagingSupport; |
82 fTwoFormatLimit = caps.fTwoFormatLimit; | 83 fTwoFormatLimit = caps.fTwoFormatLimit; |
83 fFragCoordsConventionSupport = caps.fFragCoordsConventionSupport; | 84 fFragCoordsConventionSupport = caps.fFragCoordsConventionSupport; |
84 fVertexArrayObjectSupport = caps.fVertexArrayObjectSupport; | 85 fVertexArrayObjectSupport = caps.fVertexArrayObjectSupport; |
85 fUseNonVBOVertexAndIndexDynamicData = caps.fUseNonVBOVertexAndIndexDynamicDa
ta; | 86 fUseNonVBOVertexAndIndexDynamicData = caps.fUseNonVBOVertexAndIndexDynamicDa
ta; |
86 fIsCoreProfile = caps.fIsCoreProfile; | 87 fIsCoreProfile = caps.fIsCoreProfile; |
87 fFullClearIsFree = caps.fFullClearIsFree; | 88 fFullClearIsFree = caps.fFullClearIsFree; |
88 fDropsTileOnZeroDivide = caps.fDropsTileOnZeroDivide; | 89 fDropsTileOnZeroDivide = caps.fDropsTileOnZeroDivide; |
| 90 fFBFetchSupport = caps.fFBFetchSupport; |
| 91 fFBFetchColorName = caps.fFBFetchColorName; |
| 92 fFBFetchExtensionString = caps.fFBFetchExtensionString; |
89 | 93 |
90 return *this; | 94 return *this; |
91 } | 95 } |
92 | 96 |
93 bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { | 97 bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |
94 | 98 |
95 this->reset(); | 99 this->reset(); |
96 if (!ctxInfo.isInitialized()) { | 100 if (!ctxInfo.isInitialized()) { |
97 return false; | 101 return false; |
98 } | 102 } |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 if (kGL_GrGLStandard == standard) { | 230 if (kGL_GrGLStandard == standard) { |
227 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || | 231 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || |
228 ctxInfo.hasExtension("GL_ARB_vertex_array_ob
ject"); | 232 ctxInfo.hasExtension("GL_ARB_vertex_array_ob
ject"); |
229 } else { | 233 } else { |
230 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || | 234 fVertexArrayObjectSupport = version >= GR_GL_VER(3, 0) || |
231 ctxInfo.hasExtension("GL_OES_vertex_array_ob
ject"); | 235 ctxInfo.hasExtension("GL_OES_vertex_array_ob
ject"); |
232 } | 236 } |
233 | 237 |
234 if (kGLES_GrGLStandard == standard) { | 238 if (kGLES_GrGLStandard == standard) { |
235 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { | 239 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) { |
236 fFBFetchType = kEXT_FBFetchType; | 240 fFBFetchSupport = true; |
| 241 fFBFetchColorName = "gl_LastFragData[0]"; |
| 242 fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch"; |
237 } else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) { | 243 } else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) { |
238 fFBFetchType = kNV_FBFetchType; | 244 fFBFetchSupport = true; |
| 245 fFBFetchColorName = "gl_LastFragData[0]"; |
| 246 fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch"; |
| 247 } else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) { |
| 248 // The arm extension also requires an additional flag which we will
set onResetContext |
| 249 // This is all temporary. |
| 250 fFBFetchSupport = true; |
| 251 fFBFetchColorName = "gl_LastFragColorARM"; |
| 252 fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch"; |
239 } | 253 } |
240 } | 254 } |
241 | 255 |
242 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero
in a shader | 256 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero
in a shader |
243 fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor(); | 257 fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor(); |
244 | 258 |
245 this->initFSAASupport(ctxInfo, gli); | 259 this->initFSAASupport(ctxInfo, gli); |
246 this->initStencilFormats(ctxInfo); | 260 this->initStencilFormats(ctxInfo); |
247 | 261 |
248 /************************************************************************** | 262 /************************************************************************** |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 ctxInfo.hasExtension("GL_ARB_program_interface_query")) && | 342 ctxInfo.hasExtension("GL_ARB_program_interface_query")) && |
329 NULL != gli->fFunctions.fProgramPathFragmentInputGen)); | 343 NULL != gli->fFunctions.fProgramPathFragmentInputGen)); |
330 } else { | 344 } else { |
331 // Note: path rendering is not yet implemented for GLES. | 345 // Note: path rendering is not yet implemented for GLES. |
332 fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3,1) && false
; | 346 fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3,1) && false
; |
333 } | 347 } |
334 } | 348 } |
335 | 349 |
336 fGpuTracingSupport = ctxInfo.hasExtension("GL_EXT_debug_marker"); | 350 fGpuTracingSupport = ctxInfo.hasExtension("GL_EXT_debug_marker"); |
337 | 351 |
338 fDstReadInShaderSupport = kNone_FBFetchType != fFBFetchType; | 352 // For now these two are equivalent but we could have dst read in shader via
some other method |
| 353 fDstReadInShaderSupport = fFBFetchSupport; |
339 | 354 |
340 // Disable scratch texture reuse on Mali and Adreno devices | 355 // Disable scratch texture reuse on Mali and Adreno devices |
341 fReuseScratchTextures = kARM_GrGLVendor != ctxInfo.vendor() && | 356 fReuseScratchTextures = kARM_GrGLVendor != ctxInfo.vendor() && |
342 kQualcomm_GrGLVendor != ctxInfo.vendor(); | 357 kQualcomm_GrGLVendor != ctxInfo.vendor(); |
343 | 358 |
344 // Enable supported shader-related caps | 359 // Enable supported shader-related caps |
345 if (kGL_GrGLStandard == standard) { | 360 if (kGL_GrGLStandard == standard) { |
346 fDualSourceBlendingSupport = ctxInfo.version() >= GR_GL_VER(3,3) || | 361 fDualSourceBlendingSupport = ctxInfo.version() >= GR_GL_VER(3,3) || |
347 ctxInfo.hasExtension("GL_ARB_blend_func_ext
ended"); | 362 ctxInfo.hasExtension("GL_ARB_blend_func_ext
ended"); |
348 fShaderDerivativeSupport = true; | 363 fShaderDerivativeSupport = true; |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 }; | 783 }; |
769 GR_STATIC_ASSERT(0 == kNone_MSFBOType); | 784 GR_STATIC_ASSERT(0 == kNone_MSFBOType); |
770 GR_STATIC_ASSERT(1 == kDesktop_ARB_MSFBOType); | 785 GR_STATIC_ASSERT(1 == kDesktop_ARB_MSFBOType); |
771 GR_STATIC_ASSERT(2 == kDesktop_EXT_MSFBOType); | 786 GR_STATIC_ASSERT(2 == kDesktop_EXT_MSFBOType); |
772 GR_STATIC_ASSERT(3 == kES_3_0_MSFBOType); | 787 GR_STATIC_ASSERT(3 == kES_3_0_MSFBOType); |
773 GR_STATIC_ASSERT(4 == kES_Apple_MSFBOType); | 788 GR_STATIC_ASSERT(4 == kES_Apple_MSFBOType); |
774 GR_STATIC_ASSERT(5 == kES_IMG_MsToTexture_MSFBOType); | 789 GR_STATIC_ASSERT(5 == kES_IMG_MsToTexture_MSFBOType); |
775 GR_STATIC_ASSERT(6 == kES_EXT_MsToTexture_MSFBOType); | 790 GR_STATIC_ASSERT(6 == kES_EXT_MsToTexture_MSFBOType); |
776 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMSFBOExtStr) == kLast_MSFBOType + 1); | 791 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMSFBOExtStr) == kLast_MSFBOType + 1); |
777 | 792 |
778 static const char* kFBFetchTypeStr[] = { | |
779 "None", | |
780 "EXT", | |
781 "NV", | |
782 }; | |
783 GR_STATIC_ASSERT(0 == kNone_FBFetchType); | |
784 GR_STATIC_ASSERT(1 == kEXT_FBFetchType); | |
785 GR_STATIC_ASSERT(2 == kNV_FBFetchType); | |
786 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kFBFetchTypeStr) == kLast_FBFetchType + 1); | |
787 | |
788 static const char* kInvalidateFBTypeStr[] = { | 793 static const char* kInvalidateFBTypeStr[] = { |
789 "None", | 794 "None", |
790 "Discard", | 795 "Discard", |
791 "Invalidate", | 796 "Invalidate", |
792 }; | 797 }; |
793 GR_STATIC_ASSERT(0 == kNone_InvalidateFBType); | 798 GR_STATIC_ASSERT(0 == kNone_InvalidateFBType); |
794 GR_STATIC_ASSERT(1 == kDiscard_InvalidateFBType); | 799 GR_STATIC_ASSERT(1 == kDiscard_InvalidateFBType); |
795 GR_STATIC_ASSERT(2 == kInvalidate_InvalidateFBType); | 800 GR_STATIC_ASSERT(2 == kInvalidate_InvalidateFBType); |
796 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kInvalidateFBTypeStr) == kLast_InvalidateFBT
ype + 1); | 801 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kInvalidateFBTypeStr) == kLast_InvalidateFBT
ype + 1); |
797 | 802 |
798 static const char* kMapBufferTypeStr[] = { | 803 static const char* kMapBufferTypeStr[] = { |
799 "None", | 804 "None", |
800 "MapBuffer", | 805 "MapBuffer", |
801 "MapBufferRange", | 806 "MapBufferRange", |
802 "Chromium", | 807 "Chromium", |
803 }; | 808 }; |
804 GR_STATIC_ASSERT(0 == kNone_MapBufferType); | 809 GR_STATIC_ASSERT(0 == kNone_MapBufferType); |
805 GR_STATIC_ASSERT(1 == kMapBuffer_MapBufferType); | 810 GR_STATIC_ASSERT(1 == kMapBuffer_MapBufferType); |
806 GR_STATIC_ASSERT(2 == kMapBufferRange_MapBufferType); | 811 GR_STATIC_ASSERT(2 == kMapBufferRange_MapBufferType); |
807 GR_STATIC_ASSERT(3 == kChromium_MapBufferType); | 812 GR_STATIC_ASSERT(3 == kChromium_MapBufferType); |
808 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMapBufferTypeStr) == kLast_MapBufferType +
1); | 813 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMapBufferTypeStr) == kLast_MapBufferType +
1); |
809 | 814 |
810 r.appendf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO")); | 815 r.appendf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO")); |
811 r.appendf("MSAA Type: %s\n", kMSFBOExtStr[fMSFBOType]); | 816 r.appendf("MSAA Type: %s\n", kMSFBOExtStr[fMSFBOType]); |
812 r.appendf("FB Fetch Type: %s\n", kFBFetchTypeStr[fFBFetchType]); | 817 r.appendf("FB Fetch Support: %s\n", (fFBFetchSupport ? "YES" : "NO")); |
813 r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType
]); | 818 r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType
]); |
814 r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]); | 819 r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]); |
815 r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors); | 820 r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors); |
816 r.appendf("Max FS Texture Units: %d\n", fMaxFragmentTextureUnits); | 821 r.appendf("Max FS Texture Units: %d\n", fMaxFragmentTextureUnits); |
817 if (!fIsCoreProfile) { | 822 if (!fIsCoreProfile) { |
818 r.appendf("Max Fixed Function Texture Coords: %d\n", fMaxFixedFunctionTe
xtureCoords); | 823 r.appendf("Max Fixed Function Texture Coords: %d\n", fMaxFixedFunctionTe
xtureCoords); |
819 } | 824 } |
820 r.appendf("Max Vertex Attributes: %d\n", fMaxVertexAttributes); | 825 r.appendf("Max Vertex Attributes: %d\n", fMaxVertexAttributes); |
821 r.appendf("Support RGBA8 Render Buffer: %s\n", (fRGBA8RenderbufferSupport ?
"YES": "NO")); | 826 r.appendf("Support RGBA8 Render Buffer: %s\n", (fRGBA8RenderbufferSupport ?
"YES": "NO")); |
822 r.appendf("BGRA is an internal format: %s\n", (fBGRAIsInternalFormat ? "YES"
: "NO")); | 827 r.appendf("BGRA is an internal format: %s\n", (fBGRAIsInternalFormat ? "YES"
: "NO")); |
(...skipping 10 matching lines...) Expand all Loading... |
833 r.appendf("Two Format Limit: %s\n", (fTwoFormatLimit ? "YES": "NO")); | 838 r.appendf("Two Format Limit: %s\n", (fTwoFormatLimit ? "YES": "NO")); |
834 r.appendf("Fragment coord conventions support: %s\n", | 839 r.appendf("Fragment coord conventions support: %s\n", |
835 (fFragCoordsConventionSupport ? "YES": "NO")); | 840 (fFragCoordsConventionSupport ? "YES": "NO")); |
836 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ?
"YES": "NO")); | 841 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ?
"YES": "NO")); |
837 r.appendf("Use non-VBO for dynamic data: %s\n", | 842 r.appendf("Use non-VBO for dynamic data: %s\n", |
838 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO")); | 843 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO")); |
839 r.appendf("Full screen clear is free: %s\n", (fFullClearIsFree ? "YES" : "NO
")); | 844 r.appendf("Full screen clear is free: %s\n", (fFullClearIsFree ? "YES" : "NO
")); |
840 r.appendf("Drops tile on zero divide: %s\n", (fDropsTileOnZeroDivide ? "YES"
: "NO")); | 845 r.appendf("Drops tile on zero divide: %s\n", (fDropsTileOnZeroDivide ? "YES"
: "NO")); |
841 return r; | 846 return r; |
842 } | 847 } |
OLD | NEW |