implement finish

Change-Id: If1ec99d0dbcf7aebf9d90d7779bf3ff34a8963f2
diff --git a/driver/rsdCore.cpp b/driver/rsdCore.cpp
index ed421ee..e38f92a 100644
--- a/driver/rsdCore.cpp
+++ b/driver/rsdCore.cpp
@@ -163,9 +163,9 @@
         rsdScriptGroupSetOutput,
         rsdScriptGroupExecute,
         rsdScriptGroupDestroy
-    }
+    },
 
-
+    NULL // finish
 };
 
 extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name);
diff --git a/rsContext.cpp b/rsContext.cpp
index 5cafd97..145759e 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -510,6 +510,7 @@
     mDPI = 96;
     mIsContextLite = false;
     memset(&watchdog, 0, sizeof(watchdog));
+    memset(&mHal, 0, sizeof(mHal));
     mForceCpu = false;
     mContextType = RS_CONTEXT_TYPE_NORMAL;
     mSynchronous = false;
@@ -721,6 +722,12 @@
 }
 #endif
 
+void Context::finish() {
+    if (mHal.funcs.finish) {
+        mHal.funcs.finish(this);
+    }
+}
+
 void Context::assignName(ObjectBase *obj, const char *name, uint32_t len) {
     rsAssert(!obj->getName());
     obj->setName(name, len);
@@ -785,6 +792,7 @@
 namespace renderscript {
 
 void rsi_ContextFinish(Context *rsc) {
+    rsc->finish();
 }
 
 void rsi_ContextBindRootScript(Context *rsc, RsScript vs) {
diff --git a/rsContext.h b/rsContext.h
index 1dc7c62..ab56c27 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -151,6 +151,7 @@
     void resume();
     void setSurface(uint32_t w, uint32_t h, RsNativeWindow sur);
 #endif
+    void finish();
 
     void setPriority(int32_t p);
     void destroyWorkerThreadResources();
diff --git a/rs_hal.h b/rs_hal.h
index 16bd890..9ae6fed 100644
--- a/rs_hal.h
+++ b/rs_hal.h
@@ -287,6 +287,7 @@
         void (*destroy)(const Context *rsc, const ScriptGroup *sg);
     } scriptgroup;
 
+    void (*finish)(const Context *rsc);
 } RsdHalFunctions;