aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/GrGLGpu.cpp
diff options
context:
space:
mode:
authorGravatar Greg Daniel <egdaniel@google.com>2017-09-28 12:07:28 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-09-28 19:16:29 +0000
commitd1935c16e889b6707a522f711e79c75353caa343 (patch)
treef8fe713b45c6cbe072667e06ddc24a7052a385cc /src/gpu/gl/GrGLGpu.cpp
parent29011a2bda560a645e6ddbe162df0856fe259e7b (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.cpp48
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);