Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "GrGLGpu.h" | 9 #include "GrGLGpu.h" |
| 10 #include "GrGLGLSL.h" | 10 #include "GrGLGLSL.h" |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 694 bool isNewTexture, | 694 bool isNewTexture, |
| 695 int left, int top, int width, int height, | 695 int left, int top, int width, int height, |
| 696 GrPixelConfig dataConfig, | 696 GrPixelConfig dataConfig, |
| 697 const void* data, | 697 const void* data, |
| 698 size_t rowBytes) { | 698 size_t rowBytes) { |
| 699 SkASSERT(data || isNewTexture); | 699 SkASSERT(data || isNewTexture); |
| 700 | 700 |
| 701 // If we're uploading compressed data then we should be using uploadCompress edTexData | 701 // If we're uploading compressed data then we should be using uploadCompress edTexData |
| 702 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); | 702 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); |
| 703 | 703 |
| 704 SkASSERT(this->caps()->isConfigTexturable(desc.fConfig)); | |
| 705 | |
| 704 size_t bpp = GrBytesPerPixel(dataConfig); | 706 size_t bpp = GrBytesPerPixel(dataConfig); |
| 705 if (!GrSurfacePriv::AdjustWritePixelParams(desc.fWidth, desc.fHeight, bpp, & left, &top, | 707 if (!GrSurfacePriv::AdjustWritePixelParams(desc.fWidth, desc.fHeight, bpp, & left, &top, |
| 706 &width, &height, &data, &rowBytes )) { | 708 &width, &height, &data, &rowBytes )) { |
| 707 return false; | 709 return false; |
| 708 } | 710 } |
| 709 size_t trimRowBytes = width * bpp; | 711 size_t trimRowBytes = width * bpp; |
| 710 | 712 |
| 711 // in case we need a temporary, trimmed copy of the src pixels | 713 // in case we need a temporary, trimmed copy of the src pixels |
| 712 #if defined(GOOGLE3) | 714 #if defined(GOOGLE3) |
| 713 // Stack frame size is limited in GOOGLE3. | 715 // Stack frame size is limited in GOOGLE3. |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 725 this->glCaps().texStorageSupport(); | 727 this->glCaps().texStorageSupport(); |
| 726 | 728 |
| 727 if (useTexStorage && kGL_GrGLStandard == this->glStandard()) { | 729 if (useTexStorage && kGL_GrGLStandard == this->glStandard()) { |
| 728 // 565 is not a sized internal format on desktop GL. So on desktop with | 730 // 565 is not a sized internal format on desktop GL. So on desktop with |
| 729 // 565 we always use an unsized internal format to let the system pick | 731 // 565 we always use an unsized internal format to let the system pick |
| 730 // the best sized format to convert the 565 data to. Since TexStorage | 732 // the best sized format to convert the 565 data to. Since TexStorage |
| 731 // only allows sized internal formats we will instead use TexImage2D. | 733 // only allows sized internal formats we will instead use TexImage2D. |
| 732 useTexStorage = desc.fConfig != kRGB_565_GrPixelConfig; | 734 useTexStorage = desc.fConfig != kRGB_565_GrPixelConfig; |
| 733 } | 735 } |
| 734 | 736 |
| 735 GrGLenum internalFormat = 0x0; // suppress warning | |
| 736 GrGLenum externalFormat = 0x0; // suppress warning | |
| 737 GrGLenum externalType = 0x0; // suppress warning | |
| 738 | 737 |
| 739 bool useSizedFormat = use_sized_format_for_texture(useTexStorage, this->ctxI nfo(), | 738 bool useSizedFormat = use_sized_format_for_texture(useTexStorage, this->ctxI nfo(), |
| 740 desc.fConfig); | 739 desc.fConfig); |
| 741 | 740 |
| 742 if (!this->configToGLFormats(desc.fConfig, useSizedFormat, &internalFormat, | 741 // Internal format comes from the texture desc. |
| 743 &externalFormat, &externalType)) { | 742 GrGLenum internalFormat = useSizedFormat ? |
| 744 return false; | 743 fConfigTable[desc.fConfig].fSizedInternalFormat: |
| 745 } | 744 fConfigTable[desc.fConfig].fBaseInternalFormat; |
| 746 | 745 |
| 747 if (dataConfig != desc.fConfig) { | 746 // External format and type come from the upload data. |
| 748 // call this again if we're going to upload a different config than the texture's config. | 747 GrGLenum externalFormat = fConfigTable[dataConfig].fExternalFormatForTexImag e; |
| 749 if (!this->configToGLFormats(dataConfig, false, nullptr, &externalFormat , | 748 GrGLenum externalType = fConfigTable[dataConfig].fExternalType; |
| 750 &externalType)) { | |
| 751 return false; | |
| 752 } | |
| 753 } | |
| 754 | 749 |
| 755 /* | 750 /* |
| 756 * check whether to allocate a temporary buffer for flipping y or | 751 * Check whether to allocate a temporary buffer for flipping y or |
| 757 * because our srcData has extra bytes past each row. If so, we need | 752 * because our srcData has extra bytes past each row. If so, we need |
| 758 * to trim those off here, since GL ES may not let us specify | 753 * to trim those off here, since GL ES may not let us specify |
| 759 * GL_UNPACK_ROW_LENGTH. | 754 * GL_UNPACK_ROW_LENGTH. |
| 760 */ | 755 */ |
| 761 bool restoreGLRowLength = false; | 756 bool restoreGLRowLength = false; |
| 762 bool swFlipY = false; | 757 bool swFlipY = false; |
| 763 bool glFlipY = false; | 758 bool glFlipY = false; |
| 764 if (data) { | 759 if (data) { |
| 765 if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) { | 760 if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) { |
| 766 if (this->glCaps().unpackFlipYSupport()) { | 761 if (this->glCaps().unpackFlipYSupport()) { |
| (...skipping 1279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2046 return false; | 2041 return false; |
| 2047 } | 2042 } |
| 2048 | 2043 |
| 2049 GrGLenum format = 0; | 2044 GrGLenum format = 0; |
| 2050 GrGLenum type = 0; | 2045 GrGLenum type = 0; |
| 2051 bool flipY = kBottomLeft_GrSurfaceOrigin == surface->origin(); | 2046 bool flipY = kBottomLeft_GrSurfaceOrigin == surface->origin(); |
| 2052 if (!this->configToGLFormats(config, false, nullptr, &format, &type)) { | 2047 if (!this->configToGLFormats(config, false, nullptr, &format, &type)) { |
| 2053 return false; | 2048 return false; |
| 2054 } | 2049 } |
| 2055 | 2050 |
| 2056 // glReadPixels does not allow GL_SRGB_ALPHA. Instead use GL_RGBA. This will not trigger a | |
| 2057 // conversion when the src is srgb. | |
| 2058 if (GR_GL_SRGB_ALPHA == format) { | |
| 2059 format = GR_GL_RGBA; | |
| 2060 } | |
| 2061 | |
| 2062 // resolve the render target if necessary | 2051 // resolve the render target if necessary |
| 2063 switch (tgt->getResolveType()) { | 2052 switch (tgt->getResolveType()) { |
| 2064 case GrGLRenderTarget::kCantResolve_ResolveType: | 2053 case GrGLRenderTarget::kCantResolve_ResolveType: |
| 2065 return false; | 2054 return false; |
| 2066 case GrGLRenderTarget::kAutoResolves_ResolveType: | 2055 case GrGLRenderTarget::kAutoResolves_ResolveType: |
| 2067 this->flushRenderTarget(tgt, &SkIRect::EmptyIRect()); | 2056 this->flushRenderTarget(tgt, &SkIRect::EmptyIRect()); |
| 2068 break; | 2057 break; |
| 2069 case GrGLRenderTarget::kCanResolve_ResolveType: | 2058 case GrGLRenderTarget::kCanResolve_ResolveType: |
| 2070 this->onResolveRenderTarget(tgt); | 2059 this->onResolveRenderTarget(tgt); |
| 2071 // we don't track the state of the READ FBO ID. | 2060 // we don't track the state of the READ FBO ID. |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2688 } else { | 2677 } else { |
| 2689 fConfigTable[kBGRA_8888_GrPixelConfig].fBaseInternalFormat = GR_GL_RGBA; | 2678 fConfigTable[kBGRA_8888_GrPixelConfig].fBaseInternalFormat = GR_GL_RGBA; |
| 2690 fConfigTable[kBGRA_8888_GrPixelConfig].fSizedInternalFormat = GR_GL_RGBA 8; | 2679 fConfigTable[kBGRA_8888_GrPixelConfig].fSizedInternalFormat = GR_GL_RGBA 8; |
| 2691 } | 2680 } |
| 2692 fConfigTable[kBGRA_8888_GrPixelConfig].fExternalFormat= GR_GL_BGRA; | 2681 fConfigTable[kBGRA_8888_GrPixelConfig].fExternalFormat= GR_GL_BGRA; |
| 2693 fConfigTable[kBGRA_8888_GrPixelConfig].fExternalType = GR_GL_UNSIGNED_BYTE; | 2682 fConfigTable[kBGRA_8888_GrPixelConfig].fExternalType = GR_GL_UNSIGNED_BYTE; |
| 2694 | 2683 |
| 2695 | 2684 |
| 2696 fConfigTable[kSRGBA_8888_GrPixelConfig].fBaseInternalFormat = GR_GL_SRGB_ALP HA; | 2685 fConfigTable[kSRGBA_8888_GrPixelConfig].fBaseInternalFormat = GR_GL_SRGB_ALP HA; |
| 2697 fConfigTable[kSRGBA_8888_GrPixelConfig].fSizedInternalFormat = GR_GL_SRGB8_A LPHA8; | 2686 fConfigTable[kSRGBA_8888_GrPixelConfig].fSizedInternalFormat = GR_GL_SRGB8_A LPHA8; |
| 2698 // OpenGL ES 2.0 + GL_EXT_sRGB allows GL_SRGB_ALPHA to be specified as the < format> | 2687 // GL does not do srgb<->rgb conversions when transferring between cpu and g pu. Thus, the |
| 2699 // param to Tex(Sub)Image2D. ES 2.0 requires the internalFormat and format t o match. | 2688 // external format is GL_RGBA. See below for note about ES2.0 and glTex[Sub] Image. |
| 2700 // Thus, on ES 2.0 we will use GL_SRGB_ALPHA as the externalFormat. However, | 2689 fConfigTable[kSRGBA_8888_GrPixelConfig].fExternalFormat = GR_GL_RGBA; |
| 2701 // onReadPixels needs code to override that because GL_SRGB_ALPHA is not all owed as a | |
| 2702 // glReadPixels format. | |
| 2703 // On OpenGL and ES 3.0 GL_SRGB_ALPHA does not work for the <format> param t o | |
| 2704 // glReadPixels nor does it work with Tex(Sub)Image2D So we always set the e xternalFormat | |
| 2705 // return to GL_RGBA. | |
| 2706 if (this->glStandard() == kGLES_GrGLStandard && | |
| 2707 this->glVersion() == GR_GL_VER(2,0)) { | |
| 2708 fConfigTable[kSRGBA_8888_GrPixelConfig].fExternalFormat = GR_GL_SRGB_ALP HA; | |
| 2709 } else { | |
| 2710 fConfigTable[kSRGBA_8888_GrPixelConfig].fExternalFormat = GR_GL_RGBA; | |
| 2711 } | |
| 2712 fConfigTable[kSRGBA_8888_GrPixelConfig].fExternalType = GR_GL_UNSIGNED_BYTE; | 2690 fConfigTable[kSRGBA_8888_GrPixelConfig].fExternalType = GR_GL_UNSIGNED_BYTE; |
| 2713 | 2691 |
| 2714 | 2692 |
| 2715 fConfigTable[kRGB_565_GrPixelConfig].fBaseInternalFormat = GR_GL_RGB; | 2693 fConfigTable[kRGB_565_GrPixelConfig].fBaseInternalFormat = GR_GL_RGB; |
| 2716 if (this->glCaps().ES2CompatibilitySupport()) { | 2694 if (this->glCaps().ES2CompatibilitySupport()) { |
| 2717 fConfigTable[kRGB_565_GrPixelConfig].fSizedInternalFormat = GR_GL_RGB565 ; | 2695 fConfigTable[kRGB_565_GrPixelConfig].fSizedInternalFormat = GR_GL_RGB565 ; |
| 2718 } else { | 2696 } else { |
| 2719 fConfigTable[kRGB_565_GrPixelConfig].fSizedInternalFormat = GR_GL_RGB5; | 2697 fConfigTable[kRGB_565_GrPixelConfig].fSizedInternalFormat = GR_GL_RGB5; |
| 2720 } | 2698 } |
| 2721 fConfigTable[kRGB_565_GrPixelConfig].fExternalFormat = GR_GL_RGB; | 2699 fConfigTable[kRGB_565_GrPixelConfig].fExternalFormat = GR_GL_RGB; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2801 fConfigTable[kR11_EAC_GrPixelConfig].fBaseInternalFormat = GR_GL_COMPRESSED_ R11_EAC; | 2779 fConfigTable[kR11_EAC_GrPixelConfig].fBaseInternalFormat = GR_GL_COMPRESSED_ R11_EAC; |
| 2802 fConfigTable[kR11_EAC_GrPixelConfig].fSizedInternalFormat = GR_GL_COMPRESSED _R11_EAC; | 2780 fConfigTable[kR11_EAC_GrPixelConfig].fSizedInternalFormat = GR_GL_COMPRESSED _R11_EAC; |
| 2803 fConfigTable[kR11_EAC_GrPixelConfig].fExternalFormat = 0; | 2781 fConfigTable[kR11_EAC_GrPixelConfig].fExternalFormat = 0; |
| 2804 fConfigTable[kR11_EAC_GrPixelConfig].fExternalType = 0; | 2782 fConfigTable[kR11_EAC_GrPixelConfig].fExternalType = 0; |
| 2805 | 2783 |
| 2806 fConfigTable[kASTC_12x12_GrPixelConfig].fBaseInternalFormat = GR_GL_COMPRESS ED_RGBA_ASTC_12x12; | 2784 fConfigTable[kASTC_12x12_GrPixelConfig].fBaseInternalFormat = GR_GL_COMPRESS ED_RGBA_ASTC_12x12; |
| 2807 fConfigTable[kASTC_12x12_GrPixelConfig].fSizedInternalFormat = GR_GL_COMPRES SED_RGBA_ASTC_12x12; | 2785 fConfigTable[kASTC_12x12_GrPixelConfig].fSizedInternalFormat = GR_GL_COMPRES SED_RGBA_ASTC_12x12; |
| 2808 fConfigTable[kASTC_12x12_GrPixelConfig].fExternalFormat = 0; | 2786 fConfigTable[kASTC_12x12_GrPixelConfig].fExternalFormat = 0; |
| 2809 fConfigTable[kASTC_12x12_GrPixelConfig].fExternalType = 0; | 2787 fConfigTable[kASTC_12x12_GrPixelConfig].fExternalType = 0; |
| 2810 | 2788 |
| 2789 | |
| 2790 // Almost always we want to pass fExternalFormat as the <format> param to gl Tex[Sub]Image. | |
| 2791 for (int i = 0; i < kGrPixelConfigCnt; ++i) { | |
| 2792 fConfigTable[i].fExternalFormatForTexImage = fConfigTable[i].fExternalFo rmat; | |
| 2793 } | |
|
jvanverth1
2015/12/17 19:21:50
What about iOS, BGRA, and ES 3.0? Didn't we see so
bsalomon
2015/12/17 19:35:11
I don't recall that. AFAIK there is no sRGB BGRA f
| |
| 2794 // OpenGL ES 2.0 + GL_EXT_sRGB allows GL_SRGB_ALPHA to be specified as the < format> | |
| 2795 // param to Tex(Sub)Image. ES 2.0 requires the <internalFormat> and <format> params to match. | |
| 2796 // Thus, on ES 2.0 we will use GL_SRGB_ALPHA as the <format> param. | |
| 2797 // On OpenGL and ES 3.0+ GL_SRGB_ALPHA does not work for the <format> param to glTexImage. | |
| 2798 if (this->glStandard() == kGLES_GrGLStandard && this->glVersion() == GR_GL_V ER(2,0)) { | |
| 2799 fConfigTable[kSRGBA_8888_GrPixelConfig].fExternalFormatForTexImage = GR_ GL_SRGB_ALPHA; | |
| 2800 } | |
| 2801 | |
| 2811 #ifdef SK_DEBUG | 2802 #ifdef SK_DEBUG |
| 2812 // Make sure we initialized everything. | 2803 // Make sure we initialized everything. |
| 2813 ConfigEntry defaultEntry; | 2804 ConfigEntry defaultEntry; |
| 2814 for (int i = 0; i < kLast_GrPixelConfig; ++i) { | 2805 for (int i = 0; i < kGrPixelConfigCnt; ++i) { |
| 2815 SkASSERT(defaultEntry.fBaseInternalFormat != fConfigTable[i].fBaseIntern alFormat); | 2806 SkASSERT(defaultEntry.fBaseInternalFormat != fConfigTable[i].fBaseIntern alFormat); |
| 2816 SkASSERT(defaultEntry.fSizedInternalFormat != fConfigTable[i].fSizedInte rnalFormat); | 2807 SkASSERT(defaultEntry.fSizedInternalFormat != fConfigTable[i].fSizedInte rnalFormat); |
| 2817 SkASSERT(defaultEntry.fExternalFormat != fConfigTable[i].fExternalFormat ); | 2808 SkASSERT(defaultEntry.fExternalFormat != fConfigTable[i].fExternalFormat ); |
| 2818 SkASSERT(defaultEntry.fExternalType != fConfigTable[i].fExternalType); | 2809 SkASSERT(defaultEntry.fExternalType != fConfigTable[i].fExternalType); |
| 2819 } | 2810 } |
| 2820 #endif | 2811 #endif |
| 2821 } | 2812 } |
| 2822 | 2813 |
| 2823 bool GrGLGpu::configToGLFormats(GrPixelConfig config, | 2814 bool GrGLGpu::configToGLFormats(GrPixelConfig config, |
| 2824 bool getSizedInternalFormat, | 2815 bool getSizedInternalFormat, |
| (...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3642 this->setVertexArrayID(gpu, 0); | 3633 this->setVertexArrayID(gpu, 0); |
| 3643 } | 3634 } |
| 3644 int attrCount = gpu->glCaps().maxVertexAttributes(); | 3635 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 3645 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 3636 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 3646 fDefaultVertexArrayAttribState.resize(attrCount); | 3637 fDefaultVertexArrayAttribState.resize(attrCount); |
| 3647 } | 3638 } |
| 3648 attribState = &fDefaultVertexArrayAttribState; | 3639 attribState = &fDefaultVertexArrayAttribState; |
| 3649 } | 3640 } |
| 3650 return attribState; | 3641 return attribState; |
| 3651 } | 3642 } |
| OLD | NEW |