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 9221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsint main(int argc, char** argv) 10221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams{ 11221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 128d8fb3eb4a66809872579b9bf679523e96fa302dTim Murray sp<RS> rs = new RS(); 138d8fb3eb4a66809872579b9bf679523e96fa302dTim Murray printf("New RS %p\n", rs.get()); 14221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 158d8fb3eb4a66809872579b9bf679523e96fa302dTim Murray bool r = rs->init(); 16221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams printf("Init returned %i\n", r); 17221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 1869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<const Element> e = Element::RGBA_8888(rs); 1969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams printf("Element %p\n", e.get()); 20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 21221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Type::Builder tb(rs, e); 22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams tb.setX(128); 23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams tb.setY(128); 2469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<const Type> t = tb.create(); 2569cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams printf("Type %p\n", t.get()); 26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 27221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<Allocation> a1 = Allocation::createSized(rs, e, 1000); 2969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams printf("Allocation %p\n", a1.get()); 30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 3169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<Allocation> ain = Allocation::createTyped(rs, t); 3269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<Allocation> aout = Allocation::createTyped(rs, t); 3369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams printf("Allocation %p %p\n", ain.get(), aout.get()); 34f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams 3589daad6bae798779e57f252e9da4fe4e62337124Tim Murray ScriptC_mono* sc = new ScriptC_mono(rs); 36f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams printf("new script\n"); 37f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams 3843514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines // We read back the status from the script-side via a "failed" allocation. 3943514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<const Element> failed_e = Element::BOOLEAN(rs); 4043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines Type::Builder failed_tb(rs, failed_e); 4143514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines failed_tb.setX(1); 4243514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<const Type> failed_t = failed_tb.create(); 4343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<Allocation> failed_alloc = Allocation::createTyped(rs, failed_t); 4443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines bool failed = false; 4543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines failed_alloc->copy1DRangeFrom(0, failed_t->getCount(), &failed); 4643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->bind_failed(failed_alloc); 4743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 48f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams uint32_t *buf = new uint32_t[t->getCount()]; 49f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams for (uint32_t ct=0; ct < t->getCount(); ct++) { 50f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams buf[ct] = ct | (ct << 16); 51f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams } 520b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray ain->copy1DRangeFrom(0, t->getCount(), buf); 5343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines delete [] buf; 54f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams 55f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams sc->forEach_root(ain, aout); 5643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 5743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->invoke_foo(99, 3.1f); 5843514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->set_g_f(39.9f); 5943514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->set_g_i(-14); 6043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->invoke_foo(99, 3.1f); 61f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams printf("for each done\n"); 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 6343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->invoke_bar(47, -3, 'c', -7, 14, -8); 6443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 6543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines // Verify a simple kernel. 6643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines { 67a1302e2a413fb32fb5eab320e9802a7893ff6f27Stephen Hines static const uint32_t xDim = 7; 68a1302e2a413fb32fb5eab320e9802a7893ff6f27Stephen Hines static const uint32_t yDim = 7; 6943514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<const Element> e = Element::I32(rs); 7043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines Type::Builder tb(rs, e); 71a1302e2a413fb32fb5eab320e9802a7893ff6f27Stephen Hines tb.setX(xDim); 72a1302e2a413fb32fb5eab320e9802a7893ff6f27Stephen Hines tb.setY(yDim); 7343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<const Type> t = tb.create(); 7443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<Allocation> kern1_in = Allocation::createTyped(rs, t); 7543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sp<Allocation> kern1_out = Allocation::createTyped(rs, t); 7643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 7743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines int *buf = new int[t->getCount()]; 7843514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines for (uint32_t ct=0; ct < t->getCount(); ct++) { 79a1302e2a413fb32fb5eab320e9802a7893ff6f27Stephen Hines buf[ct] = 5; 8043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } 81a1302e2a413fb32fb5eab320e9802a7893ff6f27Stephen Hines kern1_in->copy2DRangeFrom(0, 0, xDim, yDim, buf); 8243514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines delete [] buf; 8343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 8443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->forEach_kern1(kern1_in, kern1_out); 8543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines sc->forEach_verify_kern1(kern1_out); 8643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 8743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines rs->finish(); 8843514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines failed_alloc->copy1DTo(&failed); 8943514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } 9043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams printf("Deleting stuff\n"); 9289daad6bae798779e57f252e9da4fe4e62337124Tim Murray delete sc; 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams printf("Delete OK\n"); 9443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 9543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines if (failed) { 9643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines printf("TEST FAILED!\n"); 9743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } else { 9843514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines printf("TEST PASSED!\n"); 9943514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines } 10043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines 10143514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines return failed; 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 103