diff options
32 files changed, 1450 insertions, 24 deletions
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java index 12e5ada..7e542ad 100644 --- a/graphics/java/android/renderscript/Allocation.java +++ b/graphics/java/android/renderscript/Allocation.java @@ -870,7 +870,31 @@ public class Allocation extends BaseObj { if (type.getID() == 0) { throw new RSInvalidStateException("Bad Type"); } - int id = rs.nAllocationCreateTyped(type.getID(), mips.mID, usage); + int id = rs.nAllocationCreateTyped(type.getID(), mips.mID, usage, 0); + if (id == 0) { + throw new RSRuntimeException("Allocation creation failed."); + } + return new Allocation(id, rs, type, usage); + } + + /** + * @hide + * This API is hidden and only intended to be used for + * transitional purposes. + * + * @param type renderscript type describing data layout + * @param mips specifies desired mipmap behaviour for the + * allocation + * @param usage bit field specifying how the allocation is + * utilized + */ + static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mips, + int usage, int pointer) { + rs.validate(); + if (type.getID() == 0) { + throw new RSInvalidStateException("Bad Type"); + } + int id = rs.nAllocationCreateTyped(type.getID(), mips.mID, usage, pointer); if (id == 0) { throw new RSRuntimeException("Allocation creation failed."); } @@ -925,7 +949,7 @@ public class Allocation extends BaseObj { b.setX(count); Type t = b.create(); - int id = rs.nAllocationCreateTyped(t.getID(), MipmapControl.MIPMAP_NONE.mID, usage); + int id = rs.nAllocationCreateTyped(t.getID(), MipmapControl.MIPMAP_NONE.mID, usage, 0); if (id == 0) { throw new RSRuntimeException("Allocation creation failed."); } diff --git a/graphics/java/android/renderscript/Path.java b/graphics/java/android/renderscript/Path.java new file mode 100644 index 0000000..83ae150 --- /dev/null +++ b/graphics/java/android/renderscript/Path.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.renderscript; + +import java.util.Vector; +import android.util.Log; + +/** + * @hide + * + */ +public class Path extends BaseObj { + + public enum Primitive { + QUADRATIC_BEZIER(0), + CUBIC_BEZIER(1); + + int mID; + Primitive(int id) { + mID = id; + } + } + + Allocation mVertexBuffer; + Allocation mLoopBuffer; + Primitive mPrimitive; + float mQuality; + boolean mCoverageToAlpha; + + Path(int id, RenderScript rs, Primitive p, Allocation vtx, Allocation loop, float q) { + super(id, rs); + mVertexBuffer = vtx; + mLoopBuffer = loop; + mPrimitive = p; + mQuality = q; + } + + public Allocation getVertexAllocation() { + return mVertexBuffer; + } + + public Allocation getLoopAllocation() { + return mLoopBuffer; + } + + public Primitive getPrimitive() { + return mPrimitive; + } + + @Override + void updateFromNative() { + } + + + public static Path createStaticPath(RenderScript rs, Primitive p, float quality, Allocation vtx) { + int id = rs.nPathCreate(p.mID, false, vtx.getID(), 0, quality); + Path newPath = new Path(id, rs, p, null, null, quality); + return newPath; + } + + public static Path createStaticPath(RenderScript rs, Primitive p, float quality, Allocation vtx, Allocation loops) { + return null; + } + + public static Path createDynamicPath(RenderScript rs, Primitive p, float quality, Allocation vtx) { + return null; + } + + public static Path createDynamicPath(RenderScript rs, Primitive p, float quality, Allocation vtx, Allocation loops) { + return null; + } + + +} + + diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 1305633..c0cb324 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -228,10 +228,10 @@ public class RenderScript { rsnTypeGetNativeData(mContext, id, typeData); } - native int rsnAllocationCreateTyped(int con, int type, int mip, int usage); - synchronized int nAllocationCreateTyped(int type, int mip, int usage) { + native int rsnAllocationCreateTyped(int con, int type, int mip, int usage, int pointer); + synchronized int nAllocationCreateTyped(int type, int mip, int usage, int pointer) { validate(); - return rsnAllocationCreateTyped(mContext, type, mip, usage); + return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer); } native int rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage); synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) { @@ -581,6 +581,11 @@ public class RenderScript { rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount); } + native int rsnPathCreate(int con, int prim, boolean isStatic, int vtx, int loop, float q); + synchronized int nPathCreate(int prim, boolean isStatic, int vtx, int loop, float q) { + validate(); + return rsnPathCreate(mContext, prim, isStatic, vtx, loop, q); + } int mDev; int mContext; diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index c4ef993..2856437 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -430,10 +430,10 @@ nTypeGetNativeData(JNIEnv *_env, jobject _this, RsContext con, jint id, jintArra // ----------------------------------- static jint -nAllocationCreateTyped(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mips, jint usage) +nAllocationCreateTyped(JNIEnv *_env, jobject _this, RsContext con, jint type, jint mips, jint usage, jint pointer) { - LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i)", con, (RsElement)type, mips, usage); - return (jint) rsAllocationCreateTyped(con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage); + LOG_API("nAllocationCreateTyped, con(%p), type(%p), mip(%i), usage(%i), ptr(%p)", con, (RsElement)type, mips, usage, (void *)pointer); + return (jint) rsAllocationCreateTyped(con, (RsType)type, (RsAllocationMipmapControl)mips, (uint32_t)usage, (uint32_t)pointer); } static void @@ -1122,6 +1122,17 @@ nSamplerCreate(JNIEnv *_env, jobject _this, RsContext con, jint magFilter, jint // --------------------------------------------------------------------------- +//native int rsnPathCreate(int con, int prim, boolean isStatic, int vtx, int loop, float q); +static jint +nPathCreate(JNIEnv *_env, jobject _this, RsContext con, jint prim, jboolean isStatic, jint _vtx, jint _loop, jfloat q) { + LOG_API("nPathCreate, con(%p)", con); + + int id = (int)rsPathCreate(con, (RsPathPrimitive)prim, isStatic, + (RsAllocation)_vtx, + (RsAllocation)_loop, q); + return id; +} + static jint nMeshCreate(JNIEnv *_env, jobject _this, RsContext con, jintArray _vtx, jintArray _idx, jintArray _prim) { @@ -1250,7 +1261,7 @@ static JNINativeMethod methods[] = { {"rsnTypeCreate", "(IIIIIZZ)I", (void*)nTypeCreate }, {"rsnTypeGetNativeData", "(II[I)V", (void*)nTypeGetNativeData }, -{"rsnAllocationCreateTyped", "(IIII)I", (void*)nAllocationCreateTyped }, +{"rsnAllocationCreateTyped", "(IIIII)I", (void*)nAllocationCreateTyped }, {"rsnAllocationCreateFromBitmap", "(IIILandroid/graphics/Bitmap;I)I", (void*)nAllocationCreateFromBitmap }, {"rsnAllocationCubeCreateFromBitmap","(IIILandroid/graphics/Bitmap;I)I", (void*)nAllocationCubeCreateFromBitmap }, @@ -1310,6 +1321,7 @@ static JNINativeMethod methods[] = { {"rsnSamplerCreate", "(IIIIIIF)I", (void*)nSamplerCreate }, +{"rsnPathCreate", "(IIZIIF)I", (void*)nPathCreate }, {"rsnMeshCreate", "(I[I[I[I)I", (void*)nMeshCreate }, {"rsnMeshGetVertexBufferCount", "(II)I", (void*)nMeshGetVertexBufferCount }, diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk index 58d3e5c..7f0cbeb 100644 --- a/libs/rs/Android.mk +++ b/libs/rs/Android.mk @@ -96,6 +96,7 @@ LOCAL_SRC_FILES:= \ rsMatrix4x4.cpp \ rsMesh.cpp \ rsMutex.cpp \ + rsPath.cpp \ rsProgram.cpp \ rsProgramFragment.cpp \ rsProgramStore.cpp \ @@ -118,6 +119,7 @@ LOCAL_SRC_FILES:= \ driver/rsdGL.cpp \ driver/rsdMesh.cpp \ driver/rsdMeshObj.cpp \ + driver/rsdPath.cpp \ driver/rsdProgram.cpp \ driver/rsdProgramRaster.cpp \ driver/rsdProgramStore.cpp \ @@ -203,6 +205,7 @@ LOCAL_SRC_FILES:= \ rsMatrix4x4.cpp \ rsMesh.cpp \ rsMutex.cpp \ + rsPath.cpp \ rsProgram.cpp \ rsProgramFragment.cpp \ rsProgramStore.cpp \ diff --git a/libs/rs/RenderScriptDefines.h b/libs/rs/RenderScriptDefines.h index d092520..728b27a 100644 --- a/libs/rs/RenderScriptDefines.h +++ b/libs/rs/RenderScriptDefines.h @@ -41,6 +41,7 @@ typedef void * RsFont; typedef void * RsSampler; typedef void * RsScript; typedef void * RsMesh; +typedef void * RsPath; typedef void * RsType; typedef void * RsObjectBase; @@ -258,6 +259,11 @@ enum RsPrimitive { RS_PRIMITIVE_TRIANGLE_FAN }; +enum RsPathPrimitive { + RS_PATH_PRIMITIVE_QUADRATIC_BEZIER, + RS_PATH_PRIMITIVE_CUBIC_BEZIER +}; + enum RsError { RS_ERROR_NONE = 0, RS_ERROR_BAD_SHADER = 1, diff --git a/libs/rs/driver/rsdAllocation.cpp b/libs/rs/driver/rsdAllocation.cpp index e79cd0f..e072dab 100644 --- a/libs/rs/driver/rsdAllocation.cpp +++ b/libs/rs/driver/rsdAllocation.cpp @@ -212,10 +212,13 @@ bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) { return false; } - void * ptr = malloc(alloc->mHal.state.type->getSizeBytes()); + void * ptr = alloc->mHal.state.usrPtr; if (!ptr) { - free(drv); - return false; + ptr = malloc(alloc->mHal.state.type->getSizeBytes()); + if (!ptr) { + free(drv); + return false; + } } drv->glTarget = GL_NONE; @@ -269,7 +272,7 @@ void rsdAllocationDestroy(const Context *rsc, Allocation *alloc) { drv->renderTargetID = 0; } - if (drv->mallocPtr) { + if (drv->mallocPtr && !alloc->mHal.state.usrPtr) { free(drv->mallocPtr); drv->mallocPtr = NULL; } diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp index 9292fa1..a65e23b 100644 --- a/libs/rs/driver/rsdCore.cpp +++ b/libs/rs/driver/rsdCore.cpp @@ -18,6 +18,7 @@ #include "rsdAllocation.h" #include "rsdBcc.h" #include "rsdGL.h" +#include "rsdPath.h" #include "rsdProgramStore.h" #include "rsdProgramRaster.h" #include "rsdProgramVertex.h" @@ -115,6 +116,13 @@ static RsdHalFunctions FunctionTable = { }, { + rsdPathInitStatic, + rsdPathInitDynamic, + rsdPathDraw, + rsdPathDestroy + }, + + { rsdSamplerInit, rsdSamplerDestroy }, diff --git a/libs/rs/driver/rsdPath.cpp b/libs/rs/driver/rsdPath.cpp new file mode 100644 index 0000000..d475beb --- /dev/null +++ b/libs/rs/driver/rsdPath.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <GLES/gl.h> +#include <GLES2/gl2.h> +#include <GLES/glext.h> + +#include <rs_hal.h> +#include <rsContext.h> +#include <rsPath.h> + +#include "rsdCore.h" +#include "rsdPath.h" +#include "rsdAllocation.h" +#include "rsdGL.h" +#include "rsdVertexArray.h" +#include "rsdShaderCache.h" + +using namespace android; +using namespace android::renderscript; + +class DrvPath { +protected: + DrvPath(); +public: + virtual ~DrvPath(); + virtual void draw(Context *) = 0; +}; + +class DrvPathStatic : public DrvPath { +public: + typedef struct { + float x1, xc, x2; + float y1, yc, y2; + } segment_t; + + segment_t *mSegments; + uint32_t mSegmentCount; + + DrvPathStatic(const Allocation *vtx, const Allocation *loops); + virtual ~DrvPathStatic(); + + virtual void draw(Context *); +}; + +class DrvPathDynamic : public DrvPath { +public: + DrvPathDynamic(); + virtual ~DrvPathDynamic(); +}; + +static void cleanup(const Context *rsc, const Path *m) { + DrvPath *dp = (DrvPath *)m->mHal.drv; + if (dp) { + delete dp; + } +} + +bool rsdPathInitStatic(const Context *rsc, const Path *m, + const Allocation *vtx, const Allocation *loops) { + DrvPathStatic *drv = NULL; + cleanup(rsc, m); + + DrvPathStatic *dps = new DrvPathStatic(vtx, loops); + LOGE("init path m %p, %p", m, dps); + m->mHal.drv = dps; + return dps != NULL; +} + +bool rsdPathInitDynamic(const Context *rsc, const Path *m) { + return false; +} + + +void rsdPathDraw(const Context *rsc, const Path *m) { + LOGE("render m=%p", m); + + DrvPath *drv = (DrvPath *)m->mHal.drv; + if(drv) { + LOGE("render 2 drv=%p", drv); + drv->draw((Context *)rsc); + } +} + +void rsdPathDestroy(const Context *rsc, const Path *m) { + cleanup(rsc, m); + m->mHal.drv = NULL; +} + + + + +DrvPath::DrvPath() { +} + +DrvPath::~DrvPath() { +} + +DrvPathStatic::DrvPathStatic(const Allocation *vtx, const Allocation *loops) { + mSegmentCount = vtx->getType()->getDimX() / 3; + mSegments = new segment_t[mSegmentCount]; + + const float *fin = (const float *)vtx->getPtr(); + for (uint32_t ct=0; ct < mSegmentCount; ct++) { + segment_t *s = &mSegments[ct]; + s->x1 = fin[0]; + s->y1 = fin[1]; + + s->xc = fin[2]; + s->yc = fin[3]; + + s->x2 = fin[4]; + s->y2 = fin[5]; + fin += 6; + } +} + +DrvPathStatic::~DrvPathStatic() { +} + +void DrvPathStatic::draw(Context *rsc) { + const static float color[24] = { + 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, + 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, + 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; + float vtx[12]; + + LOGE("draw"); + if (!rsc->setupCheck()) { + return; + } + + RsdHal *dc = (RsdHal *)rsc->mHal.drv; + if (!dc->gl.shaderCache->setup(rsc)) { + return; + } + + RsdVertexArray::Attrib attribs[2]; + attribs[0].set(GL_FLOAT, 2, 8, false, (uint32_t)vtx, "ATTRIB_position"); + attribs[1].set(GL_FLOAT, 4, 16, false, (uint32_t)color, "ATTRIB_color"); + RsdVertexArray va(attribs, 2); + va.setup(rsc); + + LOGE("mSegmentCount %i", mSegmentCount); + for (uint32_t ct=0; ct < mSegmentCount; ct++) { + segment_t *s = &mSegments[ct]; + + vtx[0] = s->x1; + vtx[1] = s->y1; + vtx[2] = s->xc; + vtx[3] = s->yc; + + vtx[4] = s->x2; + vtx[5] = s->y2; + vtx[6] = s->xc; + vtx[7] = s->yc; + + vtx[8] = s->x1; + vtx[9] = s->y1; + vtx[10] = s->x2; + vtx[11] = s->y2; + + RSD_CALL_GL(glDrawArrays, GL_LINES, 0, 6); + } + +} + +DrvPathDynamic::DrvPathDynamic() { +} + +DrvPathDynamic::~DrvPathDynamic() { +} diff --git a/libs/rs/driver/rsdPath.h b/libs/rs/driver/rsdPath.h new file mode 100644 index 0000000..fa00972 --- /dev/null +++ b/libs/rs/driver/rsdPath.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RSD_PATH_H +#define RSD_PATH_H + +#include <rs_hal.h> + + +bool rsdPathInitStatic(const android::renderscript::Context *rsc, + const android::renderscript::Path *m, + const android::renderscript::Allocation *vertex, + const android::renderscript::Allocation *loops); +bool rsdPathInitDynamic(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); +void rsdPathDraw(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); +void rsdPathDestroy(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); + + +#endif diff --git a/libs/rs/driver/rsdRuntimeStubs.cpp b/libs/rs/driver/rsdRuntimeStubs.cpp index 90c8928..c2201be 100644 --- a/libs/rs/driver/rsdRuntimeStubs.cpp +++ b/libs/rs/driver/rsdRuntimeStubs.cpp @@ -25,6 +25,7 @@ #include "rsdCore.h" #include "rsdRuntime.h" +#include "rsdPath.h" #include <time.h> @@ -204,6 +205,12 @@ static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) { rsrDrawRect(rsc, sc, x1, y1, x2, y2, z); } +static void SC_DrawPath(Path *p) { + GET_TLS(); + //rsrDrawPath(rsc, sc, p); + rsdPathDraw(rsc, p); +} + static void SC_DrawMesh(Mesh *m) { GET_TLS(); rsrDrawMesh(rsc, sc, m); @@ -533,6 +540,10 @@ static RsdSymbolTable gSyms[] = { { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true }, { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true }, + { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true }, + { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true }, + { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true }, + { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true }, { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true }, { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true }, @@ -603,6 +614,8 @@ static RsdSymbolTable gSyms[] = { { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false }, { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false }, + { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false }, + { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false }, { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false }, diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index 20b1f52..d60db7e 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -42,6 +42,7 @@ AllocationCreateTyped { param RsType vtype param RsAllocationMipmapControl mips param uint32_t usages + param uint32_t ptr ret RsAllocation } @@ -388,3 +389,13 @@ MeshCreate { param uint32_t *primType ret RsMesh } + +PathCreate { + param RsPathPrimitive pp + param bool isStatic + param RsAllocation vertex + param RsAllocation loops + param float quality + ret RsPath + } + diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp index c1192fe..2c360fb 100644 --- a/libs/rs/rsAllocation.cpp +++ b/libs/rs/rsAllocation.cpp @@ -22,21 +22,22 @@ using namespace android; using namespace android::renderscript; Allocation::Allocation(Context *rsc, const Type *type, uint32_t usages, - RsAllocationMipmapControl mc) + RsAllocationMipmapControl mc, void * ptr) : ObjectBase(rsc) { memset(&mHal, 0, sizeof(mHal)); mHal.state.mipmapControl = RS_ALLOCATION_MIPMAP_NONE; mHal.state.usageFlags = usages; mHal.state.mipmapControl = mc; + mHal.state.usrPtr = ptr; setType(type); updateCache(); } Allocation * Allocation::createAllocation(Context *rsc, const Type *type, uint32_t usages, - RsAllocationMipmapControl mc) { - Allocation *a = new Allocation(rsc, type, usages, mc); + RsAllocationMipmapControl mc, void * ptr) { + Allocation *a = new Allocation(rsc, type, usages, mc, ptr); if (!rsc->mHal.funcs.allocation.init(rsc, a, type->getElement()->getHasReferences())) { rsc->setError(RS_ERROR_FATAL_DRIVER, "Allocation::Allocation, alloc failure"); @@ -570,8 +571,8 @@ static void AllocationGenerateScriptMips(RsContext con, RsAllocation va) { RsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype, RsAllocationMipmapControl mips, - uint32_t usages) { - Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips); + uint32_t usages, uint32_t ptr) { + Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips, (void *)ptr); if (!alloc) { return NULL; } @@ -584,7 +585,7 @@ RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype, const void *data, size_t data_length, uint32_t usages) { Type *t = static_cast<Type *>(vtype); - RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages); + RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); if (texAlloc == NULL) { LOGE("Memory allocation failure"); @@ -608,7 +609,7 @@ RsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype, // Cubemap allocation's faces should be Width by Width each. // Source data should have 6 * Width by Width pixels // Error checking is done in the java layer - RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages); + RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); if (texAlloc == NULL) { LOGE("Memory allocation failure"); diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h index 4ce863a..0f7ed42 100644 --- a/libs/rs/rsAllocation.h +++ b/libs/rs/rsAllocation.h @@ -55,6 +55,8 @@ public: bool hasMipmaps; bool hasFaces; bool hasReferences; + + void * usrPtr; }; State state; @@ -66,7 +68,8 @@ public: Hal mHal; static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages, - RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE); + RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE, + void *ptr = 0); virtual ~Allocation(); void updateCache(); @@ -134,7 +137,7 @@ protected: private: void freeChildrenUnlocked(); - Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc); + Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc, void *ptr); uint32_t getPackedSize() const; static void writePackedData(const Type *type, uint8_t *dst, const uint8_t *src, bool dstPadded); diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index c6582c9..9f8cc4a 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -32,6 +32,7 @@ #include "rsAdapter.h" #include "rsSampler.h" #include "rsFont.h" +#include "rsPath.h" #include "rsProgramFragment.h" #include "rsProgramStore.h" #include "rsProgramRaster.h" diff --git a/libs/rs/rsPath.cpp b/libs/rs/rsPath.cpp new file mode 100644 index 0000000..89a0770 --- /dev/null +++ b/libs/rs/rsPath.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "rsContext.h" + +using namespace android; +using namespace android::renderscript; + + +Path::Path(Context *rsc) : ObjectBase(rsc) { +} + +Path::Path(Context *rsc, RsPathPrimitive pp, bool isStatic, + Allocation *vtx, Allocation *loops, float quality) +: ObjectBase(rsc) { + + memset(&mHal, 0, sizeof(mHal)); + mHal.state.quality = quality; + mHal.state.primitive = pp; + + LOGE("i1"); + rsc->mHal.funcs.path.initStatic(rsc, this, vtx, loops); + + LOGE("i2"); +} + +Path::Path(Context *rsc, uint32_t vertexBuffersCount, uint32_t primitivesCount) +: ObjectBase(rsc) { + +} + +Path::~Path() { + +} + + +void Path::rasterize(const BezierSegment_t *s, uint32_t num, Allocation *alloc) { + + for (uint32_t i=0; i < num; i++) { + + } + +} + +void Path::render(Context *rsc) { +} + +void Path::serialize(OStream *stream) const { + +} + +RsA3DClassID Path::getClassId() const { + return RS_A3D_CLASS_ID_UNKNOWN; +} + +namespace android { +namespace renderscript { + +RsPath rsi_PathCreate(Context *rsc, RsPathPrimitive pp, bool isStatic, + RsAllocation vtx, RsAllocation loops, float quality) { + return new Path(rsc, pp, isStatic, (Allocation *)vtx, (Allocation *)loops, quality); +} + +} +} diff --git a/libs/rs/rsPath.h b/libs/rs/rsPath.h new file mode 100644 index 0000000..dac795e --- /dev/null +++ b/libs/rs/rsPath.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_RS_PATH_H +#define ANDROID_RS_PATH_H + + +#include "RenderScript.h" + +// --------------------------------------------------------------------------- +namespace android { +namespace renderscript { + +class Path : public ObjectBase { +public: + struct { + mutable void * drv; + + struct State { + RsPathPrimitive primitive; + float quality; + }; + State state; + } mHal; + + Path(Context *); + Path(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount); + Path(Context *, RsPathPrimitive pp, bool isStatic, Allocation *vtx, Allocation *loop, float q); + + ~Path(); + + void render(Context *); + virtual void serialize(OStream *stream) const; + virtual RsA3DClassID getClassId() const; + +private: + + + typedef struct { + float x[4]; + float y[4]; + } BezierSegment_t; + + bool subdivideCheck(const BezierSegment_t *s, float u1, float u2); + + void rasterize(const BezierSegment_t *s, uint32_t num, Allocation *alloc); + + +}; + +} +} +#endif //ANDROID_RS_PATH_H + + + diff --git a/libs/rs/rsRuntime.h b/libs/rs/rsRuntime.h index cb962a8..b0869f6 100644 --- a/libs/rs/rsRuntime.h +++ b/libs/rs/rsRuntime.h @@ -68,6 +68,7 @@ void rsrDrawQuad(Context *, Script *, void rsrDrawSpriteScreenspace(Context *, Script *, float x, float y, float z, float w, float h); void rsrDrawRect(Context *, Script *, float x1, float y1, float x2, float y2, float z); +void rsrDrawPath(Context *, Script *, Path *); void rsrDrawMesh(Context *, Script *, Mesh *); void rsrDrawMeshPrimitive(Context *, Script *, Mesh *, uint32_t primIndex); void rsrDrawMeshPrimitiveRange(Context *, Script *, Mesh *, diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp index 26e2374..a79c3cb 100644 --- a/libs/rs/rsScriptC_LibGL.cpp +++ b/libs/rs/rsScriptC_LibGL.cpp @@ -200,6 +200,14 @@ void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z); } +void rsrDrawPath(Context *rsc, Script *sc, Path *sm) { + CHECK_OBJ(sm); + if (!rsc->setupCheck()) { + return; + } + sm->render(rsc); +} + void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) { CHECK_OBJ(sm); if (!rsc->setupCheck()) { diff --git a/libs/rs/rs_hal.h b/libs/rs/rs_hal.h index b8d7351..a5df600 100644 --- a/libs/rs/rs_hal.h +++ b/libs/rs/rs_hal.h @@ -29,6 +29,7 @@ class Type; class Allocation; class Script; class ScriptC; +class Path; class Program; class ProgramStore; class ProgramRaster; @@ -189,6 +190,13 @@ typedef struct { } mesh; struct { + bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops); + bool (*initDynamic)(const Context *rsc, const Path *m); + void (*draw)(const Context *rsc, const Path *m); + void (*destroy)(const Context *rsc, const Path *m); + } path; + + struct { bool (*init)(const Context *rsc, const Sampler *m); void (*destroy)(const Context *rsc, const Sampler *m); } sampler; diff --git a/libs/rs/scriptc/rs_graphics.rsh b/libs/rs/scriptc/rs_graphics.rsh index 2581953..a01bc3d 100644 --- a/libs/rs/scriptc/rs_graphics.rsh +++ b/libs/rs/scriptc/rs_graphics.rsh @@ -22,6 +22,56 @@ */ #ifndef __RS_GRAPHICS_RSH__ #define __RS_GRAPHICS_RSH__ + +// These are API 15 once it get official +typedef enum { + RS_DEPTH_FUNC_ALWAYS, + RS_DEPTH_FUNC_LESS, + RS_DEPTH_FUNC_LEQUAL, + RS_DEPTH_FUNC_GREATER, + RS_DEPTH_FUNC_GEQUAL, + RS_DEPTH_FUNC_EQUAL, + RS_DEPTH_FUNC_NOTEQUAL +} rs_depth_func; + +typedef enum { + RS_BLEND_SRC_ZERO, // 0 + RS_BLEND_SRC_ONE, // 1 + RS_BLEND_SRC_DST_COLOR, // 2 + RS_BLEND_SRC_ONE_MINUS_DST_COLOR, // 3 + RS_BLEND_SRC_SRC_ALPHA, // 4 + RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA, // 5 + RS_BLEND_SRC_DST_ALPHA, // 6 + RS_BLEND_SRC_ONE_MINUS_DST_ALPHA, // 7 + RS_BLEND_SRC_SRC_ALPHA_SATURATE // 8 +} rs_blend_src_func; + +typedef enum { + RS_BLEND_DST_ZERO, // 0 + RS_BLEND_DST_ONE, // 1 + RS_BLEND_DST_SRC_COLOR, // 2 + RS_BLEND_DST_ONE_MINUS_SRC_COLOR, // 3 + RS_BLEND_DST_SRC_ALPHA, // 4 + RS_BLEND_DST_ONE_MINUS_SRC_ALPHA, // 5 + RS_BLEND_DST_DST_ALPHA, // 6 + RS_BLEND_DST_ONE_MINUS_DST_ALPHA // 7 +} rs_blend_dst_func; + +typedef enum { + RS_CULL_BACK, + RS_CULL_FRONT, + RS_CULL_NONE +} rs_cull_mode; + +typedef enum { + RS_SAMPLER_NEAREST, + RS_SAMPLER_LINEAR, + RS_SAMPLER_LINEAR_MIP_LINEAR, + RS_SAMPLER_WRAP, + RS_SAMPLER_CLAMP, + RS_SAMPLER_LINEAR_MIP_NEAREST, +} rs_sampler_value; + #if (defined(RS_VERSION) && (RS_VERSION >= 14)) /** * Set the color target used for all subsequent rendering calls @@ -82,6 +132,88 @@ extern void __attribute__((overloadable)) extern void __attribute__((overloadable)) rsgBindProgramStore(rs_program_store ps); + +/** + * @hide + * Get program store depth function + * + * @param ps + */ +extern rs_depth_func __attribute__((overloadable)) + rsgProgramStoreGetDepthFunc(rs_program_store ps); + +/** + * @hide + * Get program store depth mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetDepthMask(rs_program_store ps); +/** + * @hide + * Get program store red component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskR(rs_program_store ps); + +/** + * @hide + * Get program store green component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskG(rs_program_store ps); + +/** + * @hide + * Get program store blur component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskB(rs_program_store ps); + +/** + * @hide + * Get program store alpha component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskA(rs_program_store ps); + +/** + * @hide + * Get program store blend source function + * + * @param ps + */ +extern rs_blend_src_func __attribute__((overloadable)) + rsgProgramStoreGetBlendSrcFunc(rs_program_store ps); + +/** + * @hide + * Get program store blend destination function + * + * @param ps + */ +extern rs_blend_dst_func __attribute__((overloadable)) + rsgProgramStoreGetBlendDstFunc(rs_program_store ps); + +/** + * @hide + * Get program store dither state + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetDitherEnabled(rs_program_store ps); + + /** * Bind a new ProgramVertex to the rendering context. * @@ -99,6 +231,24 @@ extern void __attribute__((overloadable)) rsgBindProgramRaster(rs_program_raster pr); /** + * @hide + * Get program raster point sprite state + * + * @param pr + */ +extern bool __attribute__((overloadable)) + rsgProgramRasterGetPointSpriteEnabled(rs_program_raster pr); + +/** + * @hide + * Get program raster cull mode + * + * @param pr + */ +extern rs_cull_mode __attribute__((overloadable)) + rsgProgramRasterGetCullMode(rs_program_raster pr); + +/** * Bind a new Sampler object to a ProgramFragment. The sampler will * operate on the texture bound at the matching slot. * @@ -108,6 +258,51 @@ extern void __attribute__((overloadable)) rsgBindSampler(rs_program_fragment, uint slot, rs_sampler); /** + * @hide + * Get sampler minification value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetMinification(rs_sampler s); + +/** + * @hide + * Get sampler magnification value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetMagnification(rs_sampler s); + +/** + * @hide + * Get sampler wrap S value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetWrapS(rs_sampler s); + +/** + * @hide + * Get sampler wrap T value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetWrapT(rs_sampler s); + +/** + * @hide + * Get sampler anisotropy + * + * @param pr + */ +extern float __attribute__((overloadable)) + rsgSamplerGetAnisotropy(rs_sampler s); + +/** * Bind a new Allocation object to a ProgramFragment. The * Allocation must be a valid texture for the Program. The sampling * of the texture will be controled by the Sampler bound at the @@ -288,6 +483,9 @@ extern void __attribute__((overloadable)) extern void __attribute__((overloadable)) rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h); +extern void __attribute__((overloadable)) + rsgDrawPath(rs_path p); + /** * Draw a mesh using the current context state. The whole mesh is * rendered. diff --git a/libs/rs/scriptc/rs_object.rsh b/libs/rs/scriptc/rs_object.rsh index a431219..1fc3f83 100644 --- a/libs/rs/scriptc/rs_object.rsh +++ b/libs/rs/scriptc/rs_object.rsh @@ -56,6 +56,11 @@ extern void __attribute__((overloadable)) * \overload */ extern void __attribute__((overloadable)) + rsSetObject(rs_path *dst, rs_path src); +/** + * \overload + */ +extern void __attribute__((overloadable)) rsSetObject(rs_mesh *dst, rs_mesh src); /** * \overload @@ -114,6 +119,11 @@ extern void __attribute__((overloadable)) * \overload */ extern void __attribute__((overloadable)) + rsClearObject(rs_path *dst); +/** + * \overload + */ +extern void __attribute__((overloadable)) rsClearObject(rs_mesh *dst); /** * \overload @@ -175,6 +185,11 @@ extern bool __attribute__((overloadable)) * \overload */ extern bool __attribute__((overloadable)) + rsIsObject(rs_path); +/** + * \overload + */ +extern bool __attribute__((overloadable)) rsIsObject(rs_mesh); /** * \overload diff --git a/libs/rs/scriptc/rs_types.rsh b/libs/rs/scriptc/rs_types.rsh index 84bca9c..a01807e 100644 --- a/libs/rs/scriptc/rs_types.rsh +++ b/libs/rs/scriptc/rs_types.rsh @@ -138,6 +138,12 @@ typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_sc */ typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_mesh; /** + * \brief Opaque handle to a Renderscript Path object. + * + * See: android.renderscript.Path + */ +typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_path; +/** * \brief Opaque handle to a Renderscript ProgramFragment object. * * See: android.renderscript.ProgramFragment diff --git a/tests/RenderScriptTests/ComputePerf/src/com/example/android/rs/computeperf/mandelbrot.rs b/tests/RenderScriptTests/ComputePerf/src/com/example/android/rs/computeperf/mandelbrot.rs index a7987b3..0ffb0e5 100644 --- a/tests/RenderScriptTests/ComputePerf/src/com/example/android/rs/computeperf/mandelbrot.rs +++ b/tests/RenderScriptTests/ComputePerf/src/com/example/android/rs/computeperf/mandelbrot.rs @@ -25,13 +25,14 @@ void root(uchar4 *v_out, uint32_t x, uint32_t y) { p.y = -1.f + ((float)y / gDimY) * 2.f; float2 t = 0; + float2 t2 = t * t; int iteration = 0; - while((t.x*t.x + t.y*t.y < 4.f) && (iteration < gMaxIteration)) { - float2 t2 = t * t; + while((t2.x + t2.y < 4.f) && (iteration < gMaxIteration)) { float xtemp = t2.x - t2.y + p.x; t.y = 2 * t.x * t.y + p.y; t.x = xtemp; iteration++; + t2 = t * t; } if(iteration >= gMaxIteration) { diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java index 3615f60..7368260 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java @@ -283,6 +283,9 @@ public class ImageProcessingActivity extends Activity mRadius = MAX_RADIUS; mScript.set_radius(mRadius); + mScript.invoke_filter(); + mRS.finish(); + long t = java.lang.System.currentTimeMillis(); mScript.invoke_filter(); diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java index c038478..4466e59 100644 --- a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java @@ -64,6 +64,9 @@ public class RSTestCore { unitTests = new ArrayList<UnitTest>(); + unitTests.add(new UT_sampler(this, mRes, mCtx)); + unitTests.add(new UT_program_store(this, mRes, mCtx)); + unitTests.add(new UT_program_raster(this, mRes, mCtx)); unitTests.add(new UT_primitives(this, mRes, mCtx)); unitTests.add(new UT_vector(this, mRes, mCtx)); unitTests.add(new UT_rsdebug(this, mRes, mCtx)); diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_raster.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_raster.java new file mode 100644 index 0000000..2bfb6b1 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_raster.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.rs.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; +import android.renderscript.ProgramRaster; +import android.renderscript.ProgramRaster.CullMode; + +public class UT_program_raster extends UnitTest { + private Resources mRes; + + ProgramRaster pointSpriteEnabled; + ProgramRaster cullMode; + + protected UT_program_raster(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "ProgramRaster", ctx); + mRes = res; + } + + private ProgramRaster.Builder getDefaultBuilder(RenderScript RS) { + ProgramRaster.Builder b = new ProgramRaster.Builder(RS); + b.setCullMode(CullMode.BACK); + b.setPointSpriteEnabled(false); + return b; + } + + private void initializeGlobals(RenderScript RS, ScriptC_program_raster s) { + ProgramRaster.Builder b = getDefaultBuilder(RS); + pointSpriteEnabled = b.setPointSpriteEnabled(true).create(); + b = getDefaultBuilder(RS); + cullMode = b.setCullMode(CullMode.FRONT).create(); + + s.set_pointSpriteEnabled(pointSpriteEnabled); + s.set_cullMode(cullMode); + } + + private void testScriptSide(RenderScript pRS) { + ScriptC_program_raster s = new ScriptC_program_raster(pRS, mRes, R.raw.program_raster); + pRS.setMessageHandler(mRsMessage); + initializeGlobals(pRS, s); + s.invoke_program_raster_test(); + pRS.finish(); + waitForMessage(); + } + + private void testJavaSide(RenderScript RS) { + _RS_ASSERT("pointSpriteEnabled.getPointSpriteEnabled() == true", + pointSpriteEnabled.getPointSpriteEnabled() == true); + _RS_ASSERT("pointSpriteEnabled.getCullMode() == ProgramRaster.CullMode.BACK", + pointSpriteEnabled.getCullMode() == ProgramRaster.CullMode.BACK); + + _RS_ASSERT("cullMode.getPointSpriteEnabled() == false", + cullMode.getPointSpriteEnabled() == false); + _RS_ASSERT("cullMode.getCullMode() == ProgramRaster.CullMode.FRONT", + cullMode.getCullMode() == ProgramRaster.CullMode.FRONT); + + updateUI(); + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + testScriptSide(pRS); + testJavaSide(pRS); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_store.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_store.java new file mode 100644 index 0000000..72a401d --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_program_store.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.rs.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; +import android.renderscript.ProgramStore.BlendDstFunc; +import android.renderscript.ProgramStore.BlendSrcFunc; +import android.renderscript.ProgramStore.Builder; +import android.renderscript.ProgramStore.DepthFunc; + +public class UT_program_store extends UnitTest { + private Resources mRes; + + ProgramStore ditherEnable; + ProgramStore colorRWriteEnable; + ProgramStore colorGWriteEnable; + ProgramStore colorBWriteEnable; + ProgramStore colorAWriteEnable; + ProgramStore blendSrc; + ProgramStore blendDst; + ProgramStore depthWriteEnable; + ProgramStore depthFunc; + + protected UT_program_store(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "ProgramStore", ctx); + mRes = res; + } + + private ProgramStore.Builder getDefaultBuilder(RenderScript RS) { + ProgramStore.Builder b = new ProgramStore.Builder(RS); + b.setBlendFunc(ProgramStore.BlendSrcFunc.ZERO, ProgramStore.BlendDstFunc.ZERO); + b.setColorMaskEnabled(false, false, false, false); + b.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); + b.setDepthMaskEnabled(false); + b.setDitherEnabled(false); + return b; + } + + private void initializeGlobals(RenderScript RS, ScriptC_program_store s) { + ProgramStore.Builder b = getDefaultBuilder(RS); + ditherEnable = b.setDitherEnabled(true).create(); + + b = getDefaultBuilder(RS); + colorRWriteEnable = b.setColorMaskEnabled(true, false, false, false).create(); + + b = getDefaultBuilder(RS); + colorGWriteEnable = b.setColorMaskEnabled(false, true, false, false).create(); + + b = getDefaultBuilder(RS); + colorBWriteEnable = b.setColorMaskEnabled(false, false, true, false).create(); + + b = getDefaultBuilder(RS); + colorAWriteEnable = b.setColorMaskEnabled(false, false, false, true).create(); + + b = getDefaultBuilder(RS); + blendSrc = b.setBlendFunc(ProgramStore.BlendSrcFunc.DST_COLOR, + ProgramStore.BlendDstFunc.ZERO).create(); + + b = getDefaultBuilder(RS); + blendDst = b.setBlendFunc(ProgramStore.BlendSrcFunc.ZERO, + ProgramStore.BlendDstFunc.DST_ALPHA).create(); + + b = getDefaultBuilder(RS); + depthWriteEnable = b.setDepthMaskEnabled(true).create(); + + b = getDefaultBuilder(RS); + depthFunc = b.setDepthFunc(ProgramStore.DepthFunc.GREATER).create(); + + s.set_ditherEnable(ditherEnable); + s.set_colorRWriteEnable(colorRWriteEnable); + s.set_colorGWriteEnable(colorGWriteEnable); + s.set_colorBWriteEnable(colorBWriteEnable); + s.set_colorAWriteEnable(colorAWriteEnable); + s.set_blendSrc(blendSrc); + s.set_blendDst(blendDst); + s.set_depthWriteEnable(depthWriteEnable); + s.set_depthFunc(depthFunc); + } + + private void testScriptSide(RenderScript pRS) { + ScriptC_program_store s = new ScriptC_program_store(pRS, mRes, R.raw.program_store); + pRS.setMessageHandler(mRsMessage); + initializeGlobals(pRS, s); + s.invoke_program_store_test(); + pRS.finish(); + waitForMessage(); + } + + void checkObject(ProgramStore ps, + boolean depthMask, + DepthFunc df, + BlendSrcFunc bsf, + BlendDstFunc bdf, + boolean R, + boolean G, + boolean B, + boolean A, + boolean dither) { + _RS_ASSERT("ps.getDepthMaskEnabled() == depthMask", ps.getDepthMaskEnabled() == depthMask); + _RS_ASSERT("ps.getDepthFunc() == df", ps.getDepthFunc() == df); + _RS_ASSERT("ps.getBlendSrcFunc() == bsf", ps.getBlendSrcFunc() == bsf); + _RS_ASSERT("ps.getBlendDstFunc() == bdf", ps.getBlendDstFunc() == bdf); + _RS_ASSERT("ps.getColorMaskREnabled() == R", ps.getColorMaskREnabled() == R); + _RS_ASSERT("ps.getColorMaskGEnabled() == G", ps.getColorMaskGEnabled() == G); + _RS_ASSERT("ps.getColorMaskBEnabled() == B", ps.getColorMaskBEnabled() == B); + _RS_ASSERT("ps.getColorMaskAEnabled() == A", ps.getColorMaskAEnabled() == A); + _RS_ASSERT("ps.getDitherEnabled() == dither", ps.getDitherEnabled() == dither); + } + + void varyBuilderColorAndDither(ProgramStore.Builder pb, + boolean depthMask, + DepthFunc df, + BlendSrcFunc bsf, + BlendDstFunc bdf) { + for (int r = 0; r <= 1; r++) { + boolean isR = (r == 1); + for (int g = 0; g <= 1; g++) { + boolean isG = (g == 1); + for (int b = 0; b <= 1; b++) { + boolean isB = (b == 1); + for (int a = 0; a <= 1; a++) { + boolean isA = (a == 1); + for (int dither = 0; dither <= 1; dither++) { + boolean isDither = (dither == 1); + pb.setDitherEnabled(isDither); + pb.setColorMaskEnabled(isR, isG, isB, isA); + ProgramStore ps = pb.create(); + checkObject(ps, depthMask, df, bsf, bdf, isR, isG, isB, isA, isDither); + } + } + } + } + } + } + + public void testJavaSide(RenderScript RS) { + for (int depth = 0; depth <= 1; depth++) { + boolean depthMask = (depth == 1); + for (DepthFunc df : DepthFunc.values()) { + for (BlendSrcFunc bsf : BlendSrcFunc.values()) { + for (BlendDstFunc bdf : BlendDstFunc.values()) { + ProgramStore.Builder b = new ProgramStore.Builder(RS); + b.setDepthFunc(df); + b.setDepthMaskEnabled(depthMask); + b.setBlendFunc(bsf, bdf); + varyBuilderColorAndDither(b, depthMask, df, bsf, bdf); + } + } + } + } + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + testJavaSide(pRS); + testScriptSide(pRS); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_sampler.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_sampler.java new file mode 100644 index 0000000..030b3ff --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_sampler.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.rs.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; +import android.renderscript.Sampler; +import android.renderscript.Sampler.Value; + +public class UT_sampler extends UnitTest { + private Resources mRes; + + Sampler minification; + Sampler magnification; + Sampler wrapS; + Sampler wrapT; + Sampler anisotropy; + + protected UT_sampler(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "Sampler", ctx); + mRes = res; + } + + private Sampler.Builder getDefaultBuilder(RenderScript RS) { + Sampler.Builder b = new Sampler.Builder(RS); + b.setMinification(Value.NEAREST); + b.setMagnification(Value.NEAREST); + b.setWrapS(Value.CLAMP); + b.setWrapT(Value.CLAMP); + b.setAnisotropy(1.0f); + return b; + } + + private void initializeGlobals(RenderScript RS, ScriptC_sampler s) { + Sampler.Builder b = getDefaultBuilder(RS); + b.setMinification(Value.LINEAR_MIP_LINEAR); + minification = b.create(); + + b = getDefaultBuilder(RS); + b.setMagnification(Value.LINEAR); + magnification = b.create(); + + b = getDefaultBuilder(RS); + b.setWrapS(Value.WRAP); + wrapS = b.create(); + + b = getDefaultBuilder(RS); + b.setWrapT(Value.WRAP); + wrapT = b.create(); + + b = getDefaultBuilder(RS); + b.setAnisotropy(8.0f); + anisotropy = b.create(); + + s.set_minification(minification); + s.set_magnification(magnification); + s.set_wrapS(wrapS); + s.set_wrapT(wrapT); + s.set_anisotropy(anisotropy); + } + + private void testScriptSide(RenderScript pRS) { + ScriptC_sampler s = new ScriptC_sampler(pRS, mRes, R.raw.sampler); + pRS.setMessageHandler(mRsMessage); + initializeGlobals(pRS, s); + s.invoke_sampler_test(); + pRS.finish(); + waitForMessage(); + } + + private void testJavaSide(RenderScript RS) { + _RS_ASSERT("minification.getMagnification() == Sampler.Value.NEAREST", + minification.getMagnification() == Sampler.Value.NEAREST); + _RS_ASSERT("minification.getMinification() == Sampler.Value.LINEAR_MIP_LINEAR", + minification.getMinification() == Sampler.Value.LINEAR_MIP_LINEAR); + _RS_ASSERT("minification.getWrapS() == Sampler.Value.CLAMP", + minification.getWrapS() == Sampler.Value.CLAMP); + _RS_ASSERT("minification.getWrapT() == Sampler.Value.CLAMP", + minification.getWrapT() == Sampler.Value.CLAMP); + _RS_ASSERT("minification.getAnisotropy() == 1.0f", + minification.getAnisotropy() == 1.0f); + + _RS_ASSERT("magnification.getMagnification() == Sampler.Value.LINEAR", + magnification.getMagnification() == Sampler.Value.LINEAR); + _RS_ASSERT("magnification.getMinification() == Sampler.Value.NEAREST", + magnification.getMinification() == Sampler.Value.NEAREST); + _RS_ASSERT("magnification.getWrapS() == Sampler.Value.CLAMP", + magnification.getWrapS() == Sampler.Value.CLAMP); + _RS_ASSERT("magnification.getWrapT() == Sampler.Value.CLAMP", + magnification.getWrapT() == Sampler.Value.CLAMP); + _RS_ASSERT("magnification.getAnisotropy() == 1.0f", + magnification.getAnisotropy() == 1.0f); + + _RS_ASSERT("wrapS.getMagnification() == Sampler.Value.NEAREST", + wrapS.getMagnification() == Sampler.Value.NEAREST); + _RS_ASSERT("wrapS.getMinification() == Sampler.Value.NEAREST", + wrapS.getMinification() == Sampler.Value.NEAREST); + _RS_ASSERT("wrapS.getWrapS() == Sampler.Value.WRAP", + wrapS.getWrapS() == Sampler.Value.WRAP); + _RS_ASSERT("wrapS.getWrapT() == Sampler.Value.CLAMP", + wrapS.getWrapT() == Sampler.Value.CLAMP); + _RS_ASSERT("wrapS.getAnisotropy() == 1.0f", + wrapS.getAnisotropy() == 1.0f); + + _RS_ASSERT("wrapT.getMagnification() == Sampler.Value.NEAREST", + wrapT.getMagnification() == Sampler.Value.NEAREST); + _RS_ASSERT("wrapT.getMinification() == Sampler.Value.NEAREST", + wrapT.getMinification() == Sampler.Value.NEAREST); + _RS_ASSERT("wrapT.getWrapS() == Sampler.Value.CLAMP", + wrapT.getWrapS() == Sampler.Value.CLAMP); + _RS_ASSERT("wrapT.getWrapT() == Sampler.Value.WRAP", + wrapT.getWrapT() == Sampler.Value.WRAP); + _RS_ASSERT("wrapT.getAnisotropy() == 1.0f", + wrapT.getAnisotropy() == 1.0f); + + _RS_ASSERT("anisotropy.getMagnification() == Sampler.Value.NEAREST", + anisotropy.getMagnification() == Sampler.Value.NEAREST); + _RS_ASSERT("anisotropy.getMinification() == Sampler.Value.NEAREST", + anisotropy.getMinification() == Sampler.Value.NEAREST); + _RS_ASSERT("anisotropy.getWrapS() == Sampler.Value.CLAMP", + anisotropy.getWrapS() == Sampler.Value.CLAMP); + _RS_ASSERT("anisotropy.getWrapT() == Sampler.Value.CLAMP", + anisotropy.getWrapT() == Sampler.Value.CLAMP); + _RS_ASSERT("anisotropy.getAnisotropy() == 1.0f", + anisotropy.getAnisotropy() == 8.0f); + + updateUI(); + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + testScriptSide(pRS); + testJavaSide(pRS); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/program_raster.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/program_raster.rs new file mode 100644 index 0000000..11b8c30 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/program_raster.rs @@ -0,0 +1,37 @@ +#include "shared.rsh" +#include "rs_graphics.rsh" + +rs_program_raster pointSpriteEnabled; +rs_program_raster cullMode; + +static bool test_program_raster_getters() { + bool failed = false; + + _RS_ASSERT(rsgProgramRasterGetPointSpriteEnabled(pointSpriteEnabled) == true); + _RS_ASSERT(rsgProgramRasterGetCullMode(pointSpriteEnabled) == RS_CULL_BACK); + + _RS_ASSERT(rsgProgramRasterGetPointSpriteEnabled(cullMode) == false); + _RS_ASSERT(rsgProgramRasterGetCullMode(cullMode) == RS_CULL_FRONT); + + if (failed) { + rsDebug("test_program_raster_getters FAILED", 0); + } + else { + rsDebug("test_program_raster_getters PASSED", 0); + } + + return failed; +} + +void program_raster_test() { + bool failed = false; + failed |= test_program_raster_getters(); + + if (failed) { + rsSendToClientBlocking(RS_MSG_TEST_FAILED); + } + else { + rsSendToClientBlocking(RS_MSG_TEST_PASSED); + } +} + diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/program_store.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/program_store.rs new file mode 100644 index 0000000..3cd8a20 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/program_store.rs @@ -0,0 +1,128 @@ +#include "shared.rsh" +#include "rs_graphics.rsh" + +rs_program_store ditherEnable; +rs_program_store colorRWriteEnable; +rs_program_store colorGWriteEnable; +rs_program_store colorBWriteEnable; +rs_program_store colorAWriteEnable; +rs_program_store blendSrc; +rs_program_store blendDst; +rs_program_store depthWriteEnable; +rs_program_store depthFunc; + +static bool test_program_store_getters() { + bool failed = false; + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(depthFunc) == RS_DEPTH_FUNC_GREATER); + _RS_ASSERT(rsgProgramStoreGetDepthMask(depthFunc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(depthFunc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(depthFunc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(depthFunc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(depthFunc) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(depthFunc) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(depthFunc) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(depthFunc) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(depthWriteEnable) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(depthWriteEnable) == true); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(depthWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(depthWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(depthWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(depthWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(depthWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(depthWriteEnable) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(depthWriteEnable) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(colorRWriteEnable) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(colorRWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(colorRWriteEnable) == true); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(colorRWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(colorRWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(colorRWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(colorRWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(colorRWriteEnable) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(colorRWriteEnable) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(colorGWriteEnable) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(colorGWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(colorGWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(colorGWriteEnable) == true); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(colorGWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(colorGWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(colorGWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(colorGWriteEnable) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(colorGWriteEnable) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(colorBWriteEnable) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(colorBWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(colorBWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(colorBWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(colorBWriteEnable) == true); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(colorBWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(colorBWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(colorBWriteEnable) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(colorBWriteEnable) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(colorAWriteEnable) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(colorAWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(colorAWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(colorAWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(colorAWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(colorAWriteEnable) == true); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(colorAWriteEnable) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(colorAWriteEnable) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(colorAWriteEnable) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(ditherEnable) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(ditherEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(ditherEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(ditherEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(ditherEnable) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(ditherEnable) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(ditherEnable) == true); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(ditherEnable) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(ditherEnable) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(blendSrc) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(blendSrc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(blendSrc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(blendSrc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(blendSrc) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(blendSrc) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(blendSrc) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(blendSrc) == RS_BLEND_SRC_DST_COLOR); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(blendSrc) == RS_BLEND_DST_ZERO); + + _RS_ASSERT(rsgProgramStoreGetDepthFunc(blendDst) == RS_DEPTH_FUNC_ALWAYS); + _RS_ASSERT(rsgProgramStoreGetDepthMask(blendDst) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskR(blendDst) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskG(blendDst) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskB(blendDst) == false); + _RS_ASSERT(rsgProgramStoreGetColorMaskA(blendDst) == false); + _RS_ASSERT(rsgProgramStoreGetDitherEnabled(blendDst) == false); + _RS_ASSERT(rsgProgramStoreGetBlendSrcFunc(blendDst) == RS_BLEND_SRC_ZERO); + _RS_ASSERT(rsgProgramStoreGetBlendDstFunc(blendDst) == RS_BLEND_DST_DST_ALPHA); + + if (failed) { + rsDebug("test_program_store_getters FAILED", 0); + } + else { + rsDebug("test_program_store_getters PASSED", 0); + } + + return failed; +} + +void program_store_test() { + bool failed = false; + failed |= test_program_store_getters(); + + if (failed) { + rsSendToClientBlocking(RS_MSG_TEST_FAILED); + } + else { + rsSendToClientBlocking(RS_MSG_TEST_PASSED); + } +} + diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/sampler.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/sampler.rs new file mode 100644 index 0000000..ac9a549 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/sampler.rs @@ -0,0 +1,63 @@ +#include "shared.rsh" +#include "rs_graphics.rsh" +rs_sampler minification; +rs_sampler magnification; +rs_sampler wrapS; +rs_sampler wrapT; +rs_sampler anisotropy; + +static bool test_sampler_getters() { + bool failed = false; + + _RS_ASSERT(rsgSamplerGetMagnification(minification) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetMinification(minification) == RS_SAMPLER_LINEAR_MIP_LINEAR); + _RS_ASSERT(rsgSamplerGetWrapS(minification) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetWrapT(minification) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetAnisotropy(minification) == 1.0f); + + _RS_ASSERT(rsgSamplerGetMagnification(magnification) == RS_SAMPLER_LINEAR); + _RS_ASSERT(rsgSamplerGetMinification(magnification) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetWrapS(magnification) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetWrapT(magnification) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetAnisotropy(magnification) == 1.0f); + + _RS_ASSERT(rsgSamplerGetMagnification(wrapS) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetMinification(wrapS) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetWrapS(wrapS) == RS_SAMPLER_WRAP); + _RS_ASSERT(rsgSamplerGetWrapT(wrapS) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetAnisotropy(wrapS) == 1.0f); + + _RS_ASSERT(rsgSamplerGetMagnification(wrapT) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetMinification(wrapT) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetWrapS(wrapT) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetWrapT(wrapT) == RS_SAMPLER_WRAP); + _RS_ASSERT(rsgSamplerGetAnisotropy(wrapT) == 1.0f); + + _RS_ASSERT(rsgSamplerGetMagnification(anisotropy) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetMinification(anisotropy) == RS_SAMPLER_NEAREST); + _RS_ASSERT(rsgSamplerGetWrapS(anisotropy) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetWrapT(anisotropy) == RS_SAMPLER_CLAMP); + _RS_ASSERT(rsgSamplerGetAnisotropy(anisotropy) == 8.0f); + + if (failed) { + rsDebug("test_sampler_getters FAILED", 0); + } + else { + rsDebug("test_sampler_getters PASSED", 0); + } + + return failed; +} + +void sampler_test() { + bool failed = false; + failed |= test_sampler_getters(); + + if (failed) { + rsSendToClientBlocking(RS_MSG_TEST_FAILED); + } + else { + rsSendToClientBlocking(RS_MSG_TEST_PASSED); + } +} + |
