Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: src/gpu/gl/GrGLCaps.cpp

Issue 1563443002: Move config texturability/renderability to config table (Closed) Base URL: https://skia.googlesource.com/skia.git@readpixformat
Patch Set: whitespace cleanup Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/gl/GrGLCaps.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "GrContextOptions.h" 11 #include "GrContextOptions.h"
12 #include "GrGLContext.h" 12 #include "GrGLContext.h"
13 #include "glsl/GrGLSLCaps.h" 13 #include "glsl/GrGLSLCaps.h"
14 #include "SkTSearch.h" 14 #include "SkTSearch.h"
15 #include "SkTSort.h" 15 #include "SkTSort.h"
16 16
17 GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, 17 GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions,
18 const GrGLContextInfo& ctxInfo, 18 const GrGLContextInfo& ctxInfo,
19 const GrGLInterface* glInterface) : INHERITED(contextOptions) { 19 const GrGLInterface* glInterface) : INHERITED(contextOptions) {
20 fStencilFormats.reset(); 20 fStencilFormats.reset();
21 fMSFBOType = kNone_MSFBOType; 21 fMSFBOType = kNone_MSFBOType;
22 fInvalidateFBType = kNone_InvalidateFBType; 22 fInvalidateFBType = kNone_InvalidateFBType;
23 fLATCAlias = kLATC_LATCAlias;
24 fMapBufferType = kNone_MapBufferType; 23 fMapBufferType = kNone_MapBufferType;
25 fTransferBufferType = kNone_TransferBufferType; 24 fTransferBufferType = kNone_TransferBufferType;
26 fMaxFragmentUniformVectors = 0; 25 fMaxFragmentUniformVectors = 0;
27 fMaxVertexAttributes = 0; 26 fMaxVertexAttributes = 0;
28 fMaxFragmentTextureUnits = 0; 27 fMaxFragmentTextureUnits = 0;
29 fRGBA8RenderbufferSupport = false;
30 fBGRAIsInternalFormat = false;
31 fUnpackRowLengthSupport = false; 28 fUnpackRowLengthSupport = false;
32 fUnpackFlipYSupport = false; 29 fUnpackFlipYSupport = false;
33 fPackRowLengthSupport = false; 30 fPackRowLengthSupport = false;
34 fPackFlipYSupport = false; 31 fPackFlipYSupport = false;
35 fTextureUsageSupport = false; 32 fTextureUsageSupport = false;
36 fTexStorageSupport = false; 33 fTexStorageSupport = false;
37 fTextureRedSupport = false; 34 fTextureRedSupport = false;
38 fImagingSupport = false; 35 fImagingSupport = false;
39 fVertexArrayObjectSupport = false; 36 fVertexArrayObjectSupport = false;
40 fDirectStateAccessSupport = false; 37 fDirectStateAccessSupport = false;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 if (version >= GR_GL_VER(3, 2)) { 72 if (version >= GR_GL_VER(3, 2)) {
76 GrGLint profileMask; 73 GrGLint profileMask;
77 GR_GL_GetIntegerv(gli, GR_GL_CONTEXT_PROFILE_MASK, &profileMask); 74 GR_GL_GetIntegerv(gli, GR_GL_CONTEXT_PROFILE_MASK, &profileMask);
78 fIsCoreProfile = SkToBool(profileMask & GR_GL_CONTEXT_CORE_PROFILE_B IT); 75 fIsCoreProfile = SkToBool(profileMask & GR_GL_CONTEXT_CORE_PROFILE_B IT);
79 } 76 }
80 } 77 }
81 GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_ATTRIBS, &fMaxVertexAttributes); 78 GR_GL_GetIntegerv(gli, GR_GL_MAX_VERTEX_ATTRIBS, &fMaxVertexAttributes);
82 GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &fMaxFragmentTextureUn its); 79 GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &fMaxFragmentTextureUn its);
83 80
84 if (kGL_GrGLStandard == standard) { 81 if (kGL_GrGLStandard == standard) {
85 fRGBA8RenderbufferSupport = true;
86 } else {
87 fRGBA8RenderbufferSupport = version >= GR_GL_VER(3,0) ||
88 ctxInfo.hasExtension("GL_OES_rgb8_rgba8") ||
89 ctxInfo.hasExtension("GL_ARM_rgba8");
90 }
91
92 if (kGL_GrGLStandard == standard) {
93 fUnpackRowLengthSupport = true; 82 fUnpackRowLengthSupport = true;
94 fUnpackFlipYSupport = false; 83 fUnpackFlipYSupport = false;
95 fPackRowLengthSupport = true; 84 fPackRowLengthSupport = true;
96 fPackFlipYSupport = false; 85 fPackFlipYSupport = false;
97 } else { 86 } else {
98 fUnpackRowLengthSupport = version >= GR_GL_VER(3,0) || 87 fUnpackRowLengthSupport = version >= GR_GL_VER(3,0) ||
99 ctxInfo.hasExtension("GL_EXT_unpack_subimage") ; 88 ctxInfo.hasExtension("GL_EXT_unpack_subimage") ;
100 fUnpackFlipYSupport = ctxInfo.hasExtension("GL_CHROMIUM_flipy"); 89 fUnpackFlipYSupport = ctxInfo.hasExtension("GL_CHROMIUM_flipy");
101 fPackRowLengthSupport = version >= GR_GL_VER(3,0) || 90 fPackRowLengthSupport = version >= GR_GL_VER(3,0) ||
102 ctxInfo.hasExtension("GL_NV_pack_subimage"); 91 ctxInfo.hasExtension("GL_NV_pack_subimage");
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 fTextureRedSupport = version >= GR_GL_VER(3,0) || 123 fTextureRedSupport = version >= GR_GL_VER(3,0) ||
135 ctxInfo.hasExtension("GL_ARB_texture_rg"); 124 ctxInfo.hasExtension("GL_ARB_texture_rg");
136 } else { 125 } else {
137 fTextureRedSupport = version >= GR_GL_VER(3,0) || 126 fTextureRedSupport = version >= GR_GL_VER(3,0) ||
138 ctxInfo.hasExtension("GL_EXT_texture_rg"); 127 ctxInfo.hasExtension("GL_EXT_texture_rg");
139 } 128 }
140 } 129 }
141 fImagingSupport = kGL_GrGLStandard == standard && 130 fImagingSupport = kGL_GrGLStandard == standard &&
142 ctxInfo.hasExtension("GL_ARB_imaging"); 131 ctxInfo.hasExtension("GL_ARB_imaging");
143 132
144 // We only enable srgb support if both textures and FBOs support srgb.
145 bool srgbSupport = false;
146 if (kGL_GrGLStandard == standard) {
147 if (ctxInfo.version() >= GR_GL_VER(3,0)) {
148 srgbSupport = true;
149 } else if (ctxInfo.hasExtension("GL_EXT_texture_sRGB")) {
150 if (ctxInfo.hasExtension("GL_ARB_framebuffer_sRGB") ||
151 ctxInfo.hasExtension("GL_EXT_framebuffer_sRGB")) {
152 srgbSupport = true;
153 }
154 }
155 // All the above srgb extensions support toggling srgb writes
156 fSRGBWriteControl = srgbSupport;
157 } else {
158 // See https://bug.skia.org/4148 for PowerVR issue.
159 srgbSupport = kPowerVRRogue_GrGLRenderer != ctxInfo.renderer() &&
160 (ctxInfo.version() >= GR_GL_VER(3,0) || ctxInfo.hasExtensi on("GL_EXT_sRGB"));
161 // ES through 3.1 requires EXT_srgb_write_control to support toggling
162 // sRGB writing for destinations.
163 fSRGBWriteControl = ctxInfo.hasExtension("GL_EXT_sRGB_write_control");
164 }
165
166 // SGX and Mali GPUs that are based on a tiled-deferred architecture that ha ve trouble with 133 // SGX and Mali GPUs that are based on a tiled-deferred architecture that ha ve trouble with
167 // frequently changing VBOs. We've measured a performance increase using non -VBO vertex 134 // frequently changing VBOs. We've measured a performance increase using non -VBO vertex
168 // data for dynamic content on these GPUs. Perhaps we should read the render er string and 135 // data for dynamic content on these GPUs. Perhaps we should read the render er string and
169 // limit this decision to specific GPU families rather than basing it on the vendor alone. 136 // limit this decision to specific GPU families rather than basing it on the vendor alone.
170 if (!GR_GL_MUST_USE_VBO && 137 if (!GR_GL_MUST_USE_VBO &&
171 (kARM_GrGLVendor == ctxInfo.vendor() || 138 (kARM_GrGLVendor == ctxInfo.vendor() ||
172 kImagination_GrGLVendor == ctxInfo.vendor() || 139 kImagination_GrGLVendor == ctxInfo.vendor() ||
173 kQualcomm_GrGLVendor == ctxInfo.vendor())) { 140 kQualcomm_GrGLVendor == ctxInfo.vendor())) {
174 fUseNonVBOVertexAndIndexDynamicData = true; 141 fUseNonVBOVertexAndIndexDynamicData = true;
175 } 142 }
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 version >= GR_GL_VER(3, 2) || 429 version >= GR_GL_VER(3, 2) ||
463 (ctxInfo.hasExtension("GL_ARB_draw_instanced") && 430 (ctxInfo.hasExtension("GL_ARB_draw_instanced") &&
464 ctxInfo.hasExtension("GL_ARB_instanced_arrays")); 431 ctxInfo.hasExtension("GL_ARB_instanced_arrays"));
465 } else { 432 } else {
466 fSupportsInstancedDraws = 433 fSupportsInstancedDraws =
467 version >= GR_GL_VER(3, 0) || 434 version >= GR_GL_VER(3, 0) ||
468 (ctxInfo.hasExtension("GL_EXT_draw_instanced") && 435 (ctxInfo.hasExtension("GL_EXT_draw_instanced") &&
469 ctxInfo.hasExtension("GL_EXT_instanced_arrays")); 436 ctxInfo.hasExtension("GL_EXT_instanced_arrays"));
470 } 437 }
471 438
472 this->initConfigTexturableTable(ctxInfo, gli, srgbSupport);
473 this->initConfigRenderableTable(ctxInfo, srgbSupport);
474 this->initShaderPrecisionTable(ctxInfo, gli, glslCaps); 439 this->initShaderPrecisionTable(ctxInfo, gli, glslCaps);
475 // Requires fTexutreSwizzleSupport and fTextureRedSupport to be set before t his point. 440 // Requires fTexutreSwizzleSupport and fTextureRedSupport to be set before t his point.
476 this->initConfigSwizzleTable(ctxInfo, glslCaps); 441 this->initConfigSwizzleTable(ctxInfo, glslCaps);
477 // Requires various members are already correctly initialized (e.g. fTexture RedSupport). 442 // Requires various members are already correctly initialized (e.g. fTexture RedSupport,
478 this->initConfigTable(ctxInfo); 443 // msaa support).
444 this->initConfigTable(ctxInfo, gli);
479 445
480 this->applyOptionsOverrides(contextOptions); 446 this->applyOptionsOverrides(contextOptions);
481 glslCaps->applyOptionsOverrides(contextOptions); 447 glslCaps->applyOptionsOverrides(contextOptions);
482 } 448 }
483 449
484 const char* get_glsl_version_decl_string(GrGLStandard standard, GrGLSLGeneration generation, 450 const char* get_glsl_version_decl_string(GrGLStandard standard, GrGLSLGeneration generation,
485 bool isCoreProfile) { 451 bool isCoreProfile) {
486 switch (generation) { 452 switch (generation) {
487 case k110_GrGLSLGeneration: 453 case k110_GrGLSLGeneration:
488 if (kGLES_GrGLStandard == standard) { 454 if (kGLES_GrGLStandard == standard) {
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 // them for consistency. 604 // them for consistency.
639 if (nullptr == gli->fFunctions.fStencilThenCoverFillPath || 605 if (nullptr == gli->fFunctions.fStencilThenCoverFillPath ||
640 nullptr == gli->fFunctions.fStencilThenCoverStrokePath || 606 nullptr == gli->fFunctions.fStencilThenCoverStrokePath ||
641 nullptr == gli->fFunctions.fStencilThenCoverFillPathInstanced || 607 nullptr == gli->fFunctions.fStencilThenCoverFillPathInstanced ||
642 nullptr == gli->fFunctions.fStencilThenCoverStrokePathInstanced || 608 nullptr == gli->fFunctions.fStencilThenCoverStrokePathInstanced ||
643 nullptr == gli->fFunctions.fProgramPathFragmentInputGen) { 609 nullptr == gli->fFunctions.fProgramPathFragmentInputGen) {
644 return false; 610 return false;
645 } 611 }
646 return true; 612 return true;
647 } 613 }
648
649 void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo, bool sr gbSupport) {
650 // OpenGL < 3.0
651 // no support for render targets unless the GL_ARB_framebuffer_object
652 // extension is supported (in which case we get ALPHA, RED, RG, RGB,
653 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we
654 // probably don't get R8 in this case.
655
656 // OpenGL 3.0
657 // base color renderable: ALPHA, RED, RG, RGB, and RGBA
658 // sized derivatives: ALPHA8, R8, RGBA4, RGBA8
659
660 // >= OpenGL 3.1
661 // base color renderable: RED, RG, RGB, and RGBA
662 // sized derivatives: R8, RGBA4, RGBA8
663 // if the GL_ARB_compatibility extension is supported then we get back
664 // support for GL_ALPHA and ALPHA8
665
666 // GL_EXT_bgra adds BGRA render targets to any version
667
668 // ES 2.0
669 // color renderable: RGBA4, RGB5_A1, RGB565
670 // GL_EXT_texture_rg adds support for R8 as a color render target
671 // GL_OES_rgb8_rgba8 and/or GL_ARM_rgba8 adds support for RGBA8
672 // GL_EXT_texture_format_BGRA8888 and/or GL_APPLE_texture_format_BGRA8888 a dded BGRA support
673
674 // ES 3.0
675 // Same as ES 2.0 except R8 and RGBA8 are supported without extensions (the functions called
676 // below already account for this).
677
678 GrGLStandard standard = ctxInfo.standard();
679
680 enum {
681 kNo_MSAA = 0,
682 kYes_MSAA = 1,
683 };
684
685 if (kGL_GrGLStandard == standard) {
686 // Post 3.0 we will get R8
687 // Prior to 3.0 we will get ALPHA8 (with GL_ARB_framebuffer_object)
688 if (ctxInfo.version() >= GR_GL_VER(3,0) ||
689 ctxInfo.hasExtension("GL_ARB_framebuffer_object")) {
690 fConfigRenderSupport[kAlpha_8_GrPixelConfig][kNo_MSAA] = true;
691 fConfigRenderSupport[kAlpha_8_GrPixelConfig][kYes_MSAA] = true;
692 }
693 } else {
694 // On ES we can only hope for R8
695 fConfigRenderSupport[kAlpha_8_GrPixelConfig][kNo_MSAA] = fTextureRedSupp ort;
696 fConfigRenderSupport[kAlpha_8_GrPixelConfig][kYes_MSAA] = fTextureRedSup port;
697 }
698
699 if (kGL_GrGLStandard != standard) {
700 // only available in ES
701 fConfigRenderSupport[kRGB_565_GrPixelConfig][kNo_MSAA] = true;
702 fConfigRenderSupport[kRGB_565_GrPixelConfig][kYes_MSAA] = true;
703 }
704
705 // we no longer support 444 as a render target
706 fConfigRenderSupport[kRGBA_4444_GrPixelConfig][kNo_MSAA] = false;
707 fConfigRenderSupport[kRGBA_4444_GrPixelConfig][kYes_MSAA] = false;
708
709 if (this->fRGBA8RenderbufferSupport) {
710 fConfigRenderSupport[kRGBA_8888_GrPixelConfig][kNo_MSAA] = true;
711 fConfigRenderSupport[kRGBA_8888_GrPixelConfig][kYes_MSAA] = true;
712 }
713
714 if (this->isConfigTexturable(kBGRA_8888_GrPixelConfig)) {
715 // On iOS, BGRA is not supported as a renderable target on ES 3.0+
716 if (!ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888") ||
717 ctxInfo.version() < GR_GL_VER(3,0)) {
718 fConfigRenderSupport[kBGRA_8888_GrPixelConfig][kNo_MSAA] = true;
719 // The GL_EXT_texture_format_BGRA8888 extension does not add BGRA to the list of
720 // configs that are color-renderable and can be passed to
721 // glRenderBufferStorageMultisample. Chromium may have an extension to allow BGRA
722 // renderbuffers to work on desktop platforms.
723 if (ctxInfo.hasExtension("GL_CHROMIUM_renderbuffer_format_BGRA8888") ) {
724 fConfigRenderSupport[kBGRA_8888_GrPixelConfig][kYes_MSAA] = true ;
725 } else {
726 fConfigRenderSupport[kBGRA_8888_GrPixelConfig][kYes_MSAA] =
727 !fBGRAIsInternalFormat || !this->usesMSAARenderBuffers();
728 }
729 }
730 }
731
732 if (this->fRGBA8RenderbufferSupport && srgbSupport) {
733 fConfigRenderSupport[kSRGBA_8888_GrPixelConfig][kNo_MSAA] = true;
734 fConfigRenderSupport[kSRGBA_8888_GrPixelConfig][kYes_MSAA] = true;
735 }
736
737 if (this->isConfigTexturable(kRGBA_float_GrPixelConfig)) {
738 if (kGL_GrGLStandard == standard) {
739 fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = true;
740 fConfigRenderSupport[kRGBA_float_GrPixelConfig][kYes_MSAA] = true;
741 } else {
742 // for now we only enable this on desktop, because on ES we'd have t o solve many
743 // precision issues and no clients actually want this yet
744 /*
745 if (ctxInfo.hasExtension("GL_EXT_color_buffer_float")) {
746 fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = true ;
747 } else {
748 fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = fals e;
749 }
750 // for now we don't support floating point MSAA on ES
751 fConfigRenderSupport[kRGBA_float_GrPixelConfig][kYes_MSAA] = false;* /
752 fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = false;
753 fConfigRenderSupport[kRGBA_float_GrPixelConfig][kYes_MSAA] = false;
754 }
755 }
756
757 if (this->isConfigTexturable(kAlpha_half_GrPixelConfig)) {
758 if (kGL_GrGLStandard == standard) {
759 fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true;
760 fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = true;
761 } else if (ctxInfo.version() >= GR_GL_VER(3,0)) {
762 fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true;
763 // for now we don't support floating point MSAA on ES
764 fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = false;
765 } else {
766 if (ctxInfo.hasExtension("GL_EXT_color_buffer_half_float") && fTextu reRedSupport) {
767 fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true ;
768 } else {
769 fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = fals e;
770 }
771 // for now we don't support floating point MSAA on ES
772 fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = false;
773 }
774 }
775
776 if (this->isConfigTexturable(kRGBA_half_GrPixelConfig)) {
777 if (kGL_GrGLStandard == standard) {
778 fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true;
779 fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = true;
780 } else if (ctxInfo.version() >= GR_GL_VER(3, 0)) {
781 fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true;
782 // for now we don't support floating point MSAA on ES
783 fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = false;
784 } else {
785 if (ctxInfo.hasExtension("GL_EXT_color_buffer_half_float")) {
786 fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true;
787 } else {
788 fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = false ;
789 }
790 // for now we don't support floating point MSAA on ES
791 fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = false;
792 }
793 }
794
795 // If we don't support MSAA then undo any places above where we set a config as renderable with
796 // msaa.
797 if (kNone_MSFBOType == fMSFBOType) {
798 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
799 fConfigRenderSupport[i][kYes_MSAA] = false;
800 }
801 }
802 }
803
804 void GrGLCaps::initConfigTexturableTable(const GrGLContextInfo& ctxInfo, const G rGLInterface* gli,
805 bool srgbSupport) {
806 GrGLStandard standard = ctxInfo.standard();
807 GrGLVersion version = ctxInfo.version();
808
809 // Base texture support
810 fConfigTextureSupport[kAlpha_8_GrPixelConfig] = true;
811 fConfigTextureSupport[kRGB_565_GrPixelConfig] = true;
812 fConfigTextureSupport[kRGBA_4444_GrPixelConfig] = true;
813 fConfigTextureSupport[kRGBA_8888_GrPixelConfig] = true;
814
815 // Disable this for now, while we investigate https://bug.skia.org/4333
816 if (false) {
817 // Check for 8-bit palette..
818 GrGLint numFormats;
819 GR_GL_GetIntegerv(gli, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats );
820 if (numFormats) {
821 SkAutoSTMalloc<10, GrGLint> formats(numFormats);
822 GR_GL_GetIntegerv(gli, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats);
823 for (int i = 0; i < numFormats; ++i) {
824 if (GR_GL_PALETTE8_RGBA8 == formats[i]) {
825 fConfigTextureSupport[kIndex_8_GrPixelConfig] = true;
826 break;
827 }
828 }
829 }
830 }
831
832 // Check for BGRA
833 if (kGL_GrGLStandard == standard) {
834 fConfigTextureSupport[kBGRA_8888_GrPixelConfig] =
835 version >= GR_GL_VER(1,2) || ctxInfo.hasExtension("GL_EXT_bgra");
836 } else {
837 if (ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888")) {
838 fConfigTextureSupport[kBGRA_8888_GrPixelConfig] = true;
839 if (version >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_EXT_textur e_storage")) {
840 fBGRAIsInternalFormat = true;
841 }
842 } else if (ctxInfo.hasExtension("GL_EXT_texture_format_BGRA8888")) {
843 fConfigTextureSupport[kBGRA_8888_GrPixelConfig] = true;
844 fBGRAIsInternalFormat = true;
845 }
846 SkASSERT(fConfigTextureSupport[kBGRA_8888_GrPixelConfig] ||
847 kSkia8888_GrPixelConfig != kBGRA_8888_GrPixelConfig);
848 }
849
850 fConfigTextureSupport[kSRGBA_8888_GrPixelConfig] = srgbSupport;
851
852 // Compressed texture support
853
854 // glCompressedTexImage2D is available on all OpenGL ES devices...
855 // however, it is only available on standard OpenGL after version 1.3
856 bool hasCompressTex2D = (kGL_GrGLStandard != standard || version >= GR_GL_VE R(1, 3));
857
858 fCompressedTexSubImageSupport =
859 hasCompressTex2D && (gli->fFunctions.fCompressedTexSubImage2D);
860
861 // Check for ETC1
862 bool hasETC1 = false;
863
864 // First check version for support
865 if (kGL_GrGLStandard == standard) {
866 hasETC1 = hasCompressTex2D &&
867 (version >= GR_GL_VER(4, 3) ||
868 ctxInfo.hasExtension("GL_ARB_ES3_compatibility"));
869 } else {
870 hasETC1 = hasCompressTex2D &&
871 (version >= GR_GL_VER(3, 0) ||
872 ctxInfo.hasExtension("GL_OES_compressed_ETC1_RGB8_texture") ||
873 // ETC2 is a superset of ETC1, so we can just check for that, too.
874 (ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGB8_texture") &&
875 ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGBA8_texture")));
876 }
877 fConfigTextureSupport[kETC1_GrPixelConfig] = hasETC1;
878
879 // Check for LATC under its various forms
880 LATCAlias alias = kLATC_LATCAlias;
881 bool hasLATC = hasCompressTex2D &&
882 (ctxInfo.hasExtension("GL_EXT_texture_compression_latc") ||
883 ctxInfo.hasExtension("GL_NV_texture_compression_latc"));
884
885 // Check for RGTC
886 if (!hasLATC) {
887 // If we're using OpenGL 3.0 or later, then we have RGTC, an identical c ompression format.
888 if (kGL_GrGLStandard == standard) {
889 hasLATC = version >= GR_GL_VER(3, 0);
890 }
891
892 if (!hasLATC) {
893 hasLATC =
894 ctxInfo.hasExtension("GL_EXT_texture_compression_rgtc") ||
895 ctxInfo.hasExtension("GL_ARB_texture_compression_rgtc");
896 }
897
898 if (hasLATC) {
899 alias = kRGTC_LATCAlias;
900 }
901 }
902
903 // Check for 3DC
904 if (!hasLATC) {
905 hasLATC = ctxInfo.hasExtension("GL_AMD_compressed_3DC_texture");
906 if (hasLATC) {
907 alias = k3DC_LATCAlias;
908 }
909 }
910
911 fConfigTextureSupport[kLATC_GrPixelConfig] = hasLATC;
912 fLATCAlias = alias;
913
914 // Check for R11_EAC ... We don't support R11_EAC on desktop, as most
915 // cards default to decompressing the textures in the driver, and is
916 // generally slower.
917 if (kGL_GrGLStandard != standard) {
918 fConfigTextureSupport[kR11_EAC_GrPixelConfig] = version >= GR_GL_VER(3, 0);
919 }
920
921 // Check for ASTC
922 fConfigTextureSupport[kASTC_12x12_GrPixelConfig] =
923 ctxInfo.hasExtension("GL_KHR_texture_compression_astc_hdr") ||
924 ctxInfo.hasExtension("GL_KHR_texture_compression_astc_ldr") ||
925 ctxInfo.hasExtension("GL_OES_texture_compression_astc");
926
927 // Check for floating point texture support
928 // NOTE: We disallow floating point textures on ES devices if linear
929 // filtering modes are not supported. This is for simplicity, but a more
930 // granular approach is possible. Coincidentally, floating point textures b ecame part of
931 // the standard in ES3.1 / OGL 3.1, hence the shorthand
932 bool hasFPTextures = version >= GR_GL_VER(3, 1);
933 if (!hasFPTextures) {
934 hasFPTextures = ctxInfo.hasExtension("GL_ARB_texture_float") ||
935 (ctxInfo.hasExtension("GL_OES_texture_float_linear") &&
936 ctxInfo.hasExtension("GL_OES_texture_float"));
937 }
938 fConfigTextureSupport[kRGBA_float_GrPixelConfig] = hasFPTextures;
939
940 // Check for fp16 texture support
941 // NOTE: We disallow floating point textures on ES devices if linear
942 // filtering modes are not supported. This is for simplicity, but a more
943 // granular approach is possible. Coincidentally, 16-bit floating point tex tures became part of
944 // the standard in ES3.1 / OGL 3.1, hence the shorthand
945 bool hasHalfFPTextures = version >= GR_GL_VER(3, 1);
946 if (!hasHalfFPTextures) {
947 hasHalfFPTextures = ctxInfo.hasExtension("GL_ARB_texture_float") ||
948 (ctxInfo.hasExtension("GL_OES_texture_half_float_lin ear") &&
949 ctxInfo.hasExtension("GL_OES_texture_half_float"));
950 }
951 fConfigTextureSupport[kAlpha_half_GrPixelConfig] = hasHalfFPTextures;
952 fConfigTextureSupport[kRGBA_half_GrPixelConfig] = hasHalfFPTextures;
953 }
954
955 bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf, 614 bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf,
956 GrPixelConfig readConfig, 615 GrPixelConfig readConfig,
957 GrPixelConfig currFBOConfig) const { 616 GrPixelConfig currFBOConfig) const {
958 SkASSERT(this->isConfigRenderable(currFBOConfig, false)); 617 SkASSERT(this->isConfigRenderable(currFBOConfig, false));
959 618
960 if (kGL_GrGLStandard == intf->fStandard) { 619 if (kGL_GrGLStandard == intf->fStandard) {
961 // All of our renderable configs can be converted to each other by glRea dPixels in OpenGL. 620 // All of our renderable configs can be converted to each other by glRea dPixels in OpenGL.
962 return true; 621 return true;
963 } 622 }
964 // See Section 16.1.2 in the ES 3.2 specification. 623 // See Section 16.1.2 in the ES 3.2 specification.
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 GR_STATIC_ASSERT(3 == kChromium_MapBufferType); 840 GR_STATIC_ASSERT(3 == kChromium_MapBufferType);
1182 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMapBufferTypeStr) == kLast_MapBufferType + 1); 841 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMapBufferTypeStr) == kLast_MapBufferType + 1);
1183 842
1184 r.appendf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO")); 843 r.appendf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO"));
1185 r.appendf("MSAA Type: %s\n", kMSFBOExtStr[fMSFBOType]); 844 r.appendf("MSAA Type: %s\n", kMSFBOExtStr[fMSFBOType]);
1186 r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType ]); 845 r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType ]);
1187 r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]); 846 r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]);
1188 r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors); 847 r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors);
1189 r.appendf("Max FS Texture Units: %d\n", fMaxFragmentTextureUnits); 848 r.appendf("Max FS Texture Units: %d\n", fMaxFragmentTextureUnits);
1190 r.appendf("Max Vertex Attributes: %d\n", fMaxVertexAttributes); 849 r.appendf("Max Vertex Attributes: %d\n", fMaxVertexAttributes);
1191 r.appendf("Support RGBA8 Render Buffer: %s\n", (fRGBA8RenderbufferSupport ? "YES": "NO"));
1192 r.appendf("BGRA is an internal format: %s\n", (fBGRAIsInternalFormat ? "YES" : "NO"));
1193 r.appendf("Unpack Row length support: %s\n", (fUnpackRowLengthSupport ? "YES ": "NO")); 850 r.appendf("Unpack Row length support: %s\n", (fUnpackRowLengthSupport ? "YES ": "NO"));
1194 r.appendf("Unpack Flip Y support: %s\n", (fUnpackFlipYSupport ? "YES": "NO") ); 851 r.appendf("Unpack Flip Y support: %s\n", (fUnpackFlipYSupport ? "YES": "NO") );
1195 r.appendf("Pack Row length support: %s\n", (fPackRowLengthSupport ? "YES": " NO")); 852 r.appendf("Pack Row length support: %s\n", (fPackRowLengthSupport ? "YES": " NO"));
1196 r.appendf("Pack Flip Y support: %s\n", (fPackFlipYSupport ? "YES": "NO")); 853 r.appendf("Pack Flip Y support: %s\n", (fPackFlipYSupport ? "YES": "NO"));
1197 854
1198 r.appendf("Texture Usage support: %s\n", (fTextureUsageSupport ? "YES": "NO" )); 855 r.appendf("Texture Usage support: %s\n", (fTextureUsageSupport ? "YES": "NO" ));
1199 r.appendf("Texture Storage support: %s\n", (fTexStorageSupport ? "YES": "NO" )); 856 r.appendf("Texture Storage support: %s\n", (fTexStorageSupport ? "YES": "NO" ));
1200 r.appendf("GL_R support: %s\n", (fTextureRedSupport ? "YES": "NO")); 857 r.appendf("GL_R support: %s\n", (fTextureRedSupport ? "YES": "NO"));
1201 r.appendf("GL_ARB_imaging support: %s\n", (fImagingSupport ? "YES": "NO")); 858 r.appendf("GL_ARB_imaging support: %s\n", (fImagingSupport ? "YES": "NO"));
1202 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ? "YES": "NO")); 859 r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ? "YES": "NO"));
1203 r.appendf("Direct state access support: %s\n", (fDirectStateAccessSupport ? "YES": "NO")); 860 r.appendf("Direct state access support: %s\n", (fDirectStateAccessSupport ? "YES": "NO"));
1204 r.appendf("Debug support: %s\n", (fDebugSupport ? "YES": "NO")); 861 r.appendf("Debug support: %s\n", (fDebugSupport ? "YES": "NO"));
1205 r.appendf("Multisample disable support: %s\n", (fMultisampleDisableSupport ? "YES" : "NO")); 862 r.appendf("Multisample disable support: %s\n", (fMultisampleDisableSupport ? "YES" : "NO"));
1206 r.appendf("Use non-VBO for dynamic data: %s\n", 863 r.appendf("Use non-VBO for dynamic data: %s\n",
1207 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO")); 864 (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO"));
1208 r.appendf("SRGB write contol: %s\n", (fSRGBWriteControl ? "YES" : "NO")); 865 r.appendf("SRGB write contol: %s\n", (fSRGBWriteControl ? "YES" : "NO"));
1209 r.appendf("RGBA 8888 pixel ops are slow: %s\n", (fRGBA8888PixelsOpsAreSlow ? "YES" : "NO")); 866 r.appendf("RGBA 8888 pixel ops are slow: %s\n", (fRGBA8888PixelsOpsAreSlow ? "YES" : "NO"));
1210 r.appendf("Partial FBO read is slow: %s\n", (fPartialFBOReadIsSlow ? "YES" : "NO")); 867 r.appendf("Partial FBO read is slow: %s\n", (fPartialFBOReadIsSlow ? "YES" : "NO"));
1211 r.appendf("Bind uniform location support: %s\n", (fBindUniformLocationSuppor t ? "YES" : "NO")); 868 r.appendf("Bind uniform location support: %s\n", (fBindUniformLocationSuppor t ? "YES" : "NO"));
869
870 r.append("Configs\n-------\n");
871 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
872 r.appendf(" cfg: %d flags: 0x%04x, b_internal: 0x%08x s_internal: 0x%08 x, e_format: "
873 "0x%08x, e_type: 0x%08x, i_for_teximage: 0x%08x, e_for_teximag e: 0x%08x\n",
874 i,
875 fConfigTable[i].fFlags,
876 fConfigTable[i].fFormats.fBaseInternalFormat,
877 fConfigTable[i].fFormats.fSizedInternalFormat,
878 fConfigTable[i].fFormats.fExternalFormat,
879 fConfigTable[i].fFormats.fExternalType,
880 fConfigTable[i].fFormats.fInternalFormatTexImage,
881 fConfigTable[i].fFormats.fExternalFormatForTexImage);
882 }
883
1212 return r; 884 return r;
1213 } 885 }
1214 886
1215 static GrGLenum precision_to_gl_float_type(GrSLPrecision p) { 887 static GrGLenum precision_to_gl_float_type(GrSLPrecision p) {
1216 switch (p) { 888 switch (p) {
1217 case kLow_GrSLPrecision: 889 case kLow_GrSLPrecision:
1218 return GR_GL_LOW_FLOAT; 890 return GR_GL_LOW_FLOAT;
1219 case kMedium_GrSLPrecision: 891 case kMedium_GrSLPrecision:
1220 return GR_GL_MEDIUM_FLOAT; 892 return GR_GL_MEDIUM_FLOAT;
1221 case kHigh_GrSLPrecision: 893 case kHigh_GrSLPrecision:
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 glslCaps->fConfigSwizzle[kSRGBA_8888_GrPixelConfig] = "rgba"; 999 glslCaps->fConfigSwizzle[kSRGBA_8888_GrPixelConfig] = "rgba";
1328 glslCaps->fConfigSwizzle[kETC1_GrPixelConfig] = "rgba"; 1000 glslCaps->fConfigSwizzle[kETC1_GrPixelConfig] = "rgba";
1329 glslCaps->fConfigSwizzle[kLATC_GrPixelConfig] = "rrrr"; 1001 glslCaps->fConfigSwizzle[kLATC_GrPixelConfig] = "rrrr";
1330 glslCaps->fConfigSwizzle[kR11_EAC_GrPixelConfig] = "rrrr"; 1002 glslCaps->fConfigSwizzle[kR11_EAC_GrPixelConfig] = "rrrr";
1331 glslCaps->fConfigSwizzle[kASTC_12x12_GrPixelConfig] = "rgba"; 1003 glslCaps->fConfigSwizzle[kASTC_12x12_GrPixelConfig] = "rgba";
1332 glslCaps->fConfigSwizzle[kRGBA_float_GrPixelConfig] = "rgba"; 1004 glslCaps->fConfigSwizzle[kRGBA_float_GrPixelConfig] = "rgba";
1333 glslCaps->fConfigSwizzle[kRGBA_half_GrPixelConfig] = "rgba"; 1005 glslCaps->fConfigSwizzle[kRGBA_half_GrPixelConfig] = "rgba";
1334 1006
1335 } 1007 }
1336 1008
1337 void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { 1009 bool GrGLCaps::bgraIsInternalFormat() const {
1010 return fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = = GR_GL_BGRA;
1011 }
1012
1013 void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo, const GrGLInterfa ce* gli) {
1014 /*
1015 Comments on renderability of configs on various GL versions.
1016 OpenGL < 3.0:
1017 no built in support for render targets.
1018 GL_EXT_framebuffer_object adds possible support for any sized format with base internal
1019 format RGB, RGBA and NV float formats we don't use.
1020 This is the following:
1021 R3_G3_B2, RGB4, RGB5, RGB8, RGB10, RGB12, RGB16, RGBA2, RGBA4, R GB5_A1, RGBA8
1022 RGB10_A2, RGBA12,RGBA16
1023 Though, it is hard to believe the more obscure formats such as RGB A12 would work
1024 since they aren't required by later standards and the driver can s imply return
1025 FRAMEBUFFER_UNSUPPORTED for anything it doesn't allow.
1026 GL_ARB_framebuffer_object adds everything added by the EXT extension and additionally
1027 any sized internal format with a base internal format of ALPHA, LU MINANCE,
1028 LUMINANCE_ALPHA, INTENSITY, RED, and RG.
1029 This adds a lot of additional renderable sized formats, including ALPHA8.
1030 The GL_ARB_texture_rg brings in the RED and RG formats (8, 8I, 8UI , 16, 16I, 16UI,
1031 16F, 32I, 32UI, and 32F variants).
1032 Again, the driver has an escape hatch via FRAMEBUFFER_UNSUPPORTED.
1033
1034 For both the above extensions we limit ourselves to those that are a lso required by
1035 OpenGL 3.0.
1036
1037 OpenGL 3.0:
1038 Any format with base internal format ALPHA, RED, RG, RGB or RGBA is "color-renderable"
1039 but are not required to be supported as renderable textures/renderbu ffer.
1040 Required renderable color formats:
1041 - RGBA32F, RGBA32I, RGBA32UI, RGBA16, RGBA16F, RGBA16I,
1042 RGBA16UI, RGBA8, RGBA8I, RGBA8UI, SRGB8_ALPHA8, and
1043 RGB10_A2.
1044 - R11F_G11F_B10F.
1045 - RG32F, RG32I, RG32UI, RG16, RG16F, RG16I, RG16UI, RG8, RG8I,
1046 and RG8UI.
1047 - R32F, R32I, R32UI, R16F, R16I, R16UI, R16, R8, R8I, and R8UI.
1048 - ALPHA8
1049
1050 OpenGL 3.1, 3.2, 3.3
1051 Same as 3.0 except ALPHA8 requires GL_ARB_compatibility/compatibilit y profile.
1052 OpengGL 3.3, 4.0, 4.1
1053 Adds RGB10_A2UI.
1054 OpengGL 4.2
1055 Adds
1056 - RGB5_A1, RGBA4
1057 - RGB565
1058 OpenGL 4.4
1059 Does away with the separate list and adds a column to the sized inte rnal color format
1060 table. However, no new formats become required color renderable.
1061
1062 ES 2.0
1063 color renderable: RGBA4, RGB5_A1, RGB565
1064 GL_EXT_texture_rg adds support for R8, RG5 as a color render target
1065 GL_OES_rgb8_rgba8 adds support for RGB8 and RGBA8
1066 GL_ARM_rgba8 adds support for RGBA8 (but not RGB8)
1067 GL_EXT_texture_format_BGRA8888 does not add renderbuffer support
1068 GL_CHROMIUM_renderbuffer_format_BGRA8888 adds BGRA8 as color-rendera ble
1069 GL_APPLE_texture_format_BGRA8888 does not add renderbuffer support
1070
1071 ES 3.0
1072 - RGBA32I, RGBA32UI, RGBA16I, RGBA16UI, RGBA8, RGBA8I,
1073 RGBA8UI, SRGB8_ALPHA8, RGB10_A2, RGB10_A2UI, RGBA4, and
1074 RGB5_A1.
1075 - RGB8 and RGB565.
1076 - RG32I, RG32UI, RG16I, RG16UI, RG8, RG8I, and RG8UI.
1077 - R32I, R32UI, R16I, R16UI, R8, R8I, and R8UI
1078 ES 3.1
1079 Adds RGB10_A2, RGB10_A2UI,
1080 ES 3.2
1081 Adds R16F, RG16F, RGBA16F, R32F, RG32F, RGBA32F, R11F_G11F_B10F.
1082 */
1083 uint32_t allRenderFlags = ConfigInfo::kRenderable_Flag;
1084 if (kNone_MSFBOType != fMSFBOType) {
1085 allRenderFlags |= ConfigInfo::kRenderableWithMSAA_Flag;
1086 }
1087
1088 GrGLStandard standard = ctxInfo.standard();
1089 GrGLVersion version = ctxInfo.version();
1090
1338 fConfigTable[kUnknown_GrPixelConfig].fFormats.fBaseInternalFormat = 0; 1091 fConfigTable[kUnknown_GrPixelConfig].fFormats.fBaseInternalFormat = 0;
1339 fConfigTable[kUnknown_GrPixelConfig].fFormats.fSizedInternalFormat = 0; 1092 fConfigTable[kUnknown_GrPixelConfig].fFormats.fSizedInternalFormat = 0;
1340 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalFormat = 0; 1093 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalFormat = 0;
1341 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalType = 0; 1094 fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalType = 0;
1342 fConfigTable[kUnknown_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType; 1095 fConfigTable[kUnknown_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType;
1343 1096
1344 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ RGBA; 1097 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ RGBA;
1345 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL _RGBA8; 1098 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL _RGBA8;
1346 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA ; 1099 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA ;
1347 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGN ED_BYTE; 1100 fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGN ED_BYTE;
1348 fConfigTable[kRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_F ormatType; 1101 fConfigTable[kRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_F ormatType;
1102 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Fla g;
1103 if (kGL_GrGLStandard == standard) {
1104 // We require some form of FBO support and all GLs with FBO support can render to RGBA8
1105 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags;
1106 } else {
1107 if (version >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_OES_rgb8_rgba8 ") ||
1108 ctxInfo.hasExtension("GL_ARM_rgba8")) {
1109 fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags;
1110 }
1111 }
1349 1112
1350 if (this->bgraIsInternalFormat()) {
1351 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR _GL_BGRA;
1352 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = G R_GL_BGRA8;
1353 } else {
1354 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR _GL_RGBA;
1355 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = G R_GL_RGBA8;
1356 }
1357 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalFormat= GR_GL_BGRA; 1113 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalFormat= GR_GL_BGRA;
1358 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIG NED_BYTE; 1114 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIG NED_BYTE;
1359 fConfigTable[kBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_F ormatType; 1115 fConfigTable[kBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_F ormatType;
1116 if (kGL_GrGLStandard == standard) {
1117 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR _GL_RGBA;
1118 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = G R_GL_RGBA8;
1119 if (version >= GR_GL_VER(1, 2) || ctxInfo.hasExtension("GL_EXT_bgra")) {
1120 // Since the internal format is RGBA8, it is also renderable.
1121 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTexture able_Flag |
1122 allRenderFlags;
1123 }
1124 } else {
1125 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR _GL_BGRA;
1126 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = G R_GL_BGRA8;
1127 if (ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888")) {
1128 // The APPLE extension doesn't make this renderable.
1129 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTexture able_Flag;
1130 if (version < GR_GL_VER(3,0) && !ctxInfo.hasExtension("GL_EXT_textur e_storage")) {
1131 // On ES2 the internal format of a BGRA texture is RGBA with the APPLE extension.
1132 // Though, that seems to not be the case if the texture storage extension is
1133 // present. The specs don't exactly make that clear.
1134 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFor mat = GR_GL_RGBA;
1135 fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFo rmat = GR_GL_RGBA8;
1136 }
1137 } else if (ctxInfo.hasExtension("GL_EXT_texture_format_BGRA8888")) {
1138 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTexture able_Flag |
1139 ConfigInfo::kRendera ble_Flag;
1140 if (ctxInfo.hasExtension("GL_CHROMIUM_renderbuffer_format_BGRA8888") &&
1141 this->usesMSAARenderBuffers()) {
1142 fConfigTable[kBGRA_8888_GrPixelConfig].fFlags |=
1143 ConfigInfo::kRenderableWithMSAA_Flag;
1144 }
1145 }
1146 }
1360 1147
1361 1148 // We only enable srgb support if both textures and FBOs support srgb.
1149 bool srgbSupport = false;
1150 if (kGL_GrGLStandard == standard) {
1151 if (ctxInfo.version() >= GR_GL_VER(3,0)) {
1152 srgbSupport = true;
1153 } else if (ctxInfo.hasExtension("GL_EXT_texture_sRGB")) {
1154 if (ctxInfo.hasExtension("GL_ARB_framebuffer_sRGB") ||
1155 ctxInfo.hasExtension("GL_EXT_framebuffer_sRGB")) {
1156 srgbSupport = true;
1157 }
1158 }
1159 // All the above srgb extensions support toggling srgb writes
1160 fSRGBWriteControl = srgbSupport;
1161 } else {
1162 // See https://bug.skia.org/4148 for PowerVR issue.
1163 srgbSupport = kPowerVRRogue_GrGLRenderer != ctxInfo.renderer() &&
1164 (ctxInfo.version() >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_EXT _sRGB"));
1165 // ES through 3.1 requires EXT_srgb_write_control to support toggling
1166 // sRGB writing for destinations.
1167 fSRGBWriteControl = ctxInfo.hasExtension("GL_EXT_sRGB_write_control");
1168 }
1362 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL _SRGB_ALPHA; 1169 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL _SRGB_ALPHA;
1363 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_G L_SRGB8_ALPHA8; 1170 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_G L_SRGB8_ALPHA8;
1364 // GL does not do srgb<->rgb conversions when transferring between cpu and g pu. Thus, the 1171 // GL does not do srgb<->rgb conversions when transferring between cpu and g pu. Thus, the
1365 // external format is GL_RGBA. See below for note about ES2.0 and glTex[Sub] Image. 1172 // external format is GL_RGBA. See below for note about ES2.0 and glTex[Sub] Image.
1366 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB A; 1173 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB A;
1367 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIG NED_BYTE; 1174 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIG NED_BYTE;
1368 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_ FormatType; 1175 fConfigTable[kSRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_ FormatType;
1176 if (srgbSupport) {
1177 fConfigTable[kSRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureabl e_Flag |
1178 allRenderFlags;
1179 }
1369 1180
1370 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RG B; 1181 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RG B;
1371 if (this->ES2CompatibilitySupport()) { 1182 if (this->ES2CompatibilitySupport()) {
1372 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_RGB565; 1183 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_RGB565;
1373 } else { 1184 } else {
1374 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_RGB5; 1185 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_RGB5;
1375 } 1186 }
1376 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB; 1187 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB;
1377 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED _SHORT_5_6_5; 1188 fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED _SHORT_5_6_5;
1378 fConfigTable[kRGB_565_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType; 1189 fConfigTable[kRGB_565_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType;
1190 fConfigTable[kRGB_565_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1191 if (kGL_GrGLStandard == standard) {
1192 if (version >= GR_GL_VER(4, 2) || ctxInfo.hasExtension("GL_ES2_compatibi lity")) {
1193 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags;
1194 }
1195 } else {
1196 fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags;
1197 }
1379 1198
1380 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ RGBA; 1199 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ RGBA;
1381 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL _RGBA4; 1200 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL _RGBA4;
1382 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA ; 1201 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA ;
1383 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGN ED_SHORT_4_4_4_4; 1202 fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGN ED_SHORT_4_4_4_4;
1384 fConfigTable[kRGBA_4444_GrPixelConfig].fFormatType = kNormalizedFixedPoint_F ormatType; 1203 fConfigTable[kRGBA_4444_GrPixelConfig].fFormatType = kNormalizedFixedPoint_F ormatType;
1385 1204 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Fla g;
1205 if (kGL_GrGLStandard == standard) {
1206 if (version >= GR_GL_VER(4, 2)) {
1207 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags;
1208 }
1209 } else {
1210 fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags;
1211 }
1386 1212
1387 if (this->textureRedSupport()) { 1213 if (this->textureRedSupport()) {
1388 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_G L_RED; 1214 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_G L_RED;
1389 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_R8; 1215 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_R8;
1390 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RE D; 1216 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RE D;
1391 } else { 1217 } else {
1392 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_G L_ALPHA; 1218 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_G L_ALPHA;
1393 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_ALPHA8; 1219 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_ GL_ALPHA8;
1394 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalFormat = GR_GL_AL PHA; 1220 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalFormat = GR_GL_AL PHA;
1395 } 1221 }
1396 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED _BYTE; 1222 fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED _BYTE;
1397 fConfigTable[kAlpha_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType; 1223 fConfigTable[kAlpha_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType;
1224 fConfigTable[kAlpha_8_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag;
1225 if (this->textureRedSupport() || kDesktop_ARB_MSFBOType == this->msFBOType() ) {
1226 // desktop ARB extension/3.0+ supports ALPHA8 as renderable.
1227 // Core profile removes ALPHA8 support, but we should have chosen R8 in that case.
1228 fConfigTable[kAlpha_8_GrPixelConfig].fFlags |= allRenderFlags;
1229 }
1230
1231 // Check for [half] floating point texture support
1232 // NOTE: We disallow floating point textures on ES devices if linear filteri ng modes are not
1233 // supported. This is for simplicity, but a more granular approach is possib le. Coincidentally,
1234 // [half] floating point textures became part of the standard in ES3.1 / OGL 3.0.
1235 bool hasFPTextures = false;
1236 bool hasHalfFPTextures = false;
1237 // for now we don't support floating point MSAA on ES
1238 uint32_t fpRenderFlags = (kGL_GrGLStandard == standard) ?
1239 allRenderFlags : (uint32_t)ConfigInfo::kRenderable _Flag;
1240
1241 if (kGL_GrGLStandard == standard) {
1242 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_texture_f loat")) {
1243 hasFPTextures = true;
1244 hasHalfFPTextures = true;
1245 }
1246 } else {
1247 if (version >= GR_GL_VER(3, 1)) {
1248 hasFPTextures = true;
1249 hasHalfFPTextures = true;
1250 } else {
1251 if (ctxInfo.hasExtension("GL_OES_texture_float_linear") &&
1252 ctxInfo.hasExtension("GL_OES_texture_float")) {
1253 hasFPTextures = true;
1254 }
1255 if (ctxInfo.hasExtension("GL_OES_texture_half_float_linear") &&
1256 ctxInfo.hasExtension("GL_OES_texture_half_float")) {
1257 hasHalfFPTextures = true;
1258 }
1259 }
1260 }
1398 1261
1399 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL _RGBA; 1262 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL _RGBA;
1400 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fSizedInternalFormat = GR_G L_RGBA32F; 1263 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fSizedInternalFormat = GR_G L_RGBA32F;
1401 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB A; 1264 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB A;
1402 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalType = GR_GL_FLOAT ; 1265 fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalType = GR_GL_FLOAT ;
1403 fConfigTable[kRGBA_float_GrPixelConfig].fFormatType = kFloat_FormatType; 1266 fConfigTable[kRGBA_float_GrPixelConfig].fFormatType = kFloat_FormatType;
1267 if (hasFPTextures) {
1268 fConfigTable[kRGBA_float_GrPixelConfig].fFlags = ConfigInfo::kTextureabl e_Flag;
1269 // For now we only enable rendering to float on desktop, because on ES w e'd have to solve
1270 // many precision issues and no clients actually want this yet.
1271 if (kGL_GrGLStandard == standard /* || version >= GR_GL_VER(3,2) ||
1272 ctxInfo.hasExtension("GL_EXT_color_buffer_float")*/) {
1273 fConfigTable[kRGBA_float_GrPixelConfig].fFlags |= fpRenderFlags;
1274 }
1275 }
1404 1276
1405 if (this->textureRedSupport()) { 1277 if (this->textureRedSupport()) {
1406 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = G R_GL_RED; 1278 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = G R_GL_RED;
1407 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_R16F; 1279 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_R16F;
1408 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalFormat = GR_GL _RED; 1280 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalFormat = GR_GL _RED;
1409 } else { 1281 } else {
1410 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = G R_GL_ALPHA; 1282 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = G R_GL_ALPHA;
1411 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_ALPHA16F; 1283 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_ALPHA16F;
1412 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalFormat = GR_GL _ALPHA; 1284 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalFormat = GR_GL _ALPHA;
1413 } 1285 }
1414 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER (3, 0)) { 1286 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER (3, 0)) {
1415 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_H ALF_FLOAT; 1287 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_H ALF_FLOAT;
1416 } else { 1288 } else {
1417 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_H ALF_FLOAT_OES; 1289 fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_H ALF_FLOAT_OES;
1418 } 1290 }
1419 fConfigTable[kAlpha_half_GrPixelConfig].fFormatType = kFloat_FormatType; 1291 fConfigTable[kAlpha_half_GrPixelConfig].fFormatType = kFloat_FormatType;
1292 if (hasHalfFPTextures) {
1293 fConfigTable[kAlpha_half_GrPixelConfig].fFlags = ConfigInfo::kTextureabl e_Flag;
1294 // ES requires either 3.2 or the combination of EXT_color_buffer_half_fl oat and support for
1295 // GL_RED internal format.
1296 if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3,2) ||
1297 (this->textureRedSupport() &&
1298 ctxInfo.hasExtension("GL_EXT_color_buffer_half_float"))) {
1299 fConfigTable[kAlpha_half_GrPixelConfig].fFlags |= fpRenderFlags;
1300 }
1301 }
1420 1302
1421 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ RGBA; 1303 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_ RGBA;
1422 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL _RGBA16F; 1304 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL _RGBA16F;
1423 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA ; 1305 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA ;
1424 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER (3, 0)) { 1306 if (kGL_GrGLStandard == ctxInfo.standard() || ctxInfo.version() >= GR_GL_VER (3, 0)) {
1425 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HA LF_FLOAT; 1307 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HA LF_FLOAT;
1426 } else { 1308 } else {
1427 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HA LF_FLOAT_OES; 1309 fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HA LF_FLOAT_OES;
1428 } 1310 }
1429 fConfigTable[kRGBA_half_GrPixelConfig].fFormatType = kFloat_FormatType; 1311 fConfigTable[kRGBA_half_GrPixelConfig].fFormatType = kFloat_FormatType;
1312 if (hasHalfFPTextures) {
1313 fConfigTable[kRGBA_half_GrPixelConfig].fFlags = ConfigInfo::kTextureable _Flag;
1314 // ES requires 3.2 or EXT_color_buffer_half_float.
1315 if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3,2) ||
1316 ctxInfo.hasExtension("GL_EXT_color_buffer_half_float")) {
1317 fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= fpRenderFlags;
1318 }
1319 }
1320
1321 // Compressed texture support
1322
1323 // glCompressedTexImage2D is available on all OpenGL ES devices. It is avail able on standard
1324 // OpenGL after version 1.3. We'll assume at least that level of OpenGL supp ort.
1325
1326 // TODO: Fix command buffer bindings and remove this.
1327 fCompressedTexSubImageSupport = SkToBool(gli->fFunctions.fCompressedTexSubIm age2D);
1430 1328
1431 // No sized/unsized internal format distinction for compressed formats, no e xternal format. 1329 // No sized/unsized internal format distinction for compressed formats, no e xternal format.
1330 // Below we set the external formats and types to 0.
1432 1331
1433 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_PA LETTE8_RGBA8; 1332 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_PA LETTE8_RGBA8;
1434 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_P ALETTE8_RGBA8; 1333 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_P ALETTE8_RGBA8;
1435 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalFormat = 0; 1334 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalFormat = 0;
1436 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalType = 0; 1335 fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalType = 0;
1437 fConfigTable[kIndex_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType; 1336 fConfigTable[kIndex_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType;
1337 // Disable this for now, while we investigate https://bug.skia.org/4333
1338 if (false) {
1339 // Check for 8-bit palette..
1340 GrGLint numFormats;
1341 GR_GL_GetIntegerv(gli, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats );
1342 if (numFormats) {
1343 SkAutoSTMalloc<10, GrGLint> formats(numFormats);
1344 GR_GL_GetIntegerv(gli, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats);
1345 for (int i = 0; i < numFormats; ++i) {
1346 if (GR_GL_PALETTE8_RGBA8 == formats[i]) {
1347 fConfigTable[kIndex_8_GrPixelConfig].fFlags = ConfigInfo::kT extureable_Flag;
1348 break;
1349 }
1350 }
1351 }
1352 }
1438 1353
1439 switch(this->latcAlias()) { 1354 // May change the internal format based on extensions.
1440 case GrGLCaps::kLATC_LATCAlias: 1355 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat =
1441 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = 1356 GR_GL_COMPRESSED_LUMINANCE_LATC1;
1442 GR_GL_COMPRESSED_LUMINANCE_LATC1; 1357 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat =
1443 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = 1358 GR_GL_COMPRESSED_LUMINANCE_LATC1;
1444 GR_GL_COMPRESSED_LUMINANCE_LATC1; 1359 if (ctxInfo.hasExtension("GL_EXT_texture_compression_latc") ||
1445 break; 1360 ctxInfo.hasExtension("GL_NV_texture_compression_latc")) {
1446 case GrGLCaps::kRGTC_LATCAlias: 1361 fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag ;
1447 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = 1362 } else if ((kGL_GrGLStandard == standard && version >= GR_GL_VER(3, 0)) ||
1448 GR_GL_COMPRESSED_RED_RGTC1; 1363 ctxInfo.hasExtension("GL_EXT_texture_compression_rgtc") ||
1449 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = 1364 ctxInfo.hasExtension("GL_ARB_texture_compression_rgtc")) {
1450 GR_GL_COMPRESSED_RED_RGTC1; 1365 // RGTC is identical and available on OpenGL 3.0+ as well as with extens ions
1451 break; 1366 fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag ;
1452 case GrGLCaps::k3DC_LATCAlias: 1367 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat =
1453 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_ GL_COMPRESSED_3DC_X; 1368 GR_GL_COMPRESSED_RED_RGTC1;
1454 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = 1369 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat =
1455 GR_GL_COMPRESSED_3DC_X; 1370 GR_GL_COMPRESSED_RED_RGTC1;
1456 break; 1371 } else if (ctxInfo.hasExtension("GL_AMD_compressed_3DC_texture")) {
1372 fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag ;
1373 fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_C OMPRESSED_3DC_X;
1374 fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat =
1375 GR_GL_COMPRESSED_3DC_X;
1376
1457 } 1377 }
1458 fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalFormat = 0; 1378 fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalFormat = 0;
1459 fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalType = 0; 1379 fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalType = 0;
1460 fConfigTable[kLATC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_Format Type; 1380 fConfigTable[kLATC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_Format Type;
1461 1381
1462 fConfigTable[kETC1_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPR ESSED_ETC1_RGB8; 1382 fConfigTable[kETC1_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPR ESSED_ETC1_RGB8;
1463 fConfigTable[kETC1_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_COMP RESSED_ETC1_RGB8; 1383 fConfigTable[kETC1_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_COMP RESSED_ETC1_RGB8;
1464 fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalFormat = 0; 1384 fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalFormat = 0;
1465 fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalType = 0; 1385 fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalType = 0;
1466 fConfigTable[kETC1_GrPixelConfig].fFormatType = kNormalizedFixedPoint_Format Type; 1386 fConfigTable[kETC1_GrPixelConfig].fFormatType = kNormalizedFixedPoint_Format Type;
1387 if (kGL_GrGLStandard == standard) {
1388 if (version >= GR_GL_VER(4, 3) || ctxInfo.hasExtension("GL_ARB_ES3_compa tibility")) {
1389 fConfigTable[kETC1_GrPixelConfig].fFlags = ConfigInfo::kTextureable_ Flag;
1390 }
1391 } else {
1392 if (version >= GR_GL_VER(3, 0) ||
1393 ctxInfo.hasExtension("GL_OES_compressed_ETC1_RGB8_texture") ||
1394 // ETC2 is a superset of ETC1, so we can just check for that, too.
1395 (ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGB8_texture") &&
1396 ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGBA8_texture"))) {
1397 fConfigTable[kETC1_GrPixelConfig].fFlags = ConfigInfo::kTextureable_ Flag;
1398 }
1399 }
1467 1400
1468 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_CO MPRESSED_R11_EAC; 1401 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_CO MPRESSED_R11_EAC;
1469 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_C OMPRESSED_R11_EAC; 1402 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_C OMPRESSED_R11_EAC;
1470 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalFormat = 0; 1403 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalFormat = 0;
1471 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalType = 0; 1404 fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalType = 0;
1472 fConfigTable[kR11_EAC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType; 1405 fConfigTable[kR11_EAC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_For matType;
1406 // Check for R11_EAC. We don't support R11_EAC on desktop, as most cards def ault to
1407 // decompressing the textures in the driver, and is generally slower.
1408 if (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3,0)) {
1409 fConfigTable[kR11_EAC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_F lag;
1410 }
1473 1411
1474 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fBaseInternalFormat = 1412 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fBaseInternalFormat =
1475 GR_GL_COMPRESSED_RGBA_ASTC_12x12; 1413 GR_GL_COMPRESSED_RGBA_ASTC_12x12;
1476 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fSizedInternalFormat = 1414 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fSizedInternalFormat =
1477 GR_GL_COMPRESSED_RGBA_ASTC_12x12; 1415 GR_GL_COMPRESSED_RGBA_ASTC_12x12;
1478 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalFormat = 0; 1416 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalFormat = 0;
1479 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalType = 0; 1417 fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalType = 0;
1480 fConfigTable[kASTC_12x12_GrPixelConfig].fFormatType = kNormalizedFixedPoint_ FormatType; 1418 fConfigTable[kASTC_12x12_GrPixelConfig].fFormatType = kNormalizedFixedPoint_ FormatType;
1419 if (ctxInfo.hasExtension("GL_KHR_texture_compression_astc_hdr") ||
1420 ctxInfo.hasExtension("GL_KHR_texture_compression_astc_ldr") ||
1421 ctxInfo.hasExtension("GL_OES_texture_compression_astc")) {
1422 fConfigTable[kASTC_12x12_GrPixelConfig].fFlags = ConfigInfo::kTextureabl e_Flag;
1423 }
1481 1424
1482 // Bulk populate the texture internal/external formats here and then deal wi th exceptions below. 1425 // Bulk populate the texture internal/external formats here and then deal wi th exceptions below.
1483 1426
1484 // ES 2.0 requires that the internal/external formats match. 1427 // ES 2.0 requires that the internal/external formats match.
1485 bool useSizedFormats = (kGL_GrGLStandard == ctxInfo.standard() || 1428 bool useSizedFormats = (kGL_GrGLStandard == ctxInfo.standard() ||
1486 ctxInfo.version() >= GR_GL_VER(3,0)); 1429 ctxInfo.version() >= GR_GL_VER(3,0));
1487 for (int i = 0; i < kGrPixelConfigCnt; ++i) { 1430 for (int i = 0; i < kGrPixelConfigCnt; ++i) {
1488 // Almost always we want to pass fExternalFormat as the <format> param t o glTex[Sub]Image. 1431 // Almost always we want to pass fExternalFormat as the <format> param t o glTex[Sub]Image.
1489 fConfigTable[i].fFormats.fExternalFormatForTexImage = 1432 fConfigTable[i].fFormats.fExternalFormatForTexImage =
1490 fConfigTable[i].fFormats.fExternalFormat; 1433 fConfigTable[i].fFormats.fExternalFormat;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1524 fConfigTable[i].fFormats.fSizedInternalFormat); 1467 fConfigTable[i].fFormats.fSizedInternalFormat);
1525 SkASSERT(defaultEntry.fExternalFormat != fConfigTable[i].fFormats.fExter nalFormat); 1468 SkASSERT(defaultEntry.fExternalFormat != fConfigTable[i].fFormats.fExter nalFormat);
1526 SkASSERT(defaultEntry.fExternalType != fConfigTable[i].fFormats.fExterna lType); 1469 SkASSERT(defaultEntry.fExternalType != fConfigTable[i].fFormats.fExterna lType);
1527 } 1470 }
1528 #endif 1471 #endif
1529 } 1472 }
1530 1473
1531 void GrGLCaps::onApplyOptionsOverrides(const GrContextOptions& options) {} 1474 void GrGLCaps::onApplyOptionsOverrides(const GrContextOptions& options) {}
1532 1475
1533 1476
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLCaps.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698