diff options
author | 2015-12-17 18:15:11 -0800 | |
---|---|---|
committer | 2015-12-17 18:15:11 -0800 | |
commit | 926cb023892378a2eb7c05fc0bce8650ec09ceb1 (patch) | |
tree | e91a22e3e8690e93280a72c918f690022253ffea | |
parent | 102b07e93439c34a4efc34f7c014c8a337a7e686 (diff) |
Add field for internalFormat param to glTexImage to GrGLGpu::ConfigEntry.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1532273002
Review URL: https://codereview.chromium.org/1532273002
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 76 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.h | 2 |
2 files changed, 37 insertions, 41 deletions
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index d180eb7444..06405aa7d0 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -668,24 +668,6 @@ static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc, } } -/** - * Determines if sized internal formats are available for the texture being created. - * - * @param info Info about the GL context. - * @param textureConfig The pixel configuration for the texture being created. - */ -static bool use_sized_format_for_texture(const GrGLContextInfo& info, GrPixelConfig textureConfig) { - // ES2 requires an unsized format for glTexImage, unlike ES3 and desktop. - bool useSizedFormat = false; - if (kGL_GrGLStandard == info.standard() || - (info.version() >= GR_GL_VER(3, 0) && - // ES3 only works with sized BGRA8 format if "GL_APPLE_texture_format_BGRA8888" enabled - (kBGRA_8888_GrPixelConfig != textureConfig || !info.caps()->bgraIsInternalFormat()))) { - useSizedFormat = true; - } - return useSizedFormat; -} - bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, GrGLenum target, bool isNewTexture, @@ -715,12 +697,8 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, SkAutoSMalloc<128 * 128> tempStorage; #endif - bool useSizedFormat = use_sized_format_for_texture(this->ctxInfo(), desc.fConfig); - // Internal format comes from the texture desc. - GrGLenum internalFormat = useSizedFormat ? - fConfigTable[desc.fConfig].fSizedInternalFormat: - fConfigTable[desc.fConfig].fBaseInternalFormat; + GrGLenum internalFormat = fConfigTable[desc.fConfig].fInternalFormatTexImage; // External format and type come from the upload data. GrGLenum externalFormat = fConfigTable[dataConfig].fExternalFormatForTexImage; @@ -1219,6 +1197,7 @@ void inline get_stencil_rb_sizes(const GrGLInterface* gl, int GrGLGpu::getCompatibleStencilIndex(GrPixelConfig config) { static const int kSize = 16; + SkASSERT(this->caps()->isConfigRenderable(config, false)); if (ConfigEntry::kUnknown_StencilIndex == fConfigTable[config].fStencilFormatIndex) { // Default to unsupported fConfigTable[config].fStencilFormatIndex = ConfigEntry::kUnsupported_StencilFormatIndex; @@ -1240,19 +1219,14 @@ int GrGLGpu::getCompatibleStencilIndex(GrPixelConfig config) { GR_GL_TEXTURE_WRAP_T, GR_GL_CLAMP_TO_EDGE)); - GrGLenum internalFormat = 0x0; // suppress warning - GrGLenum externalFormat = 0x0; // suppress warning - GrGLenum externalType = 0x0; // suppress warning - bool useSizedFormat = use_sized_format_for_texture(this->ctxInfo(), config); - if (!this->configToGLFormats(config, useSizedFormat, &internalFormat, - &externalFormat, &externalType)) { - GL_CALL(DeleteTextures(1, &colorID)); - return ConfigEntry::kUnsupported_StencilFormatIndex; - } + GrGLenum internalFormat = fConfigTable[config].fInternalFormatTexImage; + GrGLenum externalFormat = fConfigTable[config].fExternalFormatForTexImage; + GrGLenum externalType = fConfigTable[config].fExternalType; CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, - 0, internalFormat, + 0, + internalFormat, kSize, kSize, 0, @@ -2742,10 +2716,17 @@ void GrGLGpu::generateConfigTable() { fConfigTable[kASTC_12x12_GrPixelConfig].fExternalFormat = 0; fConfigTable[kASTC_12x12_GrPixelConfig].fExternalType = 0; + // Bulk populate the texture internal/external formats here and then deal with exceptions below. - // Almost always we want to pass fExternalFormat as the <format> param to glTex[Sub]Image. + // ES 2.0 requires that the internal/external formats match. + bool useSizedFormats = (kGL_GrGLStandard == this->glStandard() || + this->glVersion() >= GR_GL_VER(3,0)); for (int i = 0; i < kGrPixelConfigCnt; ++i) { + // Almost always we want to pass fExternalFormat as the <format> param to glTex[Sub]Image. fConfigTable[i].fExternalFormatForTexImage = fConfigTable[i].fExternalFormat; + fConfigTable[i].fInternalFormatTexImage = useSizedFormats ? + fConfigTable[i].fSizedInternalFormat : + fConfigTable[i].fBaseInternalFormat; } // OpenGL ES 2.0 + GL_EXT_sRGB allows GL_SRGB_ALPHA to be specified as the <format> // param to Tex(Sub)Image. ES 2.0 requires the <internalFormat> and <format> params to match. @@ -2755,6 +2736,20 @@ void GrGLGpu::generateConfigTable() { fConfigTable[kSRGBA_8888_GrPixelConfig].fExternalFormatForTexImage = GR_GL_SRGB_ALPHA; } + // If BGRA is supported as an internal format it must always be specified to glTex[Sub]Image + // as a base format. + // GL_EXT_texture_format_BGRA8888: + // This extension GL_BGRA as an unsized internal format. However, it is written against ES + // 2.0 and therefore doesn't define a value for GL_BGRA8 as ES 2.0 uses unsized internal + // formats. + // GL_APPLE_texture_format_BGRA8888: + // ES 2.0: the extension makes BGRA an external format but not an internal format. + // ES 3.0: the extension explicitly states GL_BGRA8 is not a valid internal format for + // glTexImage (just for glTexStorage). + if (useSizedFormats && this->glCaps().bgraIsInternalFormat()) { + fConfigTable[kBGRA_8888_GrPixelConfig].fInternalFormatTexImage = GR_GL_BGRA; + } + #ifdef SK_DEBUG // Make sure we initialized everything. ConfigEntry defaultEntry; @@ -3472,6 +3467,9 @@ void GrGLGpu::xferBarrier(GrRenderTarget* rt, GrXferBarrierType type) { GrBackendObject GrGLGpu::createTestingOnlyBackendTexture(void* pixels, int w, int h, GrPixelConfig config) const { + if (!this->caps()->isConfigTexturable(config)) { + return false; + } GrGLTextureInfo* info = new GrGLTextureInfo; info->fTarget = GR_GL_TEXTURE_2D; info->fID = 0; @@ -3484,13 +3482,9 @@ GrBackendObject GrGLGpu::createTestingOnlyBackendTexture(void* pixels, int w, in GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_WRAP_S, GR_GL_CLAMP_TO_EDGE)); GL_CALL(TexParameteri(info->fTarget, GR_GL_TEXTURE_WRAP_T, GR_GL_CLAMP_TO_EDGE)); - GrGLenum internalFormat = 0x0; // suppress warning - GrGLenum externalFormat = 0x0; // suppress warning - GrGLenum externalType = 0x0; // suppress warning - - bool useSizedFormat = use_sized_format_for_texture(this->ctxInfo(), config); - this->configToGLFormats(config, useSizedFormat, &internalFormat, &externalFormat, - &externalType); + GrGLenum internalFormat = fConfigTable[config].fInternalFormatTexImage; + GrGLenum externalFormat = fConfigTable[config].fExternalFormatForTexImage; + GrGLenum externalType = fConfigTable[config].fExternalType; GL_CALL(TexImage2D(info->fTarget, 0, internalFormat, w, h, 0, externalFormat, externalType, pixels)); diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h index e3b590f017..a14095d888 100644 --- a/src/gpu/gl/GrGLGpu.h +++ b/src/gpu/gl/GrGLGpu.h @@ -553,6 +553,8 @@ private: // The <format> parameter to use for glTexImage and glTexSubImage. // This is usually the same as fExternalFormat except for kSRGBA on some GL contexts. GrGLenum fExternalFormatForTexImage; + // Either the base or sized internal format depending on the GL and config. + GrGLenum fInternalFormatTexImage; // Index into GrGLCaps's list of stencil formats. Support is determined experimentally and // lazily. |