130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni/* 230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Copyright (C) 2011 The Android Open Source Project 330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Licensed under the Apache License, Version 2.0 (the "License"); 530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * you may not use this file except in compliance with the License. 630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * You may obtain a copy of the License at 730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * http://www.apache.org/licenses/LICENSE-2.0 930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 1030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Unless required by applicable law or agreed to in writing, software 1130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * distributed under the License is distributed on an "AS IS" BASIS, 1230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * See the License for the specific language governing permissions and 1430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * limitations under the License. 1530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni */ 1630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 1730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipackage android.filterfw.core; 1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Frame; 2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameFormat; 2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameManager; 2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.GLFrame; 2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeFrame; 25bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Rennimport android.filterfw.core.SimpleFrame; 2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.VertexFrame; 2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 28a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/** 29a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide 30a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */ 3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipublic class SimpleFrameManager extends FrameManager { 3230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 3330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public SimpleFrameManager() { 3430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 3633d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 3730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public Frame newFrame(FrameFormat format) { 38cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn return createNewFrame(format); 3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 4133d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public Frame newBoundFrame(FrameFormat format, int bindingType, long bindingId) { 4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni Frame result = null; 4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni switch(format.getTarget()) { 4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni case FrameFormat.TARGET_GPU: { 4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLFrame glFrame = new GLFrame(format, this, bindingType, bindingId); 47511360e61650864ea22a171159efe073c80d0cdbMarius Renn glFrame.init(getGLEnvironment()); 4830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni result = glFrame; 4930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni break; 5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni default: 5330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni throw new RuntimeException("Attached frames are not supported for target type: " 5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni + FrameFormat.targetToString(format.getTarget()) + "!"); 5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 5630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return result; 5730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 5830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 59cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn private Frame createNewFrame(FrameFormat format) { 6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni Frame result = null; 6130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni switch(format.getTarget()) { 62bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn case FrameFormat.TARGET_SIMPLE: 63bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn result = new SimpleFrame(format, this); 6430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni break; 6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 6630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni case FrameFormat.TARGET_NATIVE: 67cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn result = new NativeFrame(format, this); 6830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni break; 6930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 7030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni case FrameFormat.TARGET_GPU: { 7130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni GLFrame glFrame = new GLFrame(format, this); 72511360e61650864ea22a171159efe073c80d0cdbMarius Renn glFrame.init(getGLEnvironment()); 7330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni result = glFrame; 7430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni break; 7530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 7630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 7730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni case FrameFormat.TARGET_VERTEXBUFFER: { 78cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn result = new VertexFrame(format, this); 7930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni break; 8030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 8130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni default: 8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni throw new RuntimeException("Unsupported frame target type: " + 8430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni FrameFormat.targetToString(format.getTarget()) + "!"); 8530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return result; 8730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 8830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 89e86c3ea218de70d0a3a18ac587a13ffd472cf567Wei Hua @Override 9030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public Frame retainFrame(Frame frame) { 9130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni frame.incRefCount(); 9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return frame; 9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 95e86c3ea218de70d0a3a18ac587a13ffd472cf567Wei Hua @Override 9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public Frame releaseFrame(Frame frame) { 9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni int refCount = frame.decRefCount(); 98f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn if (refCount == 0 && frame.hasNativeAllocation()) { 99f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn frame.releaseNativeAllocation(); 10030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return null; 10130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } else if (refCount < 0) { 10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni throw new RuntimeException("Frame reference count dropped below 0!"); 10330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 10430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return frame; 10530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 10630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 10730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 108