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 1379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray { 1479dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<RS> rs = new RS(); 1579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("New RS %p\n", rs.get()); 1643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 1779dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray // only legitimate because this is a standalone executable 1879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray bool r = rs->init("/system/bin"); 1979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("Init returned %i\n", r); 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<const Element> e = Element::RGBA_8888(rs); 2279dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("Element %p\n", e.get()); 2343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 2443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines Type::Builder tb(rs, e); 2579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray tb.setX(128); 2679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray tb.setY(128); 2743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<const Type> t = tb.create(); 2879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("Type %p\n", t.get()); 2979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 3079dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 3179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<Allocation> a1 = Allocation::createSized(rs, e, 1000); 3279dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("Allocation %p\n", a1.get()); 3379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 3479dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<Allocation> ain = Allocation::createTyped(rs, t); 3579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<Allocation> aout = Allocation::createTyped(rs, t); 3679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("Allocation %p %p\n", ain.get(), aout.get()); 3743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 3879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<ScriptC_mono> sc = new ScriptC_mono(rs); 3979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("new script\n"); 4079dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 4179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_alloc(a1); 4279dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_elem(e); 4379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_type(t); 4479dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_script(sc); 4579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_script(NULL); 4679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<const Sampler> samp = Sampler::CLAMP_NEAREST(rs); 4779dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_sampler(samp); 4879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 4979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray // We read back the status from the script-side via a "failed" allocation. 5079dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<const Element> failed_e = Element::BOOLEAN(rs); 5179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray Type::Builder failed_tb(rs, failed_e); 5279dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray failed_tb.setX(1); 5379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<const Type> failed_t = failed_tb.create(); 5479dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<Allocation> failed_alloc = Allocation::createTyped(rs, failed_t); 5579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 5679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray failed_alloc->copy1DRangeFrom(0, failed_t->getCount(), &failed); 5779dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->bind_failed(failed_alloc); 5879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 5979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray uint32_t *buf = new uint32_t[t->getCount()]; 6043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines for (uint32_t ct=0; ct < t->getCount(); ct++) { 6179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray buf[ct] = ct | (ct << 16); 6243514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } 6379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray ain->copy1DRangeFrom(0, t->getCount(), buf); 6443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines delete [] buf; 6543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 6679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->forEach_root(ain, aout); 6779dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 6879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->invoke_foo(99, 3.1f); 6979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_g_f(39.9f); 7079dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->set_g_i(-14); 7179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->invoke_foo(99, 3.1f); 7279dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray printf("for each done\n"); 7379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 7479dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->invoke_bar(47, -3, 'c', -7, 14, -8); 7579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 7679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray // Verify a simple kernel. 7779dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray { 7879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray static const uint32_t xDim = 7; 7979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray static const uint32_t yDim = 7; 8079dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<const Element> e = Element::I32(rs); 8179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray Type::Builder tb(rs, e); 8279dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray tb.setX(xDim); 8379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray tb.setY(yDim); 8479dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<const Type> t = tb.create(); 8579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<Allocation> kern1_in = Allocation::createTyped(rs, t); 8679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sp<Allocation> kern1_out = Allocation::createTyped(rs, t); 8779dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 8879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray int *buf = new int[t->getCount()]; 8979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray for (uint32_t ct=0; ct < t->getCount(); ct++) { 9079dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray buf[ct] = 5; 9179dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray } 9279dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray kern1_in->copy2DRangeFrom(0, 0, xDim, yDim, buf); 9379dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray delete [] buf; 9479dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 9579dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->forEach_kern1(kern1_in, kern1_out); 9679dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray sc->forEach_verify_kern1(kern1_out); 9779dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray 9879dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray rs->finish(); 9979dc3c9c918515a793b3fdcd188cb553feccca8bTim Murray failed_alloc->copy1DTo(&failed); 10079dc3c9c918515a793b3fdcd188cb553feccca8bTim 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