11a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks/*
21a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Copyright (C) 2017 The Android Open Source Project
31a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *
41a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Licensed under the Apache License, Version 2.0 (the "License");
51a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * you may not use this file except in compliance with the License.
61a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * You may obtain a copy of the License at
71a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *
81a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *      http://www.apache.org/licenses/LICENSE-2.0
91a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *
101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Unless required by applicable law or agreed to in writing, software
111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * distributed under the License is distributed on an "AS IS" BASIS,
121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * See the License for the specific language governing permissions and
141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * limitations under the License.
151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks */
161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks// Same as small_struct_2.rs except for location of padding in struct small_struct[_2].
181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks#include "shared.rsh"
201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksint gDimX;
221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksint gDimY;
231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksrs_allocation A;
251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksrs_allocation B;
261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksstatic int gIntStart = 0x7;
281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksstatic long gLongStart = 0x12345678abcdef12;
291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankstypedef struct small_struct {
311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    int i;
321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    // expect 4 bytes of padding here
331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    long l;
341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks} small_struct;
351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks#define ARRAY_LEN 3
371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankstypedef struct struct_of_struct {
391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    small_struct arr[ARRAY_LEN];
401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks} struct_of_struct;
411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksvoid test() {
431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    bool failed = false;
441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    for (int x = 0; x < gDimX; x ++) {
451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int y = 0; y < gDimY; y ++) {
461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            small_struct *v = (small_struct *) rsGetElementAt(A, x, y);
471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            _RS_ASSERT_EQU(v->i, gIntStart + y * gDimX + x);
481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            _RS_ASSERT_EQU(v->l, gLongStart + y * gDimX + x);
491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        }
501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    for (int x = 0; x < gDimX; x ++) {
531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int y = 0; y < gDimY; y ++) {
541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            struct_of_struct *v = (struct_of_struct *) rsGetElementAt(B, x, y);
551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            for (int idx = 0; idx < ARRAY_LEN; idx ++) {
561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                _RS_ASSERT_EQU((*v).arr[idx].i, gIntStart + y * gDimX + x + idx);
571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                _RS_ASSERT_EQU((*v).arr[idx].l, gLongStart + y * gDimX + x + idx);
581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            }
591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        }
601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    if (failed) {
631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        rsDebug("small_struct test FAILED", 0);
641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    else {
671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        rsDebug("small_struct test PASSED", 0);
681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks}
711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankssmall_struct RS_KERNEL setStruct(int x, int y) {
731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    small_struct output;
741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    output.i = gIntStart + y * gDimX + x;
751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    output.l = gLongStart + y * gDimX + x;
761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    return output;
771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks}
781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksstruct_of_struct RS_KERNEL setArrayOfStruct(int x, int y) {
801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    struct_of_struct output;
811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    for (int idx = 0; idx < ARRAY_LEN; idx ++) {
821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        output.arr[idx].i = gIntStart + y * gDimX + x + idx;
831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        output.arr[idx].l = gLongStart + y * gDimX + x + idx;
841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    return output;
861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks}
87