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