Add sampler support
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
index bc34080..3381525 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainView.java
@@ -52,6 +52,7 @@
private RenderScript.ProgramFragment mPF;
private RenderScript.ProgramFragment mPF2;
private RenderScript.Allocation mTexture;
+ private RenderScript.Sampler mSampler;
private Bitmap mBackground;
@@ -83,6 +84,12 @@
mPFS = mRS.programFragmentStoreCreate();
mRS.contextBindProgramFragmentStore(mPFS);
+ mRS.samplerBegin();
+ mRS.samplerSet(RenderScript.SamplerParam.FILTER_MAG, RenderScript.SamplerValue.LINEAR);
+ mRS.samplerSet(RenderScript.SamplerParam.FILTER_MIN, RenderScript.SamplerValue.LINEAR);
+ mSampler = mRS.samplerCreate();
+
+
mRS.programFragmentBegin(null, null);
mPF = mRS.programFragmentCreate();
//mRS.contextBindProgramFragment(mPF);
@@ -92,6 +99,7 @@
mPF2 = mRS.programFragmentCreate();
mRS.contextBindProgramFragment(mPF2);
mPF2.bindTexture(mTexture, 0);
+ mPF2.bindSampler(mSampler, 0);
mParams[0] = 0;
mParams[1] = partCount;
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java b/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java
index 739f9ae..cf16cec 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java
@@ -38,7 +38,7 @@
- /*
+ /*
* We use a class initializer to allow the native code to cache some
* field offsets.
*/
@@ -49,9 +49,7 @@
sInitialized = false;
try {
System.loadLibrary("RS_jni");
- Log.e(LOG_TAG, "*** Renderscript INIT");
_nInit();
- Log.e(LOG_TAG, "*** Renderscript INIT 3");
sInitialized = true;
} catch (UnsatisfiedLinkError e) {
Log.d(LOG_TAG, "RenderScript JNI library not found!");
@@ -126,6 +124,10 @@
native private void nScriptCSetScript(byte[] script, int offset, int length);
native private int nScriptCCreate();
+ native private void nSamplerDestroy(int sampler);
+ native private void nSamplerBegin();
+ native private void nSamplerSet(int param, int value);
+ native private int nSamplerCreate();
native private void nProgramFragmentStoreBegin(int in, int out);
native private void nProgramFragmentStoreDepthFunc(int func);
@@ -307,6 +309,34 @@
}
}
+ public enum SamplerParam {
+ FILTER_MIN (0),
+ FILTER_MAG (1),
+ WRAP_MODE_S (2),
+ WRAP_MODE_T (3),
+ WRAP_MODE_R (4);
+
+ int mID;
+ SamplerParam(int id) {
+ mID = id;
+ }
+ }
+
+ public enum SamplerValue {
+ NEAREST (0),
+ LINEAR (1),
+ LINEAR_MIP_LINEAR (2),
+ WRAP (3),
+ CLAMP (4);
+
+ int mID;
+ SamplerValue(int id) {
+ mID = id;
+ }
+ }
+
+
+
public class Element extends BaseObj {
Element(int id) {
mID = id;
@@ -727,9 +757,9 @@
nProgramFragmentBindTexture(mID, slot, va.mID);
}
- //public void bindSampler(Sampler vs, int slot) {
- //nProgramFragmentBindSampler(mID, slot, vs.mID);
- //}
+ public void bindSampler(Sampler vs, int slot) {
+ nProgramFragmentBindSampler(mID, slot, vs.mID);
+ }
}
public void programFragmentBegin(Element in, Element out) {
@@ -761,6 +791,33 @@
return new ProgramFragment(id);
}
+ //////////////////////////////////////////////////////////////////////////////////
+ // Sampler
+
+ public class Sampler extends BaseObj {
+ Sampler(int id) {
+ mID = id;
+ }
+
+ public void destroy() {
+ nSamplerDestroy(mID);
+ mID = 0;
+ }
+ }
+
+ public void samplerBegin() {
+ nSamplerBegin();
+ }
+
+ public void samplerSet(SamplerParam p, SamplerValue v) {
+ nSamplerSet(p.mID, v.mID);
+ }
+
+ public Sampler samplerCreate() {
+ int id = nSamplerCreate();
+ return new Sampler(id);
+ }
+
///////////////////////////////////////////////////////////////////////////////////
// Root state
diff --git a/libs/rs/jni/RenderScript_jni.cpp b/libs/rs/jni/RenderScript_jni.cpp
index 50849af..4af58a6 100644
--- a/libs/rs/jni/RenderScript_jni.cpp
+++ b/libs/rs/jni/RenderScript_jni.cpp
@@ -718,14 +718,6 @@
}
static void
-nContextBindSampler(JNIEnv *_env, jobject _this, jint sampler, jint slot)
-{
- RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
- LOG_API("nContextBindSampler, con(%p), sampler(%p), slot(%i)", con, (RsSampler)sampler, slot);
- rsContextBindSampler(slot, (RsSampler)sampler);
-}
-
-static void
nContextBindProgramFragmentStore(JNIEnv *_env, jobject _this, jint pfs)
{
RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -741,6 +733,40 @@
rsContextBindProgramFragment((RsProgramFragment)pf);
}
+// ---------------------------------------------------------------------------
+
+static void
+nSamplerDestroy(JNIEnv *_env, jobject _this, jint s)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nSamplerDestroy, con(%p), sampler(%p)", con, (RsSampler)s);
+ rsSamplerDestroy((RsSampler)s);
+}
+
+static void
+nSamplerBegin(JNIEnv *_env, jobject _this)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nSamplerBegin, con(%p)", con);
+ rsSamplerBegin();
+}
+
+static void
+nSamplerSet(JNIEnv *_env, jobject _this, jint p, jint v)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nSamplerSet, con(%p), param(%i), value(%i)", con, p, v);
+ rsSamplerSet((RsSamplerParam)p, (RsSamplerValue)v);
+}
+
+static jint
+nSamplerCreate(JNIEnv *_env, jobject _this)
+{
+ RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+ LOG_API("nSamplerCreate, con(%p), script(%p)", con, (RsScript)script);
+ return (jint)rsSamplerCreate();
+}
+
// ---------------------------------------------------------------------------
@@ -825,10 +851,14 @@
{"nProgramFragmentCreate", "()I", (void*)nProgramFragmentCreate },
{"nContextBindRootScript", "(I)V", (void*)nContextBindRootScript },
-//{"nContextBindSampler", "(II)V", (void*)nContextBindSampler },
{"nContextBindProgramFragmentStore","(I)V", (void*)nContextBindProgramFragmentStore },
{"nContextBindProgramFragment", "(I)V", (void*)nContextBindProgramFragment },
+{"nSamplerDestroy", "(I)V", (void*)nSamplerDestroy },
+{"nSamplerBegin", "()V", (void*)nSamplerBegin },
+{"nSamplerSet", "(II)V", (void*)nSamplerSet },
+{"nSamplerCreate", "()I", (void*)nSamplerCreate },
+
};
static int registerFuncs(JNIEnv *_env)
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 98c7008..090be32 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -1,10 +1,5 @@
-ContextBindSampler {
- param uint32_t slot
- param RsSampler sampler
- }
-
ContextBindRootScript {
param RsScript sampler
}
@@ -212,6 +207,9 @@
ret RsSampler
}
+SamplerDestroy {
+ param RsSampler s
+ }
TriangleMeshBegin {
param RsElement vertex
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
index 1a6e2c7..3d316ea 100644
--- a/libs/rs/rsProgramFragment.cpp
+++ b/libs/rs/rsProgramFragment.cpp
@@ -62,14 +62,14 @@
break;
}
-// if (mSamplers[ct].get()) {
- //mSamplers[ct]->setupGL();
-// } else {
+ if (mSamplers[ct].get()) {
+ mSamplers[ct]->setupGL();
+ } else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- //}
+ }
}
glActiveTexture(GL_TEXTURE0);
}
diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp
index 3c008c9..ca407db 100644
--- a/libs/rs/rsSampler.cpp
+++ b/libs/rs/rsSampler.cpp
@@ -53,7 +53,21 @@
void Sampler::setupGL()
{
+ GLenum translate[] = {
+ GL_NEAREST, //RS_SAMPLER_NEAREST,
+ GL_LINEAR, //RS_SAMPLER_LINEAR,
+ GL_LINEAR_MIP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
+ GL_WRAP, //RS_SAMPLER_WRAP,
+ GL_CLAMP_TO_EDGS, //RS_SAMPLER_CLAMP
+
+ }
+
+
//LOGE("setup gl");
+ switch(mMagFilter) {
+ case RS_SAMPLER_
+ }
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -76,7 +90,7 @@
void SamplerState::setupGL()
{
- for (uint32_t ct=0; ct < 1/*RS_MAX_SAMPLER_SLOT*/; ct++) {
+ for (uint32_t ct=0; ct < RS_MAX_SAMPLER_SLOT; ct++) {
Sampler *s = mSamplers[ct].get();
if (s) {
s->setupGL();
@@ -140,4 +154,12 @@
return s;
}
+void rsi_SamplerDestroy(Context *rsc, RsSampler vs)
+{
+ Sampler * s = static_cast<Sampler *>(vs);
+ s->decRef();
+
+}
+
+
}}