 Chromium Code Reviews
 Chromium Code Reviews Issue 1532273002:
  Add field for internalFormat param to glTexImage to GrGLGpu::ConfigEntry.  (Closed) 
  Base URL: https://skia.googlesource.com/skia.git@nostorage
    
  
    Issue 1532273002:
  Add field for internalFormat param to glTexImage to GrGLGpu::ConfigEntry.  (Closed) 
  Base URL: https://skia.googlesource.com/skia.git@nostorage| Index: src/gpu/gl/GrGLGpu.cpp | 
| diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp | 
| index d180eb7444c646397d3c48f7a125d983e7e13002..06405aa7d07255712936d6b19775624968c1eec8 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)); | 
| 
egdaniel
2015/12/18 01:31:15
Do we know we will only get here for non-msaa?
 
bsalomon
2015/12/18 02:01:52
No, but we know that any msaa renderable format is
 | 
| 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)); |