diff options
author | Mike Klein <mtklein@chromium.org> | 2017-09-21 13:46:28 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-09-21 18:33:23 +0000 |
commit | 65e706379657d64371012c2e95ccf1354d741145 (patch) | |
tree | f8ebde9cb13b844bc6d852fb54823c92e6aed1a9 /src/gpu/GrResourceProvider.cpp | |
parent | ebf648e57afa0484b4665b2c945331e1af0dfb83 (diff) |
Don't call GrBuffer::map() in createPatternedIndexBuffer.
TSAN doesn't seem to be understanding that the memory coming back from
GrBuffer::map() is a new allocation. Using AnnotateNewMemory() to tell
TSAN didn't seem to help.
This also appears to fix a memory leak if buffer->updateData() fails
when useTempData was true. Not sure if that ever really happens?
Bug: skia:7058
Change-Id: I0a2786fa2c59e14c322ec5acc8cd26436c5a9477
Reviewed-on: https://skia-review.googlesource.com/49743
Commit-Queue: Mike Klein <mtklein@chromium.org>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/GrResourceProvider.cpp')
-rw-r--r-- | src/gpu/GrResourceProvider.cpp | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp index 7f098e4075..7e7fef4661 100644 --- a/src/gpu/GrResourceProvider.cpp +++ b/src/gpu/GrResourceProvider.cpp @@ -321,11 +321,8 @@ const GrBuffer* GrResourceProvider::createPatternedIndexBuffer(const uint16_t* p if (!buffer) { return nullptr; } - uint16_t* data = (uint16_t*) buffer->map(); - bool useTempData = (nullptr == data); - if (useTempData) { - data = new uint16_t[reps * patternSize]; - } + + SkAutoTArray<uint16_t> data(reps * patternSize); for (int i = 0; i < reps; ++i) { int baseIdx = i * patternSize; uint16_t baseVert = (uint16_t)(i * vertCount); @@ -333,15 +330,12 @@ const GrBuffer* GrResourceProvider::createPatternedIndexBuffer(const uint16_t* p data[baseIdx+j] = baseVert + pattern[j]; } } - if (useTempData) { - if (!buffer->updateData(data, bufferSize)) { - buffer->unref(); - return nullptr; - } - delete[] data; - } else { - buffer->unmap(); + + if (!buffer->updateData(data.get(), bufferSize)) { + buffer->unref(); + return nullptr; } + this->assignUniqueKeyToResource(key, buffer); return buffer; } |