From d3312595c86289113ea5994234844388523499e8 Mon Sep 17 00:00:00 2001 From: bsalomon Date: Fri, 4 Mar 2016 07:06:43 -0800 Subject: Revert of Don't allow nullptr in texels array params (unless using a transfer buffer). (patchset #3 id:60001 of https://codereview.chromium.org/1765633002/ ) Reason for revert: breaks vk build Original issue's description: > Don't allow nullptr in texels array params (unless using a transfer buffer). > > Require all levels in writePixels to have a non-nullptr. > GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1765633002 > > Committed: https://skia.googlesource.com/skia/+/8ee78f31b2a29a5f76403755ea17bad9be74a3ec TBR=jvanverth@google.com,cblume@google.com,cblume@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Review URL: https://codereview.chromium.org/1760343003 --- src/gpu/gl/GrGLGpu.cpp | 101 ++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 52 deletions(-) (limited to 'src/gpu/gl') diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index fe803de0a9..dc50c1429c 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -926,7 +926,7 @@ static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc, * @param succeeded Set to true if allocating and populating the texture completed * without error. */ -static bool allocate_and_populate_uncompressed_texture(const GrSurfaceDesc& desc, +static void allocate_and_populate_uncompressed_texture(const GrSurfaceDesc& desc, const GrGLInterface& interface, const GrGLCaps& caps, GrGLenum target, @@ -934,7 +934,8 @@ static bool allocate_and_populate_uncompressed_texture(const GrSurfaceDesc& desc GrGLenum externalFormat, GrGLenum externalType, const SkTArray& texels, - int baseWidth, int baseHeight) { + int baseWidth, int baseHeight, + bool* succeeded) { CLEAR_ERROR_BEFORE_ALLOC(&interface); bool useTexStorage = caps.isConfigTexSupportEnabled(desc.fConfig); @@ -954,7 +955,7 @@ static bool allocate_and_populate_uncompressed_texture(const GrSurfaceDesc& desc desc.fWidth, desc.fHeight)); GrGLenum error = check_alloc_error(desc, &interface); if (error != GR_GL_NO_ERROR) { - return false; + *succeeded = false; } else { for (int currentMipLevel = 0; currentMipLevel < texels.count(); currentMipLevel++) { const void* currentMipData = texels[currentMipLevel].fPixels; @@ -975,48 +976,33 @@ static bool allocate_and_populate_uncompressed_texture(const GrSurfaceDesc& desc externalFormat, externalType, currentMipData)); } - return true; + *succeeded = true; } } else { - if (texels.empty()) { + *succeeded = true; + for (int currentMipLevel = 0; currentMipLevel < texels.count(); currentMipLevel++) { + int twoToTheMipLevel = 1 << currentMipLevel; + int currentWidth = SkTMax(1, baseWidth / twoToTheMipLevel); + int currentHeight = SkTMax(1, baseHeight / twoToTheMipLevel); + const void* currentMipData = texels[currentMipLevel].fPixels; + // Even if curremtMipData is nullptr, continue to call TexImage2D. + // This will allocate texture memory which we can later populate. GL_ALLOC_CALL(&interface, TexImage2D(target, - 0, + currentMipLevel, internalFormat, - baseWidth, - baseHeight, + currentWidth, + currentHeight, 0, // border externalFormat, externalType, - nullptr)); + currentMipData)); GrGLenum error = check_alloc_error(desc, &interface); if (error != GR_GL_NO_ERROR) { - return false; - } - } else { - for (int currentMipLevel = 0; currentMipLevel < texels.count(); currentMipLevel++) { - int twoToTheMipLevel = 1 << currentMipLevel; - int currentWidth = SkTMax(1, baseWidth / twoToTheMipLevel); - int currentHeight = SkTMax(1, baseHeight / twoToTheMipLevel); - const void* currentMipData = texels[currentMipLevel].fPixels; - // Even if curremtMipData is nullptr, continue to call TexImage2D. - // This will allocate texture memory which we can later populate. - GL_ALLOC_CALL(&interface, - TexImage2D(target, - currentMipLevel, - internalFormat, - currentWidth, - currentHeight, - 0, // border - externalFormat, externalType, - currentMipData)); - GrGLenum error = check_alloc_error(desc, &interface); - if (error != GR_GL_NO_ERROR) { - return false; - } + *succeeded = false; + break; } } } - return true; } /** @@ -1150,7 +1136,8 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, for (int currentMipLevel = texelsShallowCopy.count() - 1; currentMipLevel >= 0; currentMipLevel--) { - SkASSERT(texelsShallowCopy[currentMipLevel].fPixels || kTransfer_UploadType == uploadType); + SkASSERT(texelsShallowCopy[currentMipLevel].fPixels || + kNewTexture_UploadType == uploadType || kTransfer_UploadType == uploadType); } const GrGLInterface* interface = this->glInterface(); @@ -1167,6 +1154,10 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, int currentWidth = SkTMax(1, width / twoToTheMipLevel); int currentHeight = SkTMax(1, height / twoToTheMipLevel); + if (texelsShallowCopy[currentMipLevel].fPixels == nullptr) { + continue; + } + if (currentHeight > SK_MaxS32 || currentWidth > SK_MaxS32) { return false; @@ -1202,7 +1193,7 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, bool swFlipY = false; bool glFlipY = false; - if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin && !texelsShallowCopy.empty()) { + if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) { if (caps.unpackFlipYSupport()) { glFlipY = true; } else { @@ -1228,6 +1219,10 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, char* buffer = (char*)tempStorage.reset(combined_buffer_size); for (int currentMipLevel = 0; currentMipLevel < texelsShallowCopy.count(); currentMipLevel++) { + if (texelsShallowCopy[currentMipLevel].fPixels == nullptr) { + continue; + } + int twoToTheMipLevel = 1 << currentMipLevel; int currentWidth = SkTMax(1, width / twoToTheMipLevel); int currentHeight = SkTMax(1, height / twoToTheMipLevel); @@ -1274,9 +1269,6 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, } else { return false; } - } - - if (!texelsShallowCopy.empty()) { if (glFlipY) { GR_GL_CALL(interface, PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE)); } @@ -1289,10 +1281,10 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, 0 == left && 0 == top && desc.fWidth == width && desc.fHeight == height && !desc.fTextureStorageAllocator.fAllocateTextureStorage) { - succeeded = allocate_and_populate_uncompressed_texture(desc, *interface, caps, target, - internalFormat, externalFormat, - externalType, texelsShallowCopy, - width, height); + allocate_and_populate_uncompressed_texture(desc, *interface, caps, target, + internalFormat, externalFormat, + externalType, texelsShallowCopy, + width, height, &succeeded); } else { if (swFlipY || glFlipY) { top = desc.fHeight - (top + height); @@ -1302,6 +1294,9 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, int twoToTheMipLevel = 1 << currentMipLevel; int currentWidth = SkTMax(1, width / twoToTheMipLevel); int currentHeight = SkTMax(1, height / twoToTheMipLevel); + if (texelsShallowCopy[currentMipLevel].fPixels == nullptr) { + continue; + } GL_CALL(TexSubImage2D(target, currentMipLevel, @@ -1329,6 +1324,8 @@ bool GrGLGpu::uploadCompressedTexData(const GrSurfaceDesc& desc, UploadType uploadType, int left, int top, int width, int height) { SkASSERT(this->caps()->isConfigTexturable(desc.fConfig)); + SkASSERT(kTransfer_UploadType != uploadType && + (texels[0].fPixels || kNewTexture_UploadType != uploadType)); // No support for software flip y, yet... SkASSERT(kBottomLeft_GrSurfaceOrigin != desc.fOrigin); @@ -1369,7 +1366,9 @@ bool GrGLGpu::uploadCompressedTexData(const GrSurfaceDesc& desc, return false; } for (int currentMipLevel = 0; currentMipLevel < texels.count(); currentMipLevel++) { - SkASSERT(texels[currentMipLevel].fPixels || kTransfer_UploadType == uploadType); + if (texels[currentMipLevel].fPixels == nullptr) { + continue; + } int twoToTheMipLevel = 1 << currentMipLevel; int currentWidth = SkTMax(1, width / twoToTheMipLevel); @@ -1848,15 +1847,14 @@ bool GrGLGpu::createTextureExternalAllocatorImpl(const GrSurfaceDesc& desc, // We do not make SkTArray available outside of Skia, // and so we do not want to allow mipmaps to external // allocators just yet. - SkASSERT(texels.count() < 2); + SkASSERT(texels.count() == 1); + SkSTArray<1, GrMipLevel> texelsShallowCopy(1); + texelsShallowCopy.push_back(texels[0]); - const void* pixels = nullptr; - if (!texels.empty()) { - pixels = texels.begin()->fPixels; - } switch (desc.fTextureStorageAllocator.fAllocateTextureStorage( desc.fTextureStorageAllocator.fCtx, reinterpret_cast(info), - desc.fWidth, desc.fHeight, desc.fConfig, pixels, desc.fOrigin)) { + desc.fWidth, desc.fHeight, desc.fConfig, texelsShallowCopy[0].fPixels, + desc.fOrigin)) { case GrTextureStorageAllocator::Result::kSucceededAndUploaded: return true; case GrTextureStorageAllocator::Result::kFailed: @@ -1867,7 +1865,7 @@ bool GrGLGpu::createTextureExternalAllocatorImpl(const GrSurfaceDesc& desc, if (!this->uploadTexData(desc, info->fTarget, kNewTexture_UploadType, 0, 0, desc.fWidth, desc.fHeight, - desc.fConfig, texels)) { + desc.fConfig, texelsShallowCopy)) { desc.fTextureStorageAllocator.fDeallocateTextureStorage( desc.fTextureStorageAllocator.fCtx, reinterpret_cast(info)); return false; @@ -2481,8 +2479,7 @@ bool GrGLGpu::readPixelsSupported(GrPixelConfig rtConfig, GrPixelConfig readConf desc.fConfig = rtConfig; desc.fWidth = desc.fHeight = 16; desc.fFlags = kRenderTarget_GrSurfaceFlag; - SkAutoTUnref temp(this->createTexture(desc, - SkBudgeted::kNo)); + SkAutoTUnref temp(this->createTexture(desc, SkBudgeted::kNo, nullptr, 0)); if (!temp) { return false; } -- cgit v1.2.3