138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin/*
238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * Copyright 2014 The Android Open Source Project
338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin *
438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * you may not use this file except in compliance with the License.
638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * You may obtain a copy of the License at
738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin *
838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin *
1038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * Unless required by applicable law or agreed to in writing, software
1138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
1238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * See the License for the specific language governing permissions and
1438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * limitations under the License.
1538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin */
1638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
1738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkinpackage android.hardware.camera2.cts.rs;
1838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
1938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkinimport android.content.Context;
2038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkinimport android.renderscript.RenderScript;
2138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkinimport android.util.Log;
2238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
2338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin// TODO : Replace with dependency injection
2438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin/**
2538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * Singleton to hold {@link RenderScript} and {@link AllocationCache} objects.
2638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin *
2738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * <p>The test method must call {@link #setContext} before attempting to retrieve
2838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin * the underlying objects.</p> *
2938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin */
3038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkinpublic class RenderScriptSingleton {
3138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
3238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    private static final String TAG = "RenderScriptSingleton";
3338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
3438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    private static Context sContext;
3538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    private static RenderScript sRS;
3638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    private static AllocationCache sCache;
3738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
3838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    /**
3938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * Initialize the singletons from the given context; the
4038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * {@link RenderScript} and {@link AllocationCache} objects are instantiated.
4138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     *
4238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * @param context a non-{@code null} Context.
4338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     *
4438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * @throws IllegalStateException If this was called repeatedly without {@link #clearContext}
4538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     */
4638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    public static synchronized void setContext(Context context) {
4738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        if (context.equals(sContext)) {
4838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            return;
4938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        } else if (sContext != null) {
5038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            Log.v(TAG,
5138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin                    "Trying to set new context " + context +
5238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin                    ", before clearing previous "+ sContext);
5338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            throw new IllegalStateException(
5438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin                    "Call #clearContext before trying to set a new context");
5538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        }
5638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
5738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        sRS = RenderScript.create(context);
5838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        sContext = context;
5938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        sCache = new AllocationCache(sRS);
6038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    }
6138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
6238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    /**
6338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * Clean up the singletons from the given context; the
6438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * {@link RenderScript} and {@link AllocationCache} objects are destroyed.
6538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     *
6638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * <p>Safe to call multiple times; subsequent invocations have no effect.</p>
6738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     */
6838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    public static synchronized void clearContext() {
6938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        if (sContext != null) {
7038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            sCache.close();
7138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            sCache = null;
7238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
73dbe041027e41ae92feff9d8ced59f4cee270cd85Chien-Yu Chen            sRS.releaseAllContexts();
7438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            sRS = null;
7538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            sContext = null;
7638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        }
7738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    }
7838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
7938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    /**
8038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * Get the current {@link RenderScript} singleton.
8138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     *
8238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * @return A non-{@code null} {@link RenderScript} object.
8338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     *
8438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * @throws IllegalStateException if {@link #setContext} was not called prior to this
8538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     */
8638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    public static synchronized RenderScript getRS() {
8738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        if (sRS == null) {
8838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            throw new IllegalStateException("Call #setContext before using #get");
8938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        }
9038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
9138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        return sRS;
9238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    }
9338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    /**
9438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * Get the current {@link AllocationCache} singleton.
9538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     *
9638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * @return A non-{@code null} {@link AllocationCache} object.
9738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     *
9838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     * @throws IllegalStateException if {@link #setContext} was not called prior to this
9938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin     */
10038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    public static synchronized AllocationCache getCache() {
10138271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        if (sCache == null) {
10238271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin            throw new IllegalStateException("Call #setContext before using #getCache");
10338271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        }
10438271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
10538271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin        return sCache;
10638271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    }
10738271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin
10838271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    // Suppress default constructor for noninstantiability
10938271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin    private RenderScriptSingleton() { throw new AssertionError(); }
11038271c76b0b254990b8f532d7851e3ac6c2b9715Igor Murashkin}
111