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
This commit is contained in:
parent
102b07e934
commit
926cb02389
@ -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));
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user