Index: src/gpu/gl/GrGLGpu.cpp |
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp |
index e0b7d4aca5e2561df0249a8e81b4e41c3b5a50e4..b095e66ea3272a98ce3060a64979ad84518119f5 100644 |
--- a/src/gpu/gl/GrGLGpu.cpp |
+++ b/src/gpu/gl/GrGLGpu.cpp |
@@ -742,14 +742,14 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, |
#endif |
// Internal format comes from the texture desc. |
- GrGLenum internalFormat = |
- this->glCaps().configGLFormats(desc.fConfig).fInternalFormatTexImage; |
- |
+ GrGLenum internalFormat; |
// External format and type come from the upload data. |
- GrGLenum externalFormat = |
- this->glCaps().configGLFormats(dataConfig).fExternalFormatForTexImage; |
- GrGLenum externalType = this->glCaps().configGLFormats(dataConfig).fExternalType; |
- |
+ GrGLenum externalFormat; |
+ GrGLenum externalType; |
+ if (!this->glCaps().getTexImageFormats(desc.fConfig, dataConfig, &internalFormat, |
+ &externalFormat, &externalType)) { |
+ return false; |
+ } |
/* |
* Check whether to allocate a temporary buffer for flipping y or |
* because our srcData has extra bytes past each row. If so, we need |
@@ -811,7 +811,7 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, |
} else { |
CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
GL_ALLOC_CALL(this->glInterface(), TexImage2D(target, 0, internalFormat, desc.fWidth, |
- desc.fHeight, 0, externalFormat, |
+ desc.fHeight, 0, externalFormat, |
externalType, dataOrOffset)); |
GrGLenum error = check_alloc_error(desc, this->glInterface()); |
if (error != GR_GL_NO_ERROR) { |
@@ -878,9 +878,11 @@ bool GrGLGpu::uploadCompressedTexData(const GrSurfaceDesc& desc, |
// is a multiple of the block size. |
size_t dataSize = GrCompressedFormatDataSize(desc.fConfig, width, height); |
- // We only need the internal format for compressed 2D textures. There is on |
- // sized vs base internal format distinction for compressed textures. |
- GrGLenum internalFormat =this->glCaps().configGLFormats(desc.fConfig).fSizedInternalFormat; |
+ // We only need the internal format for compressed 2D textures. |
+ GrGLenum internalFormat; |
+ if (!this->glCaps().getCompressedTexImageFormats(desc.fConfig, &internalFormat)) { |
+ return false; |
+ } |
if (kNewTexture_UploadType == uploadType) { |
CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
@@ -988,12 +990,9 @@ bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, |
!idDesc->fMSColorRenderbufferID) { |
goto FAILED; |
} |
- // All ES versions (thus far) require sized internal formats for render buffers. |
- // TODO: Always use sized internal format? |
- // If this rule gets more complicated, add a field to ConfigEntry rather than logic here. |
- colorRenderbufferFormat = kGLES_GrGLStandard == this->glStandard() ? |
- this->glCaps().configGLFormats(desc.fConfig).fSizedInternalFormat : |
- this->glCaps().configGLFormats(desc.fConfig).fBaseInternalFormat; |
+ if (!this->glCaps().getRenderbufferFormat(desc.fConfig, &colorRenderbufferFormat)) { |
+ return false; |
+ } |
} else { |
idDesc->fRTFBOID = idDesc->fTexFBOID; |
} |
@@ -1267,17 +1266,22 @@ int GrGLGpu::getCompatibleStencilIndex(GrPixelConfig config) { |
GR_GL_TEXTURE_WRAP_T, |
GR_GL_CLAMP_TO_EDGE)); |
- const GrGLCaps::ConfigFormats colorFormats = this->glCaps().configGLFormats(config); |
- |
+ GrGLenum internalFormat; |
+ GrGLenum externalFormat; |
+ GrGLenum externalType; |
+ if (!this->glCaps().getTexImageFormats(config, config, &internalFormat, &externalFormat, |
+ &externalType)) { |
+ return false; |
+ } |
CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
GL_ALLOC_CALL(this->glInterface(), TexImage2D(GR_GL_TEXTURE_2D, |
0, |
- colorFormats.fInternalFormatTexImage, |
+ internalFormat, |
kSize, |
kSize, |
0, |
- colorFormats.fExternalFormatForTexImage, |
- colorFormats.fExternalType, |
+ externalFormat, |
+ externalType, |
NULL)); |
if (GR_GL_NO_ERROR != CHECK_ALLOC_ERROR(this->glInterface())) { |
GL_CALL(DeleteTextures(1, &colorID)); |
@@ -2016,8 +2020,12 @@ bool GrGLGpu::onReadPixels(GrSurface* surface, |
return false; |
} |
- GrGLenum format = this->glCaps().configGLFormats(config).fExternalFormat; |
- GrGLenum type = this->glCaps().configGLFormats(config).fExternalType; |
+ GrGLenum externalFormat; |
+ GrGLenum externalType; |
+ if (!this->glCaps().getReadPixelsFormat(surface->config(), config, &externalFormat, |
+ &externalType)) { |
+ return false; |
+ } |
bool flipY = kBottomLeft_GrSurfaceOrigin == surface->origin(); |
// resolve the render target if necessary |
@@ -2070,7 +2078,7 @@ bool GrGLGpu::onReadPixels(GrSurface* surface, |
GL_CALL(ReadPixels(readRect.fLeft, readRect.fBottom, |
readRect.fWidth, readRect.fHeight, |
- format, type, readDst)); |
+ externalFormat, externalType, readDst)); |
if (readDstRowBytes != tightRowBytes) { |
SkASSERT(this->glCaps().packRowLengthSupport()); |
GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 0)); |
@@ -2443,8 +2451,7 @@ void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) { |
GrColor blendConst = blendInfo.fBlendConstant; |
if ((BlendCoeffReferencesConstant(srcCoeff) || |
BlendCoeffReferencesConstant(dstCoeff)) && |
- (!fHWBlendState.fConstColorValid || |
- fHWBlendState.fConstColor != blendConst)) { |
+ (!fHWBlendState.fConstColorValid || fHWBlendState.fConstColor != blendConst)) { |
GrGLfloat c[4]; |
GrColorToRGBAFloat(blendConst, c); |
GL_CALL(BlendColor(c[0], c[1], c[2], c[3])); |
@@ -3326,9 +3333,19 @@ 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 = this->glCaps().configGLFormats(config).fInternalFormatTexImage; |
- GrGLenum externalFormat = this->glCaps().configGLFormats(config).fExternalFormatForTexImage; |
- GrGLenum externalType = this->glCaps().configGLFormats(config).fExternalType; |
+ GrGLenum internalFormat; |
+ GrGLenum externalFormat; |
+ GrGLenum externalType; |
+ |
+ if (!this->glCaps().getTexImageFormats(config, config, &internalFormat, &externalFormat, |
+ &externalType)) { |
+ delete info; |
+#ifdef SK_IGNORE_GL_TEXTURE_TARGET |
+ return 0; |
+#else |
+ return reinterpret_cast<GrBackendObject>(nullptr); |
+#endif |
+ } |
GL_CALL(TexImage2D(info->fTarget, 0, internalFormat, w, h, 0, externalFormat, |
externalType, pixels)); |