aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Gpu.cpp
diff options
context:
space:
mode:
authorGravatar brianosman <brianosman@google.com>2016-06-22 07:10:06 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-06-22 07:10:06 -0700
commit6efeda4838f5944e4e14ff156be5593aa59cf1aa (patch)
tree9cb0e77f479fb054345f035495d4cbbf7332a3ba /src/image/SkImage_Gpu.cpp
parentb105cff6e21afeb0f6357d63f695957fbb640694 (diff)
Revert of Store mipmap levels in deferred texture image (patchset #15 id:280001 of https://codereview.chromium.org/2034933003/ )
Reason for revert: Crashes on a few different bots (including ASAN). Examples: https://build.chromium.org/p/client.skia.android/builders/Test-Android-GCC-Nexus7-GPU-Tegra3-Arm7-Release/builds/6324 https://build.chromium.org/p/client.skia/builders/Test-iOS-Clang-iPad4-GPU-SGX554-Arm7-Debug/builds/5400 https://build.chromium.org/p/client.skia/builders/Test-Ubuntu-GCC-Golo-GPU-GT610-x86_64-Debug-ASAN/builds/3539 Original issue's description: > Store mipmap levels in deferred texture image > > 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 > R=bsalomon@google.com > GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2034933003 > > Committed: https://skia.googlesource.com/skia/+/b3105190a6e02d37f1d7f07a3a8bdd368ec7f157 TBR=bsalomon@google.com,ericrk@chromium.org,cblume@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=578304 Review-Url: https://codereview.chromium.org/2083393002
Diffstat (limited to 'src/image/SkImage_Gpu.cpp')
-rw-r--r--src/image/SkImage_Gpu.cpp106
1 files changed, 7 insertions, 99 deletions
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index 2af151f1ef..7ce6450058 100644
--- a/src/image/SkImage_Gpu.cpp
+++ b/src/image/SkImage_Gpu.cpp
@@ -10,7 +10,6 @@
#include "GrContext.h"
#include "GrDrawContext.h"
#include "GrImageIDTextureAdjuster.h"
-#include "GrTexturePriv.h"
#include "effects/GrYUVEffect.h"
#include "SkCanvas.h"
#include "SkBitmapCache.h"
@@ -20,28 +19,6 @@
#include "SkMipMap.h"
#include "SkPixelRef.h"
-namespace {
-bool shouldUseMipMaps(const SkImage::DeferredTextureImageUsageParams & param) {
- bool shouldUseMipMaps = false;
-
- // Use mipmaps if either
- // 1.) it is a perspective matrix, or
- // 2.) the quality is med/high and the scale is < 1
- if (param.fMatrix.hasPerspective()) {
- shouldUseMipMaps = true;
- }
- if (param.fQuality == kMedium_SkFilterQuality ||
- param.fQuality == kHigh_SkFilterQuality) {
- SkScalar minAxisScale = param.fMatrix.getMinScale();
- if (minAxisScale != -1.f && minAxisScale < 1.f) {
- shouldUseMipMaps = true;
- }
- }
-
- return shouldUseMipMaps;
-}
-}
-
SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, GrTexture* tex,
SkBudgeted budgeted)
: INHERITED(w, h, uniqueID)
@@ -376,8 +353,6 @@ public:
private:
uint32_t fContextUniqueID;
- // Right now, the gamma treatment is only considered when generating mipmaps
- SkSourceGammaTreatment fGammaTreatment;
struct MipMapLevelData {
void* fPixelData;
size_t fRowBytes;
@@ -399,18 +374,15 @@ private:
size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& proxy,
const DeferredTextureImageUsageParams params[],
- int paramCnt, void* buffer,
- SkSourceGammaTreatment gammaTreatment) const {
+ int paramCnt, void* buffer) const {
// Extract relevant min/max values from the params array.
int lowestPreScaleMipLevel = params[0].fPreScaleMipLevel;
SkFilterQuality highestFilterQuality = params[0].fQuality;
- bool useMipMaps = shouldUseMipMaps(params[0]);
for (int i = 1; i < paramCnt; ++i) {
if (lowestPreScaleMipLevel > params[i].fPreScaleMipLevel)
lowestPreScaleMipLevel = params[i].fPreScaleMipLevel;
if (highestFilterQuality < params[i].fQuality)
highestFilterQuality = params[i].fQuality;
- useMipMaps |= shouldUseMipMaps(params[i]);
}
const bool fillMode = SkToBool(buffer);
@@ -480,29 +452,7 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
SkASSERT(!pixmap.ctable());
}
}
- SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
int mipMapLevelCount = 1;
- if (useMipMaps) {
- // SkMipMap only deals with the mipmap levels it generates, which does
- // not include the base level.
- // That means it generates and holds levels 1-x instead of 0-x.
- // So the total mipmap level count is 1 more than what
- // SkMipMap::ComputeLevelCount returns.
- mipMapLevelCount = SkMipMap::ComputeLevelCount(scaledSize.width(), scaledSize.height()) + 1;
-
- // We already initialized pixelSize to the size of the base level.
- // SkMipMap will generate the extra mipmap levels. Their sizes need to
- // be added to the total.
- // Index 0 here does not refer to the base mipmap level -- it is
- // SkMipMap's first generated mipmap level (level 1).
- for (int currentMipMapLevelIndex = mipMapLevelCount - 1; currentMipMapLevelIndex >= 0;
- currentMipMapLevelIndex--) {
- SkISize mipSize = SkMipMap::ComputeLevelSize(scaledSize.width(), scaledSize.height(),
- currentMipMapLevelIndex);
- SkImageInfo mipInfo = SkImageInfo::MakeN32(mipSize.fWidth, mipSize.fHeight, at);
- pixelSize += SkAlign8(SkAutoPixmapStorage::AllocSize(mipInfo, nullptr));
- }
- }
size_t size = 0;
size_t dtiSize = SkAlign8(sizeof(DeferredTextureImage));
size += dtiSize;
@@ -530,39 +480,12 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
size_t rowBytes = pixmap.rowBytes();
DeferredTextureImage* dti = new (buffer) DeferredTextureImage();
dti->fContextUniqueID = proxy.fContextUniqueID;
- dti->fGammaTreatment = gammaTreatment;
dti->fData.fInfo = info;
dti->fData.fColorTableCnt = ctCount;
dti->fData.fColorTableData = ct;
dti->fData.fMipMapLevelCount = mipMapLevelCount;
dti->fData.fMipMapLevelData[0].fPixelData = pixels;
dti->fData.fMipMapLevelData[0].fRowBytes = rowBytes;
-
- // Fill in the mipmap levels if they exist
- intptr_t mipLevelPtr = bufferAsInt + pixelOffset + SkAlign8(SkAutoPixmapStorage::AllocSize(
- info, nullptr));
- if (useMipMaps) {
- SkAutoTDelete<SkMipMap> mipmaps(SkMipMap::Build(pixmap, gammaTreatment, nullptr));
- // SkMipMap holds only the mipmap levels it generates.
- // A programmer can use the data they provided to SkMipMap::Build as level 0.
- // So the SkMipMap provides levels 1-x but it stores them in its own
- // range 0-(x-1).
- for (int generatedMipLevelIndex = 0; generatedMipLevelIndex < mipMapLevelCount - 1;
- generatedMipLevelIndex++) {
- SkISize mipSize = SkMipMap::ComputeLevelSize(scaledSize.width(), scaledSize.height(),
- generatedMipLevelIndex);
- SkImageInfo mipInfo = SkImageInfo::MakeN32(mipSize.fWidth, mipSize.fHeight, at);
- SkMipMap::Level mipLevel;
- mipmaps->getLevel(generatedMipLevelIndex, &mipLevel);
- memcpy(reinterpret_cast<void*>(mipLevelPtr), mipLevel.fPixmap.addr(),
- mipLevel.fPixmap.getSafeSize());
- dti->fData.fMipMapLevelData[generatedMipLevelIndex + 1].fPixelData =
- reinterpret_cast<void*>(mipLevelPtr);
- dti->fData.fMipMapLevelData[generatedMipLevelIndex + 1].fRowBytes =
- mipLevel.fPixmap.rowBytes();
- mipLevelPtr += SkAlign8(mipLevel.fPixmap.getSafeSize());
- }
- }
return size;
}
@@ -581,24 +504,11 @@ sk_sp<SkImage> SkImage::MakeFromDeferredTextureImageData(GrContext* context, con
SkASSERT(dti->fData.fColorTableData);
colorTable.reset(new SkColorTable(dti->fData.fColorTableData, dti->fData.fColorTableCnt));
}
- int mipLevelCount = dti->fData.fMipMapLevelCount;
- SkASSERT(mipLevelCount >= 1);
- if (mipLevelCount == 1) {
- SkPixmap pixmap;
- pixmap.reset(dti->fData.fInfo, dti->fData.fMipMapLevelData[0].fPixelData,
- dti->fData.fMipMapLevelData[0].fRowBytes, colorTable.get());
- return SkImage::MakeTextureFromPixmap(context, pixmap, budgeted);
- } else {
- SkAutoTDeleteArray<GrMipLevel> texels(new GrMipLevel[mipLevelCount]);
- for (int i = 0; i < mipLevelCount; i++) {
- texels[i].fPixels = dti->fData.fMipMapLevelData[i].fPixelData;
- texels[i].fRowBytes = dti->fData.fMipMapLevelData[i].fRowBytes;
- }
-
- return SkImage::MakeTextureFromMipMap(context, dti->fData.fInfo, texels.get(),
- mipLevelCount, SkBudgeted::kYes,
- dti->fGammaTreatment);
- }
+ SkASSERT(dti->fData.fMipMapLevelCount == 1);
+ SkPixmap pixmap;
+ pixmap.reset(dti->fData.fInfo, dti->fData.fMipMapLevelData[0].fPixelData,
+ dti->fData.fMipMapLevelData[0].fRowBytes, colorTable.get());
+ return SkImage::MakeTextureFromPixmap(context, pixmap, budgeted);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -621,8 +531,7 @@ GrTexture* GrDeepCopyTexture(GrTexture* src, SkBudgeted budgeted) {
sk_sp<SkImage> SkImage::MakeTextureFromMipMap(GrContext* ctx, const SkImageInfo& info,
const GrMipLevel* texels, int mipLevelCount,
- SkBudgeted budgeted,
- SkSourceGammaTreatment gammaTreatment) {
+ SkBudgeted budgeted) {
if (!ctx) {
return nullptr;
}
@@ -630,7 +539,6 @@ sk_sp<SkImage> SkImage::MakeTextureFromMipMap(GrContext* ctx, const SkImageInfo&
if (!texture) {
return nullptr;
}
- texture->texturePriv().setGammaTreatment(gammaTreatment);
return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNewImageUniqueID,
info.alphaType(), texture, budgeted);
}