Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Unified Diff: src/gpu/SkGr.cpp

Issue 1249543003: Creating functions for uploading a mipmapped texture. (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Cleaning up the allocated SkMipMap object. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/SkGr.cpp
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 954bb808524243d181ed5066b6d84c5ef7b29449..d62cec7ff188fd0ef6684383dccc088f3e168afb 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -8,6 +8,8 @@
#include "SkGr.h"
+#include <memory>
+
#include "GrCaps.h"
#include "GrContext.h"
#include "GrTextureParamsAdjuster.h"
@@ -23,6 +25,8 @@
#include "SkErrorInternals.h"
#include "SkGrPixelRef.h"
#include "SkMessageBus.h"
+#include "SkMipMap.h"
+#include "SkMipMapLevel.h"
#include "SkPixelRef.h"
#include "SkResourceCache.h"
#include "SkTextureCompressor.h"
@@ -285,6 +289,60 @@ void GrInstallBitmapUniqueKeyInvalidator(const GrUniqueKey& key, SkPixelRef* pix
pixelRef->addGenIDChangeListener(new Invalidator(key));
}
+GrTexture* GrGenerateMipMapsAndUploadToTexture(GrContext* ctx, const SkBitmap& bitmap)
+{
+ GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(bitmap.info());
+ if (kIndex_8_SkColorType != bitmap.colorType() && !bitmap.readyToDraw()) {
+ GrTexture *texture = load_etc1_texture(ctx, bitmap, desc);
+ if (texture) {
+ return texture;
+ }
+ }
+
+ GrTexture *texture = create_texture_from_yuv(ctx, bitmap, desc);
+ if (texture) {
+ return texture;
+ }
+
+ SkASSERT(sizeof(int) <= sizeof(uint32_t));
+ if (bitmap.width() < 0 || bitmap.height() < 0) {
+ return nullptr;
+ }
+
+ SkAutoLockPixels alp(bitmap);
+ if (!bitmap.readyToDraw()) {
+ return nullptr;
+ }
+
+ std::unique_ptr<SkMipMap> mipmaps(SkMipMap::Build(bitmap, nullptr));
bsalomon 2016/01/22 14:33:36 We don't currently use unique_ptr in Skia. That is
cblume 2016/02/24 07:59:24 Done.
+ if (!mipmaps) {
+ return nullptr;
+ }
+
+ const int mipLevelCount = mipmaps->getLevelsCount();
+
+ const bool isMipMapped = mipLevelCount > 1;
+ desc.fIsMipMapped = isMipMapped;
+
+ SkTArray<SkMipMapLevel> texels(mipLevelCount);
+
+ SkMipMapLevel baseLevel(bitmap.getPixels(), bitmap.rowBytes(), bitmap.width(),
+ bitmap.height());
+ texels.push_back(baseLevel);
+
+ for (int i = 1; i <= mipLevelCount; ++i) {
+ SkMipMap::Level generatedMipLevel;
+ mipmaps->getLevel(i, &generatedMipLevel);
+ SkMipMapLevel currentMipLevel(generatedMipLevel.fPixmap.addr(),
+ generatedMipLevel.fPixmap.rowBytes(),
+ generatedMipLevel.fPixmap.width(),
+ generatedMipLevel.fPixmap.height());
+ texels.push_back(currentMipLevel);
+ }
+
+ return ctx->textureProvider()->createTexture(desc, true, texels);
+}
+
GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap,
const GrTextureParams& params) {
if (bitmap.getTexture()) {

Powered by Google App Engine
This is Rietveld 408576698