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

#pragma version(1)
#pragma rs java_package_name(android.renderscript.cts)

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

rs_allocation gAllocIn1;

float __attribute__((kernel)) testMaxFloatFloatFloat(float in, unsigned int x) {
    float in1 = rsGetElementAt_float(gAllocIn1, x);
    return max(in, in1);
}

float2 __attribute__((kernel)) testMaxFloat2Float2Float2(float2 in, unsigned int x) {
    float2 in1 = rsGetElementAt_float2(gAllocIn1, x);
    return max(in, in1);
}

float3 __attribute__((kernel)) testMaxFloat3Float3Float3(float3 in, unsigned int x) {
    float3 in1 = rsGetElementAt_float3(gAllocIn1, x);
    return max(in, in1);
}

float4 __attribute__((kernel)) testMaxFloat4Float4Float4(float4 in, unsigned int x) {
    float4 in1 = rsGetElementAt_float4(gAllocIn1, x);
    return max(in, in1);
}
rs_allocation gAllocInV2;

char __attribute__((kernel)) testMaxCharCharChar(char inV1, unsigned int x) {
    char inV2 = rsGetElementAt_char(gAllocInV2, x);
    return max(inV1, inV2);
}

char2 __attribute__((kernel)) testMaxChar2Char2Char2(char2 inV1, unsigned int x) {
    char2 inV2 = rsGetElementAt_char2(gAllocInV2, x);
    return max(inV1, inV2);
}

char3 __attribute__((kernel)) testMaxChar3Char3Char3(char3 inV1, unsigned int x) {
    char3 inV2 = rsGetElementAt_char3(gAllocInV2, x);
    return max(inV1, inV2);
}

char4 __attribute__((kernel)) testMaxChar4Char4Char4(char4 inV1, unsigned int x) {
    char4 inV2 = rsGetElementAt_char4(gAllocInV2, x);
    return max(inV1, inV2);
}

uchar __attribute__((kernel)) testMaxUcharUcharUchar(uchar inV1, unsigned int x) {
    uchar inV2 = rsGetElementAt_uchar(gAllocInV2, x);
    return max(inV1, inV2);
}

uchar2 __attribute__((kernel)) testMaxUchar2Uchar2Uchar2(uchar2 inV1, unsigned int x) {
    uchar2 inV2 = rsGetElementAt_uchar2(gAllocInV2, x);
    return max(inV1, inV2);
}

uchar3 __attribute__((kernel)) testMaxUchar3Uchar3Uchar3(uchar3 inV1, unsigned int x) {
    uchar3 inV2 = rsGetElementAt_uchar3(gAllocInV2, x);
    return max(inV1, inV2);
}

uchar4 __attribute__((kernel)) testMaxUchar4Uchar4Uchar4(uchar4 inV1, unsigned int x) {
    uchar4 inV2 = rsGetElementAt_uchar4(gAllocInV2, x);
    return max(inV1, inV2);
}

short __attribute__((kernel)) testMaxShortShortShort(short inV1, unsigned int x) {
    short inV2 = rsGetElementAt_short(gAllocInV2, x);
    return max(inV1, inV2);
}

short2 __attribute__((kernel)) testMaxShort2Short2Short2(short2 inV1, unsigned int x) {
    short2 inV2 = rsGetElementAt_short2(gAllocInV2, x);
    return max(inV1, inV2);
}

short3 __attribute__((kernel)) testMaxShort3Short3Short3(short3 inV1, unsigned int x) {
    short3 inV2 = rsGetElementAt_short3(gAllocInV2, x);
    return max(inV1, inV2);
}

short4 __attribute__((kernel)) testMaxShort4Short4Short4(short4 inV1, unsigned int x) {
    short4 inV2 = rsGetElementAt_short4(gAllocInV2, x);
    return max(inV1, inV2);
}

ushort __attribute__((kernel)) testMaxUshortUshortUshort(ushort inV1, unsigned int x) {
    ushort inV2 = rsGetElementAt_ushort(gAllocInV2, x);
    return max(inV1, inV2);
}

ushort2 __attribute__((kernel)) testMaxUshort2Ushort2Ushort2(ushort2 inV1, unsigned int x) {
    ushort2 inV2 = rsGetElementAt_ushort2(gAllocInV2, x);
    return max(inV1, inV2);
}

ushort3 __attribute__((kernel)) testMaxUshort3Ushort3Ushort3(ushort3 inV1, unsigned int x) {
    ushort3 inV2 = rsGetElementAt_ushort3(gAllocInV2, x);
    return max(inV1, inV2);
}

ushort4 __attribute__((kernel)) testMaxUshort4Ushort4Ushort4(ushort4 inV1, unsigned int x) {
    ushort4 inV2 = rsGetElementAt_ushort4(gAllocInV2, x);
    return max(inV1, inV2);
}

int __attribute__((kernel)) testMaxIntIntInt(int inV1, unsigned int x) {
    int inV2 = rsGetElementAt_int(gAllocInV2, x);
    return max(inV1, inV2);
}

int2 __attribute__((kernel)) testMaxInt2Int2Int2(int2 inV1, unsigned int x) {
    int2 inV2 = rsGetElementAt_int2(gAllocInV2, x);
    return max(inV1, inV2);
}

int3 __attribute__((kernel)) testMaxInt3Int3Int3(int3 inV1, unsigned int x) {
    int3 inV2 = rsGetElementAt_int3(gAllocInV2, x);
    return max(inV1, inV2);
}

int4 __attribute__((kernel)) testMaxInt4Int4Int4(int4 inV1, unsigned int x) {
    int4 inV2 = rsGetElementAt_int4(gAllocInV2, x);
    return max(inV1, inV2);
}

uint __attribute__((kernel)) testMaxUintUintUint(uint inV1, unsigned int x) {
    uint inV2 = rsGetElementAt_uint(gAllocInV2, x);
    return max(inV1, inV2);
}

uint2 __attribute__((kernel)) testMaxUint2Uint2Uint2(uint2 inV1, unsigned int x) {
    uint2 inV2 = rsGetElementAt_uint2(gAllocInV2, x);
    return max(inV1, inV2);
}

uint3 __attribute__((kernel)) testMaxUint3Uint3Uint3(uint3 inV1, unsigned int x) {
    uint3 inV2 = rsGetElementAt_uint3(gAllocInV2, x);
    return max(inV1, inV2);
}

uint4 __attribute__((kernel)) testMaxUint4Uint4Uint4(uint4 inV1, unsigned int x) {
    uint4 inV2 = rsGetElementAt_uint4(gAllocInV2, x);
    return max(inV1, inV2);
}

long __attribute__((kernel)) testMaxLongLongLong(long inV1, unsigned int x) {
    long inV2 = rsGetElementAt_long(gAllocInV2, x);
    return max(inV1, inV2);
}

long2 __attribute__((kernel)) testMaxLong2Long2Long2(long2 inV1, unsigned int x) {
    long2 inV2 = rsGetElementAt_long2(gAllocInV2, x);
    return max(inV1, inV2);
}

long3 __attribute__((kernel)) testMaxLong3Long3Long3(long3 inV1, unsigned int x) {
    long3 inV2 = rsGetElementAt_long3(gAllocInV2, x);
    return max(inV1, inV2);
}

long4 __attribute__((kernel)) testMaxLong4Long4Long4(long4 inV1, unsigned int x) {
    long4 inV2 = rsGetElementAt_long4(gAllocInV2, x);
    return max(inV1, inV2);
}

ulong __attribute__((kernel)) testMaxUlongUlongUlong(ulong inV1, unsigned int x) {
    ulong inV2 = rsGetElementAt_ulong(gAllocInV2, x);
    return max(inV1, inV2);
}

ulong2 __attribute__((kernel)) testMaxUlong2Ulong2Ulong2(ulong2 inV1, unsigned int x) {
    ulong2 inV2 = rsGetElementAt_ulong2(gAllocInV2, x);
    return max(inV1, inV2);
}

ulong3 __attribute__((kernel)) testMaxUlong3Ulong3Ulong3(ulong3 inV1, unsigned int x) {
    ulong3 inV2 = rsGetElementAt_ulong3(gAllocInV2, x);
    return max(inV1, inV2);
}

ulong4 __attribute__((kernel)) testMaxUlong4Ulong4Ulong4(ulong4 inV1, unsigned int x) {
    ulong4 inV2 = rsGetElementAt_ulong4(gAllocInV2, x);
    return max(inV1, inV2);
}
