aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2015-12-17 18:15:11 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-17 18:15:11 -0800
commit926cb023892378a2eb7c05fc0bce8650ec09ceb1 (patch)
treee91a22e3e8690e93280a72c918f690022253ffea
parent102b07e93439c34a4efc34f7c014c8a337a7e686 (diff)
Add field for internalFormat param to glTexImage to GrGLGpu::ConfigEntry.
-rw-r--r--src/gpu/gl/GrGLGpu.cpp76
-rw-r--r--src/gpu/gl/GrGLGpu.h2
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.