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