Loading core/jni/android/graphics/Shader.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jobject jbitmap, if (jbitmap) { // Only pass a valid SkBitmap object to the constructor if the Bitmap exists. Otherwise, // we'll pass an empty SkBitmap to avoid crashing/excepting for compatibility. GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap); android::bitmap::toBitmap(env, jbitmap).getSkBitmapForShaders(&bitmap); } sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode); Loading libs/hwui/Program.h +3 −3 Original line number Diff line number Diff line Loading @@ -133,7 +133,7 @@ struct ProgramDescription { // Shaders bool hasBitmap; bool isBitmapNpot; bool useShaderBasedWrap; bool hasVertexAlpha; bool useShadowAlphaInterp; Loading Loading @@ -180,7 +180,7 @@ struct ProgramDescription { modulate = false; hasBitmap = false; isBitmapNpot = false; useShaderBasedWrap = false; hasGradient = false; gradientType = kGradientLinear; Loading Loading @@ -234,7 +234,7 @@ struct ProgramDescription { if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE; if (hasBitmap) { key |= PROGRAM_KEY_BITMAP; if (isBitmapNpot) { if (useShaderBasedWrap) { key |= PROGRAM_KEY_BITMAP_NPOT; key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT; key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT; Loading libs/hwui/ProgramCache.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -707,7 +707,7 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti if (blendFramebuffer) { generateBlend(shader, "blendFramebuffer", description.framebufferMode); } if (description.isBitmapNpot) { if (description.useShaderBasedWrap) { generateTextureWrap(shader, description.bitmapWrapS, description.bitmapWrapT); } if (description.hasGradient) { Loading Loading @@ -736,7 +736,7 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti shader.append(gFS_Main_FetchGradient[gradientIndex(description)]); } if (description.hasBitmap) { if (!description.isBitmapNpot) { if (!description.useShaderBasedWrap) { shader.append(gFS_Main_FetchBitmap); } else { shader.append(gFS_Main_FetchBitmapNpot); Loading libs/hwui/SkiaShader.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ static inline void bindUniformColor(int slot, FloatColor color) { } static inline void bindTexture(Caches* caches, Texture* texture, GLenum wrapS, GLenum wrapT) { caches->textureState().bindTexture(texture->id()); caches->textureState().bindTexture(texture->target(), texture->id()); texture->setWrapST(wrapS, wrapT); } Loading Loading @@ -218,10 +218,13 @@ bool tryStoreBitmap(Caches& caches, const SkShader& shader, const Matrix4& model const float height = outData->bitmapTexture->height(); description->hasBitmap = true; if (!caches.extensions().hasNPot() // gralloc doesn't support non-clamp modes if (hwuiBitmap->isHardware() || (!caches.extensions().hasNPot() && (!isPowerOfTwo(width) || !isPowerOfTwo(height)) && (xy[0] != SkShader::kClamp_TileMode || xy[1] != SkShader::kClamp_TileMode)) { description->isBitmapNpot = true; && (xy[0] != SkShader::kClamp_TileMode || xy[1] != SkShader::kClamp_TileMode))) { // need non-clamp mode, but it's not supported for this draw, // so enable custom shader logic to mimic description->useShaderBasedWrap = true; description->bitmapWrapS = gTileModes[xy[0]]; description->bitmapWrapT = gTileModes[xy[1]]; Loading libs/hwui/hwui/Bitmap.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -413,7 +413,6 @@ void* Bitmap::getStorage() const { case PixelStorageType::Heap: return mPixelStorage.heap.address; case PixelStorageType::Hardware: LOG_ALWAYS_FATAL_IF("Can't get address for hardware bitmap"); return nullptr; } } Loading Loading @@ -470,6 +469,12 @@ void Bitmap::getSkBitmap(SkBitmap* outBitmap) { outBitmap->setHasHardwareMipMap(mHasHardwareMipMap); } void Bitmap::getSkBitmapForShaders(SkBitmap* outBitmap) { outBitmap->setInfo(info(), rowBytes()); outBitmap->setPixelRef(this); outBitmap->setHasHardwareMipMap(mHasHardwareMipMap); } void Bitmap::getBounds(SkRect* bounds) const { SkASSERT(bounds); bounds->set(0, 0, SkIntToScalar(info().width()), SkIntToScalar(info().height())); Loading Loading
core/jni/android/graphics/Shader.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jobject jbitmap, if (jbitmap) { // Only pass a valid SkBitmap object to the constructor if the Bitmap exists. Otherwise, // we'll pass an empty SkBitmap to avoid crashing/excepting for compatibility. GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap); android::bitmap::toBitmap(env, jbitmap).getSkBitmapForShaders(&bitmap); } sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode); Loading
libs/hwui/Program.h +3 −3 Original line number Diff line number Diff line Loading @@ -133,7 +133,7 @@ struct ProgramDescription { // Shaders bool hasBitmap; bool isBitmapNpot; bool useShaderBasedWrap; bool hasVertexAlpha; bool useShadowAlphaInterp; Loading Loading @@ -180,7 +180,7 @@ struct ProgramDescription { modulate = false; hasBitmap = false; isBitmapNpot = false; useShaderBasedWrap = false; hasGradient = false; gradientType = kGradientLinear; Loading Loading @@ -234,7 +234,7 @@ struct ProgramDescription { if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE; if (hasBitmap) { key |= PROGRAM_KEY_BITMAP; if (isBitmapNpot) { if (useShaderBasedWrap) { key |= PROGRAM_KEY_BITMAP_NPOT; key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT; key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT; Loading
libs/hwui/ProgramCache.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -707,7 +707,7 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti if (blendFramebuffer) { generateBlend(shader, "blendFramebuffer", description.framebufferMode); } if (description.isBitmapNpot) { if (description.useShaderBasedWrap) { generateTextureWrap(shader, description.bitmapWrapS, description.bitmapWrapT); } if (description.hasGradient) { Loading Loading @@ -736,7 +736,7 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti shader.append(gFS_Main_FetchGradient[gradientIndex(description)]); } if (description.hasBitmap) { if (!description.isBitmapNpot) { if (!description.useShaderBasedWrap) { shader.append(gFS_Main_FetchBitmap); } else { shader.append(gFS_Main_FetchBitmapNpot); Loading
libs/hwui/SkiaShader.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -58,7 +58,7 @@ static inline void bindUniformColor(int slot, FloatColor color) { } static inline void bindTexture(Caches* caches, Texture* texture, GLenum wrapS, GLenum wrapT) { caches->textureState().bindTexture(texture->id()); caches->textureState().bindTexture(texture->target(), texture->id()); texture->setWrapST(wrapS, wrapT); } Loading Loading @@ -218,10 +218,13 @@ bool tryStoreBitmap(Caches& caches, const SkShader& shader, const Matrix4& model const float height = outData->bitmapTexture->height(); description->hasBitmap = true; if (!caches.extensions().hasNPot() // gralloc doesn't support non-clamp modes if (hwuiBitmap->isHardware() || (!caches.extensions().hasNPot() && (!isPowerOfTwo(width) || !isPowerOfTwo(height)) && (xy[0] != SkShader::kClamp_TileMode || xy[1] != SkShader::kClamp_TileMode)) { description->isBitmapNpot = true; && (xy[0] != SkShader::kClamp_TileMode || xy[1] != SkShader::kClamp_TileMode))) { // need non-clamp mode, but it's not supported for this draw, // so enable custom shader logic to mimic description->useShaderBasedWrap = true; description->bitmapWrapS = gTileModes[xy[0]]; description->bitmapWrapT = gTileModes[xy[1]]; Loading
libs/hwui/hwui/Bitmap.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -413,7 +413,6 @@ void* Bitmap::getStorage() const { case PixelStorageType::Heap: return mPixelStorage.heap.address; case PixelStorageType::Hardware: LOG_ALWAYS_FATAL_IF("Can't get address for hardware bitmap"); return nullptr; } } Loading Loading @@ -470,6 +469,12 @@ void Bitmap::getSkBitmap(SkBitmap* outBitmap) { outBitmap->setHasHardwareMipMap(mHasHardwareMipMap); } void Bitmap::getSkBitmapForShaders(SkBitmap* outBitmap) { outBitmap->setInfo(info(), rowBytes()); outBitmap->setPixelRef(this); outBitmap->setHasHardwareMipMap(mHasHardwareMipMap); } void Bitmap::getBounds(SkRect* bounds) const { SkASSERT(bounds); bounds->set(0, 0, SkIntToScalar(info().width()), SkIntToScalar(info().height())); Loading