diff options
author | Greg Daniel <egdaniel@google.com> | 2017-09-28 12:07:28 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-09-28 19:16:29 +0000 |
commit | d1935c16e889b6707a522f711e79c75353caa343 (patch) | |
tree | f8fe713b45c6cbe072667e06ddc24a7052a385cc /src/gpu/gl/GrGLGpu.cpp | |
parent | 29011a2bda560a645e6ddbe162df0856fe259e7b (diff) |
Update GrBitmapTextureMaker for handling mipped requests
Specifically this updates the case when we are requesting to use mip
maps but there is already an unmipped version in the cache. Previously
we just grabbed the unmipped.
Now we will create a new mipped resource. Upload the cpu data to all
the levels besides the base, copy the base level on GPU from the
original resource to the mipped one. Then the mipped resource will
take over the originals unique key.
Bug: skia:
Change-Id: I38e9725c93280dc2460a0be8a7a229e7f20e1614
Reviewed-on: https://skia-review.googlesource.com/43840
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/gpu/gl/GrGLGpu.cpp')
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index ff19bb6fc3..930e2e447a 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -952,10 +952,13 @@ static bool allocate_and_populate_texture(GrPixelConfig config, } } else { for (int currentMipLevel = 0; currentMipLevel < mipLevelCount; currentMipLevel++) { + const void* currentMipData = texels[currentMipLevel].fPixels; + if (!currentMipData) { + continue; + } 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, @@ -1033,10 +1036,6 @@ bool GrGLGpu::uploadTexData(GrPixelConfig texConfig, int texWidth, int texHeight memcpy(texelsShallowCopy.get(), texels, mipLevelCount*sizeof(GrMipLevel)); } - for (int currentMipLevel = 0; currentMipLevel < mipLevelCount; ++currentMipLevel) { - SkASSERT(texelsShallowCopy[currentMipLevel].fPixels); - } - const GrGLInterface* interface = this->glInterface(); const GrGLCaps& caps = this->glCaps(); @@ -1081,19 +1080,27 @@ bool GrGLGpu::uploadTexData(GrPixelConfig texConfig, int texWidth, int texHeight // find the combined size of all the mip levels and the relative offset of // each into the collective buffer - size_t combined_buffer_size = 0; - SkTArray<size_t> individual_mip_offsets(mipLevelCount); + size_t combinedBufferSize = 0; + SkTArray<size_t> individualMipOffsets(mipLevelCount); for (int currentMipLevel = 0; currentMipLevel < mipLevelCount; currentMipLevel++) { - int twoToTheMipLevel = 1 << currentMipLevel; - int currentWidth = SkTMax(1, width / twoToTheMipLevel); - int currentHeight = SkTMax(1, height / twoToTheMipLevel); - const size_t trimmedSize = currentWidth * bpp * currentHeight; - individual_mip_offsets.push_back(combined_buffer_size); - combined_buffer_size += trimmedSize; + if (texelsShallowCopy[currentMipLevel].fPixels) { + int twoToTheMipLevel = 1 << currentMipLevel; + int currentWidth = SkTMax(1, width / twoToTheMipLevel); + int currentHeight = SkTMax(1, height / twoToTheMipLevel); + const size_t trimmedSize = currentWidth * bpp * currentHeight; + individualMipOffsets.push_back(combinedBufferSize); + combinedBufferSize += trimmedSize; + } else { + individualMipOffsets.push_back(0); + } + } - char* buffer = (char*)tempStorage.reset(combined_buffer_size); + char* buffer = (char*)tempStorage.reset(combinedBufferSize); for (int currentMipLevel = 0; currentMipLevel < mipLevelCount; currentMipLevel++) { + if (!texelsShallowCopy[currentMipLevel].fPixels) { + continue; + } int twoToTheMipLevel = 1 << currentMipLevel; int currentWidth = SkTMax(1, width / twoToTheMipLevel); int currentHeight = SkTMax(1, height / twoToTheMipLevel); @@ -1107,9 +1114,9 @@ bool GrGLGpu::uploadTexData(GrPixelConfig texConfig, int texWidth, int texHeight */ restoreGLRowLength = false; - const size_t rowBytes = texelsShallowCopy[currentMipLevel].fRowBytes ? - texelsShallowCopy[currentMipLevel].fRowBytes : - trimRowBytes; + const size_t rowBytes = texelsShallowCopy[currentMipLevel].fRowBytes + ? texelsShallowCopy[currentMipLevel].fRowBytes + : trimRowBytes; // TODO: This optimization should be enabled with or without mips. // For use with mips, we must set GR_GL_UNPACK_ROW_LENGTH once per @@ -1128,7 +1135,7 @@ bool GrGLGpu::uploadTexData(GrPixelConfig texConfig, int texWidth, int texHeight if (swFlipY && currentHeight >= 1) { src += (currentHeight - 1) * rowBytes; } - char* dst = buffer + individual_mip_offsets[currentMipLevel]; + char* dst = buffer + individualMipOffsets[currentMipLevel]; for (int y = 0; y < currentHeight; y++) { memcpy(dst, src, trimRowBytes); if (swFlipY) { @@ -1140,7 +1147,7 @@ bool GrGLGpu::uploadTexData(GrPixelConfig texConfig, int texWidth, int texHeight } // now point data to our copied version texelsShallowCopy[currentMipLevel].fPixels = buffer + - individual_mip_offsets[currentMipLevel]; + individualMipOffsets[currentMipLevel]; texelsShallowCopy[currentMipLevel].fRowBytes = trimRowBytes; } } @@ -1167,6 +1174,9 @@ bool GrGLGpu::uploadTexData(GrPixelConfig texConfig, int texWidth, int texHeight top = texHeight - (top + height); } for (int currentMipLevel = 0; currentMipLevel < mipLevelCount; currentMipLevel++) { + if (!texelsShallowCopy[currentMipLevel].fPixels) { + continue; + } int twoToTheMipLevel = 1 << currentMipLevel; int currentWidth = SkTMax(1, width / twoToTheMipLevel); int currentHeight = SkTMax(1, height / twoToTheMipLevel); |