1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h" 3221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 4f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams#include "ScriptC_mono.h" 5f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams 669cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android; 79eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC; 869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 98a588bd9d34088ed89ef2c192c32ea2301e601bcStephen Hinesint test_compute() 10221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams{ 1143514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines bool failed = false; 1243514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 13caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray { 14caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<RS> rs = new RS(); 15caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("New RS %p\n", rs.get()); 1643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 17caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray // only legitimate because this is a standalone executable 18caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray bool r = rs->init("/system/bin"); 19caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("Init returned %i\n", r); 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 21caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<const Element> e = Element::RGBA_8888(rs); 22caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("Element %p\n", e.get()); 2343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 2443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines Type::Builder tb(rs, e); 25caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray tb.setX(128); 26caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray tb.setY(128); 2743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<const Type> t = tb.create(); 28caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("Type %p\n", t.get()); 29caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 30caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 31caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<Allocation> a1 = Allocation::createSized(rs, e, 1000); 32caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("Allocation %p\n", a1.get()); 33caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 34caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<Allocation> ain = Allocation::createTyped(rs, t); 35caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<Allocation> aout = Allocation::createTyped(rs, t); 36caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("Allocation %p %p\n", ain.get(), aout.get()); 3743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 38caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<ScriptC_mono> sc = new ScriptC_mono(rs); 39caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("new script\n"); 40caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 41caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->set_alloc(a1); 42caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->set_elem(e); 43caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->set_type(t); 44caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->set_script(sc); 4544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes sc->set_script(nullptr); 46caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<const Sampler> samp = Sampler::CLAMP_NEAREST(rs); 47caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->set_sampler(samp); 48caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 49caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray // We read back the status from the script-side via a "failed" allocation. 50caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<const Element> failed_e = Element::BOOLEAN(rs); 51caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray Type::Builder failed_tb(rs, failed_e); 52caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray failed_tb.setX(1); 53caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<const Type> failed_t = failed_tb.create(); 54caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<Allocation> failed_alloc = Allocation::createTyped(rs, failed_t); 55caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 56caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray failed_alloc->copy1DRangeFrom(0, failed_t->getCount(), &failed); 57caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->bind_failed(failed_alloc); 58caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 59caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray uint32_t *buf = new uint32_t[t->getCount()]; 6043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines for (uint32_t ct=0; ct < t->getCount(); ct++) { 61caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray buf[ct] = ct | (ct << 16); 6243514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } 63caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray ain->copy1DRangeFrom(0, t->getCount(), buf); 6443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines delete [] buf; 6543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 66caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->forEach_root(ain, aout); 67caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 68caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->invoke_foo(99, 3.1f); 69caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->set_g_f(39.9f); 70caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->set_g_i(-14); 71caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->invoke_foo(99, 3.1f); 72caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray printf("for each done\n"); 73caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 74caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->invoke_bar(47, -3, 'c', -7, 14, -8); 75caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 76caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray // Verify a simple kernel. 77caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray { 78caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray static const uint32_t xDim = 7; 79caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray static const uint32_t yDim = 7; 80caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<const Element> e = Element::I32(rs); 81caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray Type::Builder tb(rs, e); 82caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray tb.setX(xDim); 83caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray tb.setY(yDim); 84caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<const Type> t = tb.create(); 85caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<Allocation> kern1_in = Allocation::createTyped(rs, t); 86caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sp<Allocation> kern1_out = Allocation::createTyped(rs, t); 87caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 88caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray int *buf = new int[t->getCount()]; 89caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray for (uint32_t ct=0; ct < t->getCount(); ct++) { 90caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray buf[ct] = 5; 91caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray } 92caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray kern1_in->copy2DRangeFrom(0, 0, xDim, yDim, buf); 93caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray delete [] buf; 94caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 95caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->forEach_kern1(kern1_in, kern1_out); 96caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray sc->forEach_verify_kern1(kern1_out); 97caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray 98caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray rs->finish(); 99caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray failed_alloc->copy1DTo(&failed); 100caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray } 10143514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } 10243514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 1038a588bd9d34088ed89ef2c192c32ea2301e601bcStephen Hines return failed; 1048a588bd9d34088ed89ef2c192c32ea2301e601bcStephen Hines} 1058a588bd9d34088ed89ef2c192c32ea2301e601bcStephen Hines 1068a588bd9d34088ed89ef2c192c32ea2301e601bcStephen Hinesint main() { 1078a588bd9d34088ed89ef2c192c32ea2301e601bcStephen Hines bool failed = test_compute(); 10843514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 10943514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines if (failed) { 11043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines printf("TEST FAILED!\n"); 11143514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } else { 11243514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines printf("TEST PASSED!\n"); 11343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } 11443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 11543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines return failed; 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 117