100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines#include "RenderScript.h" 300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines#include "ScriptC_mono.h" 500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 600db019ba61601b679aaea5a40cf0f84715d890dStephen Hinesint test_compute() 700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines{ 800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines bool failed = false; 900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 1000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines { 1100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<RS> rs = new RS(); 1200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("New RS %p\n", rs.get()); 1300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 1400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines // only legitimate because this is a standalone executable 1500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines bool r = rs->init("/system/bin"); 1600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("Init returned %i\n", r); 1700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 1800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<const Element> e = Element::RGBA_8888(rs); 1900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("Element %p\n", e.get()); 2000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 2100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines Type::Builder tb(rs, e); 2200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines tb.setX(128); 2300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines tb.setY(128); 2400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<const Type> t = tb.create(); 2500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("Type %p\n", t.get()); 2600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 2700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 2800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<Allocation> a1 = Allocation::createSized(rs, e, 1000); 2900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("Allocation %p\n", a1.get()); 3000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 3100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<Allocation> ain = Allocation::createTyped(rs, t); 3200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<Allocation> aout = Allocation::createTyped(rs, t); 3300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("Allocation %p %p\n", ain.get(), aout.get()); 3400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 3500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<ScriptC_mono> sc = new ScriptC_mono(rs); 3600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("new script\n"); 3700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 3800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->set_alloc(a1); 3900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->set_elem(e); 4000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->set_type(t); 4100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->set_script(sc); 4244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes sc->set_script(nullptr); 4300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<const Sampler> samp = Sampler::CLAMP_NEAREST(rs); 4400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->set_sampler(samp); 4500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 4600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines // We read back the status from the script-side via a "failed" allocation. 4700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<const Element> failed_e = Element::BOOLEAN(rs); 4800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines Type::Builder failed_tb(rs, failed_e); 4900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines failed_tb.setX(1); 5000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<const Type> failed_t = failed_tb.create(); 5100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<Allocation> failed_alloc = Allocation::createTyped(rs, failed_t); 5200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 5300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines failed_alloc->copy1DRangeFrom(0, failed_t->getCount(), &failed); 5400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->bind_failed(failed_alloc); 5500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 5600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines uint32_t *buf = new uint32_t[t->getCount()]; 5700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines for (uint32_t ct=0; ct < t->getCount(); ct++) { 5800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines buf[ct] = ct | (ct << 16); 5900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines } 6000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines ain->copy1DRangeFrom(0, t->getCount(), buf); 6100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines delete [] buf; 6200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 6300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->forEach_root(ain, aout); 6400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 6500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->invoke_foo(99, 3.1f); 6600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->set_g_f(39.9f); 6700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->set_g_i(-14); 6800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->invoke_foo(99, 3.1f); 6900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("for each done\n"); 7000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 7100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->invoke_bar(47, -3, 'c', -7, 14, -8); 7200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 7300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines // Verify a simple kernel. 7400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines { 7500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines static const uint32_t xDim = 7; 7600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines static const uint32_t yDim = 7; 7700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<const Element> e = Element::I32(rs); 7800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines Type::Builder tb(rs, e); 7900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines tb.setX(xDim); 8000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines tb.setY(yDim); 8100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<const Type> t = tb.create(); 8200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<Allocation> kern1_in = Allocation::createTyped(rs, t); 8300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sp<Allocation> kern1_out = Allocation::createTyped(rs, t); 8400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 8500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines int *buf = new int[t->getCount()]; 8600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines for (uint32_t ct=0; ct < t->getCount(); ct++) { 8700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines buf[ct] = 5; 8800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines } 8900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines kern1_in->copy2DRangeFrom(0, 0, xDim, yDim, buf); 9000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines delete [] buf; 9100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 9200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->forEach_kern1(kern1_in, kern1_out); 9300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines sc->forEach_verify_kern1(kern1_out); 9400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 9500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines rs->finish(); 9600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines failed_alloc->copy1DTo(&failed); 9700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines } 9800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines } 9900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 10000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines return failed; 10100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines} 10200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 10300db019ba61601b679aaea5a40cf0f84715d890dStephen Hinesint main() { 10400db019ba61601b679aaea5a40cf0f84715d890dStephen Hines bool failed = test_compute(); 10500db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 10600db019ba61601b679aaea5a40cf0f84715d890dStephen Hines if (failed) { 10700db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("TEST FAILED!\n"); 10800db019ba61601b679aaea5a40cf0f84715d890dStephen Hines } else { 10900db019ba61601b679aaea5a40cf0f84715d890dStephen Hines printf("TEST PASSED!\n"); 11000db019ba61601b679aaea5a40cf0f84715d890dStephen Hines } 11100db019ba61601b679aaea5a40cf0f84715d890dStephen Hines 11200db019ba61601b679aaea5a40cf0f84715d890dStephen Hines return failed; 11300db019ba61601b679aaea5a40cf0f84715d890dStephen Hines} 114