From: cblume Date: Tue, 31 May 2016 16:55:08 +0000 (-0700) Subject: Add mip support to *DeferredTextureImageData functions. X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~129^2~363 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2c05280a0f792fc94c879e29011312a57532786b;p=platform%2Fupstream%2FlibSkiaSharp.git Add mip support to *DeferredTextureImageData functions. As a first step, I want to add the ability to store multiple mip levels in the opaque object. I will follow this with using SkMipMap to generate and store the mip levels and generating the texture from those stored mip levels. R=bsalomon@chromium.org CC=ericrk@chromium.org BUG=578304 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2023573002 Review-Url: https://codereview.chromium.org/2023573002 --- diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index f026ebc..f67d7aa 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -328,12 +328,19 @@ public: private: uint32_t fContextUniqueID; + struct MipMapLevelData { + void* fPixelData; + size_t fRowBytes; + }; struct Data { SkImageInfo fInfo; - void* fPixelData; - size_t fRowBytes; int fColorTableCnt; uint32_t* fColorTableData; + int fMipMapLevelCount; + // The fMipMapLevelData array may contain more than 1 element. + // It contains fMipMapLevelCount elements. + // That means this struct's size is not known at compile-time. + MipMapLevelData fMipMapLevelData[1]; }; Data fData; @@ -384,9 +391,11 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox SkASSERT(!pixmap.ctable()); } } + int mipMapLevelCount = 1; size_t size = 0; size_t dtiSize = SkAlign8(sizeof(DeferredTextureImage)); size += dtiSize; + size += mipMapLevelCount * sizeof(DeferredTextureImage::MipMapLevelData); size_t pixelOffset = size; size += pixelSize; size_t ctOffset = size; @@ -411,10 +420,11 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox DeferredTextureImage* dti = new (buffer) DeferredTextureImage(); dti->fContextUniqueID = proxy.fContextUniqueID; dti->fData.fInfo = info; - dti->fData.fPixelData = pixels; - dti->fData.fRowBytes = rowBytes; dti->fData.fColorTableCnt = ctCount; dti->fData.fColorTableData = ct; + dti->fData.fMipMapLevelCount = mipMapLevelCount; + dti->fData.fMipMapLevelData[0].fPixelData = pixels; + dti->fData.fMipMapLevelData[0].fRowBytes = rowBytes; return size; } @@ -433,8 +443,10 @@ sk_sp SkImage::MakeFromDeferredTextureImageData(GrContext* context, con SkASSERT(dti->fData.fColorTableData); colorTable.reset(new SkColorTable(dti->fData.fColorTableData, dti->fData.fColorTableCnt)); } + SkASSERT(dti->fData.fMipMapLevelCount == 1); SkPixmap pixmap; - pixmap.reset(dti->fData.fInfo, dti->fData.fPixelData, dti->fData.fRowBytes, colorTable.get()); + pixmap.reset(dti->fData.fInfo, dti->fData.fMipMapLevelData[0].fPixelData, + dti->fData.fMipMapLevelData[0].fRowBytes, colorTable.get()); return SkImage::MakeTextureFromPixmap(context, pixmap, budgeted); }