/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.ide.eclipse.gltrace;

import java.io.DataOutputStream;
import java.io.IOException;

/**
 * Write trace control options to the trace backend.
 * Currently, the number of options is limited, so all the options are packed into a
 * single integer. Any changes to this protocol have to be updated on the device as well.
 */
public class TraceCommandWriter {
    private static final int CMD_SIZE = 4;

    private static final int READ_FB_ON_EGLSWAP_BIT = 0;
    private static final int READ_FB_ON_GLDRAW_BIT = 1;
    private static final int READ_TEXTURE_DATA_ON_GLTEXIMAGE_BIT = 2;

    private final DataOutputStream mStream;;

    public TraceCommandWriter(DataOutputStream traceCommandStream) {
        mStream = traceCommandStream;
    }

    public void setTraceOptions(boolean readFbOnEglSwap, boolean readFbOnGlDraw,
            boolean readTextureOnGlTexImage) throws IOException {
        int eglSwap = readFbOnEglSwap ? (1 << READ_FB_ON_EGLSWAP_BIT) : 0;
        int glDraw = readFbOnGlDraw ? (1 << READ_FB_ON_GLDRAW_BIT) : 0;
        int tex = readTextureOnGlTexImage ? ( 1 << READ_TEXTURE_DATA_ON_GLTEXIMAGE_BIT) : 0;

        int cmd = eglSwap | glDraw | tex;

        mStream.writeInt(CMD_SIZE);
        mStream.writeInt(cmd);
        mStream.flush();
    }

    public void close() {
        try {
            mStream.close();
        } catch (IOException e) {
            // ignore exception while closing stream
        }
    }
}
