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

Commit 7f7755f7 authored by nicolasroard's avatar nicolasroard
Browse files

Pipeline refactoring

Remove the temp representations and instead use a triple
buffer for ImagePresets.

Change-Id: I4cdcfbe4941af72b38fe42385085ff4a20eb78cc
parent cf68d2f5
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -359,16 +359,13 @@ public class CachingPipeline implements PipelineInterface {
            mFiltersManager.freeFilterResources(preset);

            Bitmap resizedOriginalBitmap = mResizedOriginalBitmap;
            if (updateOriginalAllocation(preset)) {
            if (updateOriginalAllocation(preset) || buffer.getProducer() == null) {
                resizedOriginalBitmap = mResizedOriginalBitmap;
                mEnvironment.cache(buffer.getProducer());
                buffer.setProducer(resizedOriginalBitmap);
                mEnvironment.cache(buffer.getProducer());
            }

            Bitmap bitmap = null;
            if (buffer.getProducer() != null) {
                bitmap = buffer.getProducer().getBitmap();
            }
            Bitmap bitmap = buffer.getProducer().getBitmap();
            long time2 = System.currentTimeMillis();

            if (bitmap == null || (bitmap.getWidth() != resizedOriginalBitmap.getWidth())
+12 −7
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.gallery3d.filtershow.filters.ImageFilterRS;
import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.SharedBuffer;
import com.android.gallery3d.filtershow.pipeline.SharedPreset;
import com.android.gallery3d.filtershow.presets.ImagePreset;

public class FilteringPipeline implements Handler.Callback {
@@ -72,8 +73,6 @@ public class FilteringPipeline implements Handler.Callback {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case NEW_PRESET: {
                    SharedBuffer buffer = MasterImage.getImage().getPreviewBuffer();
                    buffer.swapConsumer();
                    MasterImage.getImage().notifyObservers();
                    if (mHasUnhandledPreviewRequest) {
                        updatePreviewBuffer();
@@ -96,12 +95,18 @@ public class FilteringPipeline implements Handler.Callback {
        }
        switch (msg.what) {
            case COMPUTE_PRESET: {
                ImagePreset preset = (ImagePreset) msg.obj;
                SharedBuffer buffer = MasterImage.getImage().getPreviewBuffer();
                mPreviewPipeline.compute(buffer, preset, COMPUTE_PRESET);
                buffer.swapProducer();
                SharedPreset preset = MasterImage.getImage().getPreviewPreset();
                ImagePreset renderingPreset = preset.dequeuePreset();
                if (renderingPreset != null) {
                    mPreviewPipeline.compute(buffer, renderingPreset, COMPUTE_PRESET);
                    // set the preset we used in the buffer for later inspection UI-side
                    buffer.getProducer().setPreset(renderingPreset);
                    buffer.getProducer().sync();
                    buffer.swapProducer(); // push back the result
                    Message uimsg = mUIHandler.obtainMessage(NEW_PRESET);
                    mUIHandler.sendMessage(uimsg);
                }
                break;
            }
            case COMPUTE_RENDERING_REQUEST:
+0 −26
Original line number Diff line number Diff line
@@ -47,8 +47,6 @@ public class FilterRepresentation implements Cloneable {
    public static final byte TYPE_TINYPLANET = 6;
    protected static final String NAME_TAG = "Name";

    private FilterRepresentation mTempRepresentation = null;

    public FilterRepresentation(String name) {
        mName = name;
    }
@@ -67,8 +65,6 @@ public class FilterRepresentation implements Cloneable {
        representation.setShowParameterValue(showParameterValue());
        representation.mSerializationName = mSerializationName;

        representation.mTempRepresentation =
                mTempRepresentation != null ? mTempRepresentation.clone() : null;
        if (DEBUG) {
            Log.v(LOGTAG, "cloning from <" + this + "> to <" + representation + ">");
        }
@@ -140,28 +136,6 @@ public class FilterRepresentation implements Cloneable {
    public void useParametersFrom(FilterRepresentation a) {
    }

    public void clearTempRepresentation() {
        mTempRepresentation = null;
    }

    public synchronized void updateTempParametersFrom(FilterRepresentation representation) {
        if (mTempRepresentation == null) {
            try {
                mTempRepresentation = representation.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        } else {
            mTempRepresentation.useParametersFrom(representation);
        }
    }

    public synchronized void synchronizeRepresentation() {
        if (mTempRepresentation != null) {
            useParametersFrom(mTempRepresentation);
        }
    }

    public boolean allowsSingleInstanceOnly() {
        return false;
    }
+9 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.filters.ImageFilter;
import com.android.gallery3d.filtershow.pipeline.Buffer;
import com.android.gallery3d.filtershow.pipeline.SharedBuffer;
import com.android.gallery3d.filtershow.pipeline.SharedPreset;
import com.android.gallery3d.filtershow.presets.ImagePreset;
import com.android.gallery3d.filtershow.state.StateAdapter;

@@ -58,6 +59,7 @@ public class MasterImage implements RenderingRequestCaller {
    private ImagePreset mFiltersOnlyPreset = null;

    private SharedBuffer mPreviewBuffer = new SharedBuffer();
    private SharedPreset mPreviewPreset = new SharedPreset();

    private Bitmap mGeometryOnlyBitmap = null;
    private Bitmap mFiltersOnlyBitmap = null;
@@ -255,6 +257,10 @@ public class MasterImage implements RenderingRequestCaller {
        return mPreviewBuffer;
    }

    public SharedPreset getPreviewPreset() {
        return mPreviewPreset;
    }

    public void setOriginalGeometry(Bitmap originalBitmapLarge) {
        GeometryMetadata geo = getPreset().getGeometry();
        float w = originalBitmapLarge.getWidth();
@@ -266,6 +272,7 @@ public class MasterImage implements RenderingRequestCaller {
    }

    public Bitmap getFilteredImage() {
        mPreviewBuffer.swapConsumerIfNeeded(); // get latest bitmap
        Buffer consumer = mPreviewBuffer.getConsumer();
        if (consumer != null) {
            return consumer.getBitmap();
@@ -349,6 +356,7 @@ public class MasterImage implements RenderingRequestCaller {
    }

    public void invalidatePreview() {
        mPreviewPreset.enqueuePreset(mPreset);
        mPreviewBuffer.invalidate();
        invalidatePartialPreview();
        invalidateHighresPreview();
@@ -554,4 +562,5 @@ public class MasterImage implements RenderingRequestCaller {
    public ImagePreset getLoadedPreset() {
        return mLoadedPreset;
    }

}
+21 −1
Original line number Diff line number Diff line
@@ -20,16 +20,21 @@ import android.graphics.Bitmap;
import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.RenderScript;
import com.android.gallery3d.filtershow.cache.CachingPipeline;
import com.android.gallery3d.filtershow.presets.ImagePreset;

public class Buffer {
    private static final String LOGTAG = "Buffer";
    private Bitmap mBitmap;
    private Allocation mAllocation;
    private boolean mUseAllocation = false;
    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    private ImagePreset mPreset;

    public Buffer(Bitmap bitmap) {
        RenderScript rs = CachingPipeline.getRenderScriptContext();
        if (bitmap != null) {
            mBitmap = bitmap.copy(BITMAP_CONFIG, true);
        }
        if (mUseAllocation) {
            // TODO: recreate the allocation when the RS context changes
            mAllocation = Allocation.createFromBitmap(rs, mBitmap,
@@ -38,6 +43,10 @@ public class Buffer {
        }
    }

    public void setBitmap(Bitmap bitmap) {
        mBitmap = bitmap.copy(BITMAP_CONFIG, true);
    }

    public Bitmap getBitmap() {
        return mBitmap;
    }
@@ -52,5 +61,16 @@ public class Buffer {
        }
    }

    public ImagePreset getPreset() {
        return mPreset;
    }

    public void setPreset(ImagePreset preset) {
        if ((mPreset == null) || (!mPreset.same(preset))) {
            mPreset = new ImagePreset(preset);
        } else {
            mPreset.updateWith(preset);
        }
    }
}
Loading