Store mipmap levels in deferred texture image
This is a follow-up to https://codereview.chromium.org/2115023002/ and
https://codereview.chromium.org/2034933003/ which were reverted due to
an access violation and a memory leak, respectively.
When creating the deferred texture image, detect if using medium / high
quality. If so, generate and store mipmaps in the deferred texture
image.
When creating a texture from that be sure to read it back out.
BUG=578304
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2242883004
Review-Url: https://codereview.chromium.org/2242883004
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index fa22641..e53d142 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -888,20 +888,28 @@
int fExpectedScaleFactor;
bool fExpectation;
} testCases[] = {
- { create_image, {{}}, kNone_SkFilterQuality, 1, true },
- { create_codec_image, {{}}, kNone_SkFilterQuality, 1, true },
- { create_data_image, {{}}, kNone_SkFilterQuality, 1, true },
- { create_picture_image, {{}}, kNone_SkFilterQuality, 1, false },
- { [context] { return create_gpu_image(context); }, {{}}, kNone_SkFilterQuality, 1, false },
+ { create_image, {{SkMatrix::I(), kNone_SkFilterQuality, 0}},
+ kNone_SkFilterQuality, 1, true },
+ { create_codec_image, {{SkMatrix::I(), kNone_SkFilterQuality, 0}},
+ kNone_SkFilterQuality, 1, true },
+ { create_data_image, {{SkMatrix::I(), kNone_SkFilterQuality, 0}},
+ kNone_SkFilterQuality, 1, true },
+ { create_picture_image, {{SkMatrix::I(), kNone_SkFilterQuality, 0}},
+ kNone_SkFilterQuality, 1, false },
+ { [context] { return create_gpu_image(context); },
+ {{SkMatrix::I(), kNone_SkFilterQuality, 0}},
+ kNone_SkFilterQuality, 1, false },
// Create a texture image in a another GrContext.
{ [testContext, otherContextInfo] {
otherContextInfo.testContext()->makeCurrent();
sk_sp<SkImage> otherContextImage = create_gpu_image(otherContextInfo.grContext());
testContext->makeCurrent();
return otherContextImage;
- }, {{}}, kNone_SkFilterQuality, 1, false },
+ }, {{SkMatrix::I(), kNone_SkFilterQuality, 0}},
+ kNone_SkFilterQuality, 1, false },
// Create an image that is too large to upload.
- { create_image_large, {{}}, kNone_SkFilterQuality, 1, false },
+ { create_image_large, {{SkMatrix::I(), kNone_SkFilterQuality, 0}},
+ kNone_SkFilterQuality, 1, false },
// Create an image that is too large, but is scaled to an acceptable size.
{ create_image_large, {{SkMatrix::I(), kMedium_SkFilterQuality, 4}},
kMedium_SkFilterQuality, 16, true},
@@ -920,8 +928,7 @@
sk_sp<SkImage> image(testCase.fImageFactory());
size_t size = image->getDeferredTextureImageData(*proxy, testCase.fParams.data(),
static_cast<int>(testCase.fParams.size()),
- nullptr);
-
+ nullptr, SkSourceGammaTreatment::kIgnore);
static const char *const kFS[] = { "fail", "succeed" };
if (SkToBool(size) != testCase.fExpectation) {
ERRORF(reporter, "This image was expected to %s but did not.",
@@ -932,12 +939,12 @@
void* misaligned = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(buffer) + 3);
if (image->getDeferredTextureImageData(*proxy, testCase.fParams.data(),
static_cast<int>(testCase.fParams.size()),
- misaligned)) {
+ misaligned, SkSourceGammaTreatment::kIgnore)) {
ERRORF(reporter, "Should fail when buffer is misaligned.");
}
if (!image->getDeferredTextureImageData(*proxy, testCase.fParams.data(),
static_cast<int>(testCase.fParams.size()),
- buffer)) {
+ buffer, SkSourceGammaTreatment::kIgnore)) {
ERRORF(reporter, "deferred image size succeeded but creation failed.");
} else {
for (auto budgeted : { SkBudgeted::kNo, SkBudgeted::kYes }) {