Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e3935ec authored by Sergei Vasilinetc's avatar Sergei Vasilinetc Committed by Android (Google) Code Review
Browse files

Merge "Support hardware bitmaps in bitmap shaders"

parents b11f2830 554ffeb8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+3 −3
Original line number Diff line number Diff line
@@ -133,7 +133,7 @@ struct ProgramDescription {

    // Shaders
    bool hasBitmap;
    bool isBitmapNpot;
    bool useShaderBasedWrap;

    bool hasVertexAlpha;
    bool useShadowAlphaInterp;
@@ -180,7 +180,7 @@ struct ProgramDescription {
        modulate = false;

        hasBitmap = false;
        isBitmapNpot = false;
        useShaderBasedWrap = false;

        hasGradient = false;
        gradientType = kGradientLinear;
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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) {
@@ -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);
+7 −4
Original line number Diff line number Diff line
@@ -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);
}

@@ -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]];

+6 −1
Original line number Diff line number Diff line
@@ -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;
    }
}
@@ -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