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