/*
 * Copyright (C) 2015 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.
 */

// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.

/*
 * rs_io.rsh: Input/output functions
 *
 * TODO Add documentation
 */
#ifndef RENDERSCRIPT_RS_IO_RSH
#define RENDERSCRIPT_RS_IO_RSH

/*
 * rsAllocationIoReceive: Receive new content from the queue
 *
 * Receive a new set of contents from the queue.
 *
 * Parameters:
 *   a allocation to work on
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern void __attribute__((overloadable))
    rsAllocationIoReceive(rs_allocation a);
#endif

/*
 * rsAllocationIoSend: Send new content to the queue
 *
 * Send the contents of the Allocation to the queue.
 *
 * Parameters:
 *   a allocation to work on
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern void __attribute__((overloadable))
    rsAllocationIoSend(rs_allocation a);
#endif

/*
 * Send a message back to the client.  Will not block and returns true
 * if the message was sendable and false if the fifo was full.
 * A message ID is required.  Data payload is optional.
 */
extern bool __attribute__((overloadable))
    rsSendToClient(int cmdID);

extern bool __attribute__((overloadable))
    rsSendToClient(int cmdID, const void* data, uint len);

/*
 * Send a message back to the client, blocking until the message is queued.
 * A message ID is required.  Data payload is optional.
 */
extern void __attribute__((overloadable))
    rsSendToClientBlocking(int cmdID);

extern void __attribute__((overloadable))
    rsSendToClientBlocking(int cmdID, const void* data, uint len);

#endif // RENDERSCRIPT_RS_IO_RSH
