1358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
2358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray#include "RenderScript.h"
3358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
4358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray#include "ScriptC_multiply.h"
5358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
6358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayusing namespace android;
7358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayusing namespace RSC;
8358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
9358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayint main(int argc, char** argv)
10358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray{
11358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
12358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    uint32_t numElems = 1024;
13358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    uint32_t stride = 1025;
14358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
15358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    if (argc >= 2) {
16358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        int tempStride = atoi(argv[1]);
17358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        if (tempStride < 1024) {
18358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray            printf("stride must be greater than or equal to 1024\n");
19358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray            return 1;
20358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        }
21358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        stride = (uint32_t) tempStride;
22358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    }
23358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
24358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    sp<RS> rs = new RS();
25358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
2679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray    bool r = rs->init("/system/bin");
27358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
28358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    sp<const Element> e = Element::U32(rs);
29358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
30358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    Type::Builder tb(rs, e);
31358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    tb.setX(numElems);
32358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    tb.setY(numElems);
33358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    sp<const Type> t = tb.create();
34358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
35358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    sp<Allocation> ain = Allocation::createTyped(rs, t);
36358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    sp<Allocation> aout = Allocation::createTyped(rs, t);
37358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
3841efe87eb48ed945df2f26f4dff0eb5e00b8eebeStephen Hines    sp<ScriptC_multiply> sc = new ScriptC_multiply(rs);
39358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
40358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    uint32_t* buf = (uint32_t*) malloc(stride * numElems * sizeof(uint32_t));
41358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    if (!buf) {
42358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        printf("malloc failed\n");
43358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        return 1;
44358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    }
45358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
46358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    for (uint32_t i = 0; i < numElems; i++) {
47358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        for (uint32_t ct=0; ct < numElems; ct++) {
48358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray            *(buf+(stride*i)+ct) = (uint32_t)ct + (i * numElems);
49358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        }
50358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    }
51358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
52358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    ain->copy2DStridedFrom(buf, stride * sizeof(uint32_t));
53358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
54358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    sc->forEach_multiply(ain, aout);
55358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
56358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    aout->copy2DStridedTo(buf, stride * sizeof(uint32_t));
57358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
58358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    for (uint32_t i = 0; i < numElems; i++) {
59358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        for (uint32_t ct=0; ct < numElems; ct++) {
60358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray            if (*(buf+(stride*i)+ct) != (uint32_t)(ct + (i * numElems)) * 2) {
61358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                printf("Mismatch at location %d, %d: %u\n", i, ct, *(buf+(stride*i)+ct));
62358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                return 1;
63358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray            }
64358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        }
65358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    }
66358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
67358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    printf("Test successful with %u stride!\n", stride);
68358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
69358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    sc.clear();
70358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    t.clear();
71358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    e.clear();
72358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    ain.clear();
73358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    aout.clear();
74358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
75