diff options
author | Alex Sakhartchouk <alexst@google.com> | 2012-03-28 15:08:56 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-03-28 15:08:56 -0700 |
commit | 972ed5809c518ecaaca58723e85282e58c12758c (patch) | |
tree | e6aeb30c8f0e14ccaa8a56fec5a088040c1a3bf6 /libs | |
parent | c8947b3d795f9539d248edf95652974f49142b78 (diff) | |
parent | b43a1e5ddf274eb5e01dc8e450bd15b640bebe9f (diff) | |
download | frameworks_base-972ed5809c518ecaaca58723e85282e58c12758c.zip frameworks_base-972ed5809c518ecaaca58723e85282e58c12758c.tar.gz frameworks_base-972ed5809c518ecaaca58723e85282e58c12758c.tar.bz2 |
Merge "Moving libRS"
Diffstat (limited to 'libs')
149 files changed, 0 insertions, 27316 deletions
diff --git a/libs/rs/Allocation.cpp b/libs/rs/Allocation.cpp deleted file mode 100644 index e37d5de..0000000 --- a/libs/rs/Allocation.cpp +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> -#include <malloc.h> - -#include "RenderScript.h" -#include "Element.h" -#include "Type.h" -#include "Allocation.h" - - -void * Allocation::getIDSafe() const { - //if (mAdaptedAllocation != NULL) { - //return mAdaptedAllocation.getID(); - //} - return getID(); -} - -void Allocation::updateCacheInfo(const Type *t) { - mCurrentDimX = t->getX(); - mCurrentDimY = t->getY(); - mCurrentDimZ = t->getZ(); - mCurrentCount = mCurrentDimX; - if (mCurrentDimY > 1) { - mCurrentCount *= mCurrentDimY; - } - if (mCurrentDimZ > 1) { - mCurrentCount *= mCurrentDimZ; - } -} - -Allocation::Allocation(void *id, RenderScript *rs, const Type *t, uint32_t usage) : BaseObj(id, rs) { - if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT | - RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE | - RS_ALLOCATION_USAGE_GRAPHICS_VERTEX | - RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS | - RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET | - RS_ALLOCATION_USAGE_IO_INPUT | - RS_ALLOCATION_USAGE_IO_OUTPUT)) != 0) { - ALOGE("Unknown usage specified."); - } - - if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) { - mWriteAllowed = false; - if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT | - RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE | - RS_ALLOCATION_USAGE_SCRIPT)) != 0) { - ALOGE("Invalid usage combination."); - } - } - - mType = t; - mUsage = usage; - - if (t != NULL) { - updateCacheInfo(t); - } -} - -void Allocation::validateIsInt32() { - RsDataType dt = mType->getElement()->getDataType(); - if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) { - return; - } - ALOGE("32 bit integer source does not match allocation type %i", dt); -} - -void Allocation::validateIsInt16() { - RsDataType dt = mType->getElement()->getDataType(); - if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) { - return; - } - ALOGE("16 bit integer source does not match allocation type %i", dt); -} - -void Allocation::validateIsInt8() { - RsDataType dt = mType->getElement()->getDataType(); - if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) { - return; - } - ALOGE("8 bit integer source does not match allocation type %i", dt); -} - -void Allocation::validateIsFloat32() { - RsDataType dt = mType->getElement()->getDataType(); - if (dt == RS_TYPE_FLOAT_32) { - return; - } - ALOGE("32 bit float source does not match allocation type %i", dt); -} - -void Allocation::validateIsObject() { - RsDataType dt = mType->getElement()->getDataType(); - if ((dt == RS_TYPE_ELEMENT) || - (dt == RS_TYPE_TYPE) || - (dt == RS_TYPE_ALLOCATION) || - (dt == RS_TYPE_SAMPLER) || - (dt == RS_TYPE_SCRIPT) || - (dt == RS_TYPE_MESH) || - (dt == RS_TYPE_PROGRAM_FRAGMENT) || - (dt == RS_TYPE_PROGRAM_VERTEX) || - (dt == RS_TYPE_PROGRAM_RASTER) || - (dt == RS_TYPE_PROGRAM_STORE)) { - return; - } - ALOGE("Object source does not match allocation type %i", dt); -} - -void Allocation::updateFromNative() { - BaseObj::updateFromNative(); - - const void *typeID = rsaAllocationGetType(mRS->mContext, getID()); - if(typeID != NULL) { - const Type *old = mType; - Type *t = new Type((void *)typeID, mRS); - t->updateFromNative(); - updateCacheInfo(t); - mType = t; - delete old; - } -} - -void Allocation::syncAll(RsAllocationUsageType srcLocation) { - switch (srcLocation) { - case RS_ALLOCATION_USAGE_SCRIPT: - case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS: - case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE: - case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX: - break; - default: - ALOGE("Source must be exactly one usage type."); - } - rsAllocationSyncAll(mRS->mContext, getIDSafe(), srcLocation); -} - -void Allocation::ioSendOutput() { - if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) { - ALOGE("Can only send buffer if IO_OUTPUT usage specified."); - } - rsAllocationIoSend(mRS->mContext, getID()); -} - -void Allocation::ioGetInput() { - if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) { - ALOGE("Can only send buffer if IO_OUTPUT usage specified."); - } - rsAllocationIoReceive(mRS->mContext, getID()); -} - -/* -void copyFrom(BaseObj[] d) { - mRS.validate(); - validateIsObject(); - if (d.length != mCurrentCount) { - ALOGE("Array size mismatch, allocation sizeX = " + - mCurrentCount + ", array length = " + d.length); - } - int i[] = new int[d.length]; - for (int ct=0; ct < d.length; ct++) { - i[ct] = d[ct].getID(); - } - copy1DRangeFromUnchecked(0, mCurrentCount, i); -} -*/ - - -/* -void Allocation::setFromFieldPacker(int xoff, FieldPacker fp) { - mRS.validate(); - int eSize = mType.mElement.getSizeBytes(); - final byte[] data = fp.getData(); - - int count = data.length / eSize; - if ((eSize * count) != data.length) { - ALOGE("Field packer length " + data.length + - " not divisible by element size " + eSize + "."); - } - copy1DRangeFromUnchecked(xoff, count, data); -} - -void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) { - mRS.validate(); - if (component_number >= mType.mElement.mElements.length) { - ALOGE("Component_number " + component_number + " out of range."); - } - if(xoff < 0) { - ALOGE("Offset must be >= 0."); - } - - final byte[] data = fp.getData(); - int eSize = mType.mElement.mElements[component_number].getSizeBytes(); - eSize *= mType.mElement.mArraySizes[component_number]; - - if (data.length != eSize) { - ALOGE("Field packer sizelength " + data.length + - " does not match component size " + eSize + "."); - } - - mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD, - component_number, data, data.length); -} -*/ - -void Allocation::generateMipmaps() { - rsAllocationGenerateMipmaps(mRS->mContext, getID()); -} - -void Allocation::copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, size_t dataLen) { - if(count < 1) { - ALOGE("Count must be >= 1."); - return; - } - if((off + count) > mCurrentCount) { - ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off); - return; - } - if((count * mType->getElement()->getSizeBytes()) > dataLen) { - ALOGE("Array too small for allocation type."); - return; - } - - rsAllocation1DData(mRS->mContext, getIDSafe(), off, mSelectedLOD, count, data, dataLen); -} - -void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int32_t *d, size_t dataLen) { - validateIsInt32(); - copy1DRangeFromUnchecked(off, count, d, dataLen); -} - -void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int16_t *d, size_t dataLen) { - validateIsInt16(); - copy1DRangeFromUnchecked(off, count, d, dataLen); -} - -void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int8_t *d, size_t dataLen) { - validateIsInt8(); - copy1DRangeFromUnchecked(off, count, d, dataLen); -} - -void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const float *d, size_t dataLen) { - validateIsFloat32(); - copy1DRangeFromUnchecked(off, count, d, dataLen); -} - -void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff) { - rsAllocationCopy2DRange(mRS->mContext, getIDSafe(), off, 0, - mSelectedLOD, mSelectedFace, - count, 1, data->getIDSafe(), dataOff, 0, - data->mSelectedLOD, data->mSelectedFace); -} - -void Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) { - if (mAdaptedAllocation != NULL) { - - } else { - if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) { - ALOGE("Updated region larger than allocation."); - } - } -} - -void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int8_t *data, size_t dataLen) { - validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, - w, h, data, dataLen); -} - -void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int16_t *data, size_t dataLen) { - validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, - w, h, data, dataLen); -} - -void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int32_t *data, size_t dataLen) { - validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, - w, h, data, dataLen); -} - -void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const float *data, size_t dataLen) { - validate2DRange(xoff, yoff, w, h); - rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, - w, h, data, dataLen); -} - -void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const Allocation *data, size_t dataLen, - uint32_t dataXoff, uint32_t dataYoff) { - validate2DRange(xoff, yoff, w, h); - rsAllocationCopy2DRange(mRS->mContext, getIDSafe(), xoff, yoff, - mSelectedLOD, mSelectedFace, - w, h, data->getIDSafe(), dataXoff, dataYoff, - data->mSelectedLOD, data->mSelectedFace); -} - -/* -void copyTo(byte[] d) { - validateIsInt8(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - -void copyTo(short[] d) { - validateIsInt16(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - -void copyTo(int[] d) { - validateIsInt32(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - -void copyTo(float[] d) { - validateIsFloat32(); - mRS.validate(); - mRS.nAllocationRead(getID(), d); -} - -void resize(int dimX) { - if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) { - throw new RSInvalidStateException("Resize only support for 1D allocations at this time."); - } - mRS.nAllocationResize1D(getID(), dimX); - mRS.finish(); // Necessary because resize is fifoed and update is async. - - int typeID = mRS.nAllocationGetType(getID()); - mType = new Type(typeID, mRS); - mType.updateFromNative(); - updateCacheInfo(mType); -} - -void resize(int dimX, int dimY) { - if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) { - throw new RSInvalidStateException( - "Resize only support for 2D allocations at this time."); - } - if (mType.getY() == 0) { - throw new RSInvalidStateException( - "Resize only support for 2D allocations at this time."); - } - mRS.nAllocationResize2D(getID(), dimX, dimY); - mRS.finish(); // Necessary because resize is fifoed and update is async. - - int typeID = mRS.nAllocationGetType(getID()); - mType = new Type(typeID, mRS); - mType.updateFromNative(); - updateCacheInfo(mType); -} -*/ - - -Allocation *Allocation::createTyped(RenderScript *rs, const Type *type, - RsAllocationMipmapControl mips, uint32_t usage) { - void *id = rsAllocationCreateTyped(rs->mContext, type->getID(), mips, usage, 0); - if (id == 0) { - ALOGE("Allocation creation failed."); - return NULL; - } - return new Allocation(id, rs, type, usage); -} - -Allocation *Allocation::createTyped(RenderScript *rs, const Type *type, - RsAllocationMipmapControl mips, uint32_t usage, void *pointer) { - void *id = rsAllocationCreateTyped(rs->mContext, type->getID(), mips, usage, (uint32_t)pointer); - if (id == 0) { - ALOGE("Allocation creation failed."); - } - return new Allocation(id, rs, type, usage); -} - -Allocation *Allocation::createTyped(RenderScript *rs, const Type *type, uint32_t usage) { - return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage); -} - -Allocation *Allocation::createSized(RenderScript *rs, const Element *e, size_t count, uint32_t usage) { - Type::Builder b(rs, e); - b.setX(count); - const Type *t = b.create(); - - void *id = rsAllocationCreateTyped(rs->mContext, t->getID(), RS_ALLOCATION_MIPMAP_NONE, usage, 0); - if (id == 0) { - ALOGE("Allocation creation failed."); - } - return new Allocation(id, rs, t, usage); -} - - -/* -SurfaceTexture getSurfaceTexture() { - if ((mUsage & USAGE_GRAPHICS_SURFACE_TEXTURE_INPUT_OPAQUE) == 0) { - throw new RSInvalidStateException("Allocation is not a surface texture."); - } - - int id = mRS.nAllocationGetSurfaceTextureID(getID()); - return new SurfaceTexture(id); - -} - -void setSurfaceTexture(SurfaceTexture sur) { - if ((mUsage & USAGE_IO_OUTPUT) == 0) { - throw new RSInvalidStateException("Allocation is not USAGE_IO_OUTPUT."); - } - - mRS.validate(); - mRS.nAllocationSetSurfaceTexture(getID(), sur); -} - - -static Allocation createFromBitmapResource(RenderScript rs, - Resources res, - int id, - MipmapControl mips, - int usage) { - - rs.validate(); - Bitmap b = BitmapFactory.decodeResource(res, id); - Allocation alloc = createFromBitmap(rs, b, mips, usage); - b.recycle(); - return alloc; -} - -static Allocation createFromBitmapResource(RenderScript rs, - Resources res, - int id) { - return createFromBitmapResource(rs, res, id, - MipmapControl.MIPMAP_NONE, - USAGE_GRAPHICS_TEXTURE); -} - -static Allocation createFromString(RenderScript rs, - String str, - int usage) { - rs.validate(); - byte[] allocArray = NULL; - try { - allocArray = str.getBytes("UTF-8"); - Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage); - alloc.copyFrom(allocArray); - return alloc; - } - catch (Exception e) { - throw new RSRuntimeException("Could not convert string to utf-8."); - } -} -*/ - diff --git a/libs/rs/Allocation.h b/libs/rs/Allocation.h deleted file mode 100644 index c9e00a4..0000000 --- a/libs/rs/Allocation.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_ALLOCATION_H__ -#define __ANDROID_ALLOCATION_H__ - -#include <pthread.h> -#include <rs.h> - -#include "RenderScript.h" -#include "Type.h" -#include "Element.h" - -class Allocation : public BaseObj { -protected: - const Type *mType; - uint32_t mUsage; - Allocation *mAdaptedAllocation; - - bool mConstrainedLOD; - bool mConstrainedFace; - bool mConstrainedY; - bool mConstrainedZ; - bool mReadAllowed; - bool mWriteAllowed; - uint32_t mSelectedY; - uint32_t mSelectedZ; - uint32_t mSelectedLOD; - RsAllocationCubemapFace mSelectedFace; - - uint32_t mCurrentDimX; - uint32_t mCurrentDimY; - uint32_t mCurrentDimZ; - uint32_t mCurrentCount; - - - void * getIDSafe() const; - void updateCacheInfo(const Type *t); - - Allocation(void *id, RenderScript *rs, const Type *t, uint32_t usage); - - void validateIsInt32(); - void validateIsInt16(); - void validateIsInt8(); - void validateIsFloat32(); - void validateIsObject(); - - virtual void updateFromNative(); - - void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h); - -public: - const Type * getType() { - return mType; - } - - void syncAll(RsAllocationUsageType srcLocation); - void ioSendOutput(); - void ioGetInput(); - - //void copyFrom(BaseObj[] d); - //void copyFromUnchecked(int[] d); - //void copyFromUnchecked(short[] d); - //void copyFromUnchecked(byte[] d); - //void copyFromUnchecked(float[] d); - //void copyFrom(int[] d); - //void copyFrom(short[] d); - //void copyFrom(byte[] d); - //void copyFrom(float[] d); - //void setFromFieldPacker(int xoff, FieldPacker fp); - //void setFromFieldPacker(int xoff, int component_number, FieldPacker fp); - void generateMipmaps(); - void copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const int32_t* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const int16_t* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const int8_t* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const float* d, size_t dataLen); - void copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff); - - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int32_t *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int16_t *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const int8_t *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const float *data, size_t dataLen); - void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, - const Allocation *data, size_t dataLen, - uint32_t dataXoff, uint32_t dataYoff); - - //void copyTo(byte[] d); - //void copyTo(short[] d); - //void copyTo(int[] d); - //void copyTo(float[] d); - void resize(int dimX); - void resize(int dimX, int dimY); - - static Allocation *createTyped(RenderScript *rs, const Type *type, - RsAllocationMipmapControl mips, uint32_t usage); - static Allocation *createTyped(RenderScript *rs, const Type *type, - RsAllocationMipmapControl mips, uint32_t usage, void * pointer); - - static Allocation *createTyped(RenderScript *rs, const Type *type, - uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); - static Allocation *createSized(RenderScript *rs, const Element *e, size_t count, - uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); - //SurfaceTexture *getSurfaceTexture(); - //void setSurfaceTexture(SurfaceTexture *sur); - -}; - -#endif diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk deleted file mode 100644 index f92741c..0000000 --- a/libs/rs/Android.mk +++ /dev/null @@ -1,238 +0,0 @@ - -LOCAL_PATH:=$(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := libRSDriver - -LOCAL_SRC_FILES:= \ - driver/rsdAllocation.cpp \ - driver/rsdBcc.cpp \ - driver/rsdCore.cpp \ - driver/rsdFrameBuffer.cpp \ - driver/rsdFrameBufferObj.cpp \ - driver/rsdGL.cpp \ - driver/rsdMesh.cpp \ - driver/rsdMeshObj.cpp \ - driver/rsdPath.cpp \ - driver/rsdProgram.cpp \ - driver/rsdProgramRaster.cpp \ - driver/rsdProgramStore.cpp \ - driver/rsdRuntimeMath.cpp \ - driver/rsdRuntimeStubs.cpp \ - driver/rsdSampler.cpp \ - driver/rsdShader.cpp \ - driver/rsdShaderCache.cpp \ - driver/rsdVertexArray.cpp - -LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2 -LOCAL_SHARED_LIBRARIES += libbcc libbcinfo libgui - -LOCAL_C_INCLUDES += external/zlib dalvik -LOCAL_C_INCLUDES += frameworks/compile/libbcc/include - -LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-unused-variable - -LOCAL_LDLIBS := -lpthread -ldl -LOCAL_MODULE_TAGS := optional - -include $(BUILD_STATIC_LIBRARY) - -# Build rsg-generator ==================== -include $(CLEAR_VARS) - -LOCAL_MODULE := rsg-generator - -# These symbols are normally defined by BUILD_XXX, but we need to define them -# here so that local-intermediates-dir works. - -LOCAL_IS_HOST_MODULE := true -LOCAL_MODULE_CLASS := EXECUTABLES -intermediates := $(local-intermediates-dir) - -LOCAL_SRC_FILES:= \ - spec.l \ - rsg_generator.c - -include $(BUILD_HOST_EXECUTABLE) - -# TODO: This should go into build/core/config.mk -RSG_GENERATOR:=$(LOCAL_BUILT_MODULE) - -include $(CLEAR_VARS) -LOCAL_MODULE := libRS - -LOCAL_MODULE_CLASS := SHARED_LIBRARIES -intermediates:= $(local-intermediates-dir) - -# Generate custom headers - -GEN := $(addprefix $(intermediates)/, \ - rsgApiStructs.h \ - rsgApiFuncDecl.h \ - ) - -$(GEN) : PRIVATE_PATH := $(LOCAL_PATH) -$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec -$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec -$(GEN): $(intermediates)/%.h : $(LOCAL_PATH)/%.h.rsg - $(transform-generated-source) - -# used in jni/Android.mk -rs_generated_source += $(GEN) -LOCAL_GENERATED_SOURCES += $(GEN) - -# Generate custom source files - -GEN := $(addprefix $(intermediates)/, \ - rsgApi.cpp \ - rsgApiReplay.cpp \ - ) - -$(GEN) : PRIVATE_PATH := $(LOCAL_PATH) -$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec -$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec -$(GEN): $(intermediates)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg - $(transform-generated-source) - -# used in jni/Android.mk -rs_generated_source += $(GEN) - -LOCAL_GENERATED_SOURCES += $(GEN) - -LOCAL_SRC_FILES:= \ - rsAdapter.cpp \ - rsAllocation.cpp \ - rsAnimation.cpp \ - rsComponent.cpp \ - rsContext.cpp \ - rsDevice.cpp \ - rsElement.cpp \ - rsFBOCache.cpp \ - rsFifoSocket.cpp \ - rsFileA3D.cpp \ - rsFont.cpp \ - rsObjectBase.cpp \ - rsMatrix2x2.cpp \ - rsMatrix3x3.cpp \ - rsMatrix4x4.cpp \ - rsMesh.cpp \ - rsMutex.cpp \ - rsPath.cpp \ - rsProgram.cpp \ - rsProgramFragment.cpp \ - rsProgramStore.cpp \ - rsProgramRaster.cpp \ - rsProgramVertex.cpp \ - rsSampler.cpp \ - rsScript.cpp \ - rsScriptC.cpp \ - rsScriptC_Lib.cpp \ - rsScriptC_LibGL.cpp \ - rsSignal.cpp \ - rsStream.cpp \ - rsThreadIO.cpp \ - rsType.cpp \ - RenderScript.cpp \ - BaseObj.cpp \ - Element.cpp \ - Type.cpp \ - Allocation.cpp \ - Script.cpp \ - ScriptC.cpp - -LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2 libbcc -LOCAL_SHARED_LIBRARIES += libui libbcinfo libgui - -LOCAL_STATIC_LIBRARIES := libdex libft2 libRSDriver - -LOCAL_C_INCLUDES += external/freetype/include external/zlib dalvik -LOCAL_C_INCLUDES += frameworks/compile/libbcc/include - -LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-unused-variable - -LOCAL_LDLIBS := -lpthread -ldl -LOCAL_MODULE:= libRS -LOCAL_MODULE_TAGS := optional - -include $(BUILD_SHARED_LIBRARY) - -# Now build a host version for serialization -include $(CLEAR_VARS) -LOCAL_MODULE:= libRS -LOCAL_MODULE_TAGS := optional - -intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,HOST,) - -# Generate custom headers - -GEN := $(addprefix $(intermediates)/, \ - rsgApiStructs.h \ - rsgApiFuncDecl.h \ - ) - -$(GEN) : PRIVATE_PATH := $(LOCAL_PATH) -$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec -$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec -$(GEN): $(intermediates)/%.h : $(LOCAL_PATH)/%.h.rsg - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES += $(GEN) - -# Generate custom source files - -GEN := $(addprefix $(intermediates)/, \ - rsgApi.cpp \ - rsgApiReplay.cpp \ - ) - -$(GEN) : PRIVATE_PATH := $(LOCAL_PATH) -$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec -$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec -$(GEN): $(intermediates)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES += $(GEN) - -LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-unused-variable -LOCAL_CFLAGS += -DANDROID_RS_SERIALIZE -LOCAL_CFLAGS += -fPIC - -LOCAL_SRC_FILES:= \ - rsAdapter.cpp \ - rsAllocation.cpp \ - rsAnimation.cpp \ - rsComponent.cpp \ - rsContext.cpp \ - rsDevice.cpp \ - rsElement.cpp \ - rsFBOCache.cpp \ - rsFifoSocket.cpp \ - rsFileA3D.cpp \ - rsFont.cpp \ - rsObjectBase.cpp \ - rsMatrix2x2.cpp \ - rsMatrix3x3.cpp \ - rsMatrix4x4.cpp \ - rsMesh.cpp \ - rsMutex.cpp \ - rsPath.cpp \ - rsProgram.cpp \ - rsProgramFragment.cpp \ - rsProgramStore.cpp \ - rsProgramRaster.cpp \ - rsProgramVertex.cpp \ - rsSampler.cpp \ - rsScript.cpp \ - rsScriptC.cpp \ - rsScriptC_Lib.cpp \ - rsScriptC_LibGL.cpp \ - rsSignal.cpp \ - rsStream.cpp \ - rsThreadIO.cpp \ - rsType.cpp - -LOCAL_STATIC_LIBRARIES := libcutils libutils - -LOCAL_LDLIBS := -lpthread - -include $(BUILD_HOST_STATIC_LIBRARY) diff --git a/libs/rs/BaseObj.cpp b/libs/rs/BaseObj.cpp deleted file mode 100644 index 82e51e7..0000000 --- a/libs/rs/BaseObj.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2008-2012 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. - */ - -#define LOG_TAG "libRS_cpp" - -#include <rs.h> - -#include "RenderScript.h" -#include "BaseObj.h" - -void * BaseObj::getID() const { - if (mID == NULL) { - ALOGE("Internal error: Object id 0."); - } - return mID; -} - -void * BaseObj::getObjID(const BaseObj *o) { - return o == NULL ? NULL : o->getID(); -} - - -BaseObj::BaseObj(void *id, RenderScript *rs) { - mRS = rs; - mID = id; -} - -void BaseObj::checkValid() { - if (mID == 0) { - ALOGE("Invalid object."); - } -} - -BaseObj::~BaseObj() { - rsObjDestroy(mRS->mContext, mID); - mRS = NULL; - mID = NULL; -} - -void BaseObj::updateFromNative() { - const char *name = NULL; - rsaGetName(mRS, mID, &name); - mName = name; -} - -bool BaseObj::equals(const BaseObj *obj) { - // Early-out check to see if both BaseObjs are actually the same - if (this == obj) - return true; - return mID == obj->mID; -} - - - diff --git a/libs/rs/BaseObj.h b/libs/rs/BaseObj.h deleted file mode 100644 index 79761b1..0000000 --- a/libs/rs/BaseObj.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_BASE_OBJ_H__ -#define __ANDROID_BASE_OBJ_H__ - - -#include <pthread.h> -#include <rs.h> - -#include "RenderScript.h" - -class BaseObj { -protected: - friend class Element; - friend class Type; - friend class Allocation; - friend class Script; - friend class ScriptC; - - void *mID; - RenderScript *mRS; - android::String8 mName; - - void * getID() const; - - BaseObj(void *id, RenderScript *rs); - void checkValid(); - - static void * getObjID(const BaseObj *o); - -public: - - virtual ~BaseObj(); - virtual void updateFromNative(); - virtual bool equals(const BaseObj *obj); -}; - -#endif diff --git a/libs/rs/Element.cpp b/libs/rs/Element.cpp deleted file mode 100644 index f318d40..0000000 --- a/libs/rs/Element.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (C) 2008-2012 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. - */ - -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> -#include <malloc.h> -#include <string.h> - -#include "RenderScript.h" -#include "Element.h" - - -const Element * Element::getSubElement(uint32_t index) { - if (!mVisibleElementMap.size()) { - mRS->throwError("Element contains no sub-elements"); - } - if (index >= mVisibleElementMap.size()) { - mRS->throwError("Illegal sub-element index"); - } - return mElements[mVisibleElementMap[index]]; -} - -const char * Element::getSubElementName(uint32_t index) { - if (!mVisibleElementMap.size()) { - mRS->throwError("Element contains no sub-elements"); - } - if (index >= mVisibleElementMap.size()) { - mRS->throwError("Illegal sub-element index"); - } - return mElementNames[mVisibleElementMap[index]]; -} - -size_t Element::getSubElementArraySize(uint32_t index) { - if (!mVisibleElementMap.size()) { - mRS->throwError("Element contains no sub-elements"); - } - if (index >= mVisibleElementMap.size()) { - mRS->throwError("Illegal sub-element index"); - } - return mArraySizes[mVisibleElementMap[index]]; -} - -uint32_t Element::getSubElementOffsetBytes(uint32_t index) { - if (mVisibleElementMap.size()) { - mRS->throwError("Element contains no sub-elements"); - } - if (index >= mVisibleElementMap.size()) { - mRS->throwError("Illegal sub-element index"); - } - return mOffsetInBytes[mVisibleElementMap[index]]; -} - - -#define CREATE_USER(N, T) const Element * Element::N(RenderScript *rs) { \ - return createUser(rs, RS_TYPE_##T); \ -} -CREATE_USER(BOOLEAN, BOOLEAN); -CREATE_USER(U8, UNSIGNED_8); -CREATE_USER(I8, SIGNED_8); -CREATE_USER(U16, UNSIGNED_16); -CREATE_USER(I16, SIGNED_16); -CREATE_USER(U32, UNSIGNED_32); -CREATE_USER(I32, SIGNED_32); -CREATE_USER(U64, UNSIGNED_64); -CREATE_USER(I64, SIGNED_64); -CREATE_USER(F32, FLOAT_32); -CREATE_USER(F64, FLOAT_64); -CREATE_USER(ELEMENT, ELEMENT); -CREATE_USER(TYPE, TYPE); -CREATE_USER(ALLOCATION, ALLOCATION); -CREATE_USER(SAMPLER, SAMPLER); -CREATE_USER(SCRIPT, SCRIPT); -CREATE_USER(MESH, MESH); -CREATE_USER(PROGRAM_FRAGMENT, PROGRAM_FRAGMENT); -CREATE_USER(PROGRAM_VERTEX, PROGRAM_VERTEX); -CREATE_USER(PROGRAM_RASTER, PROGRAM_RASTER); -CREATE_USER(PROGRAM_STORE, PROGRAM_STORE); -CREATE_USER(MATRIX_4X4, MATRIX_4X4); -CREATE_USER(MATRIX_3X3, MATRIX_3X3); -CREATE_USER(MATRIX_2X2, MATRIX_2X2); - -#define CREATE_PIXEL(N, T, K) const Element * Element::N(RenderScript *rs) { \ - return createPixel(rs, RS_TYPE_##T, RS_KIND_##K); \ -} -CREATE_PIXEL(A_8, UNSIGNED_8, PIXEL_A); -CREATE_PIXEL(RGB_565, UNSIGNED_5_6_5, PIXEL_RGB); -CREATE_PIXEL(RGB_888, UNSIGNED_8, PIXEL_RGB); -CREATE_PIXEL(RGBA_4444, UNSIGNED_4_4_4_4, PIXEL_RGBA); -CREATE_PIXEL(RGBA_8888, UNSIGNED_8, PIXEL_RGBA); - -#define CREATE_VECTOR(N, T) const Element * Element::N##_2(RenderScript *rs) { \ - return createVector(rs, RS_TYPE_##T, 2); \ -} \ -const Element * Element::N##_3(RenderScript *rs) { \ - return createVector(rs, RS_TYPE_##T, 3); \ -} \ -const Element * Element::N##_4(RenderScript *rs) { \ - return createVector(rs, RS_TYPE_##T, 4); \ -} -CREATE_VECTOR(U8, UNSIGNED_8); -CREATE_VECTOR(I8, SIGNED_8); -CREATE_VECTOR(U16, UNSIGNED_16); -CREATE_VECTOR(I16, SIGNED_16); -CREATE_VECTOR(U32, UNSIGNED_32); -CREATE_VECTOR(I32, SIGNED_32); -CREATE_VECTOR(U64, UNSIGNED_64); -CREATE_VECTOR(I64, SIGNED_64); -CREATE_VECTOR(F32, FLOAT_32); -CREATE_VECTOR(F64, FLOAT_64); - - -void Element::updateVisibleSubElements() { - if (!mElements.size()) { - return; - } - mVisibleElementMap.clear(); - - int noPaddingFieldCount = 0; - size_t fieldCount = mElementNames.size(); - // Find out how many elements are not padding - for (size_t ct = 0; ct < fieldCount; ct ++) { - if (mElementNames[ct].string()[0] != '#') { - noPaddingFieldCount ++; - } - } - - // Make a map that points us at non-padding elements - for (size_t ct = 0; ct < fieldCount; ct ++) { - if (mElementNames[ct].string()[0] != '#') { - mVisibleElementMap.push((uint32_t)ct); - } - } -} - -Element::Element(void *id, RenderScript *rs, - android::Vector<const Element *> &elements, - android::Vector<android::String8> &elementNames, - android::Vector<uint32_t> &arraySizes) : BaseObj(id, rs) { - mSizeBytes = 0; - mVectorSize = 1; - mElements = elements; - mArraySizes = arraySizes; - mElementNames = elementNames; - - mType = RS_TYPE_NONE; - mKind = RS_KIND_USER; - - for (size_t ct = 0; ct < mElements.size(); ct++ ) { - mOffsetInBytes.push(mSizeBytes); - mSizeBytes += mElements[ct]->mSizeBytes * mArraySizes[ct]; - } - updateVisibleSubElements(); -} - - -static uint32_t GetSizeInBytesForType(RsDataType dt) { - switch(dt) { - case RS_TYPE_NONE: - return 0; - case RS_TYPE_SIGNED_8: - case RS_TYPE_UNSIGNED_8: - case RS_TYPE_BOOLEAN: - return 1; - - case RS_TYPE_FLOAT_16: - case RS_TYPE_SIGNED_16: - case RS_TYPE_UNSIGNED_16: - case RS_TYPE_UNSIGNED_5_6_5: - case RS_TYPE_UNSIGNED_5_5_5_1: - case RS_TYPE_UNSIGNED_4_4_4_4: - return 2; - - case RS_TYPE_FLOAT_32: - case RS_TYPE_SIGNED_32: - case RS_TYPE_UNSIGNED_32: - return 4; - - case RS_TYPE_FLOAT_64: - case RS_TYPE_SIGNED_64: - case RS_TYPE_UNSIGNED_64: - return 8; - - case RS_TYPE_MATRIX_4X4: - return 16 * 4; - case RS_TYPE_MATRIX_3X3: - return 9 * 4; - case RS_TYPE_MATRIX_2X2: - return 4 * 4; - - case RS_TYPE_TYPE: - case RS_TYPE_ALLOCATION: - case RS_TYPE_SAMPLER: - case RS_TYPE_SCRIPT: - case RS_TYPE_MESH: - case RS_TYPE_PROGRAM_FRAGMENT: - case RS_TYPE_PROGRAM_VERTEX: - case RS_TYPE_PROGRAM_RASTER: - case RS_TYPE_PROGRAM_STORE: - return 4; - - default: - break; - } - - ALOGE("Missing type %i", dt); - return 0; -} - -Element::Element(void *id, RenderScript *rs, - RsDataType dt, RsDataKind dk, bool norm, uint32_t size) : - BaseObj(id, rs) -{ - uint32_t tsize = GetSizeInBytesForType(dt); - if ((dt != RS_TYPE_UNSIGNED_5_6_5) && - (dt != RS_TYPE_UNSIGNED_4_4_4_4) && - (dt != RS_TYPE_UNSIGNED_5_5_5_1)) { - if (size == 3) { - mSizeBytes = tsize * 4; - } else { - mSizeBytes = tsize * size; - } - } else { - mSizeBytes = tsize; - } - mType = dt; - mKind = dk; - mNormalized = norm; - mVectorSize = size; -} - -Element::~Element() { -} - - /* - Element(int id, RenderScript rs) { - super(id, rs); - } - */ - -void Element::updateFromNative() { - BaseObj::updateFromNative(); -/* - // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements - int[] dataBuffer = new int[5]; - mRS.nElementGetNativeData(getID(), dataBuffer); - - mNormalized = dataBuffer[2] == 1 ? true : false; - mVectorSize = dataBuffer[3]; - mSize = 0; - for (DataType dt: DataType.values()) { - if(dt.mID == dataBuffer[0]){ - mType = dt; - mSize = mType.mSize * mVectorSize; - } - } - for (DataKind dk: DataKind.values()) { - if(dk.mID == dataBuffer[1]){ - mKind = dk; - } - } - - int numSubElements = dataBuffer[4]; - if(numSubElements > 0) { - mElements = new Element[numSubElements]; - mElementNames = new String[numSubElements]; - mArraySizes = new int[numSubElements]; - mOffsetInBytes = new int[numSubElements]; - - int[] subElementIds = new int[numSubElements]; - mRS.nElementGetSubElements(getID(), subElementIds, mElementNames, mArraySizes); - for(int i = 0; i < numSubElements; i ++) { - mElements[i] = new Element(subElementIds[i], mRS); - mElements[i].updateFromNative(); - mOffsetInBytes[i] = mSize; - mSize += mElements[i].mSize * mArraySizes[i]; - } - } - */ - updateVisibleSubElements(); -} - -const Element * Element::createUser(RenderScript *rs, RsDataType dt) { - void * id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, 1); - return new Element(id, rs, dt, RS_KIND_USER, false, 1); -} - -const Element * Element::createVector(RenderScript *rs, RsDataType dt, uint32_t size) { - if (size < 2 || size > 4) { - rs->throwError("Vector size out of range 2-4."); - } - void *id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, size); - return new Element(id, rs, dt, RS_KIND_USER, false, size); -} - -const Element * Element::createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk) { - if (!(dk == RS_KIND_PIXEL_L || - dk == RS_KIND_PIXEL_A || - dk == RS_KIND_PIXEL_LA || - dk == RS_KIND_PIXEL_RGB || - dk == RS_KIND_PIXEL_RGBA || - dk == RS_KIND_PIXEL_DEPTH)) { - rs->throwError("Unsupported DataKind"); - } - if (!(dt == RS_TYPE_UNSIGNED_8 || - dt == RS_TYPE_UNSIGNED_16 || - dt == RS_TYPE_UNSIGNED_5_6_5 || - dt == RS_TYPE_UNSIGNED_4_4_4_4 || - dt == RS_TYPE_UNSIGNED_5_5_5_1)) { - rs->throwError("Unsupported DataType"); - } - if (dt == RS_TYPE_UNSIGNED_5_6_5 && dk != RS_KIND_PIXEL_RGB) { - rs->throwError("Bad kind and type combo"); - } - if (dt == RS_TYPE_UNSIGNED_5_5_5_1 && dk != RS_KIND_PIXEL_RGBA) { - rs->throwError("Bad kind and type combo"); - } - if (dt == RS_TYPE_UNSIGNED_4_4_4_4 && dk != RS_KIND_PIXEL_RGBA) { - rs->throwError("Bad kind and type combo"); - } - if (dt == RS_TYPE_UNSIGNED_16 && dk != RS_KIND_PIXEL_DEPTH) { - rs->throwError("Bad kind and type combo"); - } - - int size = 1; - switch (dk) { - case RS_KIND_PIXEL_LA: - size = 2; - break; - case RS_KIND_PIXEL_RGB: - size = 3; - break; - case RS_KIND_PIXEL_RGBA: - size = 4; - break; - case RS_KIND_PIXEL_DEPTH: - size = 2; - break; - default: - break; - } - - void * id = rsElementCreate(rs->mContext, dt, dk, true, size); - return new Element(id, rs, dt, dk, true, size); -} - -bool Element::isCompatible(const Element *e) { - // Try strict BaseObj equality to start with. - if (this == e) { - return true; - } - - // Ignore mKind because it is allowed to be different (user vs. pixel). - // We also ignore mNormalized because it can be different. The mType - // field must be non-null since we require name equivalence for - // user-created Elements. - return ((mSizeBytes == e->mSizeBytes) && - (mType != NULL) && - (mType == e->mType) && - (mVectorSize == e->mVectorSize)); -} - -Element::Builder::Builder(RenderScript *rs) { - mRS = rs; - mSkipPadding = false; -} - -void Element::Builder::add(const Element *e, android::String8 &name, uint32_t arraySize) { - // Skip padding fields after a vector 3 type. - if (mSkipPadding) { - const char *s1 = "#padding_"; - const char *s2 = name; - size_t len = strlen(s1); - if (strlen(s2) >= len) { - if (!memcmp(s1, s2, len)) { - mSkipPadding = false; - return; - } - } - } - - if (e->mVectorSize == 3) { - mSkipPadding = true; - } else { - mSkipPadding = false; - } - - mElements.add(e); - mElementNames.add(name); - mArraySizes.add(arraySize); -} - -const Element * Element::Builder::create() { - size_t fieldCount = mElements.size(); - const char ** nameArray = (const char **)calloc(fieldCount, sizeof(char *)); - size_t* sizeArray = (size_t*)calloc(fieldCount, sizeof(size_t)); - - for (size_t ct = 0; ct < fieldCount; ct++) { - nameArray[ct] = mElementNames[ct].string(); - sizeArray[ct] = mElementNames[ct].length(); - } - - void *id = rsElementCreate2(mRS->mContext, - (RsElement *)mElements.array(), fieldCount, - nameArray, fieldCount * sizeof(size_t), sizeArray, - (const uint32_t *)mArraySizes.array(), fieldCount); - - - free(nameArray); - free(sizeArray); - - Element *e = new Element(id, mRS, mElements, mElementNames, mArraySizes); - return e; -} - diff --git a/libs/rs/Element.h b/libs/rs/Element.h deleted file mode 100644 index a579dc3..0000000 --- a/libs/rs/Element.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_ELEMENT_H__ -#define __ANDROID_ELEMENT_H__ - -#include <rs.h> -#include "RenderScript.h" -#include "BaseObj.h" - -class Element : public BaseObj { -public: - /** - * Return if a element is too complex for use as a data source for a Mesh or - * a Program. - * - * @return boolean - */ - bool isComplex(); - - /** - * @hide - * @return number of sub-elements in this element - */ - size_t getSubElementCount() { - return mVisibleElementMap.size(); - } - - /** - * @hide - * @param index index of the sub-element to return - * @return sub-element in this element at given index - */ - const Element * getSubElement(uint32_t index); - - /** - * @hide - * @param index index of the sub-element - * @return sub-element in this element at given index - */ - const char * getSubElementName(uint32_t index); - - /** - * @hide - * @param index index of the sub-element - * @return array size of sub-element in this element at given index - */ - size_t getSubElementArraySize(uint32_t index); - - /** - * @hide - * @param index index of the sub-element - * @return offset in bytes of sub-element in this element at given index - */ - uint32_t getSubElementOffsetBytes(uint32_t index); - - /** - * @hide - * @return element data type - */ - RsDataType getDataType() const { - return mType; - } - - /** - * @hide - * @return element data kind - */ - RsDataKind getDataKind() const { - return mKind; - } - - size_t getSizeBytes() const { - return mSizeBytes; - } - - - static const Element * BOOLEAN(RenderScript *rs); - static const Element * U8(RenderScript *rs); - static const Element * I8(RenderScript *rs); - static const Element * U16(RenderScript *rs); - static const Element * I16(RenderScript *rs); - static const Element * U32(RenderScript *rs); - static const Element * I32(RenderScript *rs); - static const Element * U64(RenderScript *rs); - static const Element * I64(RenderScript *rs); - static const Element * F32(RenderScript *rs); - static const Element * F64(RenderScript *rs); - static const Element * ELEMENT(RenderScript *rs); - static const Element * TYPE(RenderScript *rs); - static const Element * ALLOCATION(RenderScript *rs); - static const Element * SAMPLER(RenderScript *rs); - static const Element * SCRIPT(RenderScript *rs); - static const Element * MESH(RenderScript *rs); - static const Element * PROGRAM_FRAGMENT(RenderScript *rs); - static const Element * PROGRAM_VERTEX(RenderScript *rs); - static const Element * PROGRAM_RASTER(RenderScript *rs); - static const Element * PROGRAM_STORE(RenderScript *rs); - - static const Element * A_8(RenderScript *rs); - static const Element * RGB_565(RenderScript *rs); - static const Element * RGB_888(RenderScript *rs); - static const Element * RGBA_5551(RenderScript *rs); - static const Element * RGBA_4444(RenderScript *rs); - static const Element * RGBA_8888(RenderScript *rs); - - static const Element * F32_2(RenderScript *rs); - static const Element * F32_3(RenderScript *rs); - static const Element * F32_4(RenderScript *rs); - static const Element * F64_2(RenderScript *rs); - static const Element * F64_3(RenderScript *rs); - static const Element * F64_4(RenderScript *rs); - static const Element * U8_2(RenderScript *rs); - static const Element * U8_3(RenderScript *rs); - static const Element * U8_4(RenderScript *rs); - static const Element * I8_2(RenderScript *rs); - static const Element * I8_3(RenderScript *rs); - static const Element * I8_4(RenderScript *rs); - static const Element * U16_2(RenderScript *rs); - static const Element * U16_3(RenderScript *rs); - static const Element * U16_4(RenderScript *rs); - static const Element * I16_2(RenderScript *rs); - static const Element * I16_3(RenderScript *rs); - static const Element * I16_4(RenderScript *rs); - static const Element * U32_2(RenderScript *rs); - static const Element * U32_3(RenderScript *rs); - static const Element * U32_4(RenderScript *rs); - static const Element * I32_2(RenderScript *rs); - static const Element * I32_3(RenderScript *rs); - static const Element * I32_4(RenderScript *rs); - static const Element * U64_2(RenderScript *rs); - static const Element * U64_3(RenderScript *rs); - static const Element * U64_4(RenderScript *rs); - static const Element * I64_2(RenderScript *rs); - static const Element * I64_3(RenderScript *rs); - static const Element * I64_4(RenderScript *rs); - static const Element * MATRIX_4X4(RenderScript *rs); - static const Element * MATRIX_3X3(RenderScript *rs); - static const Element * MATRIX_2X2(RenderScript *rs); - - Element(void *id, RenderScript *rs, - android::Vector<const Element *> &elements, - android::Vector<android::String8> &elementNames, - android::Vector<uint32_t> &arraySizes); - Element(void *id, RenderScript *rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size); - Element(RenderScript *rs); - virtual ~Element(); - - void updateFromNative(); - static const Element * createUser(RenderScript *rs, RsDataType dt); - static const Element * createVector(RenderScript *rs, RsDataType dt, uint32_t size); - static const Element * createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk); - bool isCompatible(const Element *e); - - class Builder { - private: - RenderScript *mRS; - android::Vector<const Element *> mElements; - android::Vector<android::String8> mElementNames; - android::Vector<uint32_t> mArraySizes; - bool mSkipPadding; - - public: - Builder(RenderScript *rs); - ~Builder(); - void add(const Element *, android::String8 &name, uint32_t arraySize = 1); - const Element * create(); - }; - -private: - void updateVisibleSubElements(); - - android::Vector<const Element *> mElements; - android::Vector<android::String8> mElementNames; - android::Vector<uint32_t> mArraySizes; - android::Vector<uint32_t> mVisibleElementMap; - android::Vector<uint32_t> mOffsetInBytes; - - RsDataType mType; - RsDataKind mKind; - bool mNormalized; - size_t mSizeBytes; - size_t mVectorSize; -}; - -#endif diff --git a/libs/rs/RenderScript.cpp b/libs/rs/RenderScript.cpp deleted file mode 100644 index 217b921..0000000 --- a/libs/rs/RenderScript.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2008-2012 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. - */ - -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> -#include <malloc.h> -#include <string.h> - -#include "RenderScript.h" -#include "rs.h" - -bool RenderScript::gInitialized = false; -pthread_mutex_t RenderScript::gInitMutex = PTHREAD_MUTEX_INITIALIZER; - -RenderScript::RenderScript() { - mDev = NULL; - mContext = NULL; - mErrorFunc = NULL; - mMessageFunc = NULL; - mMessageRun = false; - - memset(&mElements, 0, sizeof(mElements)); -} - -RenderScript::~RenderScript() { - mMessageRun = false; - - rsContextDeinitToClient(mContext); - - void *res = NULL; - int status = pthread_join(mMessageThreadId, &res); - - rsContextDestroy(mContext); - mContext = NULL; - rsDeviceDestroy(mDev); - mDev = NULL; -} - -bool RenderScript::init(int targetApi) { - mDev = rsDeviceCreate(); - if (mDev == 0) { - ALOGE("Device creation failed"); - return false; - } - - mContext = rsContextCreate(mDev, 0, targetApi); - if (mContext == 0) { - ALOGE("Context creation failed"); - return false; - } - - - pid_t mNativeMessageThreadId; - - int status = pthread_create(&mMessageThreadId, NULL, threadProc, this); - if (status) { - ALOGE("Failed to start RenderScript message thread."); - return false; - } - // Wait for the message thread to be active. - while (!mMessageRun) { - usleep(1000); - } - - return true; -} - -void RenderScript::throwError(const char *err) const { - ALOGE("RS CPP error: %s", err); - int * v = NULL; - v[0] = 0; -} - - -void * RenderScript::threadProc(void *vrsc) { - RenderScript *rs = static_cast<RenderScript *>(vrsc); - size_t rbuf_size = 256; - void * rbuf = malloc(rbuf_size); - - rsContextInitToClient(rs->mContext); - rs->mMessageRun = true; - - while (rs->mMessageRun) { - size_t receiveLen = 0; - uint32_t usrID = 0; - uint32_t subID = 0; - RsMessageToClientType r = rsContextPeekMessage(rs->mContext, - &receiveLen, sizeof(receiveLen), - &usrID, sizeof(usrID)); - - if (receiveLen >= rbuf_size) { - rbuf_size = receiveLen + 32; - rbuf = realloc(rbuf, rbuf_size); - } - if (!rbuf) { - ALOGE("RenderScript::message handler realloc error %zu", rbuf_size); - // No clean way to recover now? - } - rsContextGetMessage(rs->mContext, rbuf, rbuf_size, &receiveLen, sizeof(receiveLen), - &subID, sizeof(subID)); - - switch(r) { - case RS_MESSAGE_TO_CLIENT_ERROR: - ALOGE("RS Error %s", (const char *)rbuf); - - if(rs->mMessageFunc != NULL) { - rs->mErrorFunc(usrID, (const char *)rbuf); - } - break; - case RS_MESSAGE_TO_CLIENT_EXCEPTION: - // teardown. But we want to avoid starving other threads during - // teardown by yielding until the next line in the destructor can - // execute to set mRun = false - usleep(1000); - break; - case RS_MESSAGE_TO_CLIENT_USER: - if(rs->mMessageFunc != NULL) { - rs->mMessageFunc(usrID, rbuf, receiveLen); - } else { - ALOGE("Received a message from the script with no message handler installed."); - } - break; - - default: - ALOGE("RenderScript unknown message type %i", r); - } - } - - if (rbuf) { - free(rbuf); - } - ALOGE("RenderScript Message thread exiting."); - return NULL; -} - -void RenderScript::setErrorHandler(ErrorHandlerFunc_t func) { - mErrorFunc = func; -} - -void RenderScript::setMessageHandler(MessageHandlerFunc_t func) { - mMessageFunc = func; -} - -void RenderScript::contextDump() { -} - -void RenderScript::finish() { - -} - - diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h deleted file mode 100644 index 5ad76e2..0000000 --- a/libs/rs/RenderScript.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_RENDERSCRIPT_H -#define ANDROID_RENDERSCRIPT_H - - -#include <pthread.h> -#include <utils/String8.h> -#include <utils/Vector.h> - -#include "rsDefines.h" - -class Element; -class Type; -class Allocation; - -class RenderScript { - friend class BaseObj; - friend class Allocation; - friend class Element; - friend class Type; - friend class Script; - friend class ScriptC; - -public: - RenderScript(); - virtual ~RenderScript(); - - typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText); - typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen); - - - void setErrorHandler(ErrorHandlerFunc_t func); - ErrorHandlerFunc_t getErrorHandler() {return mErrorFunc;} - - void setMessageHandler(MessageHandlerFunc_t func); - MessageHandlerFunc_t getMessageHandler() {return mMessageFunc;} - - bool init(int targetApi); - void contextDump(); - void finish(); - -private: - static bool gInitialized; - static pthread_mutex_t gInitMutex; - - pthread_t mMessageThreadId; - pid_t mNativeMessageThreadId; - bool mMessageRun; - - RsDevice mDev; - RsContext mContext; - - ErrorHandlerFunc_t mErrorFunc; - MessageHandlerFunc_t mMessageFunc; - - struct { - Element *U8; - Element *I8; - Element *U16; - Element *I16; - Element *U32; - Element *I32; - Element *U64; - Element *I64; - Element *F32; - Element *F64; - Element *BOOLEAN; - - Element *ELEMENT; - Element *TYPE; - Element *ALLOCATION; - Element *SAMPLER; - Element *SCRIPT; - Element *MESH; - Element *PROGRAM_FRAGMENT; - Element *PROGRAM_VERTEX; - Element *PROGRAM_RASTER; - Element *PROGRAM_STORE; - - Element *A_8; - Element *RGB_565; - Element *RGB_888; - Element *RGBA_5551; - Element *RGBA_4444; - Element *RGBA_8888; - - Element *FLOAT_2; - Element *FLOAT_3; - Element *FLOAT_4; - - Element *DOUBLE_2; - Element *DOUBLE_3; - Element *DOUBLE_4; - - Element *UCHAR_2; - Element *UCHAR_3; - Element *UCHAR_4; - - Element *CHAR_2; - Element *CHAR_3; - Element *CHAR_4; - - Element *USHORT_2; - Element *USHORT_3; - Element *USHORT_4; - - Element *SHORT_2; - Element *SHORT_3; - Element *SHORT_4; - - Element *UINT_2; - Element *UINT_3; - Element *UINT_4; - - Element *INT_2; - Element *INT_3; - Element *INT_4; - - Element *ULONG_2; - Element *ULONG_3; - Element *ULONG_4; - - Element *LONG_2; - Element *LONG_3; - Element *LONG_4; - - Element *MATRIX_4X4; - Element *MATRIX_3X3; - Element *MATRIX_2X2; - } mElements; - - - - void throwError(const char *err) const; - - static void * threadProc(void *); - -}; - -#endif - diff --git a/libs/rs/Script.cpp b/libs/rs/Script.cpp deleted file mode 100644 index c87d460..0000000 --- a/libs/rs/Script.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2008-2012 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. - */ - -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> -#include <malloc.h> - -#include "RenderScript.h" -#include "Element.h" -#include "Type.h" -#include "Allocation.h" -#include "Script.h" - -void Script::invoke(uint32_t slot, const void *v, size_t len) const { - rsScriptInvokeV(mRS->mContext, getID(), slot, v, len); -} - -void Script::forEach(uint32_t slot, const Allocation *ain, const Allocation *aout, - const void *usr, size_t usrLen) const { - if ((ain == NULL) && (aout == NULL)) { - mRS->throwError("At least one of ain or aout is required to be non-null."); - } - void *in_id = BaseObj::getObjID(ain); - void *out_id = BaseObj::getObjID(aout); - rsScriptForEach(mRS->mContext, getID(), slot, in_id, out_id, usr, usrLen); -} - - -Script::Script(void *id, RenderScript *rs) : BaseObj(id, rs) { -} - - -void Script::bindAllocation(const Allocation *va, uint32_t slot) const { - rsScriptBindAllocation(mRS->mContext, getID(), BaseObj::getObjID(va), slot); -} - - -void Script::setVar(uint32_t index, const BaseObj *o) const { - rsScriptSetVarObj(mRS->mContext, getID(), index, (o == NULL) ? 0 : o->getID()); -} - -void Script::setVar(uint32_t index, const void *v, size_t len) const { - rsScriptSetVarV(mRS->mContext, getID(), index, v, len); -} - - - -void Script::FieldBase::init(RenderScript *rs, uint32_t dimx, uint32_t usages) { - mAllocation = Allocation::createSized(rs, mElement, dimx, RS_ALLOCATION_USAGE_SCRIPT | usages); -} - -//Script::FieldBase::FieldBase() { -//} - - diff --git a/libs/rs/Script.h b/libs/rs/Script.h deleted file mode 100644 index 0700898..0000000 --- a/libs/rs/Script.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_SCRIPT_H__ -#define __ANDROID_SCRIPT_H__ - -#include <pthread.h> -#include <rs.h> - -#include "RenderScript.h" -#include "Allocation.h" - -class Type; -class Element; -class Allocation; - -class Script : public BaseObj { -protected: - Script(void *id, RenderScript *rs); - void forEach(uint32_t slot, const Allocation *in, const Allocation *out, const void *v, size_t) const; - void bindAllocation(const Allocation *va, uint32_t slot) const; - void setVar(uint32_t index, const void *, size_t len) const; - void setVar(uint32_t index, const BaseObj *o) const; - void invoke(uint32_t slot, const void *v, size_t len) const; - - - void invoke(uint32_t slot) const { - invoke(slot, NULL, 0); - } - void setVar(uint32_t index, float v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, double v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, int32_t v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, int64_t v) const { - setVar(index, &v, sizeof(v)); - } - void setVar(uint32_t index, bool v) const { - setVar(index, &v, sizeof(v)); - } - -public: - class FieldBase { - protected: - const Element *mElement; - Allocation *mAllocation; - - void init(RenderScript *rs, uint32_t dimx, uint32_t usages = 0); - - public: - const Element *getElement() { - return mElement; - } - - const Type *getType() { - return mAllocation->getType(); - } - - const Allocation *getAllocation() { - return mAllocation; - } - - //void updateAllocation(); - }; -}; - -#endif diff --git a/libs/rs/ScriptC.cpp b/libs/rs/ScriptC.cpp deleted file mode 100644 index 80e8efc..0000000 --- a/libs/rs/ScriptC.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2008-2012 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. - */ - -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> -#include <malloc.h> - -#include "ScriptC.h" - -ScriptC::ScriptC(RenderScript *rs, - const void *codeTxt, size_t codeLength, - const char *cachedName, size_t cachedNameLength, - const char *cacheDir, size_t cacheDirLength) -: Script(NULL, rs) { - mID = rsScriptCCreate(rs->mContext, cachedName, cachedNameLength, - cacheDir, cacheDirLength, (const char *)codeTxt, codeLength); -} - diff --git a/libs/rs/ScriptC.h b/libs/rs/ScriptC.h deleted file mode 100644 index b68f61c..0000000 --- a/libs/rs/ScriptC.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_SCRIPTC_H__ -#define __ANDROID_SCRIPTC_H__ - -#include <pthread.h> -#include <rs.h> - -#include "Script.h" - -class ScriptC : public Script { -protected: - ScriptC(RenderScript *rs, - const void *codeTxt, size_t codeLength, - const char *cachedName, size_t cachedNameLength, - const char *cacheDir, size_t cacheDirLength); - -}; - -#endif diff --git a/libs/rs/Type.cpp b/libs/rs/Type.cpp deleted file mode 100644 index 1352bd7..0000000 --- a/libs/rs/Type.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * 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. - */ - -#define LOG_TAG "libRS_cpp" - -#include <utils/Log.h> -#include <malloc.h> -#include <string.h> - -#include "RenderScript.h" -#include "Element.h" -#include "Type.h" - -void Type::calcElementCount() { - bool hasLod = hasMipmaps(); - uint32_t x = getX(); - uint32_t y = getY(); - uint32_t z = getZ(); - uint32_t faces = 1; - if (hasFaces()) { - faces = 6; - } - if (x == 0) { - x = 1; - } - if (y == 0) { - y = 1; - } - if (z == 0) { - z = 1; - } - - uint32_t count = x * y * z * faces; - while (hasLod && ((x > 1) || (y > 1) || (z > 1))) { - if(x > 1) { - x >>= 1; - } - if(y > 1) { - y >>= 1; - } - if(z > 1) { - z >>= 1; - } - - count += x * y * z * faces; - } - mElementCount = count; -} - - -Type::Type(void *id, RenderScript *rs) : BaseObj(id, rs) { - mDimX = 0; - mDimY = 0; - mDimZ = 0; - mDimMipmaps = false; - mDimFaces = false; - mElement = NULL; -} - -void Type::updateFromNative() { - // We have 6 integer to obtain mDimX; mDimY; mDimZ; - // mDimLOD; mDimFaces; mElement; - - /* - int[] dataBuffer = new int[6]; - mRS.nTypeGetNativeData(getID(), dataBuffer); - - mDimX = dataBuffer[0]; - mDimY = dataBuffer[1]; - mDimZ = dataBuffer[2]; - mDimMipmaps = dataBuffer[3] == 1 ? true : false; - mDimFaces = dataBuffer[4] == 1 ? true : false; - - int elementID = dataBuffer[5]; - if(elementID != 0) { - mElement = new Element(elementID, mRS); - mElement.updateFromNative(); - } - calcElementCount(); - */ -} - -Type::Builder::Builder(RenderScript *rs, const Element *e) { - mRS = rs; - mElement = e; - mDimX = 0; - mDimY = 0; - mDimZ = 0; - mDimMipmaps = false; - mDimFaces = false; -} - -void Type::Builder::setX(uint32_t value) { - if(value < 1) { - ALOGE("Values of less than 1 for Dimension X are not valid."); - } - mDimX = value; -} - -void Type::Builder::setY(int value) { - if(value < 1) { - ALOGE("Values of less than 1 for Dimension Y are not valid."); - } - mDimY = value; -} - -void Type::Builder::setMipmaps(bool value) { - mDimMipmaps = value; -} - -void Type::Builder::setFaces(bool value) { - mDimFaces = value; -} - -const Type * Type::Builder::create() { - if (mDimZ > 0) { - if ((mDimX < 1) || (mDimY < 1)) { - ALOGE("Both X and Y dimension required when Z is present."); - } - if (mDimFaces) { - ALOGE("Cube maps not supported with 3D types."); - } - } - if (mDimY > 0) { - if (mDimX < 1) { - ALOGE("X dimension required when Y is present."); - } - } - if (mDimFaces) { - if (mDimY < 1) { - ALOGE("Cube maps require 2D Types."); - } - } - - void * id = rsTypeCreate(mRS->mContext, mElement->getID(), mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces); - Type *t = new Type(id, mRS); - t->mElement = mElement; - t->mDimX = mDimX; - t->mDimY = mDimY; - t->mDimZ = mDimZ; - t->mDimMipmaps = mDimMipmaps; - t->mDimFaces = mDimFaces; - - t->calcElementCount(); - return t; -} - diff --git a/libs/rs/Type.h b/libs/rs/Type.h deleted file mode 100644 index 53481c3..0000000 --- a/libs/rs/Type.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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. - */ - -#ifndef __ANDROID_TYPE_H__ -#define __ANDROID_TYPE_H__ - -#include <rs.h> -#include "RenderScript.h" -#include "Element.h" - -class Type : public BaseObj { -protected: - friend class Allocation; - - uint32_t mDimX; - uint32_t mDimY; - uint32_t mDimZ; - bool mDimMipmaps; - bool mDimFaces; - size_t mElementCount; - const Element *mElement; - - void calcElementCount(); - virtual void updateFromNative(); - -public: - - const Element* getElement() const { - return mElement; - } - - uint32_t getX() const { - return mDimX; - } - - uint32_t getY() const { - return mDimY; - } - - uint32_t getZ() const { - return mDimZ; - } - - bool hasMipmaps() const { - return mDimMipmaps; - } - - bool hasFaces() const { - return mDimFaces; - } - - size_t getCount() const { - return mElementCount; - } - - size_t getSizeBytes() const { - return mElementCount * mElement->getSizeBytes(); - } - - - Type(void *id, RenderScript *rs); - - - class Builder { - protected: - RenderScript *mRS; - uint32_t mDimX; - uint32_t mDimY; - uint32_t mDimZ; - bool mDimMipmaps; - bool mDimFaces; - const Element *mElement; - - public: - Builder(RenderScript *rs, const Element *e); - - void setX(uint32_t value); - void setY(int value); - void setMipmaps(bool value); - void setFaces(bool value); - const Type * create(); - }; - -}; - -#endif diff --git a/libs/rs/driver/rsdAllocation.cpp b/libs/rs/driver/rsdAllocation.cpp deleted file mode 100644 index f358f93..0000000 --- a/libs/rs/driver/rsdAllocation.cpp +++ /dev/null @@ -1,648 +0,0 @@ -/* - * Copyright (C) 2011-2012 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 "rsdCore.h" -#include "rsdBcc.h" -#include "rsdRuntime.h" -#include "rsdAllocation.h" -#include "rsdFrameBufferObj.h" - -#include "rsAllocation.h" - -#include "system/window.h" -#include "hardware/gralloc.h" -#include "ui/Rect.h" -#include "ui/GraphicBufferMapper.h" -#include "gui/SurfaceTexture.h" - -#include <GLES/gl.h> -#include <GLES2/gl2.h> -#include <GLES/glext.h> - -using namespace android; -using namespace android::renderscript; - - - -const static GLenum gFaceOrder[] = { - GL_TEXTURE_CUBE_MAP_POSITIVE_X, - GL_TEXTURE_CUBE_MAP_NEGATIVE_X, - GL_TEXTURE_CUBE_MAP_POSITIVE_Y, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, - GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z -}; - - -GLenum rsdTypeToGLType(RsDataType t) { - switch (t) { - case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5; - case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1; - case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4; - - //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT; - case RS_TYPE_FLOAT_32: return GL_FLOAT; - case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE; - case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT; - case RS_TYPE_SIGNED_8: return GL_BYTE; - case RS_TYPE_SIGNED_16: return GL_SHORT; - default: break; - } - return 0; -} - -GLenum rsdKindToGLFormat(RsDataKind k) { - switch (k) { - case RS_KIND_PIXEL_L: return GL_LUMINANCE; - case RS_KIND_PIXEL_A: return GL_ALPHA; - case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA; - case RS_KIND_PIXEL_RGB: return GL_RGB; - case RS_KIND_PIXEL_RGBA: return GL_RGBA; - case RS_KIND_PIXEL_DEPTH: return GL_DEPTH_COMPONENT16; - default: break; - } - return 0; -} - - -static void Update2DTexture(const Context *rsc, const Allocation *alloc, const void *ptr, - uint32_t xoff, uint32_t yoff, uint32_t lod, - RsAllocationCubemapFace face, uint32_t w, uint32_t h) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - rsAssert(drv->textureID); - RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID); - RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1); - GLenum t = GL_TEXTURE_2D; - if (alloc->mHal.state.hasFaces) { - t = gFaceOrder[face]; - } - RSD_CALL_GL(glTexSubImage2D, t, lod, xoff, yoff, w, h, drv->glFormat, drv->glType, ptr); -} - - -static void Upload2DTexture(const Context *rsc, const Allocation *alloc, bool isFirstUpload) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID); - RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1); - - uint32_t faceCount = 1; - if (alloc->mHal.state.hasFaces) { - faceCount = 6; - } - - rsdGLCheckError(rsc, "Upload2DTexture 1 "); - for (uint32_t face = 0; face < faceCount; face ++) { - for (uint32_t lod = 0; lod < alloc->mHal.state.type->getLODCount(); lod++) { - const uint8_t *p = (const uint8_t *)drv->mallocPtr; - p += alloc->mHal.state.type->getLODFaceOffset(lod, (RsAllocationCubemapFace)face, 0, 0); - - GLenum t = GL_TEXTURE_2D; - if (alloc->mHal.state.hasFaces) { - t = gFaceOrder[face]; - } - - if (isFirstUpload) { - RSD_CALL_GL(glTexImage2D, t, lod, drv->glFormat, - alloc->mHal.state.type->getLODDimX(lod), - alloc->mHal.state.type->getLODDimY(lod), - 0, drv->glFormat, drv->glType, p); - } else { - RSD_CALL_GL(glTexSubImage2D, t, lod, 0, 0, - alloc->mHal.state.type->getLODDimX(lod), - alloc->mHal.state.type->getLODDimY(lod), - drv->glFormat, drv->glType, p); - } - } - } - - if (alloc->mHal.state.mipmapControl == RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE) { - RSD_CALL_GL(glGenerateMipmap, drv->glTarget); - } - rsdGLCheckError(rsc, "Upload2DTexture"); -} - -static void UploadToTexture(const Context *rsc, const Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_INPUT) { - if (!drv->textureID) { - RSD_CALL_GL(glGenTextures, 1, &drv->textureID); - } - return; - } - - if (!drv->glType || !drv->glFormat) { - return; - } - - if (!alloc->getPtr()) { - return; - } - - bool isFirstUpload = false; - - if (!drv->textureID) { - RSD_CALL_GL(glGenTextures, 1, &drv->textureID); - isFirstUpload = true; - } - - Upload2DTexture(rsc, alloc, isFirstUpload); - - if (!(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT)) { - if (drv->mallocPtr) { - free(drv->mallocPtr); - drv->mallocPtr = NULL; - } - } - rsdGLCheckError(rsc, "UploadToTexture"); -} - -static void AllocateRenderTarget(const Context *rsc, const Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - if (!drv->glFormat) { - return; - } - - if (!drv->renderTargetID) { - RSD_CALL_GL(glGenRenderbuffers, 1, &drv->renderTargetID); - - if (!drv->renderTargetID) { - // This should generally not happen - ALOGE("allocateRenderTarget failed to gen mRenderTargetID"); - rsc->dumpDebug(); - return; - } - RSD_CALL_GL(glBindRenderbuffer, GL_RENDERBUFFER, drv->renderTargetID); - RSD_CALL_GL(glRenderbufferStorage, GL_RENDERBUFFER, drv->glFormat, - alloc->mHal.state.dimensionX, alloc->mHal.state.dimensionY); - } - rsdGLCheckError(rsc, "AllocateRenderTarget"); -} - -static void UploadToBufferObject(const Context *rsc, const Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - rsAssert(!alloc->mHal.state.type->getDimY()); - rsAssert(!alloc->mHal.state.type->getDimZ()); - - //alloc->mHal.state.usageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX; - - if (!drv->bufferID) { - RSD_CALL_GL(glGenBuffers, 1, &drv->bufferID); - } - if (!drv->bufferID) { - ALOGE("Upload to buffer object failed"); - drv->uploadDeferred = true; - return; - } - RSD_CALL_GL(glBindBuffer, drv->glTarget, drv->bufferID); - RSD_CALL_GL(glBufferData, drv->glTarget, alloc->mHal.state.type->getSizeBytes(), - drv->mallocPtr, GL_DYNAMIC_DRAW); - RSD_CALL_GL(glBindBuffer, drv->glTarget, 0); - rsdGLCheckError(rsc, "UploadToBufferObject"); -} - -bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) { - DrvAllocation *drv = (DrvAllocation *)calloc(1, sizeof(DrvAllocation)); - if (!drv) { - return false; - } - - void * ptr = alloc->mHal.state.usrPtr; - if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT) { - } else { - ptr = malloc(alloc->mHal.state.type->getSizeBytes()); - if (!ptr) { - free(drv); - return false; - } - } - - drv->glTarget = GL_NONE; - if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) { - if (alloc->mHal.state.hasFaces) { - drv->glTarget = GL_TEXTURE_CUBE_MAP; - } else { - drv->glTarget = GL_TEXTURE_2D; - } - } else { - if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) { - drv->glTarget = GL_ARRAY_BUFFER; - } - } - - drv->glType = rsdTypeToGLType(alloc->mHal.state.type->getElement()->getComponent().getType()); - drv->glFormat = rsdKindToGLFormat(alloc->mHal.state.type->getElement()->getComponent().getKind()); - - - alloc->mHal.drvState.mallocPtr = ptr; - drv->mallocPtr = (uint8_t *)ptr; - alloc->mHal.drv = drv; - if (forceZero && ptr) { - memset(ptr, 0, alloc->mHal.state.type->getSizeBytes()); - } - - if (alloc->mHal.state.usageFlags & ~RS_ALLOCATION_USAGE_SCRIPT) { - drv->uploadDeferred = true; - } - - drv->readBackFBO = NULL; - - return true; -} - -void rsdAllocationDestroy(const Context *rsc, Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - if (drv->bufferID) { - // Causes a SW crash.... - //ALOGV(" mBufferID %i", mBufferID); - //glDeleteBuffers(1, &mBufferID); - //mBufferID = 0; - } - if (drv->textureID) { - RSD_CALL_GL(glDeleteTextures, 1, &drv->textureID); - drv->textureID = 0; - } - if (drv->renderTargetID) { - RSD_CALL_GL(glDeleteRenderbuffers, 1, &drv->renderTargetID); - drv->renderTargetID = 0; - } - - if (drv->mallocPtr && !alloc->mHal.state.usrPtr) { - free(drv->mallocPtr); - drv->mallocPtr = NULL; - } - if (drv->readBackFBO != NULL) { - delete drv->readBackFBO; - drv->readBackFBO = NULL; - } - free(drv); - alloc->mHal.drv = NULL; -} - -void rsdAllocationResize(const Context *rsc, const Allocation *alloc, - const Type *newType, bool zeroNew) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - drv->mallocPtr = (uint8_t *)realloc(drv->mallocPtr, newType->getSizeBytes()); - - // fixme - ((Allocation *)alloc)->mHal.drvState.mallocPtr = drv->mallocPtr; - - const uint32_t oldDimX = alloc->mHal.state.dimensionX; - const uint32_t dimX = newType->getDimX(); - - if (dimX > oldDimX) { - const Element *e = alloc->mHal.state.type->getElement(); - uint32_t stride = e->getSizeBytes(); - memset(((uint8_t *)drv->mallocPtr) + stride * oldDimX, 0, stride * (dimX - oldDimX)); - } -} - -static void rsdAllocationSyncFromFBO(const Context *rsc, const Allocation *alloc) { - if (!alloc->getIsScript()) { - return; // nothing to sync - } - - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - RsdFrameBufferObj *lastFbo = dc->gl.currentFrameBuffer; - - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - if (!drv->textureID && !drv->renderTargetID) { - return; // nothing was rendered here yet, so nothing to sync - } - if (drv->readBackFBO == NULL) { - drv->readBackFBO = new RsdFrameBufferObj(); - drv->readBackFBO->setColorTarget(drv, 0); - drv->readBackFBO->setDimensions(alloc->getType()->getDimX(), - alloc->getType()->getDimY()); - } - - // Bind the framebuffer object so we can read back from it - drv->readBackFBO->setActive(rsc); - - // Do the readback - RSD_CALL_GL(glReadPixels, 0, 0, alloc->getType()->getDimX(), alloc->getType()->getDimY(), - drv->glFormat, drv->glType, alloc->getPtr()); - - // Revert framebuffer to its original - lastFbo->setActive(rsc); -} - - -void rsdAllocationSyncAll(const Context *rsc, const Allocation *alloc, - RsAllocationUsageType src) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - if (src == RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) { - if(!alloc->getIsRenderTarget()) { - rsc->setError(RS_ERROR_FATAL_DRIVER, - "Attempting to sync allocation from render target, " - "for non-render target allocation"); - } else if (alloc->getType()->getElement()->getKind() != RS_KIND_PIXEL_RGBA) { - rsc->setError(RS_ERROR_FATAL_DRIVER, "Cannot only sync from RGBA" - "render target"); - } else { - rsdAllocationSyncFromFBO(rsc, alloc); - } - return; - } - - rsAssert(src == RS_ALLOCATION_USAGE_SCRIPT); - - if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) { - UploadToTexture(rsc, alloc); - } else { - if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) { - AllocateRenderTarget(rsc, alloc); - } - } - if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) { - UploadToBufferObject(rsc, alloc); - } - - drv->uploadDeferred = false; -} - -void rsdAllocationMarkDirty(const Context *rsc, const Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - drv->uploadDeferred = true; -} - -int32_t rsdAllocationInitSurfaceTexture(const Context *rsc, const Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - UploadToTexture(rsc, alloc); - return drv->textureID; -} - -static bool IoGetBuffer(const Context *rsc, Allocation *alloc, ANativeWindow *nw) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - int32_t r = nw->dequeueBuffer(nw, &drv->wndBuffer); - if (r) { - rsc->setError(RS_ERROR_DRIVER, "Error getting next IO output buffer."); - return false; - } - - // This lock is implicitly released by the queue buffer in IoSend - r = nw->lockBuffer(nw, drv->wndBuffer); - if (r) { - rsc->setError(RS_ERROR_DRIVER, "Error locking next IO output buffer."); - return false; - } - - // Must lock the whole surface - GraphicBufferMapper &mapper = GraphicBufferMapper::get(); - Rect bounds(drv->wndBuffer->width, drv->wndBuffer->height); - - void *dst = NULL; - mapper.lock(drv->wndBuffer->handle, - GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN, - bounds, &dst); - alloc->mHal.drvState.mallocPtr = dst; - return true; -} - -void rsdAllocationSetSurfaceTexture(const Context *rsc, Allocation *alloc, ANativeWindow *nw) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - //ALOGE("rsdAllocationSetSurfaceTexture %p %p", alloc, nw); - - // Cleanup old surface if there is one. - if (alloc->mHal.state.wndSurface) { - ANativeWindow *old = alloc->mHal.state.wndSurface; - GraphicBufferMapper &mapper = GraphicBufferMapper::get(); - mapper.unlock(drv->wndBuffer->handle); - old->queueBuffer(old, drv->wndBuffer); - } - - if (nw != NULL) { - int32_t r; - r = native_window_set_usage(nw, GRALLOC_USAGE_SW_READ_RARELY | - GRALLOC_USAGE_SW_WRITE_OFTEN); - if (r) { - rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer usage."); - return; - } - - r = native_window_set_buffers_dimensions(nw, alloc->mHal.state.dimensionX, - alloc->mHal.state.dimensionY); - if (r) { - rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer dimensions."); - return; - } - - r = native_window_set_buffer_count(nw, 3); - if (r) { - rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer count."); - return; - } - - IoGetBuffer(rsc, alloc, nw); - } -} - -void rsdAllocationIoSend(const Context *rsc, Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - ANativeWindow *nw = alloc->mHal.state.wndSurface; - - GraphicBufferMapper &mapper = GraphicBufferMapper::get(); - mapper.unlock(drv->wndBuffer->handle); - int32_t r = nw->queueBuffer(nw, drv->wndBuffer); - if (r) { - rsc->setError(RS_ERROR_DRIVER, "Error sending IO output buffer."); - return; - } - - IoGetBuffer(rsc, alloc, nw); -} - -void rsdAllocationIoReceive(const Context *rsc, Allocation *alloc) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - alloc->mHal.state.surfaceTexture->updateTexImage(); -} - - -void rsdAllocationData1D(const Context *rsc, const Allocation *alloc, - uint32_t xoff, uint32_t lod, uint32_t count, - const void *data, size_t sizeBytes) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - const uint32_t eSize = alloc->mHal.state.type->getElementSizeBytes(); - uint8_t * ptr = drv->mallocPtr; - ptr += eSize * xoff; - uint32_t size = count * eSize; - - if (alloc->mHal.state.hasReferences) { - alloc->incRefs(data, count); - alloc->decRefs(ptr, count); - } - - memcpy(ptr, data, size); - drv->uploadDeferred = true; -} - -void rsdAllocationData2D(const Context *rsc, const Allocation *alloc, - uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, const void *data, size_t sizeBytes) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - uint32_t eSize = alloc->mHal.state.elementSizeBytes; - uint32_t lineSize = eSize * w; - uint32_t destW = alloc->mHal.state.dimensionX; - - if (drv->mallocPtr) { - const uint8_t *src = static_cast<const uint8_t *>(data); - uint8_t *dst = drv->mallocPtr; - dst += alloc->mHal.state.type->getLODFaceOffset(lod, face, xoff, yoff); - - for (uint32_t line=yoff; line < (yoff+h); line++) { - if (alloc->mHal.state.hasReferences) { - alloc->incRefs(src, w); - alloc->decRefs(dst, w); - } - memcpy(dst, src, lineSize); - src += lineSize; - dst += destW * eSize; - } - drv->uploadDeferred = true; - } else { - Update2DTexture(rsc, alloc, data, xoff, yoff, lod, face, w, h); - } -} - -void rsdAllocationData3D(const Context *rsc, const Allocation *alloc, - uint32_t xoff, uint32_t yoff, uint32_t zoff, - uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes) { - -} - -void rsdAllocationData1D_alloc(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstLod, uint32_t count, - const android::renderscript::Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcLod) { -} - -uint8_t *getOffsetPtr(const android::renderscript::Allocation *alloc, - uint32_t xoff, uint32_t yoff, uint32_t lod, - RsAllocationCubemapFace face) { - uint8_t *ptr = static_cast<uint8_t *>(alloc->getPtr()); - ptr += alloc->getType()->getLODOffset(lod, xoff, yoff); - - if (face != 0) { - uint32_t totalSizeBytes = alloc->getType()->getSizeBytes(); - uint32_t faceOffset = totalSizeBytes / 6; - ptr += faceOffset * (uint32_t)face; - } - return ptr; -} - - -void rsdAllocationData2D_alloc_script(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod, - RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h, - const android::renderscript::Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod, - RsAllocationCubemapFace srcFace) { - uint32_t elementSize = dstAlloc->getType()->getElementSizeBytes(); - for (uint32_t i = 0; i < h; i ++) { - uint8_t *dstPtr = getOffsetPtr(dstAlloc, dstXoff, dstYoff + i, dstLod, dstFace); - uint8_t *srcPtr = getOffsetPtr(srcAlloc, srcXoff, srcYoff + i, srcLod, srcFace); - memcpy(dstPtr, srcPtr, w * elementSize); - - //ALOGE("COPIED dstXoff(%u), dstYoff(%u), dstLod(%u), dstFace(%u), w(%u), h(%u), srcXoff(%u), srcYoff(%u), srcLod(%u), srcFace(%u)", - // dstXoff, dstYoff, dstLod, dstFace, w, h, srcXoff, srcYoff, srcLod, srcFace); - } -} - -void rsdAllocationData2D_alloc(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod, - RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h, - const android::renderscript::Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod, - RsAllocationCubemapFace srcFace) { - if (!dstAlloc->getIsScript() && !srcAlloc->getIsScript()) { - rsc->setError(RS_ERROR_FATAL_DRIVER, "Non-script allocation copies not " - "yet implemented."); - return; - } - rsdAllocationData2D_alloc_script(rsc, dstAlloc, dstXoff, dstYoff, - dstLod, dstFace, w, h, srcAlloc, - srcXoff, srcYoff, srcLod, srcFace); -} - -void rsdAllocationData3D_alloc(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, - uint32_t dstLod, RsAllocationCubemapFace dstFace, - uint32_t w, uint32_t h, uint32_t d, - const android::renderscript::Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, - uint32_t srcLod, RsAllocationCubemapFace srcFace) { -} - -void rsdAllocationElementData1D(const Context *rsc, const Allocation *alloc, - uint32_t x, - const void *data, uint32_t cIdx, uint32_t sizeBytes) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - uint32_t eSize = alloc->mHal.state.elementSizeBytes; - uint8_t * ptr = drv->mallocPtr; - ptr += eSize * x; - - const Element * e = alloc->mHal.state.type->getElement()->getField(cIdx); - ptr += alloc->mHal.state.type->getElement()->getFieldOffsetBytes(cIdx); - - if (alloc->mHal.state.hasReferences) { - e->incRefs(data); - e->decRefs(ptr); - } - - memcpy(ptr, data, sizeBytes); - drv->uploadDeferred = true; -} - -void rsdAllocationElementData2D(const Context *rsc, const Allocation *alloc, - uint32_t x, uint32_t y, - const void *data, uint32_t cIdx, uint32_t sizeBytes) { - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - - uint32_t eSize = alloc->mHal.state.elementSizeBytes; - uint8_t * ptr = drv->mallocPtr; - ptr += eSize * (x + y * alloc->mHal.state.dimensionX); - - const Element * e = alloc->mHal.state.type->getElement()->getField(cIdx); - ptr += alloc->mHal.state.type->getElement()->getFieldOffsetBytes(cIdx); - - if (alloc->mHal.state.hasReferences) { - e->incRefs(data); - e->decRefs(ptr); - } - - memcpy(ptr, data, sizeBytes); - drv->uploadDeferred = true; -} - - diff --git a/libs/rs/driver/rsdAllocation.h b/libs/rs/driver/rsdAllocation.h deleted file mode 100644 index e3a5126..0000000 --- a/libs/rs/driver/rsdAllocation.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * 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_ALLOCATION_H -#define RSD_ALLOCATION_H - -#include <rs_hal.h> -#include <rsRuntime.h> - -#include <GLES/gl.h> -#include <GLES2/gl2.h> - -class RsdFrameBufferObj; -struct ANativeWindowBuffer; - -struct DrvAllocation { - // Is this a legal structure to be used as a texture source. - // Initially this will require 1D or 2D and color data - uint32_t textureID; - - // Is this a legal structure to be used as a vertex source. - // Initially this will require 1D and x(yzw). Additional per element data - // is allowed. - uint32_t bufferID; - - // Is this a legal structure to be used as an FBO render target - uint32_t renderTargetID; - - uint8_t * mallocPtr; - - GLenum glTarget; - GLenum glType; - GLenum glFormat; - - bool uploadDeferred; - - RsdFrameBufferObj * readBackFBO; - ANativeWindowBuffer *wndBuffer; -}; - -GLenum rsdTypeToGLType(RsDataType t); -GLenum rsdKindToGLFormat(RsDataKind k); - - -bool rsdAllocationInit(const android::renderscript::Context *rsc, - android::renderscript::Allocation *alloc, - bool forceZero); -void rsdAllocationDestroy(const android::renderscript::Context *rsc, - android::renderscript::Allocation *alloc); - -void rsdAllocationResize(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc, - const android::renderscript::Type *newType, bool zeroNew); -void rsdAllocationSyncAll(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc, - RsAllocationUsageType src); -void rsdAllocationMarkDirty(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc); -int32_t rsdAllocationInitSurfaceTexture(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc); -void rsdAllocationSetSurfaceTexture(const android::renderscript::Context *rsc, - android::renderscript::Allocation *alloc, ANativeWindow *nw); -void rsdAllocationIoSend(const android::renderscript::Context *rsc, - android::renderscript::Allocation *alloc); -void rsdAllocationIoReceive(const android::renderscript::Context *rsc, - android::renderscript::Allocation *alloc); - -void rsdAllocationData1D(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc, - uint32_t xoff, uint32_t lod, uint32_t count, - const void *data, uint32_t sizeBytes); -void rsdAllocationData2D(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc, - uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, - const void *data, uint32_t sizeBytes); -void rsdAllocationData3D(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc, - uint32_t xoff, uint32_t yoff, uint32_t zoff, - uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes); - -void rsdAllocationData1D_alloc(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstLod, uint32_t count, - const android::renderscript::Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcLod); -void rsdAllocationData2D_alloc(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod, - RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h, - const android::renderscript::Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod, - RsAllocationCubemapFace srcFace); -void rsdAllocationData3D_alloc(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, - uint32_t dstLod, RsAllocationCubemapFace dstFace, - uint32_t w, uint32_t h, uint32_t d, - const android::renderscript::Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, - uint32_t srcLod, RsAllocationCubemapFace srcFace); - -void rsdAllocationElementData1D(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc, - uint32_t x, - const void *data, uint32_t elementOff, uint32_t sizeBytes); -void rsdAllocationElementData2D(const android::renderscript::Context *rsc, - const android::renderscript::Allocation *alloc, - uint32_t x, uint32_t y, - const void *data, uint32_t elementOff, uint32_t sizeBytes); - - - - -#endif diff --git a/libs/rs/driver/rsdBcc.cpp b/libs/rs/driver/rsdBcc.cpp deleted file mode 100644 index dd78684..0000000 --- a/libs/rs/driver/rsdBcc.cpp +++ /dev/null @@ -1,541 +0,0 @@ -/* - * Copyright (C) 2011-2012 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 "rsdCore.h" -#include "rsdBcc.h" -#include "rsdRuntime.h" - -#include <bcinfo/MetadataExtractor.h> - -#include "rsContext.h" -#include "rsScriptC.h" - -#include "utils/Timers.h" -#include "utils/StopWatch.h" -extern "C" { -#include "libdex/ZipArchive.h" -} - -using namespace android; -using namespace android::renderscript; - -struct DrvScript { - int (*mRoot)(); - int (*mRootExpand)(); - void (*mInit)(); - void (*mFreeChildren)(); - - BCCScriptRef mBccScript; - - bcinfo::MetadataExtractor *ME; - - InvokeFunc_t *mInvokeFunctions; - ForEachFunc_t *mForEachFunctions; - void ** mFieldAddress; - bool * mFieldIsObject; - const uint32_t *mExportForEachSignatureList; - - const uint8_t * mScriptText; - uint32_t mScriptTextLength; -}; - -typedef void (*outer_foreach_t)( - const android::renderscript::RsForEachStubParamStruct *, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep); - -static Script * setTLS(Script *sc) { - ScriptTLSStruct * tls = (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey); - rsAssert(tls); - Script *old = tls->mScript; - tls->mScript = sc; - return old; -} - - -bool rsdScriptInit(const Context *rsc, - ScriptC *script, - char const *resName, - char const *cacheDir, - uint8_t const *bitcode, - size_t bitcodeSize, - uint32_t flags) { - //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc); - - pthread_mutex_lock(&rsdgInitMutex); - - size_t exportFuncCount = 0; - size_t exportVarCount = 0; - size_t objectSlotCount = 0; - size_t exportForEachSignatureCount = 0; - - DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript)); - if (drv == NULL) { - goto error; - } - script->mHal.drv = drv; - - drv->mBccScript = bccCreateScript(); - script->mHal.info.isThreadable = true; - drv->mScriptText = bitcode; - drv->mScriptTextLength = bitcodeSize; - - - drv->ME = new bcinfo::MetadataExtractor((const char*)drv->mScriptText, - drv->mScriptTextLength); - if (!drv->ME->extract()) { - ALOGE("bcinfo: failed to read script metadata"); - goto error; - } - - //ALOGE("mBccScript %p", script->mBccScript); - - if (bccRegisterSymbolCallback(drv->mBccScript, &rsdLookupRuntimeStub, script) != 0) { - ALOGE("bcc: FAILS to register symbol callback"); - goto error; - } - - if (bccReadBC(drv->mBccScript, - resName, - (char const *)drv->mScriptText, - drv->mScriptTextLength, 0) != 0) { - ALOGE("bcc: FAILS to read bitcode"); - goto error; - } - - if (bccLinkFile(drv->mBccScript, "/system/lib/libclcore.bc", 0) != 0) { - ALOGE("bcc: FAILS to link bitcode"); - goto error; - } - - if (bccPrepareExecutable(drv->mBccScript, cacheDir, resName, 0) != 0) { - ALOGE("bcc: FAILS to prepare executable"); - goto error; - } - - drv->mRoot = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root")); - drv->mRootExpand = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root.expand")); - drv->mInit = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, "init")); - drv->mFreeChildren = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, ".rs.dtor")); - - exportFuncCount = drv->ME->getExportFuncCount(); - if (exportFuncCount > 0) { - drv->mInvokeFunctions = (InvokeFunc_t*) calloc(exportFuncCount, - sizeof(InvokeFunc_t)); - bccGetExportFuncList(drv->mBccScript, exportFuncCount, - (void **) drv->mInvokeFunctions); - } else { - drv->mInvokeFunctions = NULL; - } - - exportVarCount = drv->ME->getExportVarCount(); - if (exportVarCount > 0) { - drv->mFieldAddress = (void **) calloc(exportVarCount, sizeof(void*)); - drv->mFieldIsObject = (bool *) calloc(exportVarCount, sizeof(bool)); - bccGetExportVarList(drv->mBccScript, exportVarCount, - (void **) drv->mFieldAddress); - } else { - drv->mFieldAddress = NULL; - drv->mFieldIsObject = NULL; - } - - objectSlotCount = drv->ME->getObjectSlotCount(); - if (objectSlotCount > 0) { - const uint32_t *objectSlotList = drv->ME->getObjectSlotList(); - for (uint32_t ct=0; ct < objectSlotCount; ct++) { - drv->mFieldIsObject[objectSlotList[ct]] = true; - } - } - - exportForEachSignatureCount = drv->ME->getExportForEachSignatureCount(); - drv->mExportForEachSignatureList = drv->ME->getExportForEachSignatureList(); - if (exportForEachSignatureCount > 0) { - drv->mForEachFunctions = - (ForEachFunc_t*) calloc(exportForEachSignatureCount, - sizeof(ForEachFunc_t)); - bccGetExportForEachList(drv->mBccScript, exportForEachSignatureCount, - (void **) drv->mForEachFunctions); - } else { - drv->mForEachFunctions = NULL; - } - - // Copy info over to runtime - script->mHal.info.exportedFunctionCount = drv->ME->getExportFuncCount(); - script->mHal.info.exportedVariableCount = drv->ME->getExportVarCount(); - script->mHal.info.exportedPragmaCount = drv->ME->getPragmaCount(); - script->mHal.info.exportedPragmaKeyList = drv->ME->getPragmaKeyList(); - script->mHal.info.exportedPragmaValueList = drv->ME->getPragmaValueList(); - - if (drv->mRootExpand) { - script->mHal.info.root = drv->mRootExpand; - } else { - script->mHal.info.root = drv->mRoot; - } - - pthread_mutex_unlock(&rsdgInitMutex); - return true; - -error: - - pthread_mutex_unlock(&rsdgInitMutex); - if (drv->ME) { - delete drv->ME; - drv->ME = NULL; - } - free(drv); - return false; - -} - -typedef struct { - Context *rsc; - Script *script; - ForEachFunc_t kernel; - uint32_t sig; - const Allocation * ain; - Allocation * aout; - const void * usr; - size_t usrLen; - - uint32_t mSliceSize; - volatile int mSliceNum; - - const uint8_t *ptrIn; - uint32_t eStrideIn; - uint8_t *ptrOut; - uint32_t eStrideOut; - - uint32_t xStart; - uint32_t xEnd; - uint32_t yStart; - uint32_t yEnd; - uint32_t zStart; - uint32_t zEnd; - uint32_t arrayStart; - uint32_t arrayEnd; - - uint32_t dimX; - uint32_t dimY; - uint32_t dimZ; - uint32_t dimArray; -} MTLaunchStruct; -typedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t); - -static void wc_xy(void *usr, uint32_t idx) { - MTLaunchStruct *mtls = (MTLaunchStruct *)usr; - RsForEachStubParamStruct p; - memset(&p, 0, sizeof(p)); - p.usr = mtls->usr; - p.usr_len = mtls->usrLen; - RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv; - uint32_t sig = mtls->sig; - - outer_foreach_t fn = (outer_foreach_t) mtls->kernel; - while (1) { - uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum); - uint32_t yStart = mtls->yStart + slice * mtls->mSliceSize; - uint32_t yEnd = yStart + mtls->mSliceSize; - yEnd = rsMin(yEnd, mtls->yEnd); - if (yEnd <= yStart) { - return; - } - - //ALOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd); - //ALOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut); - for (p.y = yStart; p.y < yEnd; p.y++) { - uint32_t offset = mtls->dimX * p.y; - p.out = mtls->ptrOut + (mtls->eStrideOut * offset); - p.in = mtls->ptrIn + (mtls->eStrideIn * offset); - fn(&p, mtls->xStart, mtls->xEnd, mtls->eStrideIn, mtls->eStrideOut); - } - } -} - -static void wc_x(void *usr, uint32_t idx) { - MTLaunchStruct *mtls = (MTLaunchStruct *)usr; - RsForEachStubParamStruct p; - memset(&p, 0, sizeof(p)); - p.usr = mtls->usr; - p.usr_len = mtls->usrLen; - RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv; - uint32_t sig = mtls->sig; - - outer_foreach_t fn = (outer_foreach_t) mtls->kernel; - while (1) { - uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum); - uint32_t xStart = mtls->xStart + slice * mtls->mSliceSize; - uint32_t xEnd = xStart + mtls->mSliceSize; - xEnd = rsMin(xEnd, mtls->xEnd); - if (xEnd <= xStart) { - return; - } - - //ALOGE("usr slice %i idx %i, x %i,%i", slice, idx, xStart, xEnd); - //ALOGE("usr ptr in %p, out %p", mtls->ptrIn, mtls->ptrOut); - - p.out = mtls->ptrOut + (mtls->eStrideOut * xStart); - p.in = mtls->ptrIn + (mtls->eStrideIn * xStart); - fn(&p, xStart, xEnd, mtls->eStrideIn, mtls->eStrideOut); - } -} - -void rsdScriptInvokeForEach(const Context *rsc, - Script *s, - uint32_t slot, - const Allocation * ain, - Allocation * aout, - const void * usr, - uint32_t usrLen, - const RsScriptCall *sc) { - - RsdHal * dc = (RsdHal *)rsc->mHal.drv; - - MTLaunchStruct mtls; - memset(&mtls, 0, sizeof(mtls)); - - DrvScript *drv = (DrvScript *)s->mHal.drv; - mtls.kernel = drv->mForEachFunctions[slot]; - rsAssert(mtls.kernel != NULL); - mtls.sig = 0x1f; // temp fix for old apps, full table in slang_rs_export_foreach.cpp - if (drv->mExportForEachSignatureList) { - mtls.sig = drv->mExportForEachSignatureList[slot]; - } - if (ain) { - mtls.dimX = ain->getType()->getDimX(); - mtls.dimY = ain->getType()->getDimY(); - mtls.dimZ = ain->getType()->getDimZ(); - //mtls.dimArray = ain->getType()->getDimArray(); - } else if (aout) { - mtls.dimX = aout->getType()->getDimX(); - mtls.dimY = aout->getType()->getDimY(); - mtls.dimZ = aout->getType()->getDimZ(); - //mtls.dimArray = aout->getType()->getDimArray(); - } else { - rsc->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); - return; - } - - if (!sc || (sc->xEnd == 0)) { - mtls.xEnd = mtls.dimX; - } else { - rsAssert(sc->xStart < mtls.dimX); - rsAssert(sc->xEnd <= mtls.dimX); - rsAssert(sc->xStart < sc->xEnd); - mtls.xStart = rsMin(mtls.dimX, sc->xStart); - mtls.xEnd = rsMin(mtls.dimX, sc->xEnd); - if (mtls.xStart >= mtls.xEnd) return; - } - - if (!sc || (sc->yEnd == 0)) { - mtls.yEnd = mtls.dimY; - } else { - rsAssert(sc->yStart < mtls.dimY); - rsAssert(sc->yEnd <= mtls.dimY); - rsAssert(sc->yStart < sc->yEnd); - mtls.yStart = rsMin(mtls.dimY, sc->yStart); - mtls.yEnd = rsMin(mtls.dimY, sc->yEnd); - if (mtls.yStart >= mtls.yEnd) return; - } - - mtls.xEnd = rsMax((uint32_t)1, mtls.xEnd); - mtls.yEnd = rsMax((uint32_t)1, mtls.yEnd); - mtls.zEnd = rsMax((uint32_t)1, mtls.zEnd); - mtls.arrayEnd = rsMax((uint32_t)1, mtls.arrayEnd); - - rsAssert(!ain || (ain->getType()->getDimZ() == 0)); - - Context *mrsc = (Context *)rsc; - Script * oldTLS = setTLS(s); - - mtls.rsc = mrsc; - mtls.ain = ain; - mtls.aout = aout; - mtls.script = s; - mtls.usr = usr; - mtls.usrLen = usrLen; - mtls.mSliceSize = 10; - mtls.mSliceNum = 0; - - mtls.ptrIn = NULL; - mtls.eStrideIn = 0; - if (ain) { - mtls.ptrIn = (const uint8_t *)ain->getPtr(); - mtls.eStrideIn = ain->getType()->getElementSizeBytes(); - } - - mtls.ptrOut = NULL; - mtls.eStrideOut = 0; - if (aout) { - mtls.ptrOut = (uint8_t *)aout->getPtr(); - mtls.eStrideOut = aout->getType()->getElementSizeBytes(); - } - - if ((dc->mWorkers.mCount > 1) && s->mHal.info.isThreadable) { - if (mtls.dimY > 1) { - rsdLaunchThreads(mrsc, wc_xy, &mtls); - } else { - rsdLaunchThreads(mrsc, wc_x, &mtls); - } - - //ALOGE("launch 1"); - } else { - RsForEachStubParamStruct p; - memset(&p, 0, sizeof(p)); - p.usr = mtls.usr; - p.usr_len = mtls.usrLen; - uint32_t sig = mtls.sig; - - //ALOGE("launch 3"); - outer_foreach_t fn = (outer_foreach_t) mtls.kernel; - for (p.ar[0] = mtls.arrayStart; p.ar[0] < mtls.arrayEnd; p.ar[0]++) { - for (p.z = mtls.zStart; p.z < mtls.zEnd; p.z++) { - for (p.y = mtls.yStart; p.y < mtls.yEnd; p.y++) { - uint32_t offset = mtls.dimX * mtls.dimY * mtls.dimZ * p.ar[0] + - mtls.dimX * mtls.dimY * p.z + - mtls.dimX * p.y; - p.out = mtls.ptrOut + (mtls.eStrideOut * offset); - p.in = mtls.ptrIn + (mtls.eStrideIn * offset); - fn(&p, mtls.xStart, mtls.xEnd, mtls.eStrideIn, - mtls.eStrideOut); - } - } - } - } - - setTLS(oldTLS); -} - - -int rsdScriptInvokeRoot(const Context *dc, Script *script) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - - Script * oldTLS = setTLS(script); - int ret = drv->mRoot(); - setTLS(oldTLS); - - return ret; -} - -void rsdScriptInvokeInit(const Context *dc, Script *script) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - - if (drv->mInit) { - drv->mInit(); - } -} - -void rsdScriptInvokeFreeChildren(const Context *dc, Script *script) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - - if (drv->mFreeChildren) { - drv->mFreeChildren(); - } -} - -void rsdScriptInvokeFunction(const Context *dc, Script *script, - uint32_t slot, - const void *params, - size_t paramLength) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength); - - Script * oldTLS = setTLS(script); - ((void (*)(const void *, uint32_t)) - drv->mInvokeFunctions[slot])(params, paramLength); - setTLS(oldTLS); -} - -void rsdScriptSetGlobalVar(const Context *dc, const Script *script, - uint32_t slot, void *data, size_t dataLength) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - //rsAssert(!script->mFieldIsObject[slot]); - //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength); - - int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot]; - if (!destPtr) { - //ALOGV("Calling setVar on slot = %i which is null", slot); - return; - } - - memcpy(destPtr, data, dataLength); -} - -void rsdScriptSetGlobalBind(const Context *dc, const Script *script, uint32_t slot, void *data) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - //rsAssert(!script->mFieldIsObject[slot]); - //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data); - - int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot]; - if (!destPtr) { - //ALOGV("Calling setVar on slot = %i which is null", slot); - return; - } - - memcpy(destPtr, &data, sizeof(void *)); -} - -void rsdScriptSetGlobalObj(const Context *dc, const Script *script, uint32_t slot, ObjectBase *data) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - //rsAssert(script->mFieldIsObject[slot]); - //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data); - - int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot]; - if (!destPtr) { - //ALOGV("Calling setVar on slot = %i which is null", slot); - return; - } - - rsrSetObject(dc, script, (ObjectBase **)destPtr, data); -} - -void rsdScriptDestroy(const Context *dc, Script *script) { - DrvScript *drv = (DrvScript *)script->mHal.drv; - - if (drv->mFieldAddress) { - size_t exportVarCount = drv->ME->getExportVarCount(); - for (size_t ct = 0; ct < exportVarCount; ct++) { - if (drv->mFieldIsObject[ct]) { - // The field address can be NULL if the script-side has - // optimized the corresponding global variable away. - if (drv->mFieldAddress[ct]) { - rsrClearObject(dc, script, (ObjectBase **)drv->mFieldAddress[ct]); - } - } - } - free(drv->mFieldAddress); - drv->mFieldAddress = NULL; - free(drv->mFieldIsObject); - drv->mFieldIsObject = NULL; } - - if (drv->mInvokeFunctions) { - free(drv->mInvokeFunctions); - drv->mInvokeFunctions = NULL; - } - - if (drv->mForEachFunctions) { - free(drv->mForEachFunctions); - drv->mForEachFunctions = NULL; - } - - delete drv->ME; - drv->ME = NULL; - - free(drv); - script->mHal.drv = NULL; - -} - - diff --git a/libs/rs/driver/rsdBcc.h b/libs/rs/driver/rsdBcc.h deleted file mode 100644 index 5f83ed2..0000000 --- a/libs/rs/driver/rsdBcc.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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_BCC_H -#define RSD_BCC_H - -#include <rs_hal.h> -#include <rsRuntime.h> - - -bool rsdScriptInit(const android::renderscript::Context *, android::renderscript::ScriptC *, - char const *resName, char const *cacheDir, - uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags); -void rsdScriptInvokeFunction(const android::renderscript::Context *dc, - android::renderscript::Script *script, - uint32_t slot, - const void *params, - size_t paramLength); - -void rsdScriptInvokeForEach(const android::renderscript::Context *rsc, - android::renderscript::Script *s, - uint32_t slot, - const android::renderscript::Allocation * ain, - android::renderscript::Allocation * aout, - const void * usr, - uint32_t usrLen, - const RsScriptCall *sc); - -int rsdScriptInvokeRoot(const android::renderscript::Context *dc, - android::renderscript::Script *script); -void rsdScriptInvokeInit(const android::renderscript::Context *dc, - android::renderscript::Script *script); -void rsdScriptInvokeFreeChildren(const android::renderscript::Context *dc, - android::renderscript::Script *script); - -void rsdScriptSetGlobalVar(const android::renderscript::Context *, - const android::renderscript::Script *, - uint32_t slot, void *data, size_t dataLen); -void rsdScriptSetGlobalBind(const android::renderscript::Context *, - const android::renderscript::Script *, - uint32_t slot, void *data); -void rsdScriptSetGlobalObj(const android::renderscript::Context *, - const android::renderscript::Script *, - uint32_t slot, android::renderscript::ObjectBase *data); - -void rsdScriptSetGlobal(const android::renderscript::Context *dc, - const android::renderscript::Script *script, - uint32_t slot, - void *data, - size_t dataLength); -void rsdScriptGetGlobal(const android::renderscript::Context *dc, - const android::renderscript::Script *script, - uint32_t slot, - void *data, - size_t dataLength); -void rsdScriptDestroy(const android::renderscript::Context *dc, - android::renderscript::Script *script); - - -#endif diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp deleted file mode 100644 index 6a532e9..0000000 --- a/libs/rs/driver/rsdCore.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (C) 2011-2012 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 "rsdCore.h" -#include "rsdAllocation.h" -#include "rsdBcc.h" -#include "rsdGL.h" -#include "rsdPath.h" -#include "rsdProgramStore.h" -#include "rsdProgramRaster.h" -#include "rsdProgramVertex.h" -#include "rsdProgramFragment.h" -#include "rsdMesh.h" -#include "rsdSampler.h" -#include "rsdFrameBuffer.h" - -#include <malloc.h> -#include "rsContext.h" - -#include <sys/types.h> -#include <sys/resource.h> -#include <sched.h> -#include <cutils/properties.h> -#include <sys/syscall.h> -#include <string.h> -#include <bcc/bcc.h> - -using namespace android; -using namespace android::renderscript; - -static void Shutdown(Context *rsc); -static void SetPriority(const Context *rsc, int32_t priority); - -static RsdHalFunctions FunctionTable = { - rsdGLInit, - rsdGLShutdown, - rsdGLSetSurface, - rsdGLSwap, - - Shutdown, - NULL, - SetPriority, - { - rsdScriptInit, - rsdScriptInvokeFunction, - rsdScriptInvokeRoot, - rsdScriptInvokeForEach, - rsdScriptInvokeInit, - rsdScriptInvokeFreeChildren, - rsdScriptSetGlobalVar, - rsdScriptSetGlobalBind, - rsdScriptSetGlobalObj, - rsdScriptDestroy - }, - - { - rsdAllocationInit, - rsdAllocationDestroy, - rsdAllocationResize, - rsdAllocationSyncAll, - rsdAllocationMarkDirty, - rsdAllocationInitSurfaceTexture, - rsdAllocationSetSurfaceTexture, - rsdAllocationIoSend, - rsdAllocationIoReceive, - rsdAllocationData1D, - rsdAllocationData2D, - rsdAllocationData3D, - rsdAllocationData1D_alloc, - rsdAllocationData2D_alloc, - rsdAllocationData3D_alloc, - rsdAllocationElementData1D, - rsdAllocationElementData2D - }, - - - { - rsdProgramStoreInit, - rsdProgramStoreSetActive, - rsdProgramStoreDestroy - }, - - { - rsdProgramRasterInit, - rsdProgramRasterSetActive, - rsdProgramRasterDestroy - }, - - { - rsdProgramVertexInit, - rsdProgramVertexSetActive, - rsdProgramVertexDestroy - }, - - { - rsdProgramFragmentInit, - rsdProgramFragmentSetActive, - rsdProgramFragmentDestroy - }, - - { - rsdMeshInit, - rsdMeshDraw, - rsdMeshDestroy - }, - - { - rsdPathInitStatic, - rsdPathInitDynamic, - rsdPathDraw, - rsdPathDestroy - }, - - { - rsdSamplerInit, - rsdSamplerDestroy - }, - - { - rsdFrameBufferInit, - rsdFrameBufferSetActive, - rsdFrameBufferDestroy - }, - -}; - -pthread_key_t rsdgThreadTLSKey = 0; -uint32_t rsdgThreadTLSKeyCount = 0; -pthread_mutex_t rsdgInitMutex = PTHREAD_MUTEX_INITIALIZER; - - -static void * HelperThreadProc(void *vrsc) { - Context *rsc = static_cast<Context *>(vrsc); - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - - uint32_t idx = (uint32_t)android_atomic_inc(&dc->mWorkers.mLaunchCount); - - //ALOGV("RS helperThread starting %p idx=%i", rsc, idx); - - dc->mWorkers.mLaunchSignals[idx].init(); - dc->mWorkers.mNativeThreadId[idx] = gettid(); - - int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct); - if (status) { - ALOGE("pthread_setspecific %i", status); - } - -#if 0 - typedef struct {uint64_t bits[1024 / 64]; } cpu_set_t; - cpu_set_t cpuset; - memset(&cpuset, 0, sizeof(cpuset)); - cpuset.bits[idx / 64] |= 1ULL << (idx % 64); - int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx], - sizeof(cpuset), &cpuset); - ALOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret)); -#endif - - while (!dc->mExit) { - dc->mWorkers.mLaunchSignals[idx].wait(); - if (dc->mWorkers.mLaunchCallback) { - dc->mWorkers.mLaunchCallback(dc->mWorkers.mLaunchData, idx); - } - android_atomic_dec(&dc->mWorkers.mRunningCount); - dc->mWorkers.mCompleteSignal.set(); - } - - //ALOGV("RS helperThread exited %p idx=%i", rsc, idx); - return NULL; -} - -void rsdLaunchThreads(Context *rsc, WorkerCallback_t cbk, void *data) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - dc->mWorkers.mLaunchData = data; - dc->mWorkers.mLaunchCallback = cbk; - android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount); - for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) { - dc->mWorkers.mLaunchSignals[ct].set(); - } - while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) { - dc->mWorkers.mCompleteSignal.wait(); - } -} - -bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) { - rsc->mHal.funcs = FunctionTable; - - RsdHal *dc = (RsdHal *)calloc(1, sizeof(RsdHal)); - if (!dc) { - ALOGE("Calloc for driver hal failed."); - return false; - } - rsc->mHal.drv = dc; - - pthread_mutex_lock(&rsdgInitMutex); - if (!rsdgThreadTLSKeyCount) { - int status = pthread_key_create(&rsdgThreadTLSKey, NULL); - if (status) { - ALOGE("Failed to init thread tls key."); - pthread_mutex_unlock(&rsdgInitMutex); - return false; - } - } - rsdgThreadTLSKeyCount++; - pthread_mutex_unlock(&rsdgInitMutex); - - dc->mTlsStruct.mContext = rsc; - dc->mTlsStruct.mScript = NULL; - int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct); - if (status) { - ALOGE("pthread_setspecific %i", status); - } - - - int cpu = sysconf(_SC_NPROCESSORS_ONLN); - if(rsc->props.mDebugMaxThreads && (cpu > (int)rsc->props.mDebugMaxThreads)) { - cpu = rsc->props.mDebugMaxThreads; - } - if (cpu < 2) { - cpu = 0; - } - ALOGV("%p Launching thread(s), CPUs %i", rsc, cpu); - - dc->mWorkers.mCount = (uint32_t)cpu; - dc->mWorkers.mThreadId = (pthread_t *) calloc(dc->mWorkers.mCount, sizeof(pthread_t)); - dc->mWorkers.mNativeThreadId = (pid_t *) calloc(dc->mWorkers.mCount, sizeof(pid_t)); - dc->mWorkers.mLaunchSignals = new Signal[dc->mWorkers.mCount]; - dc->mWorkers.mLaunchCallback = NULL; - - dc->mWorkers.mCompleteSignal.init(); - - android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount); - android_atomic_release_store(0, &dc->mWorkers.mLaunchCount); - - pthread_attr_t threadAttr; - status = pthread_attr_init(&threadAttr); - if (status) { - ALOGE("Failed to init thread attribute."); - return false; - } - - for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) { - status = pthread_create(&dc->mWorkers.mThreadId[ct], &threadAttr, HelperThreadProc, rsc); - if (status) { - dc->mWorkers.mCount = ct; - ALOGE("Created fewer than expected number of RS threads."); - break; - } - } - while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) { - usleep(100); - } - - pthread_attr_destroy(&threadAttr); - return true; -} - - -void SetPriority(const Context *rsc, int32_t priority) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) { - setpriority(PRIO_PROCESS, dc->mWorkers.mNativeThreadId[ct], priority); - } - if (dc->mHasGraphics) { - rsdGLSetPriority(rsc, priority); - } -} - -void Shutdown(Context *rsc) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - dc->mExit = true; - dc->mWorkers.mLaunchData = NULL; - dc->mWorkers.mLaunchCallback = NULL; - android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount); - for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) { - dc->mWorkers.mLaunchSignals[ct].set(); - } - int status; - void *res; - for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) { - status = pthread_join(dc->mWorkers.mThreadId[ct], &res); - } - rsAssert(android_atomic_acquire_load(&dc->mWorkers.mRunningCount) == 0); - - // Global structure cleanup. - pthread_mutex_lock(&rsdgInitMutex); - --rsdgThreadTLSKeyCount; - if (!rsdgThreadTLSKeyCount) { - pthread_key_delete(rsdgThreadTLSKey); - } - pthread_mutex_unlock(&rsdgInitMutex); - -} - diff --git a/libs/rs/driver/rsdCore.h b/libs/rs/driver/rsdCore.h deleted file mode 100644 index 05ca13bb..0000000 --- a/libs/rs/driver/rsdCore.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2011-2012 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_CORE_H -#define RSD_CORE_H - -#include <rs_hal.h> - -#include "rsMutex.h" -#include "rsSignal.h" - -#include "rsdGL.h" - -typedef void (* InvokeFunc_t)(void); -typedef void (* ForEachFunc_t)(void); -typedef void (*WorkerCallback_t)(void *usr, uint32_t idx); - -typedef struct RsdSymbolTableRec { - const char * mName; - void * mPtr; - bool threadable; -} RsdSymbolTable; - -typedef struct ScriptTLSStructRec { - android::renderscript::Context * mContext; - android::renderscript::Script * mScript; -} ScriptTLSStruct; - -typedef struct RsdHalRec { - uint32_t version_major; - uint32_t version_minor; - bool mHasGraphics; - - struct Workers { - volatile int mRunningCount; - volatile int mLaunchCount; - uint32_t mCount; - pthread_t *mThreadId; - pid_t *mNativeThreadId; - android::renderscript::Signal mCompleteSignal; - - android::renderscript::Signal *mLaunchSignals; - WorkerCallback_t mLaunchCallback; - void *mLaunchData; - }; - Workers mWorkers; - bool mExit; - - ScriptTLSStruct mTlsStruct; - - RsdGL gl; -} RsdHal; - -extern pthread_key_t rsdgThreadTLSKey; -extern uint32_t rsdgThreadTLSKeyCount; -extern pthread_mutex_t rsdgInitMutex; - - -void rsdLaunchThreads(android::renderscript::Context *rsc, WorkerCallback_t cbk, void *data); - -#endif - diff --git a/libs/rs/driver/rsdFrameBuffer.cpp b/libs/rs/driver/rsdFrameBuffer.cpp deleted file mode 100644 index bb07d29..0000000 --- a/libs/rs/driver/rsdFrameBuffer.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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 "rsdCore.h" -#include "rsdFrameBuffer.h" -#include "rsdFrameBufferObj.h" -#include "rsdAllocation.h" - -#include "rsContext.h" -#include "rsFBOCache.h" - -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - -using namespace android; -using namespace android::renderscript; - -void setDepthAttachment(const Context *rsc, const FBOCache *fb) { - RsdFrameBufferObj *fbo = (RsdFrameBufferObj*)fb->mHal.drv; - - DrvAllocation *depth = NULL; - if (fb->mHal.state.depthTarget != NULL) { - depth = (DrvAllocation *)fb->mHal.state.depthTarget->mHal.drv; - - if (depth->uploadDeferred) { - rsdAllocationSyncAll(rsc, fb->mHal.state.depthTarget, - RS_ALLOCATION_USAGE_SCRIPT); - } - } - fbo->setDepthTarget(depth); -} - -void setColorAttachment(const Context *rsc, const FBOCache *fb) { - RsdFrameBufferObj *fbo = (RsdFrameBufferObj*)fb->mHal.drv; - // Now attach color targets - for (uint32_t i = 0; i < fb->mHal.state.colorTargetsCount; i ++) { - DrvAllocation *color = NULL; - if (fb->mHal.state.colorTargets[i] != NULL) { - color = (DrvAllocation *)fb->mHal.state.colorTargets[i]->mHal.drv; - - if (color->uploadDeferred) { - rsdAllocationSyncAll(rsc, fb->mHal.state.colorTargets[i], - RS_ALLOCATION_USAGE_SCRIPT); - } - } - fbo->setColorTarget(color, i); - } -} - -bool rsdFrameBufferInit(const Context *rsc, const FBOCache *fb) { - RsdFrameBufferObj *fbo = new RsdFrameBufferObj(); - if (fbo == NULL) { - return false; - } - fb->mHal.drv = fbo; - - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - dc->gl.currentFrameBuffer = fbo; - - return true; -} - -void rsdFrameBufferSetActive(const Context *rsc, const FBOCache *fb) { - setDepthAttachment(rsc, fb); - setColorAttachment(rsc, fb); - - RsdFrameBufferObj *fbo = (RsdFrameBufferObj *)fb->mHal.drv; - if (fb->mHal.state.colorTargets[0]) { - fbo->setDimensions(fb->mHal.state.colorTargets[0]->getType()->getDimX(), - fb->mHal.state.colorTargets[0]->getType()->getDimY()); - } else if (fb->mHal.state.depthTarget) { - fbo->setDimensions(fb->mHal.state.depthTarget->getType()->getDimX(), - fb->mHal.state.depthTarget->getType()->getDimY()); - } - - fbo->setActive(rsc); -} - -void rsdFrameBufferDestroy(const Context *rsc, const FBOCache *fb) { - RsdFrameBufferObj *fbo = (RsdFrameBufferObj *)fb->mHal.drv; - delete fbo; - fb->mHal.drv = NULL; -} - - diff --git a/libs/rs/driver/rsdFrameBuffer.h b/libs/rs/driver/rsdFrameBuffer.h deleted file mode 100644 index dec59fc..0000000 --- a/libs/rs/driver/rsdFrameBuffer.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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_FRAME_BUFFER_H -#define RSD_FRAME_BUFFER_H - -#include <rs_hal.h> - -bool rsdFrameBufferInit(const android::renderscript::Context *rsc, - const android::renderscript::FBOCache *fb); -void rsdFrameBufferSetActive(const android::renderscript::Context *rsc, - const android::renderscript::FBOCache *fb); -void rsdFrameBufferDestroy(const android::renderscript::Context *rsc, - const android::renderscript::FBOCache *fb); - - -#endif // RSD_FRAME_BUFFER_H diff --git a/libs/rs/driver/rsdFrameBufferObj.cpp b/libs/rs/driver/rsdFrameBufferObj.cpp deleted file mode 100644 index 91452b0..0000000 --- a/libs/rs/driver/rsdFrameBufferObj.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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 "rsdFrameBufferObj.h" -#include "rsdAllocation.h" -#include "rsdGL.h" - -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - -using namespace android; -using namespace android::renderscript; - -RsdFrameBufferObj::RsdFrameBufferObj() { - mFBOId = 0; - mWidth = 0; - mHeight = 0; - mColorTargetsCount = 1; - mColorTargets = new DrvAllocation*[mColorTargetsCount]; - for (uint32_t i = 0; i < mColorTargetsCount; i ++) { - mColorTargets[i] = 0; - } - mDepthTarget = NULL; - mDirty = true; -} - -RsdFrameBufferObj::~RsdFrameBufferObj() { - if(mFBOId != 0) { - glDeleteFramebuffers(1, &mFBOId); - } - delete [] mColorTargets; -} - -void RsdFrameBufferObj::checkError(const Context *rsc) { - GLenum status; - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - switch (status) { - case GL_FRAMEBUFFER_COMPLETE: - break; - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: - rsc->setError(RS_ERROR_BAD_VALUE, - "Unable to set up render Target: RFRAMEBUFFER_INCOMPLETE_ATTACHMENT"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: - rsc->setError(RS_ERROR_BAD_VALUE, - "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"); - break; - case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: - rsc->setError(RS_ERROR_BAD_VALUE, - "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"); - break; - case GL_FRAMEBUFFER_UNSUPPORTED: - rsc->setError(RS_ERROR_BAD_VALUE, - "Unable to set up render Target: GL_FRAMEBUFFER_UNSUPPORTED"); - break; - } -} - - -void RsdFrameBufferObj::setDepthAttachment() { - if (mDepthTarget != NULL) { - if (mDepthTarget->textureID) { - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_TEXTURE_2D, mDepthTarget->textureID, 0); - } else { - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, mDepthTarget->renderTargetID); - } - } else { - // Reset last attachment - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); - } -} - -void RsdFrameBufferObj::setColorAttachment() { - // Now attach color targets - for (uint32_t i = 0; i < mColorTargetsCount; i ++) { - if (mColorTargets[i] != NULL) { - if (mColorTargets[i]->textureID) { - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, - GL_TEXTURE_2D, mColorTargets[i]->textureID, 0); - } else { - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, - GL_RENDERBUFFER, mColorTargets[i]->renderTargetID); - } - } else { - // Reset last attachment - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, - GL_RENDERBUFFER, 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, - GL_TEXTURE_2D, 0, 0); - } - } -} - -bool RsdFrameBufferObj::renderToFramebuffer() { - if (mDepthTarget != NULL) { - return false; - } - - for (uint32_t i = 0; i < mColorTargetsCount; i ++) { - if (mColorTargets[i] != NULL) { - return false; - } - } - return true; -} - -void RsdFrameBufferObj::setActive(const Context *rsc) { - bool framebuffer = renderToFramebuffer(); - if (!framebuffer) { - if(mFBOId == 0) { - RSD_CALL_GL(glGenFramebuffers, 1, &mFBOId); - } - RSD_CALL_GL(glBindFramebuffer, GL_FRAMEBUFFER, mFBOId); - - if (mDirty) { - setDepthAttachment(); - setColorAttachment(); - mDirty = false; - } - - RSD_CALL_GL(glViewport, 0, 0, mWidth, mHeight); - checkError(rsc); - } else { - RSD_CALL_GL(glBindFramebuffer, GL_FRAMEBUFFER, 0); - RSD_CALL_GL(glViewport, 0, 0, rsc->getWidth(), rsc->getHeight()); - } -} diff --git a/libs/rs/driver/rsdFrameBufferObj.h b/libs/rs/driver/rsdFrameBufferObj.h deleted file mode 100644 index c6e7deb..0000000 --- a/libs/rs/driver/rsdFrameBufferObj.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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_FRAMEBUFFER_OBJ_H_ -#define _RSD_FRAMEBUFFER_OBJ_H_ - -#include <rsContext.h> - -class DrvAllocation; - -class RsdFrameBufferObj { -public: - RsdFrameBufferObj(); - ~RsdFrameBufferObj(); - - void setActive(const android::renderscript::Context *rsc); - void setColorTarget(DrvAllocation *color, uint32_t index) { - mColorTargets[index] = color; - mDirty = true; - } - void setDepthTarget(DrvAllocation *depth) { - mDepthTarget = depth; - mDirty = true; - } - void setDimensions(uint32_t width, uint32_t height) { - mWidth = width; - mHeight = height; - } -protected: - uint32_t mFBOId; - DrvAllocation **mColorTargets; - uint32_t mColorTargetsCount; - DrvAllocation *mDepthTarget; - - uint32_t mWidth; - uint32_t mHeight; - - bool mDirty; - - bool renderToFramebuffer(); - void checkError(const android::renderscript::Context *rsc); - void setColorAttachment(); - void setDepthAttachment(); -}; - -#endif //_RSD_FRAMEBUFFER_STATE_H_ diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp deleted file mode 100644 index 0860417..0000000 --- a/libs/rs/driver/rsdGL.cpp +++ /dev/null @@ -1,546 +0,0 @@ -/* - * 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 <ui/FramebufferNativeWindow.h> -#include <ui/PixelFormat.h> - -#include <system/window.h> - -#include <sys/types.h> -#include <sys/resource.h> -#include <sched.h> - -#include <cutils/properties.h> - -#include <GLES/gl.h> -#include <GLES/glext.h> -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - -#include <string.h> - -#include "rsdCore.h" -#include "rsdGL.h" - -#include <malloc.h> -#include "rsContext.h" -#include "rsDevice.h" -#include "rsdShaderCache.h" -#include "rsdVertexArray.h" -#include "rsdFrameBufferObj.h" - -#include <gui/SurfaceTextureClient.h> -#include <gui/DummyConsumer.h> - -using namespace android; -using namespace android::renderscript; - -static int32_t gGLContextCount = 0; - -static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) { - struct EGLUtils { - static const char *strerror(EGLint err) { - switch (err){ - case EGL_SUCCESS: return "EGL_SUCCESS"; - case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; - case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; - case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; - case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; - case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; - case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; - case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; - case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; - case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; - case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; - case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; - case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; - case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; - case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; - default: return "UNKNOWN"; - } - } - }; - - if (returnVal != EGL_TRUE) { - fprintf(stderr, "%s() returned %d\n", op, returnVal); - } - - for (EGLint error = eglGetError(); error != EGL_SUCCESS; error - = eglGetError()) { - fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error), - error); - } -} - -static void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) { - -#define X(VAL) {VAL, #VAL} - struct {EGLint attribute; const char* name;} names[] = { - X(EGL_BUFFER_SIZE), - X(EGL_ALPHA_SIZE), - X(EGL_BLUE_SIZE), - X(EGL_GREEN_SIZE), - X(EGL_RED_SIZE), - X(EGL_DEPTH_SIZE), - X(EGL_STENCIL_SIZE), - X(EGL_CONFIG_CAVEAT), - X(EGL_CONFIG_ID), - X(EGL_LEVEL), - X(EGL_MAX_PBUFFER_HEIGHT), - X(EGL_MAX_PBUFFER_PIXELS), - X(EGL_MAX_PBUFFER_WIDTH), - X(EGL_NATIVE_RENDERABLE), - X(EGL_NATIVE_VISUAL_ID), - X(EGL_NATIVE_VISUAL_TYPE), - X(EGL_SAMPLES), - X(EGL_SAMPLE_BUFFERS), - X(EGL_SURFACE_TYPE), - X(EGL_TRANSPARENT_TYPE), - X(EGL_TRANSPARENT_RED_VALUE), - X(EGL_TRANSPARENT_GREEN_VALUE), - X(EGL_TRANSPARENT_BLUE_VALUE), - X(EGL_BIND_TO_TEXTURE_RGB), - X(EGL_BIND_TO_TEXTURE_RGBA), - X(EGL_MIN_SWAP_INTERVAL), - X(EGL_MAX_SWAP_INTERVAL), - X(EGL_LUMINANCE_SIZE), - X(EGL_ALPHA_MASK_SIZE), - X(EGL_COLOR_BUFFER_TYPE), - X(EGL_RENDERABLE_TYPE), - X(EGL_CONFORMANT), - }; -#undef X - - for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) { - EGLint value = -1; - EGLBoolean returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value); - if (returnVal) { - ALOGV(" %s: %d (0x%x)", names[j].name, value, value); - } - } -} - -static void DumpDebug(RsdHal *dc) { - ALOGE(" EGL ver %i %i", dc->gl.egl.majorVersion, dc->gl.egl.minorVersion); - ALOGE(" EGL context %p surface %p, Display=%p", dc->gl.egl.context, dc->gl.egl.surface, - dc->gl.egl.display); - ALOGE(" GL vendor: %s", dc->gl.gl.vendor); - ALOGE(" GL renderer: %s", dc->gl.gl.renderer); - ALOGE(" GL Version: %s", dc->gl.gl.version); - ALOGE(" GL Extensions: %s", dc->gl.gl.extensions); - ALOGE(" GL int Versions %i %i", dc->gl.gl.majorVersion, dc->gl.gl.minorVersion); - - ALOGV("MAX Textures %i, %i %i", dc->gl.gl.maxVertexTextureUnits, - dc->gl.gl.maxFragmentTextureImageUnits, dc->gl.gl.maxTextureImageUnits); - ALOGV("MAX Attribs %i", dc->gl.gl.maxVertexAttribs); - ALOGV("MAX Uniforms %i, %i", dc->gl.gl.maxVertexUniformVectors, - dc->gl.gl.maxFragmentUniformVectors); - ALOGV("MAX Varyings %i", dc->gl.gl.maxVaryingVectors); -} - -void rsdGLShutdown(const Context *rsc) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - dc->gl.shaderCache->cleanupAll(); - delete dc->gl.shaderCache; - delete dc->gl.vertexArrayState; - - if (dc->gl.egl.context != EGL_NO_CONTEXT) { - RSD_CALL_GL(eglMakeCurrent, dc->gl.egl.display, - EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surfaceDefault); - if (dc->gl.egl.surface != EGL_NO_SURFACE) { - RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surface); - } - RSD_CALL_GL(eglDestroyContext, dc->gl.egl.display, dc->gl.egl.context); - checkEglError("eglDestroyContext"); - } - - gGLContextCount--; - if (!gGLContextCount) { - RSD_CALL_GL(eglTerminate, dc->gl.egl.display); - } -} - -void getConfigData(const Context *rsc, - EGLint *configAttribs, size_t configAttribsLen, - uint32_t numSamples) { - memset(configAttribs, 0, configAttribsLen*sizeof(*configAttribs)); - - EGLint *configAttribsPtr = configAttribs; - - configAttribsPtr[0] = EGL_SURFACE_TYPE; - configAttribsPtr[1] = EGL_WINDOW_BIT; - configAttribsPtr += 2; - - configAttribsPtr[0] = EGL_RENDERABLE_TYPE; - configAttribsPtr[1] = EGL_OPENGL_ES2_BIT; - configAttribsPtr += 2; - - configAttribsPtr[0] = EGL_RED_SIZE; - configAttribsPtr[1] = 8; - configAttribsPtr += 2; - - configAttribsPtr[0] = EGL_GREEN_SIZE; - configAttribsPtr[1] = 8; - configAttribsPtr += 2; - - configAttribsPtr[0] = EGL_BLUE_SIZE; - configAttribsPtr[1] = 8; - configAttribsPtr += 2; - - if (rsc->mUserSurfaceConfig.alphaMin > 0) { - configAttribsPtr[0] = EGL_ALPHA_SIZE; - configAttribsPtr[1] = rsc->mUserSurfaceConfig.alphaMin; - configAttribsPtr += 2; - } - - if (rsc->mUserSurfaceConfig.depthMin > 0) { - configAttribsPtr[0] = EGL_DEPTH_SIZE; - configAttribsPtr[1] = rsc->mUserSurfaceConfig.depthMin; - configAttribsPtr += 2; - } - - if (rsc->mDev->mForceSW) { - configAttribsPtr[0] = EGL_CONFIG_CAVEAT; - configAttribsPtr[1] = EGL_SLOW_CONFIG; - configAttribsPtr += 2; - } - - if (numSamples > 1) { - configAttribsPtr[0] = EGL_SAMPLE_BUFFERS; - configAttribsPtr[1] = 1; - configAttribsPtr[2] = EGL_SAMPLES; - configAttribsPtr[3] = numSamples; - configAttribsPtr += 4; - } - - configAttribsPtr[0] = EGL_NONE; - rsAssert(configAttribsPtr < (configAttribs + configAttribsLen)); -} - -bool rsdGLInit(const Context *rsc) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - dc->gl.egl.numConfigs = -1; - - EGLint configAttribs[128]; - EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; - - ALOGV("%p initEGL start", rsc); - rsc->setWatchdogGL("eglGetDisplay", __LINE__, __FILE__); - dc->gl.egl.display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - checkEglError("eglGetDisplay"); - - RSD_CALL_GL(eglInitialize, dc->gl.egl.display, - &dc->gl.egl.majorVersion, &dc->gl.egl.minorVersion); - checkEglError("eglInitialize"); - - EGLBoolean ret; - - EGLint numConfigs = -1, n = 0; - rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__); - - // Try minding a multisample config that matches the user request - uint32_t minSample = rsc->mUserSurfaceConfig.samplesMin; - uint32_t prefSample = rsc->mUserSurfaceConfig.samplesPref; - for (uint32_t sampleCount = prefSample; sampleCount >= minSample; sampleCount--) { - getConfigData(rsc, configAttribs, (sizeof(configAttribs) / sizeof(EGLint)), sampleCount); - ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs); - checkEglError("eglGetConfigs", ret); - if (numConfigs > 0) { - break; - } - } - - eglSwapInterval(dc->gl.egl.display, 0); - - if (numConfigs) { - EGLConfig* const configs = new EGLConfig[numConfigs]; - - rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__); - ret = eglChooseConfig(dc->gl.egl.display, - configAttribs, configs, numConfigs, &n); - if (!ret || !n) { - checkEglError("eglChooseConfig", ret); - ALOGE("%p, couldn't find an EGLConfig matching the screen format\n", rsc); - } - - // The first config is guaranteed to over-satisfy the constraints - dc->gl.egl.config = configs[0]; - - // go through the list and skip configs that over-satisfy our needs - for (int i=0 ; i<n ; i++) { - if (rsc->mUserSurfaceConfig.alphaMin <= 0) { - EGLint alphaSize; - eglGetConfigAttrib(dc->gl.egl.display, - configs[i], EGL_ALPHA_SIZE, &alphaSize); - if (alphaSize > 0) { - continue; - } - } - - if (rsc->mUserSurfaceConfig.depthMin <= 0) { - EGLint depthSize; - eglGetConfigAttrib(dc->gl.egl.display, - configs[i], EGL_DEPTH_SIZE, &depthSize); - if (depthSize > 0) { - continue; - } - } - - // Found one! - dc->gl.egl.config = configs[i]; - break; - } - - delete [] configs; - } - - //if (props.mLogVisual) { - if (0) { - printEGLConfiguration(dc->gl.egl.display, dc->gl.egl.config); - } - //} - - rsc->setWatchdogGL("eglCreateContext", __LINE__, __FILE__); - dc->gl.egl.context = eglCreateContext(dc->gl.egl.display, dc->gl.egl.config, - EGL_NO_CONTEXT, context_attribs2); - checkEglError("eglCreateContext"); - if (dc->gl.egl.context == EGL_NO_CONTEXT) { - ALOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc); - rsc->setWatchdogGL(NULL, 0, NULL); - return false; - } - gGLContextCount++; - - // Create a BufferQueue with a fake consumer - sp<BufferQueue> bq = new BufferQueue(); - sp<DummyConsumer> dummy = new DummyConsumer(bq); - sp<SurfaceTextureClient> stc(new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >(bq))); - - dc->gl.egl.surfaceDefault = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config, - static_cast<ANativeWindow*>(stc.get()), - NULL); - - checkEglError("eglCreateWindowSurface"); - if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) { - ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE"); - rsdGLShutdown(rsc); - rsc->setWatchdogGL(NULL, 0, NULL); - return false; - } - - rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__); - ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault, - dc->gl.egl.surfaceDefault, dc->gl.egl.context); - if (ret == EGL_FALSE) { - ALOGE("eglMakeCurrent returned EGL_FALSE"); - checkEglError("eglMakeCurrent", ret); - rsdGLShutdown(rsc); - rsc->setWatchdogGL(NULL, 0, NULL); - return false; - } - - dc->gl.gl.version = glGetString(GL_VERSION); - dc->gl.gl.vendor = glGetString(GL_VENDOR); - dc->gl.gl.renderer = glGetString(GL_RENDERER); - dc->gl.gl.extensions = glGetString(GL_EXTENSIONS); - - //ALOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion); - //ALOGV("GL Version %s", mGL.mVersion); - //ALOGV("GL Vendor %s", mGL.mVendor); - //ALOGV("GL Renderer %s", mGL.mRenderer); - //ALOGV("GL Extensions %s", mGL.mExtensions); - - const char *verptr = NULL; - if (strlen((const char *)dc->gl.gl.version) > 9) { - if (!memcmp(dc->gl.gl.version, "OpenGL ES-CM", 12)) { - verptr = (const char *)dc->gl.gl.version + 12; - } - if (!memcmp(dc->gl.gl.version, "OpenGL ES ", 10)) { - verptr = (const char *)dc->gl.gl.version + 9; - } - } - - if (!verptr) { - ALOGE("Error, OpenGL ES Lite not supported"); - rsdGLShutdown(rsc); - rsc->setWatchdogGL(NULL, 0, NULL); - return false; - } else { - sscanf(verptr, " %i.%i", &dc->gl.gl.majorVersion, &dc->gl.gl.minorVersion); - } - - glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &dc->gl.gl.maxVertexAttribs); - glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &dc->gl.gl.maxVertexUniformVectors); - glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxVertexTextureUnits); - - glGetIntegerv(GL_MAX_VARYING_VECTORS, &dc->gl.gl.maxVaryingVectors); - glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxTextureImageUnits); - - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxFragmentTextureImageUnits); - glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &dc->gl.gl.maxFragmentUniformVectors); - - dc->gl.gl.OES_texture_npot = NULL != strstr((const char *)dc->gl.gl.extensions, - "GL_OES_texture_npot"); - dc->gl.gl.IMG_texture_npot = NULL != strstr((const char *)dc->gl.gl.extensions, - "GL_IMG_texture_npot"); - dc->gl.gl.NV_texture_npot_2D_mipmap = NULL != strstr((const char *)dc->gl.gl.extensions, - "GL_NV_texture_npot_2D_mipmap"); - dc->gl.gl.EXT_texture_max_aniso = 1.0f; - bool hasAniso = NULL != strstr((const char *)dc->gl.gl.extensions, - "GL_EXT_texture_filter_anisotropic"); - if (hasAniso) { - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &dc->gl.gl.EXT_texture_max_aniso); - } - - if (0) { - DumpDebug(dc); - } - - dc->gl.shaderCache = new RsdShaderCache(); - dc->gl.vertexArrayState = new RsdVertexArrayState(); - dc->gl.vertexArrayState->init(dc->gl.gl.maxVertexAttribs); - dc->gl.currentFrameBuffer = NULL; - dc->mHasGraphics = true; - - ALOGV("%p initGLThread end", rsc); - rsc->setWatchdogGL(NULL, 0, NULL); - return true; -} - - -bool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - EGLBoolean ret; - // WAR: Some drivers fail to handle 0 size surfaces correcntly. - // Use the pbuffer to avoid this pitfall. - if ((dc->gl.egl.surface != NULL) || (w == 0) || (h == 0)) { - rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__); - ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault, - dc->gl.egl.surfaceDefault, dc->gl.egl.context); - checkEglError("eglMakeCurrent", ret); - - rsc->setWatchdogGL("eglDestroySurface", __LINE__, __FILE__); - ret = eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surface); - checkEglError("eglDestroySurface", ret); - - dc->gl.egl.surface = NULL; - dc->gl.width = 1; - dc->gl.height = 1; - } - - if (dc->gl.wndSurface != NULL) { - dc->gl.wndSurface->decStrong(NULL); - } - - dc->gl.wndSurface = (ANativeWindow *)sur; - if (dc->gl.wndSurface != NULL) { - dc->gl.wndSurface->incStrong(NULL); - dc->gl.width = w; - dc->gl.height = h; - - rsc->setWatchdogGL("eglCreateWindowSurface", __LINE__, __FILE__); - dc->gl.egl.surface = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config, - dc->gl.wndSurface, NULL); - checkEglError("eglCreateWindowSurface"); - if (dc->gl.egl.surface == EGL_NO_SURFACE) { - ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE"); - } - - rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__); - ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surface, - dc->gl.egl.surface, dc->gl.egl.context); - checkEglError("eglMakeCurrent", ret); - } - rsc->setWatchdogGL(NULL, 0, NULL); - return true; -} - -void rsdGLSwap(const android::renderscript::Context *rsc) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface); -} - -void rsdGLSetPriority(const Context *rsc, int32_t priority) { - if (priority > 0) { - // Mark context as low priority. - ALOGV("low pri"); - } else { - ALOGV("normal pri"); - } -} - -void rsdGLCheckError(const android::renderscript::Context *rsc, - const char *msg, bool isFatal) { - GLenum err = glGetError(); - if (err != GL_NO_ERROR) { - char buf[1024]; - snprintf(buf, sizeof(buf), "GL Error = 0x%08x, from: %s", err, msg); - - if (isFatal) { - rsc->setError(RS_ERROR_FATAL_DRIVER, buf); - } else { - switch (err) { - case GL_OUT_OF_MEMORY: - rsc->setError(RS_ERROR_OUT_OF_MEMORY, buf); - break; - default: - rsc->setError(RS_ERROR_DRIVER, buf); - break; - } - } - - ALOGE("%p, %s", rsc, buf); - } - -} - -void rsdGLClearColor(const android::renderscript::Context *rsc, - float r, float g, float b, float a) { - RSD_CALL_GL(glClearColor, r, g, b, a); - RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT); -} - -void rsdGLClearDepth(const android::renderscript::Context *rsc, float v) { - RSD_CALL_GL(glClearDepthf, v); - RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT); -} - -void rsdGLFinish(const android::renderscript::Context *rsc) { - RSD_CALL_GL(glFinish); -} - -void rsdGLDrawQuadTexCoords(const android::renderscript::Context *rsc, - float x1, float y1, float z1, float u1, float v1, - float x2, float y2, float z2, float u2, float v2, - float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4) { - - float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; - const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; - - RsdVertexArray::Attrib attribs[2]; - attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); - attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); - - RsdVertexArray va(attribs, 2); - va.setup(rsc); - - RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4); -} diff --git a/libs/rs/driver/rsdGL.h b/libs/rs/driver/rsdGL.h deleted file mode 100644 index 1e5b40f..0000000 --- a/libs/rs/driver/rsdGL.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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_GL_H -#define RSD_GL_H - -#include <rs_hal.h> -#include <EGL/egl.h> - -#define RSD_CALL_GL(x, ...) rsc->setWatchdogGL(#x, __LINE__, __FILE__); x(__VA_ARGS__); rsc->setWatchdogGL(NULL, 0, NULL) - -class RsdShaderCache; -class RsdVertexArrayState; -class RsdFrameBufferObj; - -typedef void (* InvokeFunc_t)(void); -typedef void (*WorkerCallback_t)(void *usr, uint32_t idx); - -typedef struct RsdGLRec { - struct { - EGLint numConfigs; - EGLint majorVersion; - EGLint minorVersion; - EGLConfig config; - EGLContext context; - EGLSurface surface; - EGLSurface surfaceDefault; - EGLDisplay display; - } egl; - - struct { - const uint8_t * vendor; - const uint8_t * renderer; - const uint8_t * version; - const uint8_t * extensions; - - uint32_t majorVersion; - uint32_t minorVersion; - - int32_t maxVaryingVectors; - int32_t maxTextureImageUnits; - - int32_t maxFragmentTextureImageUnits; - int32_t maxFragmentUniformVectors; - - int32_t maxVertexAttribs; - int32_t maxVertexUniformVectors; - int32_t maxVertexTextureUnits; - - bool OES_texture_npot; - bool IMG_texture_npot; - bool NV_texture_npot_2D_mipmap; - float EXT_texture_max_aniso; - } gl; - - ANativeWindow *wndSurface; - uint32_t width; - uint32_t height; - RsdShaderCache *shaderCache; - RsdVertexArrayState *vertexArrayState; - RsdFrameBufferObj *currentFrameBuffer; -} RsdGL; - - -bool rsdGLInit(const android::renderscript::Context *rsc); -void rsdGLShutdown(const android::renderscript::Context *rsc); -bool rsdGLSetSurface(const android::renderscript::Context *rsc, - uint32_t w, uint32_t h, RsNativeWindow sur); -void rsdGLSwap(const android::renderscript::Context *rsc); -void rsdGLCheckError(const android::renderscript::Context *rsc, - const char *msg, bool isFatal = false); -void rsdGLSetPriority(const android::renderscript::Context *rsc, - int32_t priority); -void rsdGLClearColor(const android::renderscript::Context *rsc, - float r, float g, float b, float a); -void rsdGLClearDepth(const android::renderscript::Context *rsc, float v); -void rsdGLFinish(const android::renderscript::Context *rsc); -void rsdGLDrawQuadTexCoords(const android::renderscript::Context *rsc, - float x1, float y1, float z1, float u1, float v1, - float x2, float y2, float z2, float u2, float v2, - float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4); - -#endif - diff --git a/libs/rs/driver/rsdMesh.cpp b/libs/rs/driver/rsdMesh.cpp deleted file mode 100644 index 50daf3e..0000000 --- a/libs/rs/driver/rsdMesh.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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 <rs_hal.h> -#include <rsContext.h> -#include <rsMesh.h> - -#include "rsdCore.h" -#include "rsdMesh.h" -#include "rsdMeshObj.h" -#include "rsdShaderCache.h" - -using namespace android; -using namespace android::renderscript; - -bool rsdMeshInit(const Context *rsc, const Mesh *m) { - RsdMeshObj *drv = NULL; - if(m->mHal.drv) { - drv = (RsdMeshObj*)m->mHal.drv; - delete drv; - } - drv = new RsdMeshObj(rsc, m); - m->mHal.drv = drv; - return drv->init(rsc); -} - -void rsdMeshDraw(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) { - if(m->mHal.drv) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - if (!dc->gl.shaderCache->setup(rsc)) { - return; - } - - RsdMeshObj *drv = (RsdMeshObj*)m->mHal.drv; - drv->renderPrimitiveRange(rsc, primIndex, start, len); - } -} - -void rsdMeshDestroy(const Context *rsc, const Mesh *m) { - if(m->mHal.drv) { - RsdMeshObj *drv = (RsdMeshObj*)m->mHal.drv; - delete drv; - } -} - - diff --git a/libs/rs/driver/rsdMesh.h b/libs/rs/driver/rsdMesh.h deleted file mode 100644 index d2714fd..0000000 --- a/libs/rs/driver/rsdMesh.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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_MESH_H -#define RSD_MESH_H - -#include <rs_hal.h> - - -bool rsdMeshInit(const android::renderscript::Context *rsc, - const android::renderscript::Mesh *m); -void rsdMeshDraw(const android::renderscript::Context *rsc, - const android::renderscript::Mesh *m, - uint32_t primIndex, uint32_t start, uint32_t len); -void rsdMeshDestroy(const android::renderscript::Context *rsc, - const android::renderscript::Mesh *m); - - -#endif diff --git a/libs/rs/driver/rsdMeshObj.cpp b/libs/rs/driver/rsdMeshObj.cpp deleted file mode 100644 index 893f046..0000000 --- a/libs/rs/driver/rsdMeshObj.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/* - * 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 <rsMesh.h> - -#include "rsdAllocation.h" -#include "rsdMeshObj.h" -#include "rsdGL.h" - -using namespace android; -using namespace android::renderscript; - -RsdMeshObj::RsdMeshObj(const Context *rsc, const Mesh *rsMesh) { - mRSMesh = rsMesh; - - mAttribs = NULL; - mAttribAllocationIndex = NULL; - mGLPrimitives = NULL; - - mAttribCount = 0; -} - -RsdMeshObj::~RsdMeshObj() { - if (mAttribs) { - delete[] mAttribs; - delete[] mAttribAllocationIndex; - } - if (mGLPrimitives) { - delete[] mGLPrimitives; - } -} - -bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { - // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. - // Filter rs types accordingly - RsDataType dt = elem->mHal.state.fields[fieldIdx]->mHal.state.dataType; - if (dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 && - dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 && - dt != RS_TYPE_SIGNED_16) { - return false; - } - - // Now make sure they are not arrays - uint32_t arraySize = elem->mHal.state.fieldArraySizes[fieldIdx]; - if (arraySize != 1) { - return false; - } - - return true; -} - -bool RsdMeshObj::init(const Context *rsc) { - - updateGLPrimitives(rsc); - - // Count the number of gl attrs to initialize - mAttribCount = 0; - for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) { - const Element *elem = mRSMesh->mHal.state.vertexBuffers[ct]->getType()->getElement(); - for (uint32_t ct=0; ct < elem->mHal.state.fieldsCount; ct++) { - if (isValidGLComponent(elem, ct)) { - mAttribCount ++; - } - } - } - - if (mAttribs) { - delete [] mAttribs; - delete [] mAttribAllocationIndex; - mAttribs = NULL; - mAttribAllocationIndex = NULL; - } - if (!mAttribCount) { - return false; - } - - mAttribs = new RsdVertexArray::Attrib[mAttribCount]; - mAttribAllocationIndex = new uint32_t[mAttribCount]; - - uint32_t userNum = 0; - for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) { - const Element *elem = mRSMesh->mHal.state.vertexBuffers[ct]->getType()->getElement(); - uint32_t stride = elem->mHal.state.elementSizeBytes; - for (uint32_t fieldI=0; fieldI < elem->mHal.state.fieldsCount; fieldI++) { - const Element *f = elem->mHal.state.fields[fieldI]; - - if (!isValidGLComponent(elem, fieldI)) { - continue; - } - - mAttribs[userNum].size = f->mHal.state.vectorSize; - mAttribs[userNum].offset = elem->mHal.state.fieldOffsetBytes[fieldI]; - mAttribs[userNum].type = rsdTypeToGLType(f->mHal.state.dataType); - mAttribs[userNum].normalized = f->mHal.state.dataType != RS_TYPE_FLOAT_32; - mAttribs[userNum].stride = stride; - String8 tmp(RS_SHADER_ATTR); - tmp.append(elem->mHal.state.fieldNames[fieldI]); - mAttribs[userNum].name.setTo(tmp.string()); - - // Remember which allocation this attribute came from - mAttribAllocationIndex[userNum] = ct; - userNum ++; - } - } - - return true; -} - -void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex, - uint32_t start, uint32_t len) const { - if (len < 1 || primIndex >= mRSMesh->mHal.state.primitivesCount || mAttribCount == 0) { - rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid mesh or parameters"); - return; - } - - for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) { - const Allocation *alloc = mRSMesh->mHal.state.vertexBuffers[ct]; - DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv; - if (drv->uploadDeferred) { - rsdAllocationSyncAll(rsc, alloc, RS_ALLOCATION_USAGE_SCRIPT); - } - } - - // update attributes with either buffer information or data ptr based on their current state - for (uint32_t ct=0; ct < mAttribCount; ct++) { - uint32_t allocIndex = mAttribAllocationIndex[ct]; - Allocation *alloc = mRSMesh->mHal.state.vertexBuffers[allocIndex]; - DrvAllocation *drvAlloc = (DrvAllocation *)alloc->mHal.drv; - - if (drvAlloc->bufferID) { - mAttribs[ct].buffer = drvAlloc->bufferID; - mAttribs[ct].ptr = NULL; - } else { - mAttribs[ct].buffer = 0; - mAttribs[ct].ptr = (const uint8_t*)drvAlloc->mallocPtr; - } - } - - RsdVertexArray va(mAttribs, mAttribCount); - va.setup(rsc); - - const Allocation *idxAlloc = mRSMesh->mHal.state.indexBuffers[primIndex]; - if (idxAlloc) { - DrvAllocation *drvAlloc = (DrvAllocation *)idxAlloc->mHal.drv; - if (drvAlloc->uploadDeferred) { - rsdAllocationSyncAll(rsc, idxAlloc, RS_ALLOCATION_USAGE_SCRIPT); - } - - if (drvAlloc->bufferID) { - RSD_CALL_GL(glBindBuffer, GL_ELEMENT_ARRAY_BUFFER, drvAlloc->bufferID); - RSD_CALL_GL(glDrawElements, mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT, - (uint16_t *)(start * 2)); - } else { - RSD_CALL_GL(glBindBuffer, GL_ELEMENT_ARRAY_BUFFER, 0); - RSD_CALL_GL(glDrawElements, mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT, - drvAlloc->mallocPtr); - } - } else { - RSD_CALL_GL(glDrawArrays, mGLPrimitives[primIndex], start, len); - } - - rsdGLCheckError(rsc, "Mesh::renderPrimitiveRange"); -} - -void RsdMeshObj::updateGLPrimitives(const Context *rsc) { - mGLPrimitives = new uint32_t[mRSMesh->mHal.state.primitivesCount]; - for (uint32_t i = 0; i < mRSMesh->mHal.state.primitivesCount; i ++) { - switch (mRSMesh->mHal.state.primitives[i]) { - case RS_PRIMITIVE_POINT: mGLPrimitives[i] = GL_POINTS; break; - case RS_PRIMITIVE_LINE: mGLPrimitives[i] = GL_LINES; break; - case RS_PRIMITIVE_LINE_STRIP: mGLPrimitives[i] = GL_LINE_STRIP; break; - case RS_PRIMITIVE_TRIANGLE: mGLPrimitives[i] = GL_TRIANGLES; break; - case RS_PRIMITIVE_TRIANGLE_STRIP: mGLPrimitives[i] = GL_TRIANGLE_STRIP; break; - case RS_PRIMITIVE_TRIANGLE_FAN: mGLPrimitives[i] = GL_TRIANGLE_FAN; break; - default: rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid mesh primitive"); break; - } - } -} diff --git a/libs/rs/driver/rsdMeshObj.h b/libs/rs/driver/rsdMeshObj.h deleted file mode 100644 index 1370f01..0000000 --- a/libs/rs/driver/rsdMeshObj.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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_RSD_MESH_OBJ_H -#define ANDROID_RSD_MESH_OBJ_H - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - - class Context; - class Mesh; - class Element; - -} -} - -#include "driver/rsdVertexArray.h" - -// An element is a group of Components that occupies one cell in a structure. -class RsdMeshObj { -public: - RsdMeshObj(const android::renderscript::Context *, - const android::renderscript::Mesh *); - ~RsdMeshObj(); - - void renderPrimitiveRange(const android::renderscript::Context *, - uint32_t primIndex, uint32_t start, uint32_t len) const; - - bool init(const android::renderscript::Context *rsc); - -protected: - const android::renderscript::Mesh *mRSMesh; - - uint32_t *mGLPrimitives; - void updateGLPrimitives(const android::renderscript::Context *rsc); - - bool isValidGLComponent(const android::renderscript::Element *elem, uint32_t fieldIdx); - // Attribues that allow us to map to GL - RsdVertexArray::Attrib *mAttribs; - // This allows us to figure out which allocation the attribute - // belongs to. In the event the allocation is uploaded to GL - // buffer, it lets us properly map it - uint32_t *mAttribAllocationIndex; - uint32_t mAttribCount; -}; - -#endif //ANDROID_RSD_MESH_OBJ_H - - - diff --git a/libs/rs/driver/rsdPath.cpp b/libs/rs/driver/rsdPath.cpp deleted file mode 100644 index e04bc02..0000000 --- a/libs/rs/driver/rsdPath.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - * 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 deleted file mode 100644 index fa00972..0000000 --- a/libs/rs/driver/rsdPath.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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/rsdProgram.cpp b/libs/rs/driver/rsdProgram.cpp deleted file mode 100644 index a96a5f9..0000000 --- a/libs/rs/driver/rsdProgram.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2011-2012 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 "rsdCore.h" -#include "rsdAllocation.h" -#include "rsdProgramVertex.h" -#include "rsdShader.h" -#include "rsdShaderCache.h" - -#include "rsContext.h" -#include "rsProgramVertex.h" -#include "rsProgramFragment.h" - -#include <GLES/gl.h> -#include <GLES/glext.h> -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - -using namespace android; -using namespace android::renderscript; - -bool rsdProgramVertexInit(const Context *rsc, const ProgramVertex *pv, - const char* shader, size_t shaderLen, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength) { - RsdShader *drv = new RsdShader(pv, GL_VERTEX_SHADER, shader, shaderLen, - textureNames, textureNamesCount, textureNamesLength); - pv->mHal.drv = drv; - - return true; -} - -static void SyncProgramConstants(const Context *rsc, const Program *p) { - for (uint32_t ct=0; ct < p->mHal.state.texturesCount; ct++) { - const Allocation *a = p->mHal.state.textures[ct]; - if (!a) { - continue; - } - DrvAllocation *drvAlloc = (DrvAllocation *)a->mHal.drv; - if (drvAlloc->uploadDeferred) { - rsdAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT); - } - } -} - -void rsdProgramVertexSetActive(const Context *rsc, const ProgramVertex *pv) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - SyncProgramConstants(rsc, pv); - dc->gl.shaderCache->setActiveVertex((RsdShader*)pv->mHal.drv); -} - -void rsdProgramVertexDestroy(const Context *rsc, const ProgramVertex *pv) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - RsdShader *drv = NULL; - if(pv->mHal.drv) { - drv = (RsdShader*)pv->mHal.drv; - if (rsc->props.mLogShaders) { - ALOGV("Destroying vertex shader with ID %u", (uint32_t)pv); - } - if (drv->getStateBasedIDCount()) { - dc->gl.shaderCache->cleanupVertex(drv); - } - delete drv; - } -} - -bool rsdProgramFragmentInit(const Context *rsc, const ProgramFragment *pf, - const char* shader, size_t shaderLen, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength) { - RsdShader *drv = new RsdShader(pf, GL_FRAGMENT_SHADER, shader, shaderLen, - textureNames, textureNamesCount, textureNamesLength); - pf->mHal.drv = drv; - - return true; -} - -void rsdProgramFragmentSetActive(const Context *rsc, const ProgramFragment *pf) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - SyncProgramConstants(rsc, pf); - dc->gl.shaderCache->setActiveFragment((RsdShader*)pf->mHal.drv); -} - -void rsdProgramFragmentDestroy(const Context *rsc, const ProgramFragment *pf) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - RsdShader *drv = NULL; - if(pf->mHal.drv) { - drv = (RsdShader*)pf->mHal.drv; - if (rsc->props.mLogShaders) { - ALOGV("Destroying fragment shader with ID %u", (uint32_t)pf); - } - if (drv->getStateBasedIDCount()) { - dc->gl.shaderCache->cleanupFragment(drv); - } - delete drv; - } -} - - diff --git a/libs/rs/driver/rsdProgramFragment.h b/libs/rs/driver/rsdProgramFragment.h deleted file mode 100644 index b03a9fe..0000000 --- a/libs/rs/driver/rsdProgramFragment.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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_PROGRAM_FRAGMENT_H -#define RSD_PROGRAM_FRAGMENT_H - -#include <rs_hal.h> - - -bool rsdProgramFragmentInit(const android::renderscript::Context *rsc, - const android::renderscript::ProgramFragment *, - const char* shader, size_t shaderLen, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength); -void rsdProgramFragmentSetActive(const android::renderscript::Context *rsc, - const android::renderscript::ProgramFragment *); -void rsdProgramFragmentDestroy(const android::renderscript::Context *rsc, - const android::renderscript::ProgramFragment *); - - -#endif //RSD_PROGRAM_Fragment_H diff --git a/libs/rs/driver/rsdProgramRaster.cpp b/libs/rs/driver/rsdProgramRaster.cpp deleted file mode 100644 index e5a0291..0000000 --- a/libs/rs/driver/rsdProgramRaster.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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 "rsdCore.h" -#include "rsdProgramStore.h" - -#include "rsContext.h" -#include "rsProgramStore.h" - -#include <GLES/gl.h> -#include <GLES/glext.h> - - -using namespace android; -using namespace android::renderscript; - -bool rsdProgramRasterInit(const Context *, const ProgramRaster *) { - return true; -} - -void rsdProgramRasterSetActive(const Context *rsc, const ProgramRaster *pr) { - switch (pr->mHal.state.cull) { - case RS_CULL_BACK: - RSD_CALL_GL(glEnable, GL_CULL_FACE); - RSD_CALL_GL(glCullFace, GL_BACK); - break; - case RS_CULL_FRONT: - RSD_CALL_GL(glEnable, GL_CULL_FACE); - RSD_CALL_GL(glCullFace, GL_FRONT); - break; - case RS_CULL_NONE: - RSD_CALL_GL(glDisable, GL_CULL_FACE); - break; - default: - rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid cull type"); - break; - } - -} - -void rsdProgramRasterDestroy(const Context *, const ProgramRaster *) { -} - - diff --git a/libs/rs/driver/rsdProgramRaster.h b/libs/rs/driver/rsdProgramRaster.h deleted file mode 100644 index 20adaad..0000000 --- a/libs/rs/driver/rsdProgramRaster.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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_PROGRAM_RASTER_H -#define RSD_PROGRAM_RASTER_H - -#include <rs_hal.h> - - -bool rsdProgramRasterInit(const android::renderscript::Context *rsc, - const android::renderscript::ProgramRaster *); -void rsdProgramRasterSetActive(const android::renderscript::Context *rsc, - const android::renderscript::ProgramRaster *); -void rsdProgramRasterDestroy(const android::renderscript::Context *rsc, - const android::renderscript::ProgramRaster *); - - -#endif diff --git a/libs/rs/driver/rsdProgramStore.cpp b/libs/rs/driver/rsdProgramStore.cpp deleted file mode 100644 index c1295e8..0000000 --- a/libs/rs/driver/rsdProgramStore.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/* - * 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 "rsdCore.h" -#include "rsdProgramStore.h" - -#include "rsContext.h" -#include "rsProgramStore.h" - -#include <GLES/gl.h> -#include <GLES/glext.h> - - -using namespace android; -using namespace android::renderscript; - -struct DrvProgramStore { - GLenum blendSrc; - GLenum blendDst; - bool blendEnable; - - GLenum depthFunc; - bool depthTestEnable; -}; - -bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) { - DrvProgramStore *drv = (DrvProgramStore *)calloc(1, sizeof(DrvProgramStore)); - if (drv == NULL) { - return false; - } - - ps->mHal.drv = drv; - drv->depthTestEnable = true; - - switch (ps->mHal.state.depthFunc) { - case RS_DEPTH_FUNC_ALWAYS: - drv->depthTestEnable = false; - drv->depthFunc = GL_ALWAYS; - break; - case RS_DEPTH_FUNC_LESS: - drv->depthFunc = GL_LESS; - break; - case RS_DEPTH_FUNC_LEQUAL: - drv->depthFunc = GL_LEQUAL; - break; - case RS_DEPTH_FUNC_GREATER: - drv->depthFunc = GL_GREATER; - break; - case RS_DEPTH_FUNC_GEQUAL: - drv->depthFunc = GL_GEQUAL; - break; - case RS_DEPTH_FUNC_EQUAL: - drv->depthFunc = GL_EQUAL; - break; - case RS_DEPTH_FUNC_NOTEQUAL: - drv->depthFunc = GL_NOTEQUAL; - break; - default: - ALOGE("Unknown depth function."); - goto error; - } - - - - drv->blendEnable = true; - if ((ps->mHal.state.blendSrc == RS_BLEND_SRC_ONE) && - (ps->mHal.state.blendDst == RS_BLEND_DST_ZERO)) { - drv->blendEnable = false; - } - - switch (ps->mHal.state.blendSrc) { - case RS_BLEND_SRC_ZERO: - drv->blendSrc = GL_ZERO; - break; - case RS_BLEND_SRC_ONE: - drv->blendSrc = GL_ONE; - break; - case RS_BLEND_SRC_DST_COLOR: - drv->blendSrc = GL_DST_COLOR; - break; - case RS_BLEND_SRC_ONE_MINUS_DST_COLOR: - drv->blendSrc = GL_ONE_MINUS_DST_COLOR; - break; - case RS_BLEND_SRC_SRC_ALPHA: - drv->blendSrc = GL_SRC_ALPHA; - break; - case RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA: - drv->blendSrc = GL_ONE_MINUS_SRC_ALPHA; - break; - case RS_BLEND_SRC_DST_ALPHA: - drv->blendSrc = GL_DST_ALPHA; - break; - case RS_BLEND_SRC_ONE_MINUS_DST_ALPHA: - drv->blendSrc = GL_ONE_MINUS_DST_ALPHA; - break; - case RS_BLEND_SRC_SRC_ALPHA_SATURATE: - drv->blendSrc = GL_SRC_ALPHA_SATURATE; - break; - default: - rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend src mode."); - goto error; - } - - switch (ps->mHal.state.blendDst) { - case RS_BLEND_DST_ZERO: - drv->blendDst = GL_ZERO; - break; - case RS_BLEND_DST_ONE: - drv->blendDst = GL_ONE; - break; - case RS_BLEND_DST_SRC_COLOR: - drv->blendDst = GL_SRC_COLOR; - break; - case RS_BLEND_DST_ONE_MINUS_SRC_COLOR: - drv->blendDst = GL_ONE_MINUS_SRC_COLOR; - break; - case RS_BLEND_DST_SRC_ALPHA: - drv->blendDst = GL_SRC_ALPHA; - break; - case RS_BLEND_DST_ONE_MINUS_SRC_ALPHA: - drv->blendDst = GL_ONE_MINUS_SRC_ALPHA; - break; - case RS_BLEND_DST_DST_ALPHA: - drv->blendDst = GL_DST_ALPHA; - break; - case RS_BLEND_DST_ONE_MINUS_DST_ALPHA: - drv->blendDst = GL_ONE_MINUS_DST_ALPHA; - break; - default: - rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend dst mode."); - goto error; - } - - return true; - -error: - free(drv); - ps->mHal.drv = NULL; - return false; -} - -void rsdProgramStoreSetActive(const Context *rsc, const ProgramStore *ps) { - DrvProgramStore *drv = (DrvProgramStore *)ps->mHal.drv; - - RSD_CALL_GL(glColorMask, ps->mHal.state.colorRWriteEnable, - ps->mHal.state.colorGWriteEnable, - ps->mHal.state.colorBWriteEnable, - ps->mHal.state.colorAWriteEnable); - - if (drv->blendEnable) { - RSD_CALL_GL(glEnable, GL_BLEND); - RSD_CALL_GL(glBlendFunc, drv->blendSrc, drv->blendDst); - } else { - RSD_CALL_GL(glDisable, GL_BLEND); - } - - if (rsc->mUserSurfaceConfig.depthMin > 0) { - RSD_CALL_GL(glDepthMask, ps->mHal.state.depthWriteEnable); - if (drv->depthTestEnable || ps->mHal.state.depthWriteEnable) { - RSD_CALL_GL(glEnable, GL_DEPTH_TEST); - RSD_CALL_GL(glDepthFunc, drv->depthFunc); - } else { - RSD_CALL_GL(glDisable, GL_DEPTH_TEST); - } - } else { - RSD_CALL_GL(glDepthMask, false); - RSD_CALL_GL(glDisable, GL_DEPTH_TEST); - } - - /* - if (rsc->mUserSurfaceConfig.stencilMin > 0) { - } else { - glStencilMask(0); - glDisable(GL_STENCIL_TEST); - } - */ - - if (ps->mHal.state.ditherEnable) { - RSD_CALL_GL(glEnable, GL_DITHER); - } else { - RSD_CALL_GL(glDisable, GL_DITHER); - } -} - -void rsdProgramStoreDestroy(const Context *rsc, const ProgramStore *ps) { - free(ps->mHal.drv); - ps->mHal.drv = NULL; -} - - diff --git a/libs/rs/driver/rsdProgramStore.h b/libs/rs/driver/rsdProgramStore.h deleted file mode 100644 index 217a0ce..0000000 --- a/libs/rs/driver/rsdProgramStore.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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_PROGRAM_STORE_H -#define RSD_PROGRAM_STORE_H - -#include <rs_hal.h> - - -bool rsdProgramStoreInit(const android::renderscript::Context *rsc, - const android::renderscript::ProgramStore *ps); -void rsdProgramStoreSetActive(const android::renderscript::Context *rsc, - const android::renderscript::ProgramStore *ps); -void rsdProgramStoreDestroy(const android::renderscript::Context *rsc, - const android::renderscript::ProgramStore *ps); - - -#endif diff --git a/libs/rs/driver/rsdProgramVertex.h b/libs/rs/driver/rsdProgramVertex.h deleted file mode 100644 index f917a41..0000000 --- a/libs/rs/driver/rsdProgramVertex.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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_PROGRAM_VERTEX_H -#define RSD_PROGRAM_VERTEX_H - -#include <rs_hal.h> - -bool rsdProgramVertexInit(const android::renderscript::Context *rsc, - const android::renderscript::ProgramVertex *, - const char* shader, size_t shaderLen, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength); -void rsdProgramVertexSetActive(const android::renderscript::Context *rsc, - const android::renderscript::ProgramVertex *); -void rsdProgramVertexDestroy(const android::renderscript::Context *rsc, - const android::renderscript::ProgramVertex *); - - -#endif //RSD_PROGRAM_VERTEX_H diff --git a/libs/rs/driver/rsdRuntime.h b/libs/rs/driver/rsdRuntime.h deleted file mode 100644 index 840eced..0000000 --- a/libs/rs/driver/rsdRuntime.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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_RUNTIME_STUBS_H -#define RSD_RUNTIME_STUBS_H - -#include <rs_hal.h> -#include <bcc/bcc.h> - -#include "rsMutex.h" - -const RsdSymbolTable * rsdLookupSymbolMath(const char *sym); - -void* rsdLookupRuntimeStub(void* pContext, char const* name); - -#endif diff --git a/libs/rs/driver/rsdRuntimeMath.cpp b/libs/rs/driver/rsdRuntimeMath.cpp deleted file mode 100644 index 753ef73..0000000 --- a/libs/rs/driver/rsdRuntimeMath.cpp +++ /dev/null @@ -1,567 +0,0 @@ -/* - * 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 <cutils/compiler.h> - -#include "rsContext.h" -#include "rsScriptC.h" -#include "rsMatrix4x4.h" -#include "rsMatrix3x3.h" -#include "rsMatrix2x2.h" - -#include "rsdCore.h" -#include "rsdRuntime.h" - - -using namespace android; -using namespace android::renderscript; - - -static float SC_exp10(float v) { - return pow(10.f, v); -} - -static float SC_fract(float v, int *iptr) { - int i = (int)floor(v); - iptr[0] = i; - return fmin(v - i, 0x1.fffffep-1f); -} - -static float SC_log2(float v) { - return log10(v) / log10(2.f); -} - -static float SC_mad(float v1, float v2, float v3) { - return v1 * v2 + v3; -} - -#if 0 -static float SC_pown(float v, int p) { - return powf(v, (float)p); -} - -static float SC_powr(float v, float p) { - return powf(v, p); -} -#endif - -float SC_rootn(float v, int r) { - return pow(v, 1.f / r); -} - -float SC_rsqrt(float v) { - return 1.f / sqrtf(v); -} - -float SC_sincos(float v, float *cosptr) { - *cosptr = cosf(v); - return sinf(v); -} - -////////////////////////////////////////////////////////////////////////////// -// Integer -////////////////////////////////////////////////////////////////////////////// - - -static uint32_t SC_abs_i32(int32_t v) {return abs(v);} -static uint16_t SC_abs_i16(int16_t v) {return (uint16_t)abs(v);} -static uint8_t SC_abs_i8(int8_t v) {return (uint8_t)abs(v);} - -static uint32_t SC_clz_u32(uint32_t v) {return __builtin_clz(v);} -static uint16_t SC_clz_u16(uint16_t v) {return (uint16_t)__builtin_clz(v);} -static uint8_t SC_clz_u8(uint8_t v) {return (uint8_t)__builtin_clz(v);} -static int32_t SC_clz_i32(int32_t v) {return (int32_t)__builtin_clz((uint32_t)v);} -static int16_t SC_clz_i16(int16_t v) {return (int16_t)__builtin_clz(v);} -static int8_t SC_clz_i8(int8_t v) {return (int8_t)__builtin_clz(v);} - -static uint32_t SC_max_u32(uint32_t v, uint32_t v2) {return rsMax(v, v2);} -static uint16_t SC_max_u16(uint16_t v, uint16_t v2) {return rsMax(v, v2);} -static uint8_t SC_max_u8(uint8_t v, uint8_t v2) {return rsMax(v, v2);} -static int32_t SC_max_i32(int32_t v, int32_t v2) {return rsMax(v, v2);} -static int16_t SC_max_i16(int16_t v, int16_t v2) {return rsMax(v, v2);} -static int8_t SC_max_i8(int8_t v, int8_t v2) {return rsMax(v, v2);} - -static uint32_t SC_min_u32(uint32_t v, uint32_t v2) {return rsMin(v, v2);} -static uint16_t SC_min_u16(uint16_t v, uint16_t v2) {return rsMin(v, v2);} -static uint8_t SC_min_u8(uint8_t v, uint8_t v2) {return rsMin(v, v2);} -static int32_t SC_min_i32(int32_t v, int32_t v2) {return rsMin(v, v2);} -static int16_t SC_min_i16(int16_t v, int16_t v2) {return rsMin(v, v2);} -static int8_t SC_min_i8(int8_t v, int8_t v2) {return rsMin(v, v2);} - -////////////////////////////////////////////////////////////////////////////// -// Float util -////////////////////////////////////////////////////////////////////////////// - -static float SC_clamp_f32(float amount, float low, float high) { - return amount < low ? low : (amount > high ? high : amount); -} - -static float SC_degrees(float radians) { - return radians * (180.f / M_PI); -} - -static float SC_max_f32(float v, float v2) { - return rsMax(v, v2); -} - -static float SC_min_f32(float v, float v2) { - return rsMin(v, v2); -} - -static float SC_mix_f32(float start, float stop, float amount) { - //ALOGE("lerpf %f %f %f", start, stop, amount); - return start + (stop - start) * amount; -} - -static float SC_radians(float degrees) { - return degrees * (M_PI / 180.f); -} - -static float SC_step_f32(float edge, float v) { - if (v < edge) return 0.f; - return 1.f; -} - -static float SC_sign_f32(float value) { - if (value > 0) return 1.f; - if (value < 0) return -1.f; - return value; -} - -static void SC_MatrixLoadIdentity_4x4(Matrix4x4 *m) { - m->loadIdentity(); -} -static void SC_MatrixLoadIdentity_3x3(Matrix3x3 *m) { - m->loadIdentity(); -} -static void SC_MatrixLoadIdentity_2x2(Matrix2x2 *m) { - m->loadIdentity(); -} - -static void SC_MatrixLoad_4x4_f(Matrix4x4 *m, const float *f) { - m->load(f); -} -static void SC_MatrixLoad_3x3_f(Matrix3x3 *m, const float *f) { - m->load(f); -} -static void SC_MatrixLoad_2x2_f(Matrix2x2 *m, const float *f) { - m->load(f); -} - -static void SC_MatrixLoad_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *s) { - m->load(s); -} -static void SC_MatrixLoad_4x4_3x3(Matrix4x4 *m, const Matrix3x3 *s) { - m->load(s); -} -static void SC_MatrixLoad_4x4_2x2(Matrix4x4 *m, const Matrix2x2 *s) { - m->load(s); -} -static void SC_MatrixLoad_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *s) { - m->load(s); -} -static void SC_MatrixLoad_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *s) { - m->load(s); -} - -static void SC_MatrixLoadRotate(Matrix4x4 *m, float rot, float x, float y, float z) { - m->loadRotate(rot, x, y, z); -} -static void SC_MatrixLoadScale(Matrix4x4 *m, float x, float y, float z) { - m->loadScale(x, y, z); -} -static void SC_MatrixLoadTranslate(Matrix4x4 *m, float x, float y, float z) { - m->loadTranslate(x, y, z); -} -static void SC_MatrixRotate(Matrix4x4 *m, float rot, float x, float y, float z) { - m->rotate(rot, x, y, z); -} -static void SC_MatrixScale(Matrix4x4 *m, float x, float y, float z) { - m->scale(x, y, z); -} -static void SC_MatrixTranslate(Matrix4x4 *m, float x, float y, float z) { - m->translate(x, y, z); -} - -static void SC_MatrixLoadMultiply_4x4_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *lhs, const Matrix4x4 *rhs) { - m->loadMultiply(lhs, rhs); -} -static void SC_MatrixLoadMultiply_3x3_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *lhs, const Matrix3x3 *rhs) { - m->loadMultiply(lhs, rhs); -} -static void SC_MatrixLoadMultiply_2x2_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *lhs, const Matrix2x2 *rhs) { - m->loadMultiply(lhs, rhs); -} - -static void SC_MatrixMultiply_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *rhs) { - m->multiply(rhs); -} -static void SC_MatrixMultiply_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *rhs) { - m->multiply(rhs); -} -static void SC_MatrixMultiply_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *rhs) { - m->multiply(rhs); -} - -static void SC_MatrixLoadOrtho(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) { - m->loadOrtho(l, r, b, t, n, f); -} -static void SC_MatrixLoadFrustum(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) { - m->loadFrustum(l, r, b, t, n, f); -} -static void SC_MatrixLoadPerspective(Matrix4x4 *m, float fovy, float aspect, float near, float far) { - m->loadPerspective(fovy, aspect, near, far); -} - -static bool SC_MatrixInverse_4x4(Matrix4x4 *m) { - return m->inverse(); -} -static bool SC_MatrixInverseTranspose_4x4(Matrix4x4 *m) { - return m->inverseTranspose(); -} -static void SC_MatrixTranspose_4x4(Matrix4x4 *m) { - m->transpose(); -} -static void SC_MatrixTranspose_3x3(Matrix3x3 *m) { - m->transpose(); -} -static void SC_MatrixTranspose_2x2(Matrix2x2 *m) { - m->transpose(); -} - -static float SC_randf(float max) { - float r = (float)rand(); - r *= max; - r /= RAND_MAX; - return r; -} - -static float SC_randf2(float min, float max) { - float r = (float)rand(); - r /= RAND_MAX; - r = r * (max - min) + min; - return r; -} - -static int SC_randi(int max) { - return (int)SC_randf(max); -} - -static int SC_randi2(int min, int max) { - return (int)SC_randf2(min, max); -} - -static float SC_frac(float v) { - int i = (int)floor(v); - return fmin(v - i, 0x1.fffffep-1f); -} - - -static int32_t SC_AtomicCas(volatile int32_t *ptr, int32_t expectedValue, int32_t newValue) { - int32_t prev; - - do { - int32_t ret = android_atomic_release_cas(expectedValue, newValue, ptr); - if (!ret) { - // The android cas return 0 if it wrote the value. This means the - // previous value was the expected value and we can return. - return expectedValue; - } - // We didn't write the value and need to load the "previous" value. - prev = *ptr; - - // A race condition exists where the expected value could appear after our cas failed - // above. In this case loop until we have a legit previous value or the - // write passes. - } while (prev == expectedValue); - return prev; -} - - -static int32_t SC_AtomicInc(volatile int32_t *ptr) { - return android_atomic_inc(ptr); -} - -static int32_t SC_AtomicDec(volatile int32_t *ptr) { - return android_atomic_dec(ptr); -} - -static int32_t SC_AtomicAdd(volatile int32_t *ptr, int32_t value) { - return android_atomic_add(value, ptr); -} - -static int32_t SC_AtomicSub(volatile int32_t *ptr, int32_t value) { - int32_t prev, status; - do { - prev = *ptr; - status = android_atomic_release_cas(prev, prev - value, ptr); - } while (CC_UNLIKELY(status != 0)); - return prev; -} - -static int32_t SC_AtomicAnd(volatile int32_t *ptr, int32_t value) { - return android_atomic_and(value, ptr); -} - -static int32_t SC_AtomicOr(volatile int32_t *ptr, int32_t value) { - return android_atomic_or(value, ptr); -} - -static int32_t SC_AtomicXor(volatile int32_t *ptr, int32_t value) { - int32_t prev, status; - do { - prev = *ptr; - status = android_atomic_release_cas(prev, prev ^ value, ptr); - } while (CC_UNLIKELY(status != 0)); - return prev; -} - -static uint32_t SC_AtomicUMin(volatile uint32_t *ptr, uint32_t value) { - uint32_t prev, status; - do { - prev = *ptr; - uint32_t n = rsMin(value, prev); - status = android_atomic_release_cas((int32_t) prev, (int32_t)n, (volatile int32_t*) ptr); - } while (CC_UNLIKELY(status != 0)); - return prev; -} - -static int32_t SC_AtomicMin(volatile int32_t *ptr, int32_t value) { - int32_t prev, status; - do { - prev = *ptr; - int32_t n = rsMin(value, prev); - status = android_atomic_release_cas(prev, n, ptr); - } while (CC_UNLIKELY(status != 0)); - return prev; -} - -static uint32_t SC_AtomicUMax(volatile uint32_t *ptr, uint32_t value) { - uint32_t prev, status; - do { - prev = *ptr; - uint32_t n = rsMax(value, prev); - status = android_atomic_release_cas((int32_t) prev, (int32_t) n, (volatile int32_t*) ptr); - } while (CC_UNLIKELY(status != 0)); - return prev; -} - -static int32_t SC_AtomicMax(volatile int32_t *ptr, int32_t value) { - int32_t prev, status; - do { - prev = *ptr; - int32_t n = rsMax(value, prev); - status = android_atomic_release_cas(prev, n, ptr); - } while (CC_UNLIKELY(status != 0)); - return prev; -} - - - -////////////////////////////////////////////////////////////////////////////// -// Class implementation -////////////////////////////////////////////////////////////////////////////// - -// llvm name mangling ref -// <builtin-type> ::= v # void -// ::= b # bool -// ::= c # char -// ::= a # signed char -// ::= h # unsigned char -// ::= s # short -// ::= t # unsigned short -// ::= i # int -// ::= j # unsigned int -// ::= l # long -// ::= m # unsigned long -// ::= x # long long, __int64 -// ::= y # unsigned long long, __int64 -// ::= f # float -// ::= d # double - -static RsdSymbolTable gSyms[] = { - { "_Z4acosf", (void *)&acosf, true }, - { "_Z5acoshf", (void *)&acoshf, true }, - { "_Z4asinf", (void *)&asinf, true }, - { "_Z5asinhf", (void *)&asinhf, true }, - { "_Z4atanf", (void *)&atanf, true }, - { "_Z5atan2ff", (void *)&atan2f, true }, - { "_Z5atanhf", (void *)&atanhf, true }, - { "_Z4cbrtf", (void *)&cbrtf, true }, - { "_Z4ceilf", (void *)&ceilf, true }, - { "_Z8copysignff", (void *)©signf, true }, - { "_Z3cosf", (void *)&cosf, true }, - { "_Z4coshf", (void *)&coshf, true }, - { "_Z4erfcf", (void *)&erfcf, true }, - { "_Z3erff", (void *)&erff, true }, - { "_Z3expf", (void *)&expf, true }, - { "_Z4exp2f", (void *)&exp2f, true }, - { "_Z5exp10f", (void *)&SC_exp10, true }, - { "_Z5expm1f", (void *)&expm1f, true }, - { "_Z4fabsf", (void *)&fabsf, true }, - { "_Z4fdimff", (void *)&fdimf, true }, - { "_Z5floorf", (void *)&floorf, true }, - { "_Z3fmafff", (void *)&fmaf, true }, - { "_Z4fmaxff", (void *)&fmaxf, true }, - { "_Z4fminff", (void *)&fminf, true }, // float fmin(float, float) - { "_Z4fmodff", (void *)&fmodf, true }, - { "_Z5fractfPf", (void *)&SC_fract, true }, - { "_Z5frexpfPi", (void *)&frexpf, true }, - { "_Z5hypotff", (void *)&hypotf, true }, - { "_Z5ilogbf", (void *)&ilogbf, true }, - { "_Z5ldexpfi", (void *)&ldexpf, true }, - { "_Z6lgammaf", (void *)&lgammaf, true }, - { "_Z6lgammafPi", (void *)&lgammaf_r, true }, - { "_Z3logf", (void *)&logf, true }, - { "_Z4log2f", (void *)&SC_log2, true }, - { "_Z5log10f", (void *)&log10f, true }, - { "_Z5log1pf", (void *)&log1pf, true }, - { "_Z4logbf", (void *)&logbf, true }, - { "_Z3madfff", (void *)&SC_mad, true }, - { "_Z4modffPf", (void *)&modff, true }, - //{ "_Z3nanj", (void *)&SC_nan, true }, - { "_Z9nextafterff", (void *)&nextafterf, true }, - { "_Z3powff", (void *)&powf, true }, - { "_Z9remainderff", (void *)&remainderf, true }, - { "_Z6remquoffPi", (void *)&remquof, true }, - { "_Z4rintf", (void *)&rintf, true }, - { "_Z5rootnfi", (void *)&SC_rootn, true }, - { "_Z5roundf", (void *)&roundf, true }, - { "_Z5rsqrtf", (void *)&SC_rsqrt, true }, - { "_Z3sinf", (void *)&sinf, true }, - { "_Z6sincosfPf", (void *)&SC_sincos, true }, - { "_Z4sinhf", (void *)&sinhf, true }, - { "_Z4sqrtf", (void *)&sqrtf, true }, - { "_Z3tanf", (void *)&tanf, true }, - { "_Z4tanhf", (void *)&tanhf, true }, - { "_Z6tgammaf", (void *)&tgammaf, true }, - { "_Z5truncf", (void *)&truncf, true }, - - { "_Z3absi", (void *)&SC_abs_i32, true }, - { "_Z3abss", (void *)&SC_abs_i16, true }, - { "_Z3absc", (void *)&SC_abs_i8, true }, - { "_Z3clzj", (void *)&SC_clz_u32, true }, - { "_Z3clzt", (void *)&SC_clz_u16, true }, - { "_Z3clzh", (void *)&SC_clz_u8, true }, - { "_Z3clzi", (void *)&SC_clz_i32, true }, - { "_Z3clzs", (void *)&SC_clz_i16, true }, - { "_Z3clzc", (void *)&SC_clz_i8, true }, - { "_Z3maxjj", (void *)&SC_max_u32, true }, - { "_Z3maxtt", (void *)&SC_max_u16, true }, - { "_Z3maxhh", (void *)&SC_max_u8, true }, - { "_Z3maxii", (void *)&SC_max_i32, true }, - { "_Z3maxss", (void *)&SC_max_i16, true }, - { "_Z3maxcc", (void *)&SC_max_i8, true }, - { "_Z3minjj", (void *)&SC_min_u32, true }, - { "_Z3mintt", (void *)&SC_min_u16, true }, - { "_Z3minhh", (void *)&SC_min_u8, true }, - { "_Z3minii", (void *)&SC_min_i32, true }, - { "_Z3minss", (void *)&SC_min_i16, true }, - { "_Z3mincc", (void *)&SC_min_i8, true }, - - { "_Z5clampfff", (void *)&SC_clamp_f32, true }, - { "_Z7degreesf", (void *)&SC_degrees, true }, - { "_Z3maxff", (void *)&SC_max_f32, true }, - { "_Z3minff", (void *)&SC_min_f32, true }, - { "_Z3mixfff", (void *)&SC_mix_f32, true }, - { "_Z7radiansf", (void *)&SC_radians, true }, - { "_Z4stepff", (void *)&SC_step_f32, true }, - //{ "smoothstep", (void *)&, true }, - { "_Z4signf", (void *)&SC_sign_f32, true }, - - // matrix - { "_Z20rsMatrixLoadIdentityP12rs_matrix4x4", (void *)&SC_MatrixLoadIdentity_4x4, true }, - { "_Z20rsMatrixLoadIdentityP12rs_matrix3x3", (void *)&SC_MatrixLoadIdentity_3x3, true }, - { "_Z20rsMatrixLoadIdentityP12rs_matrix2x2", (void *)&SC_MatrixLoadIdentity_2x2, true }, - - { "_Z12rsMatrixLoadP12rs_matrix4x4PKf", (void *)&SC_MatrixLoad_4x4_f, true }, - { "_Z12rsMatrixLoadP12rs_matrix3x3PKf", (void *)&SC_MatrixLoad_3x3_f, true }, - { "_Z12rsMatrixLoadP12rs_matrix2x2PKf", (void *)&SC_MatrixLoad_2x2_f, true }, - - { "_Z12rsMatrixLoadP12rs_matrix4x4PKS_", (void *)&SC_MatrixLoad_4x4_4x4, true }, - { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix3x3", (void *)&SC_MatrixLoad_4x4_3x3, true }, - { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix2x2", (void *)&SC_MatrixLoad_4x4_2x2, true }, - { "_Z12rsMatrixLoadP12rs_matrix3x3PKS_", (void *)&SC_MatrixLoad_3x3_3x3, true }, - { "_Z12rsMatrixLoadP12rs_matrix2x2PKS_", (void *)&SC_MatrixLoad_2x2_2x2, true }, - - { "_Z18rsMatrixLoadRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadRotate, true }, - { "_Z17rsMatrixLoadScaleP12rs_matrix4x4fff", (void *)&SC_MatrixLoadScale, true }, - { "_Z21rsMatrixLoadTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixLoadTranslate, true }, - { "_Z14rsMatrixRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixRotate, true }, - { "_Z13rsMatrixScaleP12rs_matrix4x4fff", (void *)&SC_MatrixScale, true }, - { "_Z17rsMatrixTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixTranslate, true }, - - { "_Z20rsMatrixLoadMultiplyP12rs_matrix4x4PKS_S2_", (void *)&SC_MatrixLoadMultiply_4x4_4x4_4x4, true }, - { "_Z16rsMatrixMultiplyP12rs_matrix4x4PKS_", (void *)&SC_MatrixMultiply_4x4_4x4, true }, - { "_Z20rsMatrixLoadMultiplyP12rs_matrix3x3PKS_S2_", (void *)&SC_MatrixLoadMultiply_3x3_3x3_3x3, true }, - { "_Z16rsMatrixMultiplyP12rs_matrix3x3PKS_", (void *)&SC_MatrixMultiply_3x3_3x3, true }, - { "_Z20rsMatrixLoadMultiplyP12rs_matrix2x2PKS_S2_", (void *)&SC_MatrixLoadMultiply_2x2_2x2_2x2, true }, - { "_Z16rsMatrixMultiplyP12rs_matrix2x2PKS_", (void *)&SC_MatrixMultiply_2x2_2x2, true }, - - { "_Z17rsMatrixLoadOrthoP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadOrtho, true }, - { "_Z19rsMatrixLoadFrustumP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadFrustum, true }, - { "_Z23rsMatrixLoadPerspectiveP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadPerspective, true }, - - { "_Z15rsMatrixInverseP12rs_matrix4x4", (void *)&SC_MatrixInverse_4x4, true }, - { "_Z24rsMatrixInverseTransposeP12rs_matrix4x4", (void *)&SC_MatrixInverseTranspose_4x4, true }, - { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_4x4, true }, - { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_3x3, true }, - { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_2x2, true }, - - // RS Math - { "_Z6rsRandi", (void *)&SC_randi, true }, - { "_Z6rsRandii", (void *)&SC_randi2, true }, - { "_Z6rsRandf", (void *)&SC_randf, true }, - { "_Z6rsRandff", (void *)&SC_randf2, true }, - { "_Z6rsFracf", (void *)&SC_frac, true }, - - // Atomics - { "_Z11rsAtomicIncPVi", (void *)&SC_AtomicInc, true }, - { "_Z11rsAtomicIncPVj", (void *)&SC_AtomicInc, true }, - { "_Z11rsAtomicDecPVi", (void *)&SC_AtomicDec, true }, - { "_Z11rsAtomicDecPVj", (void *)&SC_AtomicDec, true }, - { "_Z11rsAtomicAddPVii", (void *)&SC_AtomicAdd, true }, - { "_Z11rsAtomicAddPVjj", (void *)&SC_AtomicAdd, true }, - { "_Z11rsAtomicSubPVii", (void *)&SC_AtomicSub, true }, - { "_Z11rsAtomicSubPVjj", (void *)&SC_AtomicSub, true }, - { "_Z11rsAtomicAndPVii", (void *)&SC_AtomicAnd, true }, - { "_Z11rsAtomicAndPVjj", (void *)&SC_AtomicAnd, true }, - { "_Z10rsAtomicOrPVii", (void *)&SC_AtomicOr, true }, - { "_Z10rsAtomicOrPVjj", (void *)&SC_AtomicOr, true }, - { "_Z11rsAtomicXorPVii", (void *)&SC_AtomicXor, true }, - { "_Z11rsAtomicXorPVjj", (void *)&SC_AtomicXor, true }, - { "_Z11rsAtomicMinPVii", (void *)&SC_AtomicMin, true }, - { "_Z11rsAtomicMinPVjj", (void *)&SC_AtomicUMin, true }, - { "_Z11rsAtomicMaxPVii", (void *)&SC_AtomicMax, true }, - { "_Z11rsAtomicMaxPVjj", (void *)&SC_AtomicUMax, true }, - { "_Z11rsAtomicCasPViii", (void *)&SC_AtomicCas, true }, - { "_Z11rsAtomicCasPVjjj", (void *)&SC_AtomicCas, true }, - - { NULL, NULL, false } -}; - -const RsdSymbolTable * rsdLookupSymbolMath(const char *sym) { - const RsdSymbolTable *syms = gSyms; - - while (syms->mPtr) { - if (!strcmp(syms->mName, sym)) { - return syms; - } - syms++; - } - return NULL; -} - diff --git a/libs/rs/driver/rsdRuntimeStubs.cpp b/libs/rs/driver/rsdRuntimeStubs.cpp deleted file mode 100644 index aa9f159..0000000 --- a/libs/rs/driver/rsdRuntimeStubs.cpp +++ /dev/null @@ -1,720 +0,0 @@ -/* - * 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" -#include "rsScriptC.h" -#include "rsMatrix4x4.h" -#include "rsMatrix3x3.h" -#include "rsMatrix2x2.h" -#include "rsRuntime.h" - -#include "utils/Timers.h" -#include "rsdCore.h" - -#include "rsdRuntime.h" -#include "rsdPath.h" - -#include <time.h> - -using namespace android; -using namespace android::renderscript; - -#define GET_TLS() ScriptTLSStruct * tls = \ - (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey); \ - Context * rsc = tls->mContext; \ - ScriptC * sc = (ScriptC *) tls->mScript - - - -////////////////////////////////////////////////////////////////////////////// -// Allocation -////////////////////////////////////////////////////////////////////////////// - - -static void SC_AllocationSyncAll2(Allocation *a, RsAllocationUsageType source) { - GET_TLS(); - rsrAllocationSyncAll(rsc, sc, a, source); -} - -static void SC_AllocationSyncAll(Allocation *a) { - GET_TLS(); - rsrAllocationSyncAll(rsc, sc, a, RS_ALLOCATION_USAGE_SCRIPT); -} - -static void SC_AllocationCopy1DRange(Allocation *dstAlloc, - uint32_t dstOff, - uint32_t dstMip, - uint32_t count, - Allocation *srcAlloc, - uint32_t srcOff, uint32_t srcMip) { - GET_TLS(); - rsrAllocationCopy1DRange(rsc, dstAlloc, dstOff, dstMip, count, - srcAlloc, srcOff, srcMip); -} - -static void SC_AllocationCopy2DRange(Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, - uint32_t dstMip, uint32_t dstFace, - uint32_t width, uint32_t height, - Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, - uint32_t srcMip, uint32_t srcFace) { - GET_TLS(); - rsrAllocationCopy2DRange(rsc, dstAlloc, - dstXoff, dstYoff, dstMip, dstFace, - width, height, - srcAlloc, - srcXoff, srcYoff, srcMip, srcFace); -} - - -////////////////////////////////////////////////////////////////////////////// -// Context -////////////////////////////////////////////////////////////////////////////// - -static void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) { - GET_TLS(); - rsrBindTexture(rsc, sc, pf, slot, a); -} - -static void SC_BindVertexConstant(ProgramVertex *pv, uint32_t slot, Allocation *a) { - GET_TLS(); - rsrBindConstant(rsc, sc, pv, slot, a); -} - -static void SC_BindFragmentConstant(ProgramFragment *pf, uint32_t slot, Allocation *a) { - GET_TLS(); - rsrBindConstant(rsc, sc, pf, slot, a); -} - -static void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) { - GET_TLS(); - rsrBindSampler(rsc, sc, pf, slot, s); -} - -static void SC_BindProgramStore(ProgramStore *ps) { - GET_TLS(); - rsrBindProgramStore(rsc, sc, ps); -} - -static void SC_BindProgramFragment(ProgramFragment *pf) { - GET_TLS(); - rsrBindProgramFragment(rsc, sc, pf); -} - -static void SC_BindProgramVertex(ProgramVertex *pv) { - GET_TLS(); - rsrBindProgramVertex(rsc, sc, pv); -} - -static void SC_BindProgramRaster(ProgramRaster *pr) { - GET_TLS(); - rsrBindProgramRaster(rsc, sc, pr); -} - -static void SC_BindFrameBufferObjectColorTarget(Allocation *a, uint32_t slot) { - GET_TLS(); - rsrBindFrameBufferObjectColorTarget(rsc, sc, a, slot); -} - -static void SC_BindFrameBufferObjectDepthTarget(Allocation *a) { - GET_TLS(); - rsrBindFrameBufferObjectDepthTarget(rsc, sc, a); -} - -static void SC_ClearFrameBufferObjectColorTarget(uint32_t slot) { - GET_TLS(); - rsrClearFrameBufferObjectColorTarget(rsc, sc, slot); -} - -static void SC_ClearFrameBufferObjectDepthTarget(Context *, Script *) { - GET_TLS(); - rsrClearFrameBufferObjectDepthTarget(rsc, sc); -} - -static void SC_ClearFrameBufferObjectTargets(Context *, Script *) { - GET_TLS(); - rsrClearFrameBufferObjectTargets(rsc, sc); -} - - -////////////////////////////////////////////////////////////////////////////// -// VP -////////////////////////////////////////////////////////////////////////////// - -static void SC_VpLoadProjectionMatrix(const rsc_Matrix *m) { - GET_TLS(); - rsrVpLoadProjectionMatrix(rsc, sc, m); -} - -static void SC_VpLoadModelMatrix(const rsc_Matrix *m) { - GET_TLS(); - rsrVpLoadModelMatrix(rsc, sc, m); -} - -static void SC_VpLoadTextureMatrix(const rsc_Matrix *m) { - GET_TLS(); - rsrVpLoadTextureMatrix(rsc, sc, m); -} - -static void SC_PfConstantColor(ProgramFragment *pf, float r, float g, float b, float a) { - GET_TLS(); - rsrPfConstantColor(rsc, sc, pf, r, g, b, a); -} - -static void SC_VpGetProjectionMatrix(rsc_Matrix *m) { - GET_TLS(); - rsrVpGetProjectionMatrix(rsc, sc, m); -} - - -////////////////////////////////////////////////////////////////////////////// -// Drawing -////////////////////////////////////////////////////////////////////////////// - -static void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1, - float x2, float y2, float z2, float u2, float v2, - float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4) { - GET_TLS(); - rsrDrawQuadTexCoords(rsc, sc, - x1, y1, z1, u1, v1, - x2, y2, z2, u2, v2, - x3, y3, z3, u3, v3, - x4, y4, z4, u4, v4); -} - -static void SC_DrawQuad(float x1, float y1, float z1, - float x2, float y2, float z2, - float x3, float y3, float z3, - float x4, float y4, float z4) { - GET_TLS(); - rsrDrawQuad(rsc, sc, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4); -} - -static void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) { - GET_TLS(); - rsrDrawSpriteScreenspace(rsc, sc, x, y, z, w, h); -} - -static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) { - GET_TLS(); - 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); -} - -static void SC_DrawMeshPrimitive(Mesh *m, uint32_t primIndex) { - GET_TLS(); - rsrDrawMeshPrimitive(rsc, sc, m, primIndex); -} - -static void SC_DrawMeshPrimitiveRange(Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) { - GET_TLS(); - rsrDrawMeshPrimitiveRange(rsc, sc, m, primIndex, start, len); -} - -static void SC_MeshComputeBoundingBox(Mesh *m, - float *minX, float *minY, float *minZ, - float *maxX, float *maxY, float *maxZ) { - GET_TLS(); - rsrMeshComputeBoundingBox(rsc, sc, m, minX, minY, minZ, maxX, maxY, maxZ); -} - - - -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// - - -static void SC_Color(float r, float g, float b, float a) { - GET_TLS(); - rsrColor(rsc, sc, r, g, b, a); -} - -static void SC_Finish() { - GET_TLS(); - rsdGLFinish(rsc); -} - -static void SC_ClearColor(float r, float g, float b, float a) { - GET_TLS(); - rsrPrepareClear(rsc, sc); - rsdGLClearColor(rsc, r, g, b, a); -} - -static void SC_ClearDepth(float v) { - GET_TLS(); - rsrPrepareClear(rsc, sc); - rsdGLClearDepth(rsc, v); -} - -static uint32_t SC_GetWidth() { - GET_TLS(); - return rsrGetWidth(rsc, sc); -} - -static uint32_t SC_GetHeight() { - GET_TLS(); - return rsrGetHeight(rsc, sc); -} - -static void SC_DrawTextAlloc(Allocation *a, int x, int y) { - GET_TLS(); - rsrDrawTextAlloc(rsc, sc, a, x, y); -} - -static void SC_DrawText(const char *text, int x, int y) { - GET_TLS(); - rsrDrawText(rsc, sc, text, x, y); -} - -static void SC_MeasureTextAlloc(Allocation *a, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { - GET_TLS(); - rsrMeasureTextAlloc(rsc, sc, a, left, right, top, bottom); -} - -static void SC_MeasureText(const char *text, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { - GET_TLS(); - rsrMeasureText(rsc, sc, text, left, right, top, bottom); -} - -static void SC_BindFont(Font *f) { - GET_TLS(); - rsrBindFont(rsc, sc, f); -} - -static void SC_FontColor(float r, float g, float b, float a) { - GET_TLS(); - rsrFontColor(rsc, sc, r, g, b, a); -} - - - -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// - -static void SC_SetObject(ObjectBase **dst, ObjectBase * src) { - GET_TLS(); - rsrSetObject(rsc, sc, dst, src); -} - -static void SC_ClearObject(ObjectBase **dst) { - GET_TLS(); - rsrClearObject(rsc, sc, dst); -} - -static bool SC_IsObject(const ObjectBase *src) { - GET_TLS(); - return rsrIsObject(rsc, sc, src); -} - - - - -static const Allocation * SC_GetAllocation(const void *ptr) { - GET_TLS(); - return rsrGetAllocation(rsc, sc, ptr); -} - -static void SC_ForEach_SAA(Script *target, - Allocation *in, - Allocation *out) { - GET_TLS(); - rsrForEach(rsc, sc, target, in, out, NULL, 0, NULL); -} - -static void SC_ForEach_SAAU(Script *target, - Allocation *in, - Allocation *out, - const void *usr) { - GET_TLS(); - rsrForEach(rsc, sc, target, in, out, usr, 0, NULL); -} - -static void SC_ForEach_SAAUS(Script *target, - Allocation *in, - Allocation *out, - const void *usr, - const RsScriptCall *call) { - GET_TLS(); - rsrForEach(rsc, sc, target, in, out, usr, 0, call); -} - -static void SC_ForEach_SAAUL(Script *target, - Allocation *in, - Allocation *out, - const void *usr, - uint32_t usrLen) { - GET_TLS(); - rsrForEach(rsc, sc, target, in, out, usr, usrLen, NULL); -} - -static void SC_ForEach_SAAULS(Script *target, - Allocation *in, - Allocation *out, - const void *usr, - uint32_t usrLen, - const RsScriptCall *call) { - GET_TLS(); - rsrForEach(rsc, sc, target, in, out, usr, usrLen, call); -} - - - -////////////////////////////////////////////////////////////////////////////// -// Time routines -////////////////////////////////////////////////////////////////////////////// - -static float SC_GetDt() { - GET_TLS(); - return rsrGetDt(rsc, sc); -} - -time_t SC_Time(time_t *timer) { - GET_TLS(); - return rsrTime(rsc, sc, timer); -} - -tm* SC_LocalTime(tm *local, time_t *timer) { - GET_TLS(); - return rsrLocalTime(rsc, sc, local, timer); -} - -int64_t SC_UptimeMillis() { - GET_TLS(); - return rsrUptimeMillis(rsc, sc); -} - -int64_t SC_UptimeNanos() { - GET_TLS(); - return rsrUptimeNanos(rsc, sc); -} - -////////////////////////////////////////////////////////////////////////////// -// Message routines -////////////////////////////////////////////////////////////////////////////// - -static uint32_t SC_ToClient2(int cmdID, void *data, int len) { - GET_TLS(); - return rsrToClient(rsc, sc, cmdID, data, len); -} - -static uint32_t SC_ToClient(int cmdID) { - GET_TLS(); - return rsrToClient(rsc, sc, cmdID, NULL, 0); -} - -static uint32_t SC_ToClientBlocking2(int cmdID, void *data, int len) { - GET_TLS(); - return rsrToClientBlocking(rsc, sc, cmdID, data, len); -} - -static uint32_t SC_ToClientBlocking(int cmdID) { - GET_TLS(); - return rsrToClientBlocking(rsc, sc, cmdID, NULL, 0); -} - -int SC_divsi3(int a, int b) { - return a / b; -} - -int SC_modsi3(int a, int b) { - return a % b; -} - -unsigned int SC_udivsi3(unsigned int a, unsigned int b) { - return a / b; -} - -unsigned int SC_umodsi3(unsigned int a, unsigned int b) { - return a % b; -} - -static void SC_debugF(const char *s, float f) { - ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f))); -} -static void SC_debugFv2(const char *s, float f1, float f2) { - ALOGD("%s {%f, %f}", s, f1, f2); -} -static void SC_debugFv3(const char *s, float f1, float f2, float f3) { - ALOGD("%s {%f, %f, %f}", s, f1, f2, f3); -} -static void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) { - ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4); -} -static void SC_debugD(const char *s, double d) { - ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d))); -} -static void SC_debugFM4v4(const char *s, const float *f) { - ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]); - ALOGD("%s %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]); - ALOGD("%s %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]); - ALOGD("%s %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]); -} -static void SC_debugFM3v3(const char *s, const float *f) { - ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]); - ALOGD("%s %f, %f, %f", s, f[1], f[4], f[7]); - ALOGD("%s %f, %f, %f}",s, f[2], f[5], f[8]); -} -static void SC_debugFM2v2(const char *s, const float *f) { - ALOGD("%s {%f, %f", s, f[0], f[2]); - ALOGD("%s %f, %f}",s, f[1], f[3]); -} - -static void SC_debugI32(const char *s, int32_t i) { - ALOGD("%s %i 0x%x", s, i, i); -} -static void SC_debugU32(const char *s, uint32_t i) { - ALOGD("%s %u 0x%x", s, i, i); -} -static void SC_debugLL64(const char *s, long long ll) { - ALOGD("%s %lld 0x%llx", s, ll, ll); -} -static void SC_debugULL64(const char *s, unsigned long long ll) { - ALOGD("%s %llu 0x%llx", s, ll, ll); -} - -static void SC_debugP(const char *s, const void *p) { - ALOGD("%s %p", s, p); -} - - -////////////////////////////////////////////////////////////////////////////// -// Stub implementation -////////////////////////////////////////////////////////////////////////////// - -// llvm name mangling ref -// <builtin-type> ::= v # void -// ::= b # bool -// ::= c # char -// ::= a # signed char -// ::= h # unsigned char -// ::= s # short -// ::= t # unsigned short -// ::= i # int -// ::= j # unsigned int -// ::= l # long -// ::= m # unsigned long -// ::= x # long long, __int64 -// ::= y # unsigned long long, __int64 -// ::= f # float -// ::= d # double - -static RsdSymbolTable gSyms[] = { - { "memset", (void *)&memset, true }, - { "memcpy", (void *)&memcpy, true }, - - // Refcounting - { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true }, - { "_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 }, - - { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true }, - - { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true }, - { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true }, - { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true }, - - // Allocation ops - { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true }, - { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false }, - { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false }, - { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false }, - { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true }, - - { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false }, - { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false }, - - // Messaging - - { "_Z14rsSendToClienti", (void *)&SC_ToClient, false }, - { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false }, - { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false }, - { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false }, - - { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false }, - { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false }, - { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false }, - { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false }, - { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false }, - { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false }, - { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false }, - { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false }, - - { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false }, - { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false }, - { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false }, - - { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false }, - - { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false }, - - { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false }, - { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false }, - - - { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false }, - { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false }, - { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false }, - { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false }, - - { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false }, - { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false }, - { "_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 }, - - { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false }, - { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false }, - { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false }, - { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false }, - - { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false }, - { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false }, - - { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false }, - { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false }, - { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false }, - { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false }, - { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false }, - - { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, false }, - { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, false }, - { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK16rs_script_call_t", (void *)&SC_ForEach_SAAUS, false }, - { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, false }, - { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK16rs_script_call_t", (void *)&SC_ForEach_SAAULS, false }, - - // time - { "_Z6rsTimePi", (void *)&SC_Time, true }, - { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true }, - { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true }, - { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true }, - { "_Z7rsGetDtv", (void*)&SC_GetDt, false }, - - // misc - { "_Z5colorffff", (void *)&SC_Color, false }, - { "_Z9rsgFinishv", (void *)&SC_Finish, false }, - - // Debug - { "_Z7rsDebugPKcf", (void *)&SC_debugF, true }, - { "_Z7rsDebugPKcff", (void *)&SC_debugFv2, true }, - { "_Z7rsDebugPKcfff", (void *)&SC_debugFv3, true }, - { "_Z7rsDebugPKcffff", (void *)&SC_debugFv4, true }, - { "_Z7rsDebugPKcd", (void *)&SC_debugD, true }, - { "_Z7rsDebugPKcPK12rs_matrix4x4", (void *)&SC_debugFM4v4, true }, - { "_Z7rsDebugPKcPK12rs_matrix3x3", (void *)&SC_debugFM3v3, true }, - { "_Z7rsDebugPKcPK12rs_matrix2x2", (void *)&SC_debugFM2v2, true }, - { "_Z7rsDebugPKci", (void *)&SC_debugI32, true }, - { "_Z7rsDebugPKcj", (void *)&SC_debugU32, true }, - // Both "long" and "unsigned long" need to be redirected to their - // 64-bit counterparts, since we have hacked Slang to use 64-bit - // for "long" on Arm (to be similar to Java). - { "_Z7rsDebugPKcl", (void *)&SC_debugLL64, true }, - { "_Z7rsDebugPKcm", (void *)&SC_debugULL64, true }, - { "_Z7rsDebugPKcx", (void *)&SC_debugLL64, true }, - { "_Z7rsDebugPKcy", (void *)&SC_debugULL64, true }, - { "_Z7rsDebugPKcPKv", (void *)&SC_debugP, true }, - - { NULL, NULL, false } -}; - - -void* rsdLookupRuntimeStub(void* pContext, char const* name) { - ScriptC *s = (ScriptC *)pContext; - if (!strcmp(name, "__isThreadable")) { - return (void*) s->mHal.info.isThreadable; - } else if (!strcmp(name, "__clearThreadable")) { - s->mHal.info.isThreadable = false; - return NULL; - } - - RsdSymbolTable *syms = gSyms; - const RsdSymbolTable *sym = rsdLookupSymbolMath(name); - - if (!sym) { - while (syms->mPtr) { - if (!strcmp(syms->mName, name)) { - sym = syms; - } - syms++; - } - } - - if (sym) { - s->mHal.info.isThreadable &= sym->threadable; - return sym->mPtr; - } - ALOGE("ScriptC sym lookup failed for %s", name); - return NULL; -} - - diff --git a/libs/rs/driver/rsdSampler.cpp b/libs/rs/driver/rsdSampler.cpp deleted file mode 100644 index af48c61..0000000 --- a/libs/rs/driver/rsdSampler.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 "rsdCore.h" -#include "rsdSampler.h" - -#include "rsContext.h" -#include "rsSampler.h" -#include "rsProgramVertex.h" -#include "rsProgramFragment.h" - -#include <GLES/gl.h> -#include <GLES/glext.h> - - -using namespace android; -using namespace android::renderscript; - -bool rsdSamplerInit(const android::renderscript::Context *, - const android::renderscript::Sampler *) { - return true; -} - -void rsdSamplerDestroy(const android::renderscript::Context *rsc, - const android::renderscript::Sampler *s) { -} diff --git a/libs/rs/driver/rsdSampler.h b/libs/rs/driver/rsdSampler.h deleted file mode 100644 index 3a64e9e..0000000 --- a/libs/rs/driver/rsdSampler.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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_SAMPLER_H -#define RSD_SAMPLER_H - -#include <rs_hal.h> - - -bool rsdSamplerInit(const android::renderscript::Context *rsc, - const android::renderscript::Sampler *); - -void rsdSamplerDestroy(const android::renderscript::Context *rsc, - const android::renderscript::Sampler *); - - -#endif // RSD_SAMPLER_H diff --git a/libs/rs/driver/rsdShader.cpp b/libs/rs/driver/rsdShader.cpp deleted file mode 100644 index 6d9fa90..0000000 --- a/libs/rs/driver/rsdShader.cpp +++ /dev/null @@ -1,604 +0,0 @@ -/* - * Copyright (C) 2011-2012 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 <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - -#include <rs_hal.h> -#include <rsContext.h> -#include <rsProgram.h> - -#include "rsdCore.h" -#include "rsdAllocation.h" -#include "rsdShader.h" -#include "rsdShaderCache.h" - -using namespace android; -using namespace android::renderscript; - -RsdShader::RsdShader(const Program *p, uint32_t type, - const char * shaderText, size_t shaderLength, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength) { - mUserShader.setTo(shaderText, shaderLength); - mRSProgram = p; - mType = type; - initMemberVars(); - initAttribAndUniformArray(); - init(textureNames, textureNamesCount, textureNamesLength); - - for(size_t i=0; i < textureNamesCount; i++) { - mTextureNames.push(String8(textureNames[i], textureNamesLength[i])); - } -} - -RsdShader::~RsdShader() { - for (uint32_t i = 0; i < mStateBasedShaders.size(); i ++) { - StateBasedKey *state = mStateBasedShaders.itemAt(i); - if (state->mShaderID) { - glDeleteShader(state->mShaderID); - } - delete state; - } - - delete[] mAttribNames; - delete[] mUniformNames; - delete[] mUniformArraySizes; -} - -void RsdShader::initMemberVars() { - mDirty = true; - mAttribCount = 0; - mUniformCount = 0; - - mAttribNames = NULL; - mUniformNames = NULL; - mUniformArraySizes = NULL; - mCurrentState = NULL; - - mIsValid = false; -} - -RsdShader::StateBasedKey *RsdShader::getExistingState() { - RsdShader::StateBasedKey *returnKey = NULL; - - for (uint32_t i = 0; i < mStateBasedShaders.size(); i ++) { - returnKey = mStateBasedShaders.itemAt(i); - - for (uint32_t ct = 0; ct < mRSProgram->mHal.state.texturesCount; ct ++) { - uint32_t texType = 0; - if (mRSProgram->mHal.state.textureTargets[ct] == RS_TEXTURE_2D) { - Allocation *a = mRSProgram->mHal.state.textures[ct]; - if (a && a->mHal.state.surfaceTextureID) { - texType = GL_TEXTURE_EXTERNAL_OES; - } else { - texType = GL_TEXTURE_2D; - } - } else { - texType = GL_TEXTURE_CUBE_MAP; - } - if (texType != returnKey->mTextureTargets[ct]) { - returnKey = NULL; - break; - } - } - } - return returnKey; -} - -uint32_t RsdShader::getStateBasedShaderID(const Context *rsc) { - StateBasedKey *state = getExistingState(); - if (state != NULL) { - mCurrentState = state; - return mCurrentState->mShaderID; - } - // We have not created a shader for this particular state yet - state = new StateBasedKey(mTextureCount); - mCurrentState = state; - mStateBasedShaders.add(state); - createShader(); - loadShader(rsc); - return mCurrentState->mShaderID; -} - -void RsdShader::init(const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength) { - uint32_t attribCount = 0; - uint32_t uniformCount = 0; - for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { - initAddUserElement(mRSProgram->mHal.state.inputElements[ct], mAttribNames, - NULL, &attribCount, RS_SHADER_ATTR); - } - for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) { - initAddUserElement(mRSProgram->mHal.state.constantTypes[ct]->getElement(), - mUniformNames, mUniformArraySizes, &uniformCount, RS_SHADER_UNI); - } - - mTextureUniformIndexStart = uniformCount; - for (uint32_t ct=0; ct < mRSProgram->mHal.state.texturesCount; ct++) { - mUniformNames[uniformCount].setTo("UNI_"); - mUniformNames[uniformCount].append(textureNames[ct], textureNamesLength[ct]); - mUniformArraySizes[uniformCount] = 1; - uniformCount++; - } -} - -String8 RsdShader::getGLSLInputString() const { - String8 s; - for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { - const Element *e = mRSProgram->mHal.state.inputElements[ct]; - for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { - const Element *f = e->mHal.state.fields[field]; - - // Cannot be complex - rsAssert(!f->mHal.state.fieldsCount); - switch (f->mHal.state.vectorSize) { - case 1: s.append("attribute float ATTRIB_"); break; - case 2: s.append("attribute vec2 ATTRIB_"); break; - case 3: s.append("attribute vec3 ATTRIB_"); break; - case 4: s.append("attribute vec4 ATTRIB_"); break; - default: - rsAssert(0); - } - - s.append(e->mHal.state.fieldNames[field]); - s.append(";\n"); - } - } - return s; -} - -void RsdShader::appendAttributes() { - for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { - const Element *e = mRSProgram->mHal.state.inputElements[ct]; - for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { - const Element *f = e->mHal.state.fields[field]; - const char *fn = e->mHal.state.fieldNames[field]; - - // Cannot be complex - rsAssert(!f->mHal.state.fieldsCount); - switch (f->mHal.state.vectorSize) { - case 1: mShader.append("attribute float ATTRIB_"); break; - case 2: mShader.append("attribute vec2 ATTRIB_"); break; - case 3: mShader.append("attribute vec3 ATTRIB_"); break; - case 4: mShader.append("attribute vec4 ATTRIB_"); break; - default: - rsAssert(0); - } - - mShader.append(fn); - mShader.append(";\n"); - } - } -} - -void RsdShader::appendTextures() { - - // TODO: this does not yet handle cases where the texture changes between IO - // input and local - bool appendUsing = true; - for (uint32_t ct = 0; ct < mRSProgram->mHal.state.texturesCount; ct ++) { - if (mRSProgram->mHal.state.textureTargets[ct] == RS_TEXTURE_2D) { - Allocation *a = mRSProgram->mHal.state.textures[ct]; - if (a && a->mHal.state.surfaceTextureID) { - if(appendUsing) { - mShader.append("#extension GL_OES_EGL_image_external : require\n"); - appendUsing = false; - } - mShader.append("uniform samplerExternalOES UNI_"); - mCurrentState->mTextureTargets[ct] = GL_TEXTURE_EXTERNAL_OES; - } else { - mShader.append("uniform sampler2D UNI_"); - mCurrentState->mTextureTargets[ct] = GL_TEXTURE_2D; - } - } else { - mShader.append("uniform samplerCube UNI_"); - mCurrentState->mTextureTargets[ct] = GL_TEXTURE_CUBE_MAP; - } - - mShader.append(mTextureNames[ct]); - mShader.append(";\n"); - } -} - -bool RsdShader::createShader() { - mShader.clear(); - if (mType == GL_FRAGMENT_SHADER) { - mShader.append("precision mediump float;\n"); - } - appendUserConstants(); - appendAttributes(); - appendTextures(); - mShader.append(mUserShader); - - return true; -} - -bool RsdShader::loadShader(const Context *rsc) { - mCurrentState->mShaderID = glCreateShader(mType); - rsAssert(mCurrentState->mShaderID); - - if(!mShader.length()) { - createShader(); - } - - if (rsc->props.mLogShaders) { - ALOGV("Loading shader type %x, ID %i", mType, mCurrentState->mShaderID); - ALOGV("%s", mShader.string()); - } - - if (mCurrentState->mShaderID) { - const char * ss = mShader.string(); - RSD_CALL_GL(glShaderSource, mCurrentState->mShaderID, 1, &ss, NULL); - RSD_CALL_GL(glCompileShader, mCurrentState->mShaderID); - - GLint compiled = 0; - RSD_CALL_GL(glGetShaderiv, mCurrentState->mShaderID, GL_COMPILE_STATUS, &compiled); - if (!compiled) { - GLint infoLen = 0; - RSD_CALL_GL(glGetShaderiv, mCurrentState->mShaderID, GL_INFO_LOG_LENGTH, &infoLen); - if (infoLen) { - char* buf = (char*) malloc(infoLen); - if (buf) { - RSD_CALL_GL(glGetShaderInfoLog, mCurrentState->mShaderID, infoLen, NULL, buf); - rsc->setError(RS_ERROR_FATAL_PROGRAM_LINK, buf); - free(buf); - } - RSD_CALL_GL(glDeleteShader, mCurrentState->mShaderID); - mCurrentState->mShaderID = 0; - return false; - } - } - } - - if (rsc->props.mLogShaders) { - ALOGV("--Shader load result %x ", glGetError()); - } - mIsValid = true; - return true; -} - -void RsdShader::appendUserConstants() { - for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) { - const Element *e = mRSProgram->mHal.state.constantTypes[ct]->getElement(); - for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { - const Element *f = e->mHal.state.fields[field]; - const char *fn = e->mHal.state.fieldNames[field]; - - // Cannot be complex - rsAssert(!f->mHal.state.fieldsCount); - if (f->mHal.state.dataType == RS_TYPE_MATRIX_4X4) { - mShader.append("uniform mat4 UNI_"); - } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_3X3) { - mShader.append("uniform mat3 UNI_"); - } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_2X2) { - mShader.append("uniform mat2 UNI_"); - } else { - switch (f->mHal.state.vectorSize) { - case 1: mShader.append("uniform float UNI_"); break; - case 2: mShader.append("uniform vec2 UNI_"); break; - case 3: mShader.append("uniform vec3 UNI_"); break; - case 4: mShader.append("uniform vec4 UNI_"); break; - default: - rsAssert(0); - } - } - - mShader.append(fn); - if (e->mHal.state.fieldArraySizes[field] > 1) { - mShader.appendFormat("[%d]", e->mHal.state.fieldArraySizes[field]); - } - mShader.append(";\n"); - } - } -} - -void RsdShader::logUniform(const Element *field, const float *fd, uint32_t arraySize ) { - RsDataType dataType = field->mHal.state.dataType; - uint32_t elementSize = field->mHal.state.elementSizeBytes / sizeof(float); - for (uint32_t i = 0; i < arraySize; i ++) { - if (arraySize > 1) { - ALOGV("Array Element [%u]", i); - } - if (dataType == RS_TYPE_MATRIX_4X4) { - ALOGV("Matrix4x4"); - ALOGV("{%f, %f, %f, %f", fd[0], fd[4], fd[8], fd[12]); - ALOGV(" %f, %f, %f, %f", fd[1], fd[5], fd[9], fd[13]); - ALOGV(" %f, %f, %f, %f", fd[2], fd[6], fd[10], fd[14]); - ALOGV(" %f, %f, %f, %f}", fd[3], fd[7], fd[11], fd[15]); - } else if (dataType == RS_TYPE_MATRIX_3X3) { - ALOGV("Matrix3x3"); - ALOGV("{%f, %f, %f", fd[0], fd[3], fd[6]); - ALOGV(" %f, %f, %f", fd[1], fd[4], fd[7]); - ALOGV(" %f, %f, %f}", fd[2], fd[5], fd[8]); - } else if (dataType == RS_TYPE_MATRIX_2X2) { - ALOGV("Matrix2x2"); - ALOGV("{%f, %f", fd[0], fd[2]); - ALOGV(" %f, %f}", fd[1], fd[3]); - } else { - switch (field->mHal.state.vectorSize) { - case 1: - ALOGV("Uniform 1 = %f", fd[0]); - break; - case 2: - ALOGV("Uniform 2 = %f %f", fd[0], fd[1]); - break; - case 3: - ALOGV("Uniform 3 = %f %f %f", fd[0], fd[1], fd[2]); - break; - case 4: - ALOGV("Uniform 4 = %f %f %f %f", fd[0], fd[1], fd[2], fd[3]); - break; - default: - rsAssert(0); - } - } - ALOGE("Element size %u data=%p", elementSize, fd); - fd += elementSize; - ALOGE("New data=%p", fd); - } -} - -void RsdShader::setUniform(const Context *rsc, const Element *field, const float *fd, - int32_t slot, uint32_t arraySize ) { - RsDataType dataType = field->mHal.state.dataType; - if (dataType == RS_TYPE_MATRIX_4X4) { - RSD_CALL_GL(glUniformMatrix4fv, slot, arraySize, GL_FALSE, fd); - } else if (dataType == RS_TYPE_MATRIX_3X3) { - RSD_CALL_GL(glUniformMatrix3fv, slot, arraySize, GL_FALSE, fd); - } else if (dataType == RS_TYPE_MATRIX_2X2) { - RSD_CALL_GL(glUniformMatrix2fv, slot, arraySize, GL_FALSE, fd); - } else { - switch (field->mHal.state.vectorSize) { - case 1: - RSD_CALL_GL(glUniform1fv, slot, arraySize, fd); - break; - case 2: - RSD_CALL_GL(glUniform2fv, slot, arraySize, fd); - break; - case 3: - RSD_CALL_GL(glUniform3fv, slot, arraySize, fd); - break; - case 4: - RSD_CALL_GL(glUniform4fv, slot, arraySize, fd); - break; - default: - rsAssert(0); - } - } -} - -void RsdShader::setupSampler(const Context *rsc, const Sampler *s, const Allocation *tex) { - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - GLenum trans[] = { - GL_NEAREST, //RS_SAMPLER_NEAREST, - GL_LINEAR, //RS_SAMPLER_LINEAR, - GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR, - GL_REPEAT, //RS_SAMPLER_WRAP, - GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP - GL_LINEAR_MIPMAP_NEAREST, //RS_SAMPLER_LINEAR_MIP_NEAREST - }; - - GLenum transNP[] = { - GL_NEAREST, //RS_SAMPLER_NEAREST, - GL_LINEAR, //RS_SAMPLER_LINEAR, - GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR, - GL_CLAMP_TO_EDGE, //RS_SAMPLER_WRAP, - GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP - GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_NEAREST, - }; - - // This tells us the correct texture type - DrvAllocation *drvTex = (DrvAllocation *)tex->mHal.drv; - const GLenum target = drvTex->glTarget; - - if (!dc->gl.gl.OES_texture_npot && tex->getType()->getIsNp2()) { - if (tex->getHasGraphicsMipmaps() && - (dc->gl.gl.NV_texture_npot_2D_mipmap || dc->gl.gl.IMG_texture_npot)) { - if (dc->gl.gl.NV_texture_npot_2D_mipmap) { - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER, - trans[s->mHal.state.minFilter]); - } else { - switch (trans[s->mHal.state.minFilter]) { - case GL_LINEAR_MIPMAP_LINEAR: - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER, - GL_LINEAR_MIPMAP_NEAREST); - break; - default: - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER, - trans[s->mHal.state.minFilter]); - break; - } - } - } else { - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER, - transNP[s->mHal.state.minFilter]); - } - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MAG_FILTER, - transNP[s->mHal.state.magFilter]); - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_S, transNP[s->mHal.state.wrapS]); - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_T, transNP[s->mHal.state.wrapT]); - } else { - if (tex->getHasGraphicsMipmaps()) { - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER, - trans[s->mHal.state.minFilter]); - } else { - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER, - transNP[s->mHal.state.minFilter]); - } - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MAG_FILTER, trans[s->mHal.state.magFilter]); - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_S, trans[s->mHal.state.wrapS]); - RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_T, trans[s->mHal.state.wrapT]); - } - - float anisoValue = rsMin(dc->gl.gl.EXT_texture_max_aniso, s->mHal.state.aniso); - if (dc->gl.gl.EXT_texture_max_aniso > 1.0f) { - RSD_CALL_GL(glTexParameterf, target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoValue); - } - - rsdGLCheckError(rsc, "Sampler::setup tex env"); -} - -void RsdShader::setupTextures(const Context *rsc, RsdShaderCache *sc) { - if (mRSProgram->mHal.state.texturesCount == 0) { - return; - } - - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - - uint32_t numTexturesToBind = mRSProgram->mHal.state.texturesCount; - uint32_t numTexturesAvailable = dc->gl.gl.maxFragmentTextureImageUnits; - if (numTexturesToBind >= numTexturesAvailable) { - ALOGE("Attempting to bind %u textures on shader id %u, but only %u are available", - mRSProgram->mHal.state.texturesCount, (uint32_t)this, numTexturesAvailable); - rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind more textuers than available"); - numTexturesToBind = numTexturesAvailable; - } - - for (uint32_t ct=0; ct < numTexturesToBind; ct++) { - RSD_CALL_GL(glActiveTexture, GL_TEXTURE0 + ct); - RSD_CALL_GL(glUniform1i, sc->fragUniformSlot(mTextureUniformIndexStart + ct), ct); - - if (!mRSProgram->mHal.state.textures[ct]) { - // if nothing is bound, reset to default GL texture - RSD_CALL_GL(glBindTexture, mCurrentState->mTextureTargets[ct], 0); - continue; - } - - DrvAllocation *drvTex = (DrvAllocation *)mRSProgram->mHal.state.textures[ct]->mHal.drv; - if (drvTex->glTarget != GL_TEXTURE_2D && - drvTex->glTarget != GL_TEXTURE_CUBE_MAP && - drvTex->glTarget != GL_TEXTURE_EXTERNAL_OES) { - ALOGE("Attempting to bind unknown texture to shader id %u, texture unit %u", - (uint)this, ct); - rsc->setError(RS_ERROR_BAD_SHADER, "Non-texture allocation bound to a shader"); - } - RSD_CALL_GL(glBindTexture, drvTex->glTarget, drvTex->textureID); - rsdGLCheckError(rsc, "ProgramFragment::setup tex bind"); - if (mRSProgram->mHal.state.samplers[ct]) { - setupSampler(rsc, mRSProgram->mHal.state.samplers[ct], - mRSProgram->mHal.state.textures[ct]); - } else { - RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - rsdGLCheckError(rsc, "ProgramFragment::setup tex env"); - } - rsdGLCheckError(rsc, "ProgramFragment::setup uniforms"); - } - - RSD_CALL_GL(glActiveTexture, GL_TEXTURE0); - mDirty = false; - rsdGLCheckError(rsc, "ProgramFragment::setup"); -} - -void RsdShader::setupUserConstants(const Context *rsc, RsdShaderCache *sc, bool isFragment) { - uint32_t uidx = 0; - for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) { - Allocation *alloc = mRSProgram->mHal.state.constants[ct]; - if (!alloc) { - ALOGE("Attempting to set constants on shader id %u, but alloc at slot %u is not set", - (uint32_t)this, ct); - rsc->setError(RS_ERROR_BAD_SHADER, "No constant allocation bound"); - continue; - } - - const uint8_t *data = static_cast<const uint8_t *>(alloc->getPtr()); - const Element *e = mRSProgram->mHal.state.constantTypes[ct]->getElement(); - for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { - const Element *f = e->mHal.state.fields[field]; - const char *fieldName = e->mHal.state.fieldNames[field]; - - uint32_t offset = e->mHal.state.fieldOffsetBytes[field]; - const float *fd = reinterpret_cast<const float *>(&data[offset]); - - int32_t slot = -1; - uint32_t arraySize = 1; - if (!isFragment) { - slot = sc->vtxUniformSlot(uidx); - arraySize = sc->vtxUniformSize(uidx); - } else { - slot = sc->fragUniformSlot(uidx); - arraySize = sc->fragUniformSize(uidx); - } - if (rsc->props.mLogShadersUniforms) { - ALOGV("Uniform slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s", - slot, offset, ct, field, uidx, fieldName); - } - uidx ++; - if (slot < 0) { - continue; - } - - if (rsc->props.mLogShadersUniforms) { - logUniform(f, fd, arraySize); - } - setUniform(rsc, f, fd, slot, arraySize); - } - } -} - -void RsdShader::setup(const android::renderscript::Context *rsc, RsdShaderCache *sc) { - - setupUserConstants(rsc, sc, mType == GL_FRAGMENT_SHADER); - setupTextures(rsc, sc); -} - -void RsdShader::initAttribAndUniformArray() { - mAttribCount = 0; - for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { - const Element *elem = mRSProgram->mHal.state.inputElements[ct]; - mAttribCount += elem->mHal.state.fieldsCount; - } - - mUniformCount = 0; - for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) { - const Element *elem = mRSProgram->mHal.state.constantTypes[ct]->getElement(); - mUniformCount += elem->mHal.state.fieldsCount; - } - mUniformCount += mRSProgram->mHal.state.texturesCount; - - if (mAttribCount) { - mAttribNames = new String8[mAttribCount]; - } - if (mUniformCount) { - mUniformNames = new String8[mUniformCount]; - mUniformArraySizes = new uint32_t[mUniformCount]; - } - - mTextureCount = mRSProgram->mHal.state.texturesCount; -} - -void RsdShader::initAddUserElement(const Element *e, String8 *names, uint32_t *arrayLengths, - uint32_t *count, const char *prefix) { - rsAssert(e->mHal.state.fieldsCount); - for (uint32_t ct=0; ct < e->mHal.state.fieldsCount; ct++) { - const Element *ce = e->mHal.state.fields[ct]; - if (ce->mHal.state.fieldsCount) { - initAddUserElement(ce, names, arrayLengths, count, prefix); - } else { - String8 tmp(prefix); - tmp.append(e->mHal.state.fieldNames[ct]); - names[*count].setTo(tmp.string()); - if (arrayLengths) { - arrayLengths[*count] = e->mHal.state.fieldArraySizes[ct]; - } - (*count)++; - } - } -} diff --git a/libs/rs/driver/rsdShader.h b/libs/rs/driver/rsdShader.h deleted file mode 100644 index 2680b3e..0000000 --- a/libs/rs/driver/rsdShader.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2011-2012 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_RSD_SHADER_H -#define ANDROID_RSD_SHADER_H - -#include <utils/String8.h> - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class Element; -class Context; -class Program; - -} -} - -class RsdShaderCache; - -#define RS_SHADER_ATTR "ATTRIB_" -#define RS_SHADER_UNI "UNI_" - -class RsdShader { -public: - - RsdShader(const android::renderscript::Program *p, uint32_t type, - const char * shaderText, uint32_t shaderLength, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength); - virtual ~RsdShader(); - - uint32_t getStateBasedShaderID(const android::renderscript::Context *); - - // Add ability to get all ID's to clean up the cached program objects - uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); } - uint32_t getStateBasedID(uint32_t index) const { - return mStateBasedShaders.itemAt(index)->mShaderID; - } - - uint32_t getAttribCount() const {return mAttribCount;} - uint32_t getUniformCount() const {return mUniformCount;} - const android::String8 & getAttribName(uint32_t i) const {return mAttribNames[i];} - const android::String8 & getUniformName(uint32_t i) const {return mUniformNames[i];} - uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];} - - android::String8 getGLSLInputString() const; - - bool isValid() const {return mIsValid;} - void forceDirty() const {mDirty = true;} - - bool loadShader(const android::renderscript::Context *); - void setup(const android::renderscript::Context *, RsdShaderCache *sc); - -protected: - - class StateBasedKey { - public: - StateBasedKey(uint32_t texCount) : mShaderID(0) { - mTextureTargets = new uint32_t[texCount]; - } - ~StateBasedKey() { - delete[] mTextureTargets; - } - uint32_t mShaderID; - uint32_t *mTextureTargets; - }; - - bool createShader(); - StateBasedKey *getExistingState(); - - const android::renderscript::Program *mRSProgram; - bool mIsValid; - - // Applies to vertex and fragment shaders only - void appendUserConstants(); - void setupUserConstants(const android::renderscript::Context *rsc, - RsdShaderCache *sc, bool isFragment); - void initAddUserElement(const android::renderscript::Element *e, - android::String8 *names, uint32_t *arrayLengths, - uint32_t *count, const char *prefix); - void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc); - void setupSampler(const android::renderscript::Context *rsc, - const android::renderscript::Sampler *s, - const android::renderscript::Allocation *tex); - - void appendAttributes(); - void appendTextures(); - - void initAttribAndUniformArray(); - - mutable bool mDirty; - android::String8 mShader; - android::String8 mUserShader; - uint32_t mType; - - uint32_t mTextureCount; - StateBasedKey *mCurrentState; - uint32_t mAttribCount; - uint32_t mUniformCount; - android::String8 *mAttribNames; - android::String8 *mUniformNames; - uint32_t *mUniformArraySizes; - - android::Vector<android::String8> mTextureNames; - - android::Vector<StateBasedKey*> mStateBasedShaders; - - int32_t mTextureUniformIndexStart; - - void logUniform(const android::renderscript::Element *field, - const float *fd, uint32_t arraySize); - void setUniform(const android::renderscript::Context *rsc, - const android::renderscript::Element *field, - const float *fd, int32_t slot, uint32_t arraySize ); - void initMemberVars(); - void init(const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength); -}; - -#endif //ANDROID_RSD_SHADER_H - - - - diff --git a/libs/rs/driver/rsdShaderCache.cpp b/libs/rs/driver/rsdShaderCache.cpp deleted file mode 100644 index 69b43fc..0000000 --- a/libs/rs/driver/rsdShaderCache.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (C) 2011-2012 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 <rs_hal.h> -#include <rsContext.h> - -#include "rsdShader.h" -#include "rsdShaderCache.h" -#include "rsdGL.h" - -#include <GLES/gl.h> -#include <GLES2/gl2.h> - -using namespace android; -using namespace android::renderscript; - - -RsdShaderCache::RsdShaderCache() { - mEntries.setCapacity(16); - mVertexDirty = true; - mFragmentDirty = true; -} - -RsdShaderCache::~RsdShaderCache() { - cleanupAll(); -} - -void RsdShaderCache::updateUniformArrayData(const Context *rsc, RsdShader *prog, uint32_t linkedID, - UniformData *data, const char* logTag, - UniformQueryData **uniformList, uint32_t uniListSize) { - - for (uint32_t ct=0; ct < prog->getUniformCount(); ct++) { - if (data[ct].slot >= 0 && data[ct].arraySize > 1) { - //Iterate over the list of active GL uniforms and find highest array index - for (uint32_t ui = 0; ui < uniListSize; ui ++) { - if (prog->getUniformName(ct) == uniformList[ui]->name) { - data[ct].arraySize = (uint32_t)uniformList[ui]->arraySize; - break; - } - } - } - - if (rsc->props.mLogShaders) { - ALOGV("%s U, %s = %d, arraySize = %d\n", logTag, - prog->getUniformName(ct).string(), data[ct].slot, data[ct].arraySize); - } - } -} - -void RsdShaderCache::populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data) { - for (uint32_t ct=0; ct < prog->getUniformCount(); ct++) { - data[ct].slot = glGetUniformLocation(linkedID, prog->getUniformName(ct)); - data[ct].arraySize = prog->getUniformArraySize(ct); - } -} - -bool RsdShaderCache::hasArrayUniforms(RsdShader *vtx, RsdShader *frag) { - UniformData *data = mCurrent->vtxUniforms; - for (uint32_t ct=0; ct < vtx->getUniformCount(); ct++) { - if (data[ct].slot >= 0 && data[ct].arraySize > 1) { - return true; - } - } - data = mCurrent->fragUniforms; - for (uint32_t ct=0; ct < frag->getUniformCount(); ct++) { - if (data[ct].slot >= 0 && data[ct].arraySize > 1) { - return true; - } - } - return false; -} - -bool RsdShaderCache::setup(const Context *rsc) { - if (!mVertexDirty && !mFragmentDirty) { - return true; - } - - if (!link(rsc)) { - return false; - } - - if (mFragmentDirty) { - mFragment->setup(rsc, this); - mFragmentDirty = false; - } - if (mVertexDirty) { - mVertex->setup(rsc, this); - mVertexDirty = false; - } - - return true; -} - -bool RsdShaderCache::link(const Context *rsc) { - - RsdShader *vtx = mVertex; - RsdShader *frag = mFragment; - - uint32_t vID = vtx->getStateBasedShaderID(rsc); - uint32_t fID = frag->getStateBasedShaderID(rsc); - - // Don't try to cache if shaders failed to load - if (!vID || !fID) { - return false; - } - uint32_t entryCount = mEntries.size(); - for (uint32_t ct = 0; ct < entryCount; ct ++) { - if ((mEntries[ct]->vtx == vID) && (mEntries[ct]->frag == fID)) { - - //ALOGV("SC using program %i", mEntries[ct]->program); - glUseProgram(mEntries[ct]->program); - mCurrent = mEntries[ct]; - //ALOGV("RsdShaderCache hit, using %i", ct); - rsdGLCheckError(rsc, "RsdShaderCache::link (hit)"); - return true; - } - } - - ProgramEntry *e = new ProgramEntry(vtx->getAttribCount(), - vtx->getUniformCount(), - frag->getUniformCount()); - mEntries.push(e); - mCurrent = e; - e->vtx = vID; - e->frag = fID; - e->program = glCreateProgram(); - if (e->program) { - GLuint pgm = e->program; - glAttachShader(pgm, vID); - //ALOGE("e1 %x", glGetError()); - glAttachShader(pgm, fID); - - glBindAttribLocation(pgm, 0, "ATTRIB_position"); - glBindAttribLocation(pgm, 1, "ATTRIB_color"); - glBindAttribLocation(pgm, 2, "ATTRIB_normal"); - glBindAttribLocation(pgm, 3, "ATTRIB_texture0"); - - //ALOGE("e2 %x", glGetError()); - glLinkProgram(pgm); - //ALOGE("e3 %x", glGetError()); - GLint linkStatus = GL_FALSE; - glGetProgramiv(pgm, GL_LINK_STATUS, &linkStatus); - if (linkStatus != GL_TRUE) { - GLint bufLength = 0; - glGetProgramiv(pgm, GL_INFO_LOG_LENGTH, &bufLength); - if (bufLength) { - char* buf = (char*) malloc(bufLength); - if (buf) { - glGetProgramInfoLog(pgm, bufLength, NULL, buf); - rsc->setError(RS_ERROR_FATAL_PROGRAM_LINK, buf); - free(buf); - } - } - glDeleteProgram(pgm); - return false; - } - - for (uint32_t ct=0; ct < e->vtxAttrCount; ct++) { - e->vtxAttrs[ct].slot = glGetAttribLocation(pgm, vtx->getAttribName(ct)); - e->vtxAttrs[ct].name = vtx->getAttribName(ct).string(); - if (rsc->props.mLogShaders) { - ALOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->vtxAttrs[ct].slot); - } - } - - populateUniformData(vtx, pgm, e->vtxUniforms); - populateUniformData(frag, pgm, e->fragUniforms); - - // Only populate this list if we have arrays in our uniforms - UniformQueryData **uniformList = NULL; - GLint numUniforms = 0; - bool hasArrays = hasArrayUniforms(vtx, frag); - if (hasArrays) { - // Get the number of active uniforms and the length of the longest name - glGetProgramiv(pgm, GL_ACTIVE_UNIFORMS, &numUniforms); - GLint maxNameLength = 0; - glGetProgramiv(pgm, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength); - if (numUniforms > 0 && maxNameLength > 0) { - uniformList = new UniformQueryData*[numUniforms]; - // Iterate over all the uniforms and build the list we - // can later use to match our uniforms to - for (uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) { - uniformList[ct] = new UniformQueryData(maxNameLength); - glGetActiveUniform(pgm, ct, maxNameLength, &uniformList[ct]->writtenLength, - &uniformList[ct]->arraySize, &uniformList[ct]->type, - uniformList[ct]->name); - //ALOGE("GL UNI idx=%u, arraySize=%u, name=%s", ct, - // uniformList[ct]->arraySize, uniformList[ct]->name); - } - } - } - - // We now know the highest index of all of the array uniforms - // and we need to update our cache to reflect that - // we may have declared [n], but only m < n elements are used - updateUniformArrayData(rsc, vtx, pgm, e->vtxUniforms, "vtx", - uniformList, (uint32_t)numUniforms); - updateUniformArrayData(rsc, frag, pgm, e->fragUniforms, "frag", - uniformList, (uint32_t)numUniforms); - - // Clean up the uniform data from GL - if (uniformList != NULL) { - for (uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) { - delete uniformList[ct]; - } - delete[] uniformList; - uniformList = NULL; - } - } - - //ALOGV("SC made program %i", e->program); - glUseProgram(e->program); - rsdGLCheckError(rsc, "RsdShaderCache::link (miss)"); - - return true; -} - -int32_t RsdShaderCache::vtxAttribSlot(const String8 &attrName) const { - for (uint32_t ct=0; ct < mCurrent->vtxAttrCount; ct++) { - if (attrName == mCurrent->vtxAttrs[ct].name) { - return mCurrent->vtxAttrs[ct].slot; - } - } - return -1; -} - -void RsdShaderCache::cleanupVertex(RsdShader *s) { - int32_t numEntries = (int32_t)mEntries.size(); - uint32_t numShaderIDs = s->getStateBasedIDCount(); - for (uint32_t sId = 0; sId < numShaderIDs; sId ++) { - uint32_t id = s->getStateBasedID(sId); - for (int32_t ct = 0; ct < numEntries; ct ++) { - if (mEntries[ct]->vtx == id) { - glDeleteProgram(mEntries[ct]->program); - - delete mEntries[ct]; - mEntries.removeAt(ct); - numEntries = (int32_t)mEntries.size(); - ct --; - } - } - } -} - -void RsdShaderCache::cleanupFragment(RsdShader *s) { - int32_t numEntries = (int32_t)mEntries.size(); - uint32_t numShaderIDs = s->getStateBasedIDCount(); - for (uint32_t sId = 0; sId < numShaderIDs; sId ++) { - uint32_t id = s->getStateBasedID(sId); - for (int32_t ct = 0; ct < numEntries; ct ++) { - if (mEntries[ct]->frag == id) { - glDeleteProgram(mEntries[ct]->program); - - delete mEntries[ct]; - mEntries.removeAt(ct); - numEntries = (int32_t)mEntries.size(); - ct --; - } - } - } -} - -void RsdShaderCache::cleanupAll() { - for (uint32_t ct=0; ct < mEntries.size(); ct++) { - glDeleteProgram(mEntries[ct]->program); - free(mEntries[ct]); - } - mEntries.clear(); -} - diff --git a/libs/rs/driver/rsdShaderCache.h b/libs/rs/driver/rsdShaderCache.h deleted file mode 100644 index 88aa32d..0000000 --- a/libs/rs/driver/rsdShaderCache.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2011-2012 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_RSD_SHADER_CACHE_H -#define ANDROID_RSD_SHADER_CACHE_H - -namespace android { -namespace renderscript { - -class Context; - -} -} - -#include <utils/String8.h> -#include <utils/Vector.h> -class RsdShader; - -// --------------------------------------------------------------------------- - -// An element is a group of Components that occupies one cell in a structure. -class RsdShaderCache { -public: - RsdShaderCache(); - virtual ~RsdShaderCache(); - - void setActiveVertex(RsdShader *pv) { - mVertexDirty = true; - mVertex = pv; - } - - void setActiveFragment(RsdShader *pf) { - mFragmentDirty = true; - mFragment = pf; - } - - bool setup(const android::renderscript::Context *rsc); - - void cleanupVertex(RsdShader *s); - void cleanupFragment(RsdShader *s); - - void cleanupAll(); - - int32_t vtxAttribSlot(const android::String8 &attrName) const; - int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;} - uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;} - int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;} - uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;} - -protected: - bool link(const android::renderscript::Context *rsc); - bool mFragmentDirty; - bool mVertexDirty; - RsdShader *mVertex; - RsdShader *mFragment; - - struct UniformQueryData { - char *name; - uint32_t nameLength; - int32_t writtenLength; - int32_t arraySize; - uint32_t type; - UniformQueryData(uint32_t maxName) { - name = NULL; - nameLength = maxName; - if (nameLength > 0 ) { - name = new char[nameLength]; - } - } - ~UniformQueryData() { - if (name != NULL) { - delete[] name; - name = NULL; - } - } - }; - struct UniformData { - int32_t slot; - uint32_t arraySize; - }; - struct AttrData { - int32_t slot; - const char* name; - }; - struct ProgramEntry { - ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis, - uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0), - vtxAttrs(0), vtxUniforms(0), fragUniforms(0), - fragUniformIsSTO(0) { - vtxAttrCount = numVtxAttr; - if (numVtxAttr) { - vtxAttrs = new AttrData[numVtxAttr]; - } - if (numVtxUnis) { - vtxUniforms = new UniformData[numVtxUnis]; - } - if (numFragUnis) { - fragUniforms = new UniformData[numFragUnis]; - fragUniformIsSTO = new bool[numFragUnis]; - } - } - ~ProgramEntry() { - if (vtxAttrs) { - delete[] vtxAttrs; - vtxAttrs = NULL; - } - if (vtxUniforms) { - delete[] vtxUniforms; - vtxUniforms = NULL; - } - if (fragUniforms) { - delete[] fragUniforms; - fragUniforms = NULL; - } - if (fragUniformIsSTO) { - delete[] fragUniformIsSTO; - fragUniformIsSTO = NULL; - } - } - uint32_t vtx; - uint32_t frag; - uint32_t program; - uint32_t vtxAttrCount; - AttrData *vtxAttrs; - UniformData *vtxUniforms; - UniformData *fragUniforms; - bool *fragUniformIsSTO; - }; - android::Vector<ProgramEntry*> mEntries; - ProgramEntry *mCurrent; - - bool hasArrayUniforms(RsdShader *vtx, RsdShader *frag); - void populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data); - void updateUniformArrayData(const android::renderscript::Context *rsc, - RsdShader *prog, uint32_t linkedID, - UniformData *data, const char* logTag, - UniformQueryData **uniformList, uint32_t uniListSize); -}; - - -#endif //ANDROID_RSD_SHADER_CACHE_H - - - - diff --git a/libs/rs/driver/rsdVertexArray.cpp b/libs/rs/driver/rsdVertexArray.cpp deleted file mode 100644 index 1836e67..0000000 --- a/libs/rs/driver/rsdVertexArray.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - * 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 <rs_hal.h> -#include <rsContext.h> - -#include <GLES/gl.h> -#include <GLES2/gl2.h> - -#include "rsdGL.h" -#include "rsdCore.h" -#include "rsdVertexArray.h" -#include "rsdShaderCache.h" - -using namespace android; -using namespace android::renderscript; - -RsdVertexArray::RsdVertexArray(const Attrib *attribs, uint32_t numAttribs) { - mAttribs = attribs; - mCount = numAttribs; -} - -RsdVertexArray::~RsdVertexArray() { -} - -RsdVertexArray::Attrib::Attrib() { - clear(); -} - -void RsdVertexArray::Attrib::clear() { - buffer = 0; - offset = 0; - type = 0; - size = 0; - stride = 0; - ptr = NULL; - normalized = false; - name.setTo(""); -} - -void RsdVertexArray::Attrib::set(uint32_t type, uint32_t size, uint32_t stride, - bool normalized, uint32_t offset, - const char *name) { - clear(); - this->type = type; - this->size = size; - this->offset = offset; - this->normalized = normalized; - this->stride = stride; - this->name.setTo(name); -} - -void RsdVertexArray::logAttrib(uint32_t idx, uint32_t slot) const { - if (idx == 0) { - ALOGV("Starting vertex attribute binding"); - } - ALOGV("va %i: slot=%i name=%s buf=%i ptr=%p size=%i type=0x%x stride=0x%x norm=%i offset=0x%x", - idx, slot, - mAttribs[idx].name.string(), - mAttribs[idx].buffer, - mAttribs[idx].ptr, - mAttribs[idx].size, - mAttribs[idx].type, - mAttribs[idx].stride, - mAttribs[idx].normalized, - mAttribs[idx].offset); -} - -void RsdVertexArray::setup(const Context *rsc) const { - - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - RsdVertexArrayState *state = dc->gl.vertexArrayState; - RsdShaderCache *sc = dc->gl.shaderCache; - - rsdGLCheckError(rsc, "RsdVertexArray::setup start"); - uint32_t maxAttrs = state->mAttrsEnabledSize; - - for (uint32_t ct=1; ct < maxAttrs; ct++) { - if(state->mAttrsEnabled[ct]) { - glDisableVertexAttribArray(ct); - state->mAttrsEnabled[ct] = false; - } - } - - rsdGLCheckError(rsc, "RsdVertexArray::setup disabled"); - for (uint32_t ct=0; ct < mCount; ct++) { - int32_t slot = sc->vtxAttribSlot(mAttribs[ct].name); - if (rsc->props.mLogShadersAttr) { - logAttrib(ct, slot); - } - if (slot < 0 || slot >= (int32_t)maxAttrs) { - continue; - } - glEnableVertexAttribArray(slot); - state->mAttrsEnabled[slot] = true; - glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer); - glVertexAttribPointer(slot, - mAttribs[ct].size, - mAttribs[ct].type, - mAttribs[ct].normalized, - mAttribs[ct].stride, - mAttribs[ct].ptr + mAttribs[ct].offset); - } - rsdGLCheckError(rsc, "RsdVertexArray::setup done"); -} -//////////////////////////////////////////// -RsdVertexArrayState::RsdVertexArrayState() { - mAttrsEnabled = NULL; - mAttrsEnabledSize = 0; -} - -RsdVertexArrayState::~RsdVertexArrayState() { - if (mAttrsEnabled) { - delete[] mAttrsEnabled; - mAttrsEnabled = NULL; - } -} -void RsdVertexArrayState::init(uint32_t maxAttrs) { - mAttrsEnabledSize = maxAttrs; - mAttrsEnabled = new bool[mAttrsEnabledSize]; - for (uint32_t ct = 0; ct < mAttrsEnabledSize; ct++) { - mAttrsEnabled[ct] = false; - } -} - diff --git a/libs/rs/driver/rsdVertexArray.h b/libs/rs/driver/rsdVertexArray.h deleted file mode 100644 index 3e807a3..0000000 --- a/libs/rs/driver/rsdVertexArray.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * 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_RSD_VERTEX_ARRAY_H -#define ANDROID_RSD_VERTEX_ARRAY_H - -namespace android { -namespace renderscript { - -class Context; - -} -} - -#include <utils/String8.h> - -// An element is a group of Components that occupies one cell in a structure. -class RsdVertexArray { -public: - class Attrib { - public: - uint32_t buffer; - const uint8_t * ptr; - uint32_t offset; - uint32_t type; - uint32_t size; - uint32_t stride; - bool normalized; - android::String8 name; - - Attrib(); - void clear(); - void set(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset, const char *name); - }; - - RsdVertexArray(const Attrib *attribs, uint32_t numAttribs); - virtual ~RsdVertexArray(); - - void setup(const android::renderscript::Context *rsc) const; - void logAttrib(uint32_t idx, uint32_t slot) const; - -protected: - void clear(uint32_t index); - uint32_t mActiveBuffer; - const uint8_t * mActivePointer; - uint32_t mCount; - - const Attrib *mAttribs; -}; - - -class RsdVertexArrayState { -public: - RsdVertexArrayState(); - ~RsdVertexArrayState(); - void init(uint32_t maxAttrs); - - bool *mAttrsEnabled; - uint32_t mAttrsEnabledSize; -}; - - -#endif //ANDROID_RSD_VERTEX_ARRAY_H - - - diff --git a/libs/rs/rs.h b/libs/rs/rs.h deleted file mode 100644 index 825b9b8..0000000 --- a/libs/rs/rs.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2007 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 RENDER_SCRIPT_H -#define RENDER_SCRIPT_H - -#include <stdint.h> -#include <sys/types.h> - -#include "rsDefines.h" - -// -// A3D loading and object update code. -// Should only be called at object creation, not thread safe -RsObjectBase rsaFileA3DGetEntryByIndex(RsContext, uint32_t idx, RsFile); -RsFile rsaFileA3DCreateFromMemory(RsContext, const void *data, uint32_t len); -RsFile rsaFileA3DCreateFromAsset(RsContext, void *asset); -RsFile rsaFileA3DCreateFromFile(RsContext, const char *path); -void rsaFileA3DGetNumIndexEntries(RsContext, int32_t *numEntries, RsFile); -void rsaFileA3DGetIndexEntries(RsContext, RsFileIndexEntry *fileEntries, - uint32_t numEntries, RsFile); -void rsaGetName(RsContext, void * obj, const char **name); -// Mesh update functions -void rsaMeshGetVertexBufferCount(RsContext, RsMesh, int32_t *vtxCount); -void rsaMeshGetIndexCount(RsContext, RsMesh, int32_t *idxCount); -void rsaMeshGetVertices(RsContext, RsMesh, RsAllocation *vtxData, uint32_t vtxDataCount); -void rsaMeshGetIndices(RsContext, RsMesh, RsAllocation *va, - uint32_t *primType, uint32_t idxDataCount); -// Allocation update -const void* rsaAllocationGetType(RsContext con, RsAllocation va); -// Type update -void rsaTypeGetNativeData(RsContext, RsType, uint32_t *typeData, uint32_t typeDataSize); -// Element update -void rsaElementGetNativeData(RsContext, RsElement, uint32_t *elemData, uint32_t elemDataSize); -void rsaElementGetSubElements(RsContext, RsElement, uint32_t *ids, const char **names, - uint32_t *arraySizes, uint32_t dataSize); - -RsDevice rsDeviceCreate(); -void rsDeviceDestroy(RsDevice dev); -void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value); -RsContext rsContextCreate(RsDevice dev, uint32_t version, uint32_t sdkVersion); -RsContext rsContextCreateGL(RsDevice dev, uint32_t version, uint32_t sdkVersion, - RsSurfaceConfig sc, uint32_t dpi); - -#include "rsgApiFuncDecl.h" - -#endif // RENDER_SCRIPT_H - - - diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec deleted file mode 100644 index b373056..0000000 --- a/libs/rs/rs.spec +++ /dev/null @@ -1,427 +0,0 @@ - -ContextDestroy { - direct -} - -ContextGetMessage { - direct - param void *data - param size_t *receiveLen - param uint32_t *usrID - ret RsMessageToClientType -} - -ContextPeekMessage { - direct - param size_t *receiveLen - param uint32_t *usrID - ret RsMessageToClientType -} - -ContextInitToClient { - direct -} - -ContextDeinitToClient { - direct -} - -TypeCreate { - direct - param RsElement e - param uint32_t dimX - param uint32_t dimY - param uint32_t dimZ - param bool mips - param bool faces - ret RsType -} - -AllocationCreateTyped { - direct - param RsType vtype - param RsAllocationMipmapControl mips - param uint32_t usages - param uint32_t ptr - ret RsAllocation -} - -AllocationCreateFromBitmap { - direct - param RsType vtype - param RsAllocationMipmapControl mips - param const void *data - param uint32_t usages - ret RsAllocation -} - -AllocationCubeCreateFromBitmap { - direct - param RsType vtype - param RsAllocationMipmapControl mips - param const void *data - param uint32_t usages - ret RsAllocation -} - -AllocationGetSurfaceTextureID { - param RsAllocation alloc - ret int32_t -} - -AllocationGetSurfaceTextureID2 { - param RsAllocation alloc - param void *st - sync -} - -AllocationSetSurface { - param RsAllocation alloc - param RsNativeWindow sur - sync - } - -AllocationIoSend { - param RsAllocation alloc - } - -AllocationIoReceive { - param RsAllocation alloc - } - - -ContextFinish { - sync - } - -ContextBindRootScript { - param RsScript sampler - } - -ContextBindProgramStore { - param RsProgramStore pgm - } - -ContextBindProgramFragment { - param RsProgramFragment pgm - } - -ContextBindProgramVertex { - param RsProgramVertex pgm - } - -ContextBindProgramRaster { - param RsProgramRaster pgm - } - -ContextBindFont { - param RsFont pgm - } - -ContextPause { - } - -ContextResume { - } - -ContextSetSurface { - param uint32_t width - param uint32_t height - param RsNativeWindow sur - sync - } - -ContextDump { - param int32_t bits -} - -ContextSetPriority { - param int32_t priority - } - -ContextDestroyWorker { - sync -} - -AssignName { - param RsObjectBase obj - param const char *name - } - -ObjDestroy { - param RsAsyncVoidPtr objPtr - } - -ElementCreate { - direct - param RsDataType mType - param RsDataKind mKind - param bool mNormalized - param uint32_t mVectorSize - ret RsElement - } - -ElementCreate2 { - direct - param const RsElement * elements - param const char ** names - param const uint32_t * arraySize - ret RsElement - } - -AllocationCopyToBitmap { - param RsAllocation alloc - param void * data - } - - -Allocation1DData { - param RsAllocation va - param uint32_t xoff - param uint32_t lod - param uint32_t count - param const void *data - } - -Allocation1DElementData { - param RsAllocation va - param uint32_t x - param uint32_t lod - param const void *data - param size_t comp_offset - } - -Allocation2DData { - param RsAllocation va - param uint32_t xoff - param uint32_t yoff - param uint32_t lod - param RsAllocationCubemapFace face - param uint32_t w - param uint32_t h - param const void *data - } - -Allocation2DElementData { - param RsAllocation va - param uint32_t x - param uint32_t y - param uint32_t lod - param RsAllocationCubemapFace face - param const void *data - param size_t element_offset - } - -AllocationGenerateMipmaps { - param RsAllocation va -} - -AllocationRead { - param RsAllocation va - param void * data - } - -AllocationSyncAll { - param RsAllocation va - param RsAllocationUsageType src -} - - -AllocationResize1D { - param RsAllocation va - param uint32_t dimX - } - -AllocationResize2D { - param RsAllocation va - param uint32_t dimX - param uint32_t dimY - } - -AllocationCopy2DRange { - param RsAllocation dest - param uint32_t destXoff - param uint32_t destYoff - param uint32_t destMip - param uint32_t destFace - param uint32_t width - param uint32_t height - param RsAllocation src - param uint32_t srcXoff - param uint32_t srcYoff - param uint32_t srcMip - param uint32_t srcFace - } - -SamplerCreate { - direct - param RsSamplerValue magFilter - param RsSamplerValue minFilter - param RsSamplerValue wrapS - param RsSamplerValue wrapT - param RsSamplerValue wrapR - param float mAniso - ret RsSampler -} - -ScriptBindAllocation { - param RsScript vtm - param RsAllocation va - param uint32_t slot - } - -ScriptSetTimeZone { - param RsScript s - param const char * timeZone - } - -ScriptInvoke { - param RsScript s - param uint32_t slot - } - -ScriptInvokeV { - param RsScript s - param uint32_t slot - param const void * data - } - -ScriptForEach { - param RsScript s - param uint32_t slot - param RsAllocation ain - param RsAllocation aout - param const void * usr -} - -ScriptSetVarI { - param RsScript s - param uint32_t slot - param int value - } - -ScriptSetVarObj { - param RsScript s - param uint32_t slot - param RsObjectBase value - } - -ScriptSetVarJ { - param RsScript s - param uint32_t slot - param int64_t value - } - -ScriptSetVarF { - param RsScript s - param uint32_t slot - param float value - } - -ScriptSetVarD { - param RsScript s - param uint32_t slot - param double value - } - -ScriptSetVarV { - param RsScript s - param uint32_t slot - param const void * data - } - - -ScriptCCreate { - param const char * resName - param const char * cacheDir - param const char * text - ret RsScript - } - - -ProgramStoreCreate { - direct - param bool colorMaskR - param bool colorMaskG - param bool colorMaskB - param bool colorMaskA - param bool depthMask - param bool ditherEnable - param RsBlendSrcFunc srcFunc - param RsBlendDstFunc destFunc - param RsDepthFunc depthFunc - ret RsProgramStore - } - -ProgramRasterCreate { - direct - param bool pointSprite - param RsCullMode cull - ret RsProgramRaster -} - -ProgramBindConstants { - param RsProgram vp - param uint32_t slot - param RsAllocation constants - } - - -ProgramBindTexture { - param RsProgramFragment pf - param uint32_t slot - param RsAllocation a - } - -ProgramBindSampler { - param RsProgramFragment pf - param uint32_t slot - param RsSampler s - } - -ProgramFragmentCreate { - direct - param const char * shaderText - param const char ** textureNames - param const uint32_t * params - ret RsProgramFragment - } - -ProgramVertexCreate { - direct - param const char * shaderText - param const char ** textureNames - param const uint32_t * params - ret RsProgramVertex - } - -FontCreateFromFile { - param const char *name - param float fontSize - param uint32_t dpi - ret RsFont - } - -FontCreateFromMemory { - param const char *name - param float fontSize - param uint32_t dpi - param const void *data - ret RsFont - } - -MeshCreate { - param RsAllocation *vtx - param RsAllocation *idx - 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/rsAdapter.cpp b/libs/rs/rsAdapter.cpp deleted file mode 100644 index 41811ae..0000000 --- a/libs/rs/rsAdapter.cpp +++ /dev/null @@ -1,238 +0,0 @@ - -/* - * Copyright (C) 2009 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" -#include "rsAdapter.h" - -using namespace android; -using namespace android::renderscript; - -Adapter1D::Adapter1D(Context *rsc) : ObjectBase(rsc) { - reset(); -} - -Adapter1D::Adapter1D(Context *rsc, Allocation *a) : ObjectBase(rsc) { - reset(); - setAllocation(a); -} - -void Adapter1D::reset() { - mY = 0; - mZ = 0; - mLOD = 0; - mFace = 0; -} - -void * Adapter1D::getElement(uint32_t x) { - rsAssert(mAllocation.get()); - rsAssert(mAllocation->getPtr()); - rsAssert(mAllocation->getType()); - uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr()); - ptr += mAllocation->getType()->getLODOffset(mLOD, x, mY); - return ptr; -} - -void Adapter1D::subData(uint32_t xoff, uint32_t count, const void *data) { - if (mAllocation.get() && mAllocation.get()->getType()) { - void *ptr = getElement(xoff); - count *= mAllocation.get()->getType()->getElementSizeBytes(); - memcpy(ptr, data, count); - } -} - -void Adapter1D::data(const void *data) { - memcpy(getElement(0), - data, - mAllocation.get()->getType()->getSizeBytes()); -} - -void Adapter1D::serialize(OStream *stream) const { -} - -Adapter1D *Adapter1D::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - -namespace android { -namespace renderscript { - -RsAdapter1D rsi_Adapter1DCreate(Context *rsc) { - Adapter1D *a = new Adapter1D(rsc); - a->incUserRef(); - return a; -} - -void rsi_Adapter1DBindAllocation(Context *rsc, RsAdapter1D va, RsAllocation valloc) { - Adapter1D * a = static_cast<Adapter1D *>(va); - Allocation * alloc = static_cast<Allocation *>(valloc); - a->setAllocation(alloc); -} - -void rsi_Adapter1DSetConstraint(Context *rsc, RsAdapter1D va, RsDimension dim, uint32_t value) { - Adapter1D * a = static_cast<Adapter1D *>(va); - switch (dim) { - case RS_DIMENSION_X: - rsAssert(!"Cannot contrain X in an 1D adapter"); - return; - case RS_DIMENSION_Y: - a->setY(value); - break; - case RS_DIMENSION_Z: - a->setZ(value); - break; - case RS_DIMENSION_LOD: - a->setLOD(value); - break; - case RS_DIMENSION_FACE: - a->setFace(value); - break; - default: - rsAssert(!"Unimplemented constraint"); - return; - } -} - -void rsi_Adapter1DSubData(Context *rsc, RsAdapter1D va, uint32_t xoff, uint32_t count, const void *data) { - Adapter1D * a = static_cast<Adapter1D *>(va); - a->subData(xoff, count, data); -} - -void rsi_Adapter1DData(Context *rsc, RsAdapter1D va, const void *data) { - Adapter1D * a = static_cast<Adapter1D *>(va); - a->data(data); -} - -} -} - -////////////////////////// - -Adapter2D::Adapter2D(Context *rsc) : ObjectBase(rsc) { - reset(); -} - -Adapter2D::Adapter2D(Context *rsc, Allocation *a) : ObjectBase(rsc) { - reset(); - setAllocation(a); -} - -void Adapter2D::reset() { - mZ = 0; - mLOD = 0; - mFace = 0; -} - -void * Adapter2D::getElement(uint32_t x, uint32_t y) const { - rsAssert(mAllocation.get()); - rsAssert(mAllocation->getPtr()); - rsAssert(mAllocation->getType()); - if (mFace != 0 && !mAllocation->getType()->getDimFaces()) { - ALOGE("Adapter wants cubemap face, but allocation has none"); - return NULL; - } - - uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr()); - ptr += mAllocation->getType()->getLODOffset(mLOD, x, y); - - if (mFace != 0) { - uint32_t totalSizeBytes = mAllocation->getType()->getSizeBytes(); - uint32_t faceOffset = totalSizeBytes / 6; - ptr += faceOffset * mFace; - } - return ptr; -} - -void Adapter2D::subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) { - rsAssert(mAllocation.get()); - rsAssert(mAllocation->getPtr()); - rsAssert(mAllocation->getType()); - - uint32_t eSize = mAllocation.get()->getType()->getElementSizeBytes(); - uint32_t lineSize = eSize * w; - - const uint8_t *src = static_cast<const uint8_t *>(data); - for (uint32_t line=yoff; line < (yoff+h); line++) { - memcpy(getElement(xoff, line), src, lineSize); - src += lineSize; - } -} - -void Adapter2D::data(const void *data) { - memcpy(getElement(0,0), - data, - mAllocation.get()->getType()->getSizeBytes()); -} - -void Adapter2D::serialize(OStream *stream) const { -} - -Adapter2D *Adapter2D::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - - -namespace android { -namespace renderscript { - -RsAdapter2D rsi_Adapter2DCreate(Context *rsc) { - Adapter2D *a = new Adapter2D(rsc); - a->incUserRef(); - return a; -} - -void rsi_Adapter2DBindAllocation(Context *rsc, RsAdapter2D va, RsAllocation valloc) { - Adapter2D * a = static_cast<Adapter2D *>(va); - Allocation * alloc = static_cast<Allocation *>(valloc); - a->setAllocation(alloc); -} - -void rsi_Adapter2DSetConstraint(Context *rsc, RsAdapter2D va, RsDimension dim, uint32_t value) { - Adapter2D * a = static_cast<Adapter2D *>(va); - switch (dim) { - case RS_DIMENSION_X: - rsAssert(!"Cannot contrain X in an 2D adapter"); - return; - case RS_DIMENSION_Y: - rsAssert(!"Cannot contrain Y in an 2D adapter"); - break; - case RS_DIMENSION_Z: - a->setZ(value); - break; - case RS_DIMENSION_LOD: - a->setLOD(value); - break; - case RS_DIMENSION_FACE: - a->setFace(value); - break; - default: - rsAssert(!"Unimplemented constraint"); - return; - } -} - -void rsi_Adapter2DData(Context *rsc, RsAdapter2D va, const void *data) { - Adapter2D * a = static_cast<Adapter2D *>(va); - a->data(data); -} - -void rsi_Adapter2DSubData(Context *rsc, RsAdapter2D va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) { - Adapter2D * a = static_cast<Adapter2D *>(va); - a->subData(xoff, yoff, w, h, data); -} - -} -} diff --git a/libs/rs/rsAdapter.h b/libs/rs/rsAdapter.h deleted file mode 100644 index d150789..0000000 --- a/libs/rs/rsAdapter.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2009 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_ADAPTER_H -#define ANDROID_RS_ADAPTER_H - -#include "rsAllocation.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - - -class Adapter1D : public ObjectBase { - -public: - // By policy this allocation will hold a pointer to the type - // but will not destroy it on destruction. - Adapter1D(Context *); - Adapter1D(Context *, Allocation *); - void reset(); - void * getElement(uint32_t x); - - void setAllocation(Allocation *a) {mAllocation.set(a);} - - uint32_t getDimX() const {return mAllocation->getType()->getLODDimX(mLOD);} - - const Type * getBaseType() const {return mAllocation->getType();} - - inline void setY(uint32_t y) {mY = y;} - inline void setZ(uint32_t z) {mZ = z;} - inline void setLOD(uint32_t lod) {mLOD = lod;} - inline void setFace(uint32_t face) {mFace = face;} - //void setArray(uint32_t num, uint32_t value); - - void subData(uint32_t xoff, uint32_t count, const void *data); - void data(const void *data); - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ADAPTER_1D; } - static Adapter1D *createFromStream(Context *rsc, IStream *stream); - -protected: - ObjectBaseRef<Allocation> mAllocation; - uint32_t mY; - uint32_t mZ; - uint32_t mLOD; - uint32_t mFace; -}; - -class Adapter2D : public ObjectBase { - -public: - // By policy this allocation will hold a pointer to the type - // but will not destroy it on destruction. - Adapter2D(Context *); - Adapter2D(Context *, Allocation *); - void reset(); - void * getElement(uint32_t x, uint32_t y) const; - - uint32_t getDimX() const {return mAllocation->getType()->getLODDimX(mLOD);} - uint32_t getDimY() const {return mAllocation->getType()->getLODDimY(mLOD);} - const Type * getBaseType() const {return mAllocation->getType();} - - void setAllocation(Allocation *a) {mAllocation.set(a);} - inline void setZ(uint32_t z) {mZ = z;} - inline void setLOD(uint32_t lod) {mLOD = lod;} - inline void setFace(uint32_t face) {mFace = face;} - //void setArray(uint32_t num, uint32_t value); - - void data(const void *data); - void subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data); - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ADAPTER_2D; } - static Adapter2D *createFromStream(Context *rsc, IStream *stream); - -protected: - ObjectBaseRef<Allocation> mAllocation; - uint32_t mZ; - uint32_t mLOD; - uint32_t mFace; -}; - -} -} -#endif - diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp deleted file mode 100644 index cdff49c..0000000 --- a/libs/rs/rsAllocation.cpp +++ /dev/null @@ -1,741 +0,0 @@ -/* - * Copyright (C) 2009-2012 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" -#include "rsAllocation.h" -#include "rsAdapter.h" -#include "rs_hal.h" - -#include "system/window.h" -#include "gui/SurfaceTexture.h" - -using namespace android; -using namespace android::renderscript; - -Allocation::Allocation(Context *rsc, const Type *type, uint32_t usages, - 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, 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"); - delete a; - return NULL; - } - - return a; -} - -void Allocation::updateCache() { - const Type *type = mHal.state.type; - mHal.state.dimensionX = type->getDimX(); - mHal.state.dimensionY = type->getDimY(); - mHal.state.dimensionZ = type->getDimZ(); - mHal.state.hasFaces = type->getDimFaces(); - mHal.state.hasMipmaps = type->getDimLOD(); - mHal.state.elementSizeBytes = type->getElementSizeBytes(); - mHal.state.hasReferences = mHal.state.type->getElement()->getHasReferences(); -} - -Allocation::~Allocation() { - freeChildrenUnlocked(); - setSurfaceTexture(mRSC, NULL); - mRSC->mHal.funcs.allocation.destroy(mRSC, this); -} - -void Allocation::syncAll(Context *rsc, RsAllocationUsageType src) { - rsc->mHal.funcs.allocation.syncAll(rsc, this, src); -} - -void Allocation::read(void *data) { - memcpy(data, getPtr(), mHal.state.type->getSizeBytes()); -} - -void Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod, - uint32_t count, const void *data, size_t sizeBytes) { - const size_t eSize = mHal.state.type->getElementSizeBytes(); - - if ((count * eSize) != sizeBytes) { - ALOGE("Allocation::subData called with mismatched size expected %zu, got %zu", - (count * eSize), sizeBytes); - mHal.state.type->dumpLOGV("type info"); - return; - } - - rsc->mHal.funcs.allocation.data1D(rsc, this, xoff, lod, count, data, sizeBytes); - sendDirty(rsc); -} - -void Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, const void *data, size_t sizeBytes) { - const size_t eSize = mHal.state.elementSizeBytes; - const size_t lineSize = eSize * w; - - //ALOGE("data2d %p, %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes); - - if ((lineSize * h) != sizeBytes) { - ALOGE("Allocation size mismatch, expected %zu, got %zu", (lineSize * h), sizeBytes); - rsAssert(!"Allocation::subData called with mismatched size"); - return; - } - - rsc->mHal.funcs.allocation.data2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes); - sendDirty(rsc); -} - -void Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, - uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes) { -} - -void Allocation::elementData(Context *rsc, uint32_t x, const void *data, - uint32_t cIdx, size_t sizeBytes) { - size_t eSize = mHal.state.elementSizeBytes; - - if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { - ALOGE("Error Allocation::subElementData component %i out of range.", cIdx); - rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); - return; - } - - if (x >= mHal.state.dimensionX) { - ALOGE("Error Allocation::subElementData X offset %i out of range.", x); - rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); - return; - } - - const Element * e = mHal.state.type->getElement()->getField(cIdx); - uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx); - if (sizeBytes != e->getSizeBytes() * elemArraySize) { - ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes()); - rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); - return; - } - - rsc->mHal.funcs.allocation.elementData1D(rsc, this, x, data, cIdx, sizeBytes); - sendDirty(rsc); -} - -void Allocation::elementData(Context *rsc, uint32_t x, uint32_t y, - const void *data, uint32_t cIdx, size_t sizeBytes) { - size_t eSize = mHal.state.elementSizeBytes; - - if (x >= mHal.state.dimensionX) { - ALOGE("Error Allocation::subElementData X offset %i out of range.", x); - rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); - return; - } - - if (y >= mHal.state.dimensionY) { - ALOGE("Error Allocation::subElementData X offset %i out of range.", x); - rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); - return; - } - - if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { - ALOGE("Error Allocation::subElementData component %i out of range.", cIdx); - rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); - return; - } - - const Element * e = mHal.state.type->getElement()->getField(cIdx); - uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx); - if (sizeBytes != e->getSizeBytes() * elemArraySize) { - ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes()); - rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); - return; - } - - rsc->mHal.funcs.allocation.elementData2D(rsc, this, x, y, data, cIdx, sizeBytes); - sendDirty(rsc); -} - -void Allocation::addProgramToDirty(const Program *p) { - mToDirtyList.push(p); -} - -void Allocation::removeProgramToDirty(const Program *p) { - for (size_t ct=0; ct < mToDirtyList.size(); ct++) { - if (mToDirtyList[ct] == p) { - mToDirtyList.removeAt(ct); - return; - } - } - rsAssert(0); -} - -void Allocation::dumpLOGV(const char *prefix) const { - ObjectBase::dumpLOGV(prefix); - - String8 s(prefix); - s.append(" type "); - if (mHal.state.type) { - mHal.state.type->dumpLOGV(s.string()); - } - - ALOGV("%s allocation ptr=%p mUsageFlags=0x04%x, mMipmapControl=0x%04x", - prefix, getPtr(), mHal.state.usageFlags, mHal.state.mipmapControl); -} - -uint32_t Allocation::getPackedSize() const { - uint32_t numItems = mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(); - return numItems * mHal.state.type->getElement()->getSizeBytesUnpadded(); -} - -void Allocation::writePackedData(const Type *type, - uint8_t *dst, const uint8_t *src, bool dstPadded) { - const Element *elem = type->getElement(); - uint32_t unpaddedBytes = elem->getSizeBytesUnpadded(); - uint32_t paddedBytes = elem->getSizeBytes(); - uint32_t numItems = type->getSizeBytes() / paddedBytes; - - uint32_t srcInc = !dstPadded ? paddedBytes : unpaddedBytes; - uint32_t dstInc = dstPadded ? paddedBytes : unpaddedBytes; - - // no sub-elements - uint32_t fieldCount = elem->getFieldCount(); - if (fieldCount == 0) { - for (uint32_t i = 0; i < numItems; i ++) { - memcpy(dst, src, unpaddedBytes); - src += srcInc; - dst += dstInc; - } - return; - } - - // Cache offsets - uint32_t *offsetsPadded = new uint32_t[fieldCount]; - uint32_t *offsetsUnpadded = new uint32_t[fieldCount]; - uint32_t *sizeUnpadded = new uint32_t[fieldCount]; - - for (uint32_t i = 0; i < fieldCount; i++) { - offsetsPadded[i] = elem->getFieldOffsetBytes(i); - offsetsUnpadded[i] = elem->getFieldOffsetBytesUnpadded(i); - sizeUnpadded[i] = elem->getField(i)->getSizeBytesUnpadded(); - } - - uint32_t *srcOffsets = !dstPadded ? offsetsPadded : offsetsUnpadded; - uint32_t *dstOffsets = dstPadded ? offsetsPadded : offsetsUnpadded; - - // complex elements, need to copy subelem after subelem - for (uint32_t i = 0; i < numItems; i ++) { - for (uint32_t fI = 0; fI < fieldCount; fI++) { - memcpy(dst + dstOffsets[fI], src + srcOffsets[fI], sizeUnpadded[fI]); - } - src += srcInc; - dst += dstInc; - } - - delete[] offsetsPadded; - delete[] offsetsUnpadded; - delete[] sizeUnpadded; -} - -void Allocation::unpackVec3Allocation(const void *data, size_t dataSize) { - const uint8_t *src = (const uint8_t*)data; - uint8_t *dst = (uint8_t*)getPtr(); - - writePackedData(getType(), dst, src, true); -} - -void Allocation::packVec3Allocation(OStream *stream) const { - uint32_t paddedBytes = getType()->getElement()->getSizeBytes(); - uint32_t unpaddedBytes = getType()->getElement()->getSizeBytesUnpadded(); - uint32_t numItems = mHal.state.type->getSizeBytes() / paddedBytes; - - const uint8_t *src = (const uint8_t*)getPtr(); - uint8_t *dst = new uint8_t[numItems * unpaddedBytes]; - - writePackedData(getType(), dst, src, false); - stream->addByteArray(dst, getPackedSize()); - - delete[] dst; -} - -void Allocation::serialize(OStream *stream) const { - // Need to identify ourselves - stream->addU32((uint32_t)getClassId()); - - String8 name(getName()); - stream->addString(&name); - - // First thing we need to serialize is the type object since it will be needed - // to initialize the class - mHal.state.type->serialize(stream); - - uint32_t dataSize = mHal.state.type->getSizeBytes(); - // 3 element vectors are padded to 4 in memory, but padding isn't serialized - uint32_t packedSize = getPackedSize(); - // Write how much data we are storing - stream->addU32(packedSize); - if (dataSize == packedSize) { - // Now write the data - stream->addByteArray(getPtr(), dataSize); - } else { - // Now write the data - packVec3Allocation(stream); - } -} - -Allocation *Allocation::createFromStream(Context *rsc, IStream *stream) { - // First make sure we are reading the correct object - RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); - if (classID != RS_A3D_CLASS_ID_ALLOCATION) { - ALOGE("allocation loading skipped due to invalid class id\n"); - return NULL; - } - - String8 name; - stream->loadString(&name); - - Type *type = Type::createFromStream(rsc, stream); - if (!type) { - return NULL; - } - type->compute(); - - Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); - type->decUserRef(); - - // Number of bytes we wrote out for this allocation - uint32_t dataSize = stream->loadU32(); - // 3 element vectors are padded to 4 in memory, but padding isn't serialized - uint32_t packedSize = alloc->getPackedSize(); - if (dataSize != type->getSizeBytes() && - dataSize != packedSize) { - ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n"); - ObjectBase::checkDelete(alloc); - ObjectBase::checkDelete(type); - return NULL; - } - - alloc->setName(name.string(), name.size()); - - if (dataSize == type->getSizeBytes()) { - uint32_t count = dataSize / type->getElementSizeBytes(); - // Read in all of our allocation data - alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize); - } else { - alloc->unpackVec3Allocation(stream->getPtr() + stream->getPos(), dataSize); - } - stream->reset(stream->getPos() + dataSize); - - return alloc; -} - -void Allocation::sendDirty(const Context *rsc) const { - for (size_t ct=0; ct < mToDirtyList.size(); ct++) { - mToDirtyList[ct]->forceDirty(); - } - mRSC->mHal.funcs.allocation.markDirty(rsc, this); -} - -void Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const { - const uint8_t *p = static_cast<const uint8_t *>(ptr); - const Element *e = mHal.state.type->getElement(); - uint32_t stride = e->getSizeBytes(); - - p += stride * startOff; - while (ct > 0) { - e->incRefs(p); - ct --; - p += stride; - } -} - -void Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const { - if (!mHal.state.hasReferences || !getIsScript()) { - return; - } - const uint8_t *p = static_cast<const uint8_t *>(ptr); - const Element *e = mHal.state.type->getElement(); - uint32_t stride = e->getSizeBytes(); - - p += stride * startOff; - while (ct > 0) { - e->decRefs(p); - ct --; - p += stride; - } -} - -void Allocation::freeChildrenUnlocked () { - decRefs(getPtr(), mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(), 0); -} - -bool Allocation::freeChildren() { - if (mHal.state.hasReferences) { - incSysRef(); - freeChildrenUnlocked(); - return decSysRef(); - } - return false; -} - -void Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) { -} - -void Allocation::resize1D(Context *rsc, uint32_t dimX) { - uint32_t oldDimX = mHal.state.dimensionX; - if (dimX == oldDimX) { - return; - } - - ObjectBaseRef<Type> t = mHal.state.type->cloneAndResize1D(rsc, dimX); - if (dimX < oldDimX) { - decRefs(getPtr(), oldDimX - dimX, dimX); - } - rsc->mHal.funcs.allocation.resize(rsc, this, t.get(), mHal.state.hasReferences); - setType(t.get()); - updateCache(); -} - -void Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) { - ALOGE("not implemented"); -} - -int32_t Allocation::getSurfaceTextureID(const Context *rsc) { - int32_t id = rsc->mHal.funcs.allocation.initSurfaceTexture(rsc, this); - mHal.state.surfaceTextureID = id; - return id; -} - -void Allocation::setSurfaceTexture(const Context *rsc, SurfaceTexture *st) { - if(st != mHal.state.surfaceTexture) { - if(mHal.state.surfaceTexture != NULL) { - mHal.state.surfaceTexture->decStrong(NULL); - } - mHal.state.surfaceTexture = st; - if(mHal.state.surfaceTexture != NULL) { - mHal.state.surfaceTexture->incStrong(NULL); - } - } -} - -void Allocation::setSurface(const Context *rsc, RsNativeWindow sur) { - ANativeWindow *nw = (ANativeWindow *)sur; - ANativeWindow *old = mHal.state.wndSurface; - if (nw) { - nw->incStrong(NULL); - } - rsc->mHal.funcs.allocation.setSurfaceTexture(rsc, this, nw); - mHal.state.wndSurface = nw; - if (old) { - old->decStrong(NULL); - } -} - -void Allocation::ioSend(const Context *rsc) { - rsc->mHal.funcs.allocation.ioSend(rsc, this); -} - -void Allocation::ioReceive(const Context *rsc) { - rsc->mHal.funcs.allocation.ioReceive(rsc, this); -} - - -///////////////// -// - -namespace android { -namespace renderscript { - -static void AllocationGenerateScriptMips(RsContext con, RsAllocation va); - -static void mip565(const Adapter2D &out, const Adapter2D &in) { - uint32_t w = out.getDimX(); - uint32_t h = out.getDimY(); - - for (uint32_t y=0; y < h; y++) { - uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y)); - const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2)); - const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1)); - - for (uint32_t x=0; x < w; x++) { - *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]); - oPtr ++; - i1 += 2; - i2 += 2; - } - } -} - -static void mip8888(const Adapter2D &out, const Adapter2D &in) { - uint32_t w = out.getDimX(); - uint32_t h = out.getDimY(); - - for (uint32_t y=0; y < h; y++) { - uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y)); - const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2)); - const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1)); - - for (uint32_t x=0; x < w; x++) { - *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]); - oPtr ++; - i1 += 2; - i2 += 2; - } - } -} - -static void mip8(const Adapter2D &out, const Adapter2D &in) { - uint32_t w = out.getDimX(); - uint32_t h = out.getDimY(); - - for (uint32_t y=0; y < h; y++) { - uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y)); - const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2)); - const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1)); - - for (uint32_t x=0; x < w; x++) { - *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f); - oPtr ++; - i1 += 2; - i2 += 2; - } - } -} - -static void mip(const Adapter2D &out, const Adapter2D &in) { - switch (out.getBaseType()->getElement()->getSizeBits()) { - case 32: - mip8888(out, in); - break; - case 16: - mip565(out, in); - break; - case 8: - mip8(out, in); - break; - } -} - -void rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) { - Allocation *a = static_cast<Allocation *>(va); - a->sendDirty(rsc); - a->syncAll(rsc, src); -} - -void rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) { - Allocation *texAlloc = static_cast<Allocation *>(va); - AllocationGenerateScriptMips(rsc, texAlloc); -} - -void rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) { - Allocation *texAlloc = static_cast<Allocation *>(va); - const Type * t = texAlloc->getType(); - - size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes(); - if (s != dataLen) { - rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size"); - return; - } - - memcpy(data, texAlloc->getPtr(), s); -} - -void rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod, - uint32_t count, const void *data, size_t sizeBytes) { - Allocation *a = static_cast<Allocation *>(va); - a->data(rsc, xoff, lod, count, data, sizeBytes); -} - -void rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face, - const void *data, size_t sizeBytes, size_t eoff) { - Allocation *a = static_cast<Allocation *>(va); - a->elementData(rsc, x, y, data, eoff, sizeBytes); -} - -void rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod, - const void *data, size_t sizeBytes, size_t eoff) { - Allocation *a = static_cast<Allocation *>(va); - a->elementData(rsc, x, data, eoff, sizeBytes); -} - -void rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, const void *data, size_t sizeBytes) { - Allocation *a = static_cast<Allocation *>(va); - a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes); -} - -void rsi_AllocationRead(Context *rsc, RsAllocation va, void *data, size_t data_length) { - Allocation *a = static_cast<Allocation *>(va); - a->read(data); -} - -void rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) { - Allocation *a = static_cast<Allocation *>(va); - a->resize1D(rsc, dimX); -} - -void rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) { - Allocation *a = static_cast<Allocation *>(va); - a->resize2D(rsc, dimX, dimY); -} - -static void AllocationGenerateScriptMips(RsContext con, RsAllocation va) { - Context *rsc = static_cast<Context *>(con); - Allocation *texAlloc = static_cast<Allocation *>(va); - uint32_t numFaces = texAlloc->getType()->getDimFaces() ? 6 : 1; - for (uint32_t face = 0; face < numFaces; face ++) { - Adapter2D adapt(rsc, texAlloc); - Adapter2D adapt2(rsc, texAlloc); - adapt.setFace(face); - adapt2.setFace(face); - for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) { - adapt.setLOD(lod); - adapt2.setLOD(lod + 1); - mip(adapt2, adapt); - } - } -} - -RsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype, - RsAllocationMipmapControl mips, - uint32_t usages, uint32_t ptr) { - Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips, (void *)ptr); - if (!alloc) { - return NULL; - } - alloc->incUserRef(); - return alloc; -} - -RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype, - RsAllocationMipmapControl mips, - const void *data, size_t data_length, uint32_t usages) { - Type *t = static_cast<Type *>(vtype); - - RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); - Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); - if (texAlloc == NULL) { - ALOGE("Memory allocation failure"); - return NULL; - } - - memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes()); - if (mips == RS_ALLOCATION_MIPMAP_FULL) { - AllocationGenerateScriptMips(rsc, texAlloc); - } - - texAlloc->sendDirty(rsc); - return texAlloc; -} - -RsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype, - RsAllocationMipmapControl mips, - const void *data, size_t data_length, uint32_t usages) { - Type *t = static_cast<Type *>(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, 0); - Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); - if (texAlloc == NULL) { - ALOGE("Memory allocation failure"); - return NULL; - } - - uint32_t faceSize = t->getDimX(); - uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes(); - uint32_t copySize = faceSize * t->getElementSizeBytes(); - - uint8_t *sourcePtr = (uint8_t*)data; - for (uint32_t face = 0; face < 6; face ++) { - Adapter2D faceAdapter(rsc, texAlloc); - faceAdapter.setFace(face); - - for (uint32_t dI = 0; dI < faceSize; dI ++) { - memcpy(faceAdapter.getElement(0, dI), sourcePtr + strideBytes * dI, copySize); - } - - // Move the data pointer to the next cube face - sourcePtr += copySize; - } - - if (mips == RS_ALLOCATION_MIPMAP_FULL) { - AllocationGenerateScriptMips(rsc, texAlloc); - } - - texAlloc->sendDirty(rsc); - return texAlloc; -} - -void rsi_AllocationCopy2DRange(Context *rsc, - RsAllocation dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, - uint32_t dstMip, uint32_t dstFace, - uint32_t width, uint32_t height, - RsAllocation srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, - uint32_t srcMip, uint32_t srcFace) { - Allocation *dst = static_cast<Allocation *>(dstAlloc); - Allocation *src= static_cast<Allocation *>(srcAlloc); - rsc->mHal.funcs.allocation.allocData2D(rsc, dst, dstXoff, dstYoff, dstMip, - (RsAllocationCubemapFace)dstFace, - width, height, - src, srcXoff, srcYoff,srcMip, - (RsAllocationCubemapFace)srcFace); -} - -int32_t rsi_AllocationGetSurfaceTextureID(Context *rsc, RsAllocation valloc) { - Allocation *alloc = static_cast<Allocation *>(valloc); - return alloc->getSurfaceTextureID(rsc); -} - -void rsi_AllocationGetSurfaceTextureID2(Context *rsc, RsAllocation valloc, void *vst, size_t len) { - Allocation *alloc = static_cast<Allocation *>(valloc); - alloc->setSurfaceTexture(rsc, static_cast<SurfaceTexture *>(vst)); -} - -void rsi_AllocationSetSurface(Context *rsc, RsAllocation valloc, RsNativeWindow sur) { - Allocation *alloc = static_cast<Allocation *>(valloc); - alloc->setSurface(rsc, sur); -} - -void rsi_AllocationIoSend(Context *rsc, RsAllocation valloc) { - Allocation *alloc = static_cast<Allocation *>(valloc); - alloc->ioSend(rsc); -} - -void rsi_AllocationIoReceive(Context *rsc, RsAllocation valloc) { - Allocation *alloc = static_cast<Allocation *>(valloc); - alloc->ioReceive(rsc); -} - -} -} - -const void * rsaAllocationGetType(RsContext con, RsAllocation va) { - Allocation *a = static_cast<Allocation *>(va); - a->getType()->incUserRef(); - - return a->getType(); -} diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h deleted file mode 100644 index e2783d2..0000000 --- a/libs/rs/rsAllocation.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2009-2012 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_STRUCTURED_ALLOCATION_H -#define ANDROID_STRUCTURED_ALLOCATION_H - -#include "rsType.h" - -struct ANativeWindow; - -// --------------------------------------------------------------------------- -namespace android { -class SurfaceTexture; - -namespace renderscript { - -class Program; - -/***************************************************************************** - * CAUTION - * - * Any layout changes for this class may require a corresponding change to be - * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains - * a partial copy of the information below. - * - *****************************************************************************/ -class Allocation : public ObjectBase { - // The graphics equivalent of malloc. The allocation contains a structure of elements. - -public: - struct Hal { - void * drv; - - struct State { - const Type * type; - - uint32_t usageFlags; - RsAllocationMipmapControl mipmapControl; - - // Cached fields from the Type and Element - // to prevent pointer chasing in critical loops. - uint32_t dimensionX; - uint32_t dimensionY; - uint32_t dimensionZ; - uint32_t elementSizeBytes; - bool hasMipmaps; - bool hasFaces; - bool hasReferences; - void * usrPtr; - int32_t surfaceTextureID; - ANativeWindow *wndSurface; - SurfaceTexture *surfaceTexture; - }; - State state; - - struct DrvState { - void * mallocPtr; - } drvState; - - }; - Hal mHal; - - static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages, - RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE, - void *ptr = 0); - virtual ~Allocation(); - void updateCache(); - - void * getPtr() const {return mHal.drvState.mallocPtr;} - const Type * getType() const {return mHal.state.type;} - - void syncAll(Context *rsc, RsAllocationUsageType src); - - void copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len); - - void resize1D(Context *rsc, uint32_t dimX); - void resize2D(Context *rsc, uint32_t dimX, uint32_t dimY); - - void data(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, const void *data, size_t sizeBytes); - void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, const void *data, size_t sizeBytes); - void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes); - - void elementData(Context *rsc, uint32_t x, - const void *data, uint32_t elementOff, size_t sizeBytes); - void elementData(Context *rsc, uint32_t x, uint32_t y, - const void *data, uint32_t elementOff, size_t sizeBytes); - - void read(void *data); - - void addProgramToDirty(const Program *); - void removeProgramToDirty(const Program *); - - virtual void dumpLOGV(const char *prefix) const; - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ALLOCATION; } - static Allocation *createFromStream(Context *rsc, IStream *stream); - - bool getIsScript() const { - return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) != 0; - } - bool getIsTexture() const { - return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) != 0; - } - bool getIsRenderTarget() const { - return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) != 0; - } - bool getIsBufferObject() const { - return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) != 0; - } - - void incRefs(const void *ptr, size_t ct, size_t startOff = 0) const; - void decRefs(const void *ptr, size_t ct, size_t startOff = 0) const; - virtual bool freeChildren(); - - void sendDirty(const Context *rsc) const; - bool getHasGraphicsMipmaps() const { - return mHal.state.mipmapControl != RS_ALLOCATION_MIPMAP_NONE; - } - - int32_t getSurfaceTextureID(const Context *rsc); - void setSurfaceTexture(const Context *rsc, SurfaceTexture *st); - void setSurface(const Context *rsc, RsNativeWindow sur); - void ioSend(const Context *rsc); - void ioReceive(const Context *rsc); - -protected: - Vector<const Program *> mToDirtyList; - ObjectBaseRef<const Type> mType; - void setType(const Type *t) { - mType.set(t); - mHal.state.type = t; - } - -private: - void freeChildrenUnlocked(); - 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); - void unpackVec3Allocation(const void *data, size_t dataSize); - void packVec3Allocation(OStream *stream) const; -}; - -} -} -#endif - diff --git a/libs/rs/rsAnimation.cpp b/libs/rs/rsAnimation.cpp deleted file mode 100644 index a4093d9..0000000 --- a/libs/rs/rsAnimation.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2009 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" -#include "rsAnimation.h" - - -using namespace android; -using namespace android::renderscript; - -void Animation::serialize(OStream *stream) const { -} - -Animation *Animation::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - -/* -Animation::Animation(Context *rsc) : ObjectBase(rsc) -{ - mAllocFile = __FILE__; - mAllocLine = __LINE__; - - mValuesInput = NULL; - mValuesOutput = NULL; - mValueCount = 0; - mInterpolation = RS_ANIMATION_INTERPOLATION_STEP; - mEdgePre = RS_ANIMATION_EDGE_UNDEFINED; - mEdgePost = RS_ANIMATION_EDGE_UNDEFINED; - mInputMin = 0; - mInputMax = 0; -} - -Animation * Animation::create(Context *rsc, - const float *inValues, const float *outValues, - uint32_t valueCount, RsAnimationInterpolation interp, - RsAnimationEdge pre, RsAnimationEdge post) -{ - if (valueCount < 2) { - rsc->setError(RS_ERROR_BAD_VALUE, "Animations require more than 2 values."); - return NULL; - } - Animation *a = new Animation(rsc); - if (!a) { - rsc->setError(RS_ERROR_OUT_OF_MEMORY); - return NULL; - } - - float *vin = (float *)malloc(valueCount * sizeof(float)); - float *vout = (float *)malloc(valueCount * sizeof(float)); - a->mValuesInput = vin; - a->mValuesOutput = vout; - if (a->mValuesInput == NULL || a->mValuesOutput == NULL) { - delete a; - rsc->setError(RS_ERROR_OUT_OF_MEMORY); - return NULL; - } - - a->mEdgePre = pre; - a->mEdgePost = post; - a->mInterpolation = interp; - a->mValueCount = valueCount; - - memcpy(vin, inValues, valueCount * sizeof(float)); - memcpy(vout, outValues, valueCount * sizeof(float)); - a->mInputMin = inValues[0]; - a->mInputMax = inValues[0]; - - bool needSort = false; - for (uint32_t ct=1; ct < valueCount; ct++) { - if (a->mInputMin > vin[ct]) { - needSort = true; - a->mInputMin = vin[ct]; - } - if (a->mInputMax < vin[ct]) { - a->mInputMax = vin[ct]; - } else { - needSort = true; - } - } - - while (1) { - bool changed = false; - for (uint32_t ct=1; ct < valueCount; ct++) { - if (vin[ct-1] > vin[ct]) { - float t = vin[ct-1]; - vin[ct-1] = vin[ct]; - vin[ct] = t; - t = vout[ct-1]; - vout[ct-1] = vout[ct]; - vout[ct] = t; - changed = true; - } - } - if (!changed) break; - } - - return a; -} -*/ - - -///////////////////////////////////////// -// - -namespace android { -namespace renderscript { - -RsAnimation rsi_AnimationCreate(Context *rsc, - const float *inValues, - const float *outValues, - uint32_t valueCount, - RsAnimationInterpolation interp, - RsAnimationEdge pre, - RsAnimationEdge post) { - //ALOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); - Animation *a = NULL;//Animation::create(rsc, inValues, outValues, valueCount, interp, pre, post); - if (a != NULL) { - a->incUserRef(); - } - return (RsAnimation)a; -} - - -} -} - diff --git a/libs/rs/rsAnimation.h b/libs/rs/rsAnimation.h deleted file mode 100644 index 526a081..0000000 --- a/libs/rs/rsAnimation.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2009 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_ANIMATION_H -#define ANDROID_RS_ANIMATION_H - -#include "rsUtils.h" -#include "rsObjectBase.h" -#include "rsDefines.h" -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - - -class Animation : public ObjectBase { -public: - ~Animation(); - - static Animation * create(Context *rsc, - const float *inValues, const float *outValues, - uint32_t valueCount, RsAnimationInterpolation, - RsAnimationEdge pre, RsAnimationEdge post); - - float eval(float) const; - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ANIMATION; } - static Animation *createFromStream(Context *rsc, IStream *stream); - -protected: - Animation(Context *rsc); - - - - float evalInRange(float) const; - - - - const float *mValuesInput; - const float *mValuesOutput; - uint32_t mValueCount; - RsAnimationInterpolation mInterpolation; - RsAnimationEdge mEdgePre; - RsAnimationEdge mEdgePost; - - // derived - float mInputMin; - float mInputMax; -}; - -} -} -#endif //ANDROID_STRUCTURED_ELEMENT_H - diff --git a/libs/rs/rsComponent.cpp b/libs/rs/rsComponent.cpp deleted file mode 100644 index 9c2c200..0000000 --- a/libs/rs/rsComponent.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (C) 2009 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 "rsComponent.h" - -using namespace android; -using namespace android::renderscript; - -Component::Component() { - set(RS_TYPE_NONE, RS_KIND_USER, false, 1); -} - -Component::~Component() { -} - -void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) { - mType = dt; - mKind = dk; - mNormalized = norm; - mVectorSize = vecSize; - rsAssert(vecSize <= 4); - - mBits = 0; - mTypeBits = 0; - mIsFloat = false; - mIsSigned = false; - mIsPixel = false; - - switch (mKind) { - case RS_KIND_PIXEL_L: - case RS_KIND_PIXEL_A: - mIsPixel = true; - rsAssert(mVectorSize == 1); - rsAssert(mNormalized == true); - break; - case RS_KIND_PIXEL_LA: - mIsPixel = true; - rsAssert(mVectorSize == 2); - rsAssert(mNormalized == true); - break; - case RS_KIND_PIXEL_RGB: - mIsPixel = true; - rsAssert(mVectorSize == 3); - rsAssert(mNormalized == true); - break; - case RS_KIND_PIXEL_RGBA: - mIsPixel = true; - rsAssert(mVectorSize == 4); - rsAssert(mNormalized == true); - break; - default: - rsAssert(mKind != RS_KIND_INVALID); - break; - } - - switch (mType) { - case RS_TYPE_NONE: - return; - case RS_TYPE_UNSIGNED_5_6_5: - mVectorSize = 3; - mBits = 16; - mNormalized = true; - rsAssert(mKind == RS_KIND_PIXEL_RGB); - return; - case RS_TYPE_UNSIGNED_5_5_5_1: - mVectorSize = 4; - mBits = 16; - mNormalized = true; - rsAssert(mKind == RS_KIND_PIXEL_RGBA); - return; - case RS_TYPE_UNSIGNED_4_4_4_4: - mVectorSize = 4; - mBits = 16; - mNormalized = true; - rsAssert(mKind == RS_KIND_PIXEL_RGBA); - return; - - case RS_TYPE_MATRIX_4X4: - mTypeBits = 16 * 32; - rsAssert(mVectorSize == 1); - rsAssert(mNormalized == false); - rsAssert(mKind == RS_KIND_USER); - break; - case RS_TYPE_MATRIX_3X3: - mTypeBits = 9 * 32; - rsAssert(mVectorSize == 1); - rsAssert(mNormalized == false); - rsAssert(mKind == RS_KIND_USER); - break; - case RS_TYPE_MATRIX_2X2: - mTypeBits = 4 * 32; - rsAssert(mVectorSize == 1); - rsAssert(mNormalized == false); - rsAssert(mKind == RS_KIND_USER); - break; - - case RS_TYPE_ELEMENT: - case RS_TYPE_TYPE: - case RS_TYPE_ALLOCATION: - case RS_TYPE_SAMPLER: - case RS_TYPE_SCRIPT: - case RS_TYPE_MESH: - case RS_TYPE_PROGRAM_FRAGMENT: - case RS_TYPE_PROGRAM_VERTEX: - case RS_TYPE_PROGRAM_RASTER: - case RS_TYPE_PROGRAM_STORE: - rsAssert(mVectorSize == 1); - rsAssert(mNormalized == false); - rsAssert(mKind == RS_KIND_USER); - mBits = 32; - mTypeBits = 32; - return; - - case RS_TYPE_FLOAT_16: - mTypeBits = 16; - mIsFloat = true; - break; - case RS_TYPE_FLOAT_32: - mTypeBits = 32; - mIsFloat = true; - break; - case RS_TYPE_FLOAT_64: - mTypeBits = 64; - mIsFloat = true; - break; - case RS_TYPE_SIGNED_8: - mTypeBits = 8; - mIsSigned = true; - break; - case RS_TYPE_SIGNED_16: - mTypeBits = 16; - mIsSigned = true; - break; - case RS_TYPE_SIGNED_32: - mTypeBits = 32; - mIsSigned = true; - break; - case RS_TYPE_SIGNED_64: - mTypeBits = 64; - mIsSigned = true; - break; - case RS_TYPE_UNSIGNED_8: - mTypeBits = 8; - break; - case RS_TYPE_UNSIGNED_16: - mTypeBits = 16; - break; - case RS_TYPE_UNSIGNED_32: - mTypeBits = 32; - break; - case RS_TYPE_UNSIGNED_64: - mTypeBits = 64; - break; - - case RS_TYPE_BOOLEAN: - mTypeBits = 8; - break; - default: - rsAssert(mType != RS_TYPE_INVALID); - break; - } - - mBitsUnpadded = mTypeBits * mVectorSize; - mBits = mTypeBits * rsHigherPow2(mVectorSize); -} - -bool Component::isReference() const { - return (mType >= RS_TYPE_ELEMENT); -} - -static const char * gTypeBasicStrings[] = { - "NONE", - "F16", - "F32", - "F64", - "S8", - "S16", - "S32", - "S64", - "U8", - "U16", - "U32", - "U64", - "BOOLEAN", - "UP_565", - "UP_5551", - "UP_4444", - "MATRIX_4X4", - "MATRIX_3X3", - "MATRIX_2X2", -}; - -static const char * gTypeObjStrings[] = { - "ELEMENT", - "TYPE", - "ALLOCATION", - "SAMPLER", - "SCRIPT", - "MESH", - "PROGRAM_FRAGMENT", - "PROGRAM_VERTEX", - "PROGRAM_RASTER", - "PROGRAM_STORE", -}; - -static const char * gKindStrings[] = { - "USER", - "COLOR", - "POSITION", - "TEXTURE", - "NORMAL", - "INDEX", - "POINT_SIZE", - "PIXEL_L", - "PIXEL_A", - "PIXEL_LA", - "PIXEL_RGB", - "PIXEL_RGBA", -}; - -void Component::dumpLOGV(const char *prefix) const { - if (mType >= RS_TYPE_ELEMENT) { - ALOGV("%s Component: %s, %s, vectorSize=%i, bits=%i", - prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits); - } else { - ALOGV("%s Component: %s, %s, vectorSize=%i, bits=%i", - prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits); - } -} - -void Component::serialize(OStream *stream) const { - stream->addU8((uint8_t)mType); - stream->addU8((uint8_t)mKind); - stream->addU8((uint8_t)(mNormalized ? 1 : 0)); - stream->addU32(mVectorSize); -} - -void Component::loadFromStream(IStream *stream) { - mType = (RsDataType)stream->loadU8(); - mKind = (RsDataKind)stream->loadU8(); - uint8_t temp = stream->loadU8(); - mNormalized = temp != 0; - mVectorSize = stream->loadU32(); - - set(mType, mKind, mNormalized, mVectorSize); -} - - - - diff --git a/libs/rs/rsComponent.h b/libs/rs/rsComponent.h deleted file mode 100644 index a2e8c0f..0000000 --- a/libs/rs/rsComponent.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2009 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_COMPONENT_H -#define ANDROID_COMPONENT_H - -#include "rsUtils.h" -#include "rsDefines.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - - -// An element is a group of Components that occupies one cell in a structure. -class Component { -public: - Component(); - ~Component(); - - void set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize=1); - - void dumpLOGV(const char *prefix) const; - - RsDataType getType() const {return mType;} - RsDataKind getKind() const {return mKind;} - bool getIsNormalized() const {return mNormalized;} - uint32_t getVectorSize() const {return mVectorSize;} - bool getIsFloat() const {return mIsFloat;} - bool getIsSigned() const {return mIsSigned;} - uint32_t getBits() const {return mBits;} - uint32_t getBitsUnpadded() const {return mBitsUnpadded;} - - // Helpers for reading / writing this class out - void serialize(OStream *stream) const; - void loadFromStream(IStream *stream); - - bool isReference() const; - -protected: - RsDataType mType; - RsDataKind mKind; - bool mNormalized; - uint32_t mVectorSize; - - // derived - uint32_t mBits; - uint32_t mBitsUnpadded; - uint32_t mTypeBits; - bool mIsFloat; - bool mIsSigned; - bool mIsPixel; -}; - -} -} - -#endif - diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp deleted file mode 100644 index 5e21763..0000000 --- a/libs/rs/rsContext.cpp +++ /dev/null @@ -1,770 +0,0 @@ -/* - * 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 "rs.h" -#include "rsDevice.h" -#include "rsContext.h" -#include "rsThreadIO.h" -#include "rsMesh.h" -#include <ui/FramebufferNativeWindow.h> -#include <gui/DisplayEventReceiver.h> - -#include <sys/types.h> -#include <sys/resource.h> -#include <sched.h> - -#include <cutils/properties.h> - -#include <sys/syscall.h> -#include <string.h> - -using namespace android; -using namespace android::renderscript; - -pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER; -pthread_mutex_t Context::gLibMutex = PTHREAD_MUTEX_INITIALIZER; - -bool Context::initGLThread() { - pthread_mutex_lock(&gInitMutex); - - if (!mHal.funcs.initGraphics(this)) { - pthread_mutex_unlock(&gInitMutex); - ALOGE("%p initGraphics failed", this); - return false; - } - - pthread_mutex_unlock(&gInitMutex); - return true; -} - -void Context::deinitEGL() { - mHal.funcs.shutdownGraphics(this); -} - -Context::PushState::PushState(Context *con) { - mRsc = con; - if (con->mIsGraphicsContext) { - mFragment.set(con->getProgramFragment()); - mVertex.set(con->getProgramVertex()); - mStore.set(con->getProgramStore()); - mRaster.set(con->getProgramRaster()); - mFont.set(con->getFont()); - } -} - -Context::PushState::~PushState() { - if (mRsc->mIsGraphicsContext) { - mRsc->setProgramFragment(mFragment.get()); - mRsc->setProgramVertex(mVertex.get()); - mRsc->setProgramStore(mStore.get()); - mRsc->setProgramRaster(mRaster.get()); - mRsc->setFont(mFont.get()); - } -} - - -uint32_t Context::runScript(Script *s) { - PushState(this); - - uint32_t ret = s->run(this); - return ret; -} - -uint32_t Context::runRootScript() { - timerSet(RS_TIMER_SCRIPT); - mStateFragmentStore.mLast.clear(); - watchdog.inRoot = true; - uint32_t ret = runScript(mRootScript.get()); - watchdog.inRoot = false; - - return ret; -} - -uint64_t Context::getTime() const { -#ifndef ANDROID_RS_SERIALIZE - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000); -#else - return 0; -#endif //ANDROID_RS_SERIALIZE -} - -void Context::timerReset() { - for (int ct=0; ct < _RS_TIMER_TOTAL; ct++) { - mTimers[ct] = 0; - } -} - -void Context::timerInit() { - mTimeLast = getTime(); - mTimeFrame = mTimeLast; - mTimeLastFrame = mTimeLast; - mTimerActive = RS_TIMER_INTERNAL; - mAverageFPSFrameCount = 0; - mAverageFPSStartTime = mTimeLast; - mAverageFPS = 0; - timerReset(); -} - -void Context::timerFrame() { - mTimeLastFrame = mTimeFrame; - mTimeFrame = getTime(); - // Update average fps - const uint64_t averageFramerateInterval = 1000 * 1000000; - mAverageFPSFrameCount ++; - uint64_t inverval = mTimeFrame - mAverageFPSStartTime; - if (inverval >= averageFramerateInterval) { - inverval = inverval / 1000000; - mAverageFPS = (mAverageFPSFrameCount * 1000) / inverval; - mAverageFPSFrameCount = 0; - mAverageFPSStartTime = mTimeFrame; - } -} - -void Context::timerSet(Timers tm) { - uint64_t last = mTimeLast; - mTimeLast = getTime(); - mTimers[mTimerActive] += mTimeLast - last; - mTimerActive = tm; -} - -void Context::timerPrint() { - double total = 0; - for (int ct = 0; ct < _RS_TIMER_TOTAL; ct++) { - total += mTimers[ct]; - } - uint64_t frame = mTimeFrame - mTimeLastFrame; - mTimeMSLastFrame = frame / 1000000; - mTimeMSLastScript = mTimers[RS_TIMER_SCRIPT] / 1000000; - mTimeMSLastSwap = mTimers[RS_TIMER_CLEAR_SWAP] / 1000000; - - - if (props.mLogTimes) { - ALOGV("RS: Frame (%i), Script %2.1f%% (%i), Swap %2.1f%% (%i), Idle %2.1f%% (%lli), Internal %2.1f%% (%lli), Avg fps: %u", - mTimeMSLastFrame, - 100.0 * mTimers[RS_TIMER_SCRIPT] / total, mTimeMSLastScript, - 100.0 * mTimers[RS_TIMER_CLEAR_SWAP] / total, mTimeMSLastSwap, - 100.0 * mTimers[RS_TIMER_IDLE] / total, mTimers[RS_TIMER_IDLE] / 1000000, - 100.0 * mTimers[RS_TIMER_INTERNAL] / total, mTimers[RS_TIMER_INTERNAL] / 1000000, - mAverageFPS); - } -} - -bool Context::setupCheck() { - - mFragmentStore->setup(this, &mStateFragmentStore); - mFragment->setup(this, &mStateFragment); - mRaster->setup(this, &mStateRaster); - mVertex->setup(this, &mStateVertex); - mFBOCache.setup(this); - return true; -} - -void Context::setupProgramStore() { - mFragmentStore->setup(this, &mStateFragmentStore); -} - -static uint32_t getProp(const char *str) { - char buf[PROPERTY_VALUE_MAX]; - property_get(str, buf, "0"); - return atoi(buf); -} - -void Context::displayDebugStats() { - char buffer[128]; - sprintf(buffer, "Avg fps %u, Frame %i ms, Script %i ms", mAverageFPS, mTimeMSLastFrame, mTimeMSLastScript); - float oldR, oldG, oldB, oldA; - mStateFont.getFontColor(&oldR, &oldG, &oldB, &oldA); - uint32_t bufferLen = strlen(buffer); - - ObjectBaseRef<Font> lastFont(getFont()); - setFont(NULL); - float shadowCol = 0.1f; - mStateFont.setFontColor(shadowCol, shadowCol, shadowCol, 1.0f); - mStateFont.renderText(buffer, bufferLen, 5, getHeight() - 6); - - mStateFont.setFontColor(1.0f, 0.7f, 0.0f, 1.0f); - mStateFont.renderText(buffer, bufferLen, 4, getHeight() - 7); - - setFont(lastFont.get()); - mStateFont.setFontColor(oldR, oldG, oldB, oldA); -} - -void * Context::threadProc(void *vrsc) { - Context *rsc = static_cast<Context *>(vrsc); -#ifndef ANDROID_RS_SERIALIZE - rsc->mNativeThreadId = gettid(); - setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY); - rsc->mThreadPriority = ANDROID_PRIORITY_DISPLAY; -#endif //ANDROID_RS_SERIALIZE - rsc->props.mLogTimes = getProp("debug.rs.profile") != 0; - rsc->props.mLogScripts = getProp("debug.rs.script") != 0; - rsc->props.mLogObjects = getProp("debug.rs.object") != 0; - rsc->props.mLogShaders = getProp("debug.rs.shader") != 0; - rsc->props.mLogShadersAttr = getProp("debug.rs.shader.attributes") != 0; - rsc->props.mLogShadersUniforms = getProp("debug.rs.shader.uniforms") != 0; - rsc->props.mLogVisual = getProp("debug.rs.visual") != 0; - rsc->props.mDebugMaxThreads = getProp("debug.rs.max-threads"); - - if (!rsdHalInit(rsc, 0, 0)) { - rsc->setError(RS_ERROR_FATAL_DRIVER, "Failed initializing GL"); - ALOGE("Hal init failed"); - return NULL; - } - rsc->mHal.funcs.setPriority(rsc, rsc->mThreadPriority); - - if (rsc->mIsGraphicsContext) { - if (!rsc->initGLThread()) { - rsc->setError(RS_ERROR_OUT_OF_MEMORY, "Failed initializing GL"); - return NULL; - } - - rsc->mStateRaster.init(rsc); - rsc->setProgramRaster(NULL); - rsc->mStateVertex.init(rsc); - rsc->setProgramVertex(NULL); - rsc->mStateFragment.init(rsc); - rsc->setProgramFragment(NULL); - rsc->mStateFragmentStore.init(rsc); - rsc->setProgramStore(NULL); - rsc->mStateFont.init(rsc); - rsc->setFont(NULL); - rsc->mStateSampler.init(rsc); - rsc->mFBOCache.init(rsc); - } - - rsc->mRunning = true; - if (!rsc->mIsGraphicsContext) { - while (!rsc->mExit) { - rsc->mIO.playCoreCommands(rsc, -1); - } - } else { -#ifndef ANDROID_RS_SERIALIZE - DisplayEventReceiver displayEvent; - DisplayEventReceiver::Event eventBuffer[1]; -#endif - int vsyncRate = 0; - int targetRate = 0; - - bool drawOnce = false; - while (!rsc->mExit) { - rsc->timerSet(RS_TIMER_IDLE); - -#ifndef ANDROID_RS_SERIALIZE - if (!rsc->mRootScript.get() || !rsc->mHasSurface || rsc->mPaused) { - targetRate = 0; - } - - if (vsyncRate != targetRate) { - displayEvent.setVsyncRate(targetRate); - vsyncRate = targetRate; - } - if (targetRate) { - drawOnce |= rsc->mIO.playCoreCommands(rsc, displayEvent.getFd()); - while (displayEvent.getEvents(eventBuffer, 1) != 0) { - //ALOGE("vs2 time past %lld", (rsc->getTime() - eventBuffer[0].header.timestamp) / 1000000); - } - } else -#endif - { - drawOnce |= rsc->mIO.playCoreCommands(rsc, -1); - } - - if ((rsc->mRootScript.get() != NULL) && rsc->mHasSurface && - (targetRate || drawOnce) && !rsc->mPaused) { - - drawOnce = false; - targetRate = ((rsc->runRootScript() + 15) / 16); - - if (rsc->props.mLogVisual) { - rsc->displayDebugStats(); - } - - rsc->timerSet(RS_TIMER_CLEAR_SWAP); - rsc->mHal.funcs.swap(rsc); - rsc->timerFrame(); - rsc->timerSet(RS_TIMER_INTERNAL); - rsc->timerPrint(); - rsc->timerReset(); - } - } - } - - ALOGV("%p RS Thread exiting", rsc); - - if (rsc->mIsGraphicsContext) { - pthread_mutex_lock(&gInitMutex); - rsc->deinitEGL(); - pthread_mutex_unlock(&gInitMutex); - } - - ALOGV("%p RS Thread exited", rsc); - return NULL; -} - -void Context::destroyWorkerThreadResources() { - //ALOGV("destroyWorkerThreadResources 1"); - ObjectBase::zeroAllUserRef(this); - if (mIsGraphicsContext) { - mRaster.clear(); - mFragment.clear(); - mVertex.clear(); - mFragmentStore.clear(); - mFont.clear(); - mRootScript.clear(); - mStateRaster.deinit(this); - mStateVertex.deinit(this); - mStateFragment.deinit(this); - mStateFragmentStore.deinit(this); - mStateFont.deinit(this); - mStateSampler.deinit(this); - mFBOCache.deinit(this); - } - ObjectBase::freeAllChildren(this); - mExit = true; - //ALOGV("destroyWorkerThreadResources 2"); -} - -void Context::printWatchdogInfo(void *ctx) { - Context *rsc = (Context *)ctx; - if (rsc->watchdog.command && rsc->watchdog.file) { - ALOGE("RS watchdog timeout: %i %s line %i %s", rsc->watchdog.inRoot, - rsc->watchdog.command, rsc->watchdog.line, rsc->watchdog.file); - } else { - ALOGE("RS watchdog timeout: %i", rsc->watchdog.inRoot); - } -} - - -void Context::setPriority(int32_t p) { - // Note: If we put this in the proper "background" policy - // the wallpapers can become completly unresponsive at times. - // This is probably not what we want for something the user is actively - // looking at. - mThreadPriority = p; - setpriority(PRIO_PROCESS, mNativeThreadId, p); - mHal.funcs.setPriority(this, mThreadPriority); -} - -Context::Context() { - mDev = NULL; - mRunning = false; - mExit = false; - mPaused = false; - mObjHead = NULL; - mError = RS_ERROR_NONE; - mTargetSdkVersion = 14; - mDPI = 96; - mIsContextLite = false; - memset(&watchdog, 0, sizeof(watchdog)); -} - -Context * Context::createContext(Device *dev, const RsSurfaceConfig *sc) { - Context * rsc = new Context(); - - if (!rsc->initContext(dev, sc)) { - delete rsc; - return NULL; - } - return rsc; -} - -Context * Context::createContextLite() { - Context * rsc = new Context(); - rsc->mIsContextLite = true; - return rsc; -} - -bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) { - pthread_mutex_lock(&gInitMutex); - - mIO.init(); - mIO.setTimeoutCallback(printWatchdogInfo, this, 2e9); - - dev->addContext(this); - mDev = dev; - if (sc) { - mUserSurfaceConfig = *sc; - } else { - memset(&mUserSurfaceConfig, 0, sizeof(mUserSurfaceConfig)); - } - - mIsGraphicsContext = sc != NULL; - - int status; - pthread_attr_t threadAttr; - - pthread_mutex_unlock(&gInitMutex); - - // Global init done at this point. - - status = pthread_attr_init(&threadAttr); - if (status) { - ALOGE("Failed to init thread attribute."); - return false; - } - - mHasSurface = false; - - timerInit(); - timerSet(RS_TIMER_INTERNAL); - - status = pthread_create(&mThreadId, &threadAttr, threadProc, this); - if (status) { - ALOGE("Failed to start rs context thread."); - return false; - } - while (!mRunning && (mError == RS_ERROR_NONE)) { - usleep(100); - } - - if (mError != RS_ERROR_NONE) { - ALOGE("Errors during thread init"); - return false; - } - - pthread_attr_destroy(&threadAttr); - return true; -} - -Context::~Context() { - ALOGV("%p Context::~Context", this); - - if (!mIsContextLite) { - mPaused = false; - void *res; - - mIO.shutdown(); - int status = pthread_join(mThreadId, &res); - rsAssert(mExit); - - if (mHal.funcs.shutdownDriver) { - mHal.funcs.shutdownDriver(this); - } - - // Global structure cleanup. - pthread_mutex_lock(&gInitMutex); - if (mDev) { - mDev->removeContext(this); - mDev = NULL; - } - pthread_mutex_unlock(&gInitMutex); - } - ALOGV("%p Context::~Context done", this); -} - -void Context::setSurface(uint32_t w, uint32_t h, RsNativeWindow sur) { - rsAssert(mIsGraphicsContext); - mHal.funcs.setSurface(this, w, h, sur); - - mHasSurface = sur != NULL; - mWidth = w; - mHeight = h; - - if (mWidth && mHeight) { - mStateVertex.updateSize(this); - mFBOCache.updateSize(); - } -} - -uint32_t Context::getCurrentSurfaceWidth() const { - for (uint32_t i = 0; i < mFBOCache.mHal.state.colorTargetsCount; i ++) { - if (mFBOCache.mHal.state.colorTargets[i] != NULL) { - return mFBOCache.mHal.state.colorTargets[i]->getType()->getDimX(); - } - } - if (mFBOCache.mHal.state.depthTarget != NULL) { - return mFBOCache.mHal.state.depthTarget->getType()->getDimX(); - } - return mWidth; -} - -uint32_t Context::getCurrentSurfaceHeight() const { - for (uint32_t i = 0; i < mFBOCache.mHal.state.colorTargetsCount; i ++) { - if (mFBOCache.mHal.state.colorTargets[i] != NULL) { - return mFBOCache.mHal.state.colorTargets[i]->getType()->getDimY(); - } - } - if (mFBOCache.mHal.state.depthTarget != NULL) { - return mFBOCache.mHal.state.depthTarget->getType()->getDimY(); - } - return mHeight; -} - -void Context::pause() { - rsAssert(mIsGraphicsContext); - mPaused = true; -} - -void Context::resume() { - rsAssert(mIsGraphicsContext); - mPaused = false; -} - -void Context::setRootScript(Script *s) { - rsAssert(mIsGraphicsContext); - mRootScript.set(s); -} - -void Context::setProgramStore(ProgramStore *pfs) { - rsAssert(mIsGraphicsContext); - if (pfs == NULL) { - mFragmentStore.set(mStateFragmentStore.mDefault); - } else { - mFragmentStore.set(pfs); - } -} - -void Context::setProgramFragment(ProgramFragment *pf) { - rsAssert(mIsGraphicsContext); - if (pf == NULL) { - mFragment.set(mStateFragment.mDefault); - } else { - mFragment.set(pf); - } -} - -void Context::setProgramRaster(ProgramRaster *pr) { - rsAssert(mIsGraphicsContext); - if (pr == NULL) { - mRaster.set(mStateRaster.mDefault); - } else { - mRaster.set(pr); - } -} - -void Context::setProgramVertex(ProgramVertex *pv) { - rsAssert(mIsGraphicsContext); - if (pv == NULL) { - mVertex.set(mStateVertex.mDefault); - } else { - mVertex.set(pv); - } -} - -void Context::setFont(Font *f) { - rsAssert(mIsGraphicsContext); - if (f == NULL) { - mFont.set(mStateFont.mDefault); - } else { - mFont.set(f); - } -} - -void Context::assignName(ObjectBase *obj, const char *name, uint32_t len) { - rsAssert(!obj->getName()); - obj->setName(name, len); - mNames.add(obj); -} - -void Context::removeName(ObjectBase *obj) { - for (size_t ct=0; ct < mNames.size(); ct++) { - if (obj == mNames[ct]) { - mNames.removeAt(ct); - return; - } - } -} - -RsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID) { - return (RsMessageToClientType)mIO.getClientHeader(receiveLen, subID); -} - -RsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen) { - return (RsMessageToClientType)mIO.getClientPayload(data, receiveLen, subID, bufferLen); -} - -bool Context::sendMessageToClient(const void *data, RsMessageToClientType cmdID, - uint32_t subID, size_t len, bool waitForSpace) const { - - return mIO.sendToClient(cmdID, subID, data, len, waitForSpace); -} - -void Context::initToClient() { - while (!mRunning) { - usleep(100); - } -} - -void Context::deinitToClient() { - mIO.clientShutdown(); -} - -void Context::setError(RsError e, const char *msg) const { - mError = e; - sendMessageToClient(msg, RS_MESSAGE_TO_CLIENT_ERROR, e, strlen(msg) + 1, true); -} - - -void Context::dumpDebug() const { - ALOGE("RS Context debug %p", this); - ALOGE("RS Context debug"); - - ALOGE(" RS width %i, height %i", mWidth, mHeight); - ALOGE(" RS running %i, exit %i, paused %i", mRunning, mExit, mPaused); - ALOGE(" RS pThreadID %li, nativeThreadID %i", (long int)mThreadId, mNativeThreadId); -} - -/////////////////////////////////////////////////////////////////////////////////////////// -// - -namespace android { -namespace renderscript { - -void rsi_ContextFinish(Context *rsc) { -} - -void rsi_ContextBindRootScript(Context *rsc, RsScript vs) { - Script *s = static_cast<Script *>(vs); - rsc->setRootScript(s); -} - -void rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) { - Sampler *s = static_cast<Sampler *>(vs); - - if (slot > RS_MAX_SAMPLER_SLOT) { - ALOGE("Invalid sampler slot"); - return; - } - - s->bindToContext(&rsc->mStateSampler, slot); -} - -void rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) { - ProgramStore *pfs = static_cast<ProgramStore *>(vpfs); - rsc->setProgramStore(pfs); -} - -void rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) { - ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); - rsc->setProgramFragment(pf); -} - -void rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) { - ProgramRaster *pr = static_cast<ProgramRaster *>(vpr); - rsc->setProgramRaster(pr); -} - -void rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) { - ProgramVertex *pv = static_cast<ProgramVertex *>(vpv); - rsc->setProgramVertex(pv); -} - -void rsi_ContextBindFont(Context *rsc, RsFont vfont) { - Font *font = static_cast<Font *>(vfont); - rsc->setFont(font); -} - -void rsi_AssignName(Context *rsc, RsObjectBase obj, const char *name, size_t name_length) { - ObjectBase *ob = static_cast<ObjectBase *>(obj); - rsc->assignName(ob, name, name_length); -} - -void rsi_ObjDestroy(Context *rsc, void *optr) { - ObjectBase *ob = static_cast<ObjectBase *>(optr); - rsc->removeName(ob); - ob->decUserRef(); -} - -void rsi_ContextPause(Context *rsc) { - rsc->pause(); -} - -void rsi_ContextResume(Context *rsc) { - rsc->resume(); -} - -void rsi_ContextSetSurface(Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) { - rsc->setSurface(w, h, sur); -} - -void rsi_ContextSetPriority(Context *rsc, int32_t p) { - rsc->setPriority(p); -} - -void rsi_ContextDump(Context *rsc, int32_t bits) { - ObjectBase::dumpAll(rsc); -} - -void rsi_ContextDestroyWorker(Context *rsc) { - rsc->destroyWorkerThreadResources(); -} - -void rsi_ContextDestroy(Context *rsc) { - ALOGV("%p rsContextDestroy", rsc); - rsContextDestroyWorker(rsc); - delete rsc; - ALOGV("%p rsContextDestroy done", rsc); -} - - -RsMessageToClientType rsi_ContextPeekMessage(Context *rsc, - size_t * receiveLen, size_t receiveLen_length, - uint32_t * subID, size_t subID_length) { - return rsc->peekMessageToClient(receiveLen, subID); -} - -RsMessageToClientType rsi_ContextGetMessage(Context *rsc, void * data, size_t data_length, - size_t * receiveLen, size_t receiveLen_length, - uint32_t * subID, size_t subID_length) { - rsAssert(subID_length == sizeof(uint32_t)); - rsAssert(receiveLen_length == sizeof(size_t)); - return rsc->getMessageToClient(data, receiveLen, subID, data_length); -} - -void rsi_ContextInitToClient(Context *rsc) { - rsc->initToClient(); -} - -void rsi_ContextDeinitToClient(Context *rsc) { - rsc->deinitToClient(); -} - -} -} - -RsContext rsContextCreate(RsDevice vdev, uint32_t version, - uint32_t sdkVersion) { - ALOGV("rsContextCreate dev=%p", vdev); - Device * dev = static_cast<Device *>(vdev); - Context *rsc = Context::createContext(dev, NULL); - if (rsc) { - rsc->setTargetSdkVersion(sdkVersion); - } - return rsc; -} - -RsContext rsContextCreateGL(RsDevice vdev, uint32_t version, - uint32_t sdkVersion, RsSurfaceConfig sc, - uint32_t dpi) { - ALOGV("rsContextCreateGL dev=%p", vdev); - Device * dev = static_cast<Device *>(vdev); - Context *rsc = Context::createContext(dev, &sc); - if (rsc) { - rsc->setTargetSdkVersion(sdkVersion); - rsc->setDPI(dpi); - } - ALOGV("%p rsContextCreateGL ret", rsc); - return rsc; -} - -// Only to be called at a3d load time, before object is visible to user -// not thread safe -void rsaGetName(RsContext con, void * obj, const char **name) { - ObjectBase *ob = static_cast<ObjectBase *>(obj); - (*name) = ob->getName(); -} diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h deleted file mode 100644 index de110c6..0000000 --- a/libs/rs/rsContext.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - * 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_CONTEXT_H -#define ANDROID_RS_CONTEXT_H - -#include "rsUtils.h" -#include "rs_hal.h" - -#include "rsThreadIO.h" -#include "rsScriptC.h" -#include "rsSampler.h" -#include "rsFont.h" -#include "rsPath.h" -#include "rsProgramFragment.h" -#include "rsProgramStore.h" -#include "rsProgramRaster.h" -#include "rsProgramVertex.h" -#include "rsFBOCache.h" - -// --------------------------------------------------------------------------- -namespace android { - -namespace renderscript { - -class Device; - -#if 0 -#define CHECK_OBJ(o) { \ - GET_TLS(); \ - if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \ - ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \ - } \ -} -#define CHECK_OBJ_OR_NULL(o) { \ - GET_TLS(); \ - if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) { \ - ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__); \ - } \ -} -#else -#define CHECK_OBJ(o) -#define CHECK_OBJ_OR_NULL(o) -#endif - -class Context { -public: - struct Hal { - void * drv; - - RsdHalFunctions funcs; - }; - Hal mHal; - - static Context * createContext(Device *, const RsSurfaceConfig *sc); - static Context * createContextLite(); - ~Context(); - - static pthread_mutex_t gInitMutex; - // Library mutex (for providing thread-safe calls from the runtime) - static pthread_mutex_t gLibMutex; - - class PushState { - public: - PushState(Context *); - ~PushState(); - - private: - ObjectBaseRef<ProgramFragment> mFragment; - ObjectBaseRef<ProgramVertex> mVertex; - ObjectBaseRef<ProgramStore> mStore; - ObjectBaseRef<ProgramRaster> mRaster; - ObjectBaseRef<Font> mFont; - Context *mRsc; - }; - - RsSurfaceConfig mUserSurfaceConfig; - - ElementState mStateElement; - TypeState mStateType; - SamplerState mStateSampler; - ProgramFragmentState mStateFragment; - ProgramStoreState mStateFragmentStore; - ProgramRasterState mStateRaster; - ProgramVertexState mStateVertex; - FontState mStateFont; - - ScriptCState mScriptC; - FBOCache mFBOCache; - - void swapBuffers(); - void setRootScript(Script *); - void setProgramRaster(ProgramRaster *); - void setProgramVertex(ProgramVertex *); - void setProgramFragment(ProgramFragment *); - void setProgramStore(ProgramStore *); - void setFont(Font *); - - void updateSurface(void *sur); - - ProgramFragment * getProgramFragment() {return mFragment.get();} - ProgramStore * getProgramStore() {return mFragmentStore.get();} - ProgramRaster * getProgramRaster() {return mRaster.get();} - ProgramVertex * getProgramVertex() {return mVertex.get();} - Font * getFont() {return mFont.get();} - - bool setupCheck(); - void setupProgramStore(); - - void pause(); - void resume(); - void setSurface(uint32_t w, uint32_t h, RsNativeWindow sur); - void setPriority(int32_t p); - void destroyWorkerThreadResources(); - - void assignName(ObjectBase *obj, const char *name, uint32_t len); - void removeName(ObjectBase *obj); - - RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID); - RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen); - bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const; - uint32_t runScript(Script *s); - - void initToClient(); - void deinitToClient(); - - ProgramFragment * getDefaultProgramFragment() const { - return mStateFragment.mDefault.get(); - } - ProgramVertex * getDefaultProgramVertex() const { - return mStateVertex.mDefault.get(); - } - ProgramStore * getDefaultProgramStore() const { - return mStateFragmentStore.mDefault.get(); - } - ProgramRaster * getDefaultProgramRaster() const { - return mStateRaster.mDefault.get(); - } - Font* getDefaultFont() const { - return mStateFont.mDefault.get(); - } - - uint32_t getWidth() const {return mWidth;} - uint32_t getHeight() const {return mHeight;} - - uint32_t getCurrentSurfaceWidth() const; - uint32_t getCurrentSurfaceHeight() const; - - mutable ThreadIO mIO; - - // Timers - enum Timers { - RS_TIMER_IDLE, - RS_TIMER_INTERNAL, - RS_TIMER_SCRIPT, - RS_TIMER_CLEAR_SWAP, - _RS_TIMER_TOTAL - }; - uint64_t getTime() const; - void timerInit(); - void timerReset(); - void timerSet(Timers); - void timerPrint(); - void timerFrame(); - - struct { - bool mLogTimes; - bool mLogScripts; - bool mLogObjects; - bool mLogShaders; - bool mLogShadersAttr; - bool mLogShadersUniforms; - bool mLogVisual; - uint32_t mDebugMaxThreads; - } props; - - mutable struct { - bool inRoot; - const char *command; - const char *file; - uint32_t line; - } watchdog; - static void printWatchdogInfo(void *ctx); - void setWatchdogGL(const char *cmd, uint32_t line, const char *file) const { - watchdog.command = cmd; - watchdog.file = file; - watchdog.line = line; - } - - void dumpDebug() const; - void setError(RsError e, const char *msg = NULL) const; - - mutable const ObjectBase * mObjHead; - - uint32_t getDPI() const {return mDPI;} - void setDPI(uint32_t dpi) {mDPI = dpi;} - - uint32_t getTargetSdkVersion() const {return mTargetSdkVersion;} - void setTargetSdkVersion(uint32_t sdkVer) {mTargetSdkVersion = sdkVer;} - - Device *mDev; -protected: - - uint32_t mTargetSdkVersion; - uint32_t mDPI; - uint32_t mWidth; - uint32_t mHeight; - int32_t mThreadPriority; - bool mIsGraphicsContext; - - bool mRunning; - bool mExit; - bool mPaused; - mutable RsError mError; - - pthread_t mThreadId; - pid_t mNativeThreadId; - - ObjectBaseRef<Script> mRootScript; - ObjectBaseRef<ProgramFragment> mFragment; - ObjectBaseRef<ProgramVertex> mVertex; - ObjectBaseRef<ProgramStore> mFragmentStore; - ObjectBaseRef<ProgramRaster> mRaster; - ObjectBaseRef<Font> mFont; - - void displayDebugStats(); - -private: - Context(); - bool initContext(Device *, const RsSurfaceConfig *sc); - - - bool initGLThread(); - void deinitEGL(); - - uint32_t runRootScript(); - - static void * threadProc(void *); - static void * helperThreadProc(void *); - - bool mHasSurface; - bool mIsContextLite; - - Vector<ObjectBase *> mNames; - - uint64_t mTimers[_RS_TIMER_TOTAL]; - Timers mTimerActive; - uint64_t mTimeLast; - uint64_t mTimeFrame; - uint64_t mTimeLastFrame; - uint32_t mTimeMSLastFrame; - uint32_t mTimeMSLastScript; - uint32_t mTimeMSLastSwap; - uint32_t mAverageFPSFrameCount; - uint64_t mAverageFPSStartTime; - uint32_t mAverageFPS; -}; - -} // renderscript -} // android -#endif diff --git a/libs/rs/rsDefines.h b/libs/rs/rsDefines.h deleted file mode 100644 index 0e0cd8d..0000000 --- a/libs/rs/rsDefines.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2007-2012 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 RENDER_SCRIPT_DEFINES_H -#define RENDER_SCRIPT_DEFINES_H - -#include <stdint.h> -#include <sys/types.h> - -#ifdef __cplusplus -extern "C" { -#endif - -////////////////////////////////////////////////////// -// - -typedef void * RsAsyncVoidPtr; - -typedef void * RsAdapter1D; -typedef void * RsAdapter2D; -typedef void * RsAllocation; -typedef void * RsAnimation; -typedef void * RsContext; -typedef void * RsDevice; -typedef void * RsElement; -typedef void * RsFile; -typedef void * RsFont; -typedef void * RsSampler; -typedef void * RsScript; -typedef void * RsMesh; -typedef void * RsPath; -typedef void * RsType; -typedef void * RsObjectBase; - -typedef void * RsProgram; -typedef void * RsProgramVertex; -typedef void * RsProgramFragment; -typedef void * RsProgramStore; -typedef void * RsProgramRaster; - -typedef void * RsNativeWindow; - -typedef void (* RsBitmapCallback_t)(void *); - -typedef struct { - float m[16]; -} rs_matrix4x4; - -typedef struct { - float m[9]; -} rs_matrix3x3; - -typedef struct { - float m[4]; -} rs_matrix2x2; - -enum RsDeviceParam { - RS_DEVICE_PARAM_FORCE_SOFTWARE_GL, - RS_DEVICE_PARAM_COUNT -}; - -typedef struct { - uint32_t colorMin; - uint32_t colorPref; - uint32_t alphaMin; - uint32_t alphaPref; - uint32_t depthMin; - uint32_t depthPref; - uint32_t stencilMin; - uint32_t stencilPref; - uint32_t samplesMin; - uint32_t samplesPref; - float samplesQ; -} RsSurfaceConfig; - -enum RsMessageToClientType { - RS_MESSAGE_TO_CLIENT_NONE = 0, - RS_MESSAGE_TO_CLIENT_EXCEPTION = 1, - RS_MESSAGE_TO_CLIENT_RESIZE = 2, - RS_MESSAGE_TO_CLIENT_ERROR = 3, - RS_MESSAGE_TO_CLIENT_USER = 4 -}; - -enum RsAllocationUsageType { - RS_ALLOCATION_USAGE_SCRIPT = 0x0001, - RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE = 0x0002, - RS_ALLOCATION_USAGE_GRAPHICS_VERTEX = 0x0004, - RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS = 0x0008, - RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET = 0x0010, - RS_ALLOCATION_USAGE_IO_INPUT = 0x0020, - RS_ALLOCATION_USAGE_IO_OUTPUT = 0x0040, - - RS_ALLOCATION_USAGE_ALL = 0x00FF -}; - -enum RsAllocationMipmapControl { - RS_ALLOCATION_MIPMAP_NONE = 0, - RS_ALLOCATION_MIPMAP_FULL = 1, - RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE = 2 -}; - -enum RsAllocationCubemapFace { - RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X = 0, - RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_X = 1, - RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Y = 2, - RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Y = 3, - RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Z = 4, - RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Z = 5 -}; - -enum RsDataType { - RS_TYPE_NONE, - RS_TYPE_FLOAT_16, - RS_TYPE_FLOAT_32, - RS_TYPE_FLOAT_64, - RS_TYPE_SIGNED_8, - RS_TYPE_SIGNED_16, - RS_TYPE_SIGNED_32, - RS_TYPE_SIGNED_64, - RS_TYPE_UNSIGNED_8, - RS_TYPE_UNSIGNED_16, - RS_TYPE_UNSIGNED_32, - RS_TYPE_UNSIGNED_64, - - RS_TYPE_BOOLEAN, - - RS_TYPE_UNSIGNED_5_6_5, - RS_TYPE_UNSIGNED_5_5_5_1, - RS_TYPE_UNSIGNED_4_4_4_4, - - RS_TYPE_MATRIX_4X4, - RS_TYPE_MATRIX_3X3, - RS_TYPE_MATRIX_2X2, - - RS_TYPE_ELEMENT = 1000, - RS_TYPE_TYPE, - RS_TYPE_ALLOCATION, - RS_TYPE_SAMPLER, - RS_TYPE_SCRIPT, - RS_TYPE_MESH, - RS_TYPE_PROGRAM_FRAGMENT, - RS_TYPE_PROGRAM_VERTEX, - RS_TYPE_PROGRAM_RASTER, - RS_TYPE_PROGRAM_STORE, - - RS_TYPE_INVALID = 10000, -}; - -enum RsDataKind { - RS_KIND_USER, - - RS_KIND_PIXEL_L = 7, - RS_KIND_PIXEL_A, - RS_KIND_PIXEL_LA, - RS_KIND_PIXEL_RGB, - RS_KIND_PIXEL_RGBA, - RS_KIND_PIXEL_DEPTH, - - RS_KIND_INVALID = 100, -}; - -enum RsSamplerParam { - RS_SAMPLER_MIN_FILTER, - RS_SAMPLER_MAG_FILTER, - RS_SAMPLER_WRAP_S, - RS_SAMPLER_WRAP_T, - RS_SAMPLER_WRAP_R, - RS_SAMPLER_ANISO -}; - -enum RsSamplerValue { - RS_SAMPLER_NEAREST, - RS_SAMPLER_LINEAR, - RS_SAMPLER_LINEAR_MIP_LINEAR, - RS_SAMPLER_WRAP, - RS_SAMPLER_CLAMP, - RS_SAMPLER_LINEAR_MIP_NEAREST, - - RS_SAMPLER_INVALID = 100, -}; - -enum RsTextureTarget { - RS_TEXTURE_2D, - RS_TEXTURE_CUBE -}; - -enum RsDimension { - RS_DIMENSION_X, - RS_DIMENSION_Y, - RS_DIMENSION_Z, - RS_DIMENSION_LOD, - RS_DIMENSION_FACE, - - RS_DIMENSION_ARRAY_0 = 100, - RS_DIMENSION_ARRAY_1, - RS_DIMENSION_ARRAY_2, - RS_DIMENSION_ARRAY_3, - RS_DIMENSION_MAX = RS_DIMENSION_ARRAY_3 -}; - -enum RsDepthFunc { - 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 -}; - -enum RsBlendSrcFunc { - 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_INVALID = 100, -}; - -enum RsBlendDstFunc { - 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_INVALID = 100, -}; - -enum RsTexEnvMode { - RS_TEX_ENV_MODE_NONE, - RS_TEX_ENV_MODE_REPLACE, - RS_TEX_ENV_MODE_MODULATE, - RS_TEX_ENV_MODE_DECAL -}; - -enum RsProgramParam { - RS_PROGRAM_PARAM_INPUT, - RS_PROGRAM_PARAM_OUTPUT, - RS_PROGRAM_PARAM_CONSTANT, - RS_PROGRAM_PARAM_TEXTURE_TYPE, -}; - -enum RsPrimitive { - RS_PRIMITIVE_POINT, - RS_PRIMITIVE_LINE, - RS_PRIMITIVE_LINE_STRIP, - RS_PRIMITIVE_TRIANGLE, - RS_PRIMITIVE_TRIANGLE_STRIP, - RS_PRIMITIVE_TRIANGLE_FAN, - - RS_PRIMITIVE_INVALID = 100, -}; - -enum RsPathPrimitive { - RS_PATH_PRIMITIVE_QUADRATIC_BEZIER, - RS_PATH_PRIMITIVE_CUBIC_BEZIER -}; - -enum RsError { - RS_ERROR_NONE = 0, - RS_ERROR_BAD_SHADER = 1, - RS_ERROR_BAD_SCRIPT = 2, - RS_ERROR_BAD_VALUE = 3, - RS_ERROR_OUT_OF_MEMORY = 4, - RS_ERROR_DRIVER = 5, - - RS_ERROR_FATAL_UNKNOWN = 0x1000, - RS_ERROR_FATAL_DRIVER = 0x1001, - RS_ERROR_FATAL_PROGRAM_LINK = 0x1002 -}; - -enum RsAnimationInterpolation { - RS_ANIMATION_INTERPOLATION_STEP, - RS_ANIMATION_INTERPOLATION_LINEAR, - RS_ANIMATION_INTERPOLATION_BEZIER, - RS_ANIMATION_INTERPOLATION_CARDINAL, - RS_ANIMATION_INTERPOLATION_HERMITE, - RS_ANIMATION_INTERPOLATION_BSPLINE -}; - -enum RsAnimationEdge { - RS_ANIMATION_EDGE_UNDEFINED, - RS_ANIMATION_EDGE_CONSTANT, - RS_ANIMATION_EDGE_GRADIENT, - RS_ANIMATION_EDGE_CYCLE, - RS_ANIMATION_EDGE_OSCILLATE, - RS_ANIMATION_EDGE_CYLE_RELATIVE -}; - -enum RsA3DClassID { - RS_A3D_CLASS_ID_UNKNOWN, - RS_A3D_CLASS_ID_MESH, - RS_A3D_CLASS_ID_TYPE, - RS_A3D_CLASS_ID_ELEMENT, - RS_A3D_CLASS_ID_ALLOCATION, - RS_A3D_CLASS_ID_PROGRAM_VERTEX, - RS_A3D_CLASS_ID_PROGRAM_RASTER, - RS_A3D_CLASS_ID_PROGRAM_FRAGMENT, - RS_A3D_CLASS_ID_PROGRAM_STORE, - RS_A3D_CLASS_ID_SAMPLER, - RS_A3D_CLASS_ID_ANIMATION, - RS_A3D_CLASS_ID_ADAPTER_1D, - RS_A3D_CLASS_ID_ADAPTER_2D, - RS_A3D_CLASS_ID_SCRIPT_C -}; - -enum RsCullMode { - RS_CULL_BACK, - RS_CULL_FRONT, - RS_CULL_NONE, - RS_CULL_INVALID = 100, -}; - -typedef struct { - RsA3DClassID classID; - const char* objectName; -} RsFileIndexEntry; - -// Script to Script -typedef struct { - uint32_t xStart; - uint32_t xEnd; - uint32_t yStart; - uint32_t yEnd; - uint32_t zStart; - uint32_t zEnd; - uint32_t arrayStart; - uint32_t arrayEnd; - -} RsScriptCall; - -#ifdef __cplusplus -}; -#endif - -#endif // RENDER_SCRIPT_DEFINES_H - - - - diff --git a/libs/rs/rsDevice.cpp b/libs/rs/rsDevice.cpp deleted file mode 100644 index d7d03f6..0000000 --- a/libs/rs/rsDevice.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2009 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 "rsDevice.h" -#include "rsContext.h" - -using namespace android; -using namespace android::renderscript; - -Device::Device() { - mForceSW = false; -} - -Device::~Device() { -} - -void Device::addContext(Context *rsc) { - mContexts.push(rsc); -} - -void Device::removeContext(Context *rsc) { - for (size_t idx=0; idx < mContexts.size(); idx++) { - if (mContexts[idx] == rsc) { - mContexts.removeAt(idx); - break; - } - } -} - -RsDevice rsDeviceCreate() { - Device * d = new Device(); - return d; -} - -void rsDeviceDestroy(RsDevice dev) { - Device * d = static_cast<Device *>(dev); - delete d; -} - -void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value) { - Device * d = static_cast<Device *>(dev); - if (p == RS_DEVICE_PARAM_FORCE_SOFTWARE_GL) { - d->mForceSW = value != 0; - return; - } - rsAssert(0); -} - diff --git a/libs/rs/rsDevice.h b/libs/rs/rsDevice.h deleted file mode 100644 index ffb514b..0000000 --- a/libs/rs/rsDevice.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2009 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_DEVICE_H -#define ANDROID_RS_DEVICE_H - -#include "rsUtils.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class Context; - -class Device { -public: - Device(); - ~Device(); - - void addContext(Context *); - void removeContext(Context *); - - bool mForceSW; - -protected: - Vector<Context *> mContexts; -}; - -} -} -#endif diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp deleted file mode 100644 index fb2892c..0000000 --- a/libs/rs/rsElement.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/* - * Copyright (C) 2009 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; - - -Element::Element(Context *rsc) : ObjectBase(rsc) { - mBits = 0; - mBitsUnpadded = 0; - mFields = NULL; - mFieldCount = 0; - mHasReference = false; - memset(&mHal, 0, sizeof(mHal)); -} - -Element::~Element() { - clear(); -} - -void Element::preDestroy() const { - for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) { - if (mRSC->mStateElement.mElements[ct] == this) { - mRSC->mStateElement.mElements.removeAt(ct); - break; - } - } -} - -void Element::clear() { - delete [] mFields; - mFields = NULL; - mFieldCount = 0; - mHasReference = false; - - delete [] mHal.state.fields; - delete [] mHal.state.fieldArraySizes; - delete [] mHal.state.fieldNames; - delete [] mHal.state.fieldNameLengths; - delete [] mHal.state.fieldOffsetBytes; -} - -size_t Element::getSizeBits() const { - if (!mFieldCount) { - return mBits; - } - - size_t total = 0; - for (size_t ct=0; ct < mFieldCount; ct++) { - total += mFields[ct].e->mBits * mFields[ct].arraySize; - } - return total; -} - -size_t Element::getSizeBitsUnpadded() const { - if (!mFieldCount) { - return mBitsUnpadded; - } - - size_t total = 0; - for (size_t ct=0; ct < mFieldCount; ct++) { - total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize; - } - return total; -} - -void Element::dumpLOGV(const char *prefix) const { - ObjectBase::dumpLOGV(prefix); - ALOGV("%s Element: fieldCount: %zu, size bytes: %zu", prefix, mFieldCount, getSizeBytes()); - mComponent.dumpLOGV(prefix); - for (uint32_t ct = 0; ct < mFieldCount; ct++) { - ALOGV("%s Element field index: %u ------------------", prefix, ct); - ALOGV("%s name: %s, offsetBits: %u, arraySize: %u", - prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize); - mFields[ct].e->dumpLOGV(prefix); - } -} - -void Element::serialize(OStream *stream) const { - // Need to identify ourselves - stream->addU32((uint32_t)getClassId()); - - String8 name(getName()); - stream->addString(&name); - - mComponent.serialize(stream); - - // Now serialize all the fields - stream->addU32(mFieldCount); - for (uint32_t ct = 0; ct < mFieldCount; ct++) { - stream->addString(&mFields[ct].name); - stream->addU32(mFields[ct].arraySize); - mFields[ct].e->serialize(stream); - } -} - -Element *Element::createFromStream(Context *rsc, IStream *stream) { - // First make sure we are reading the correct object - RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); - if (classID != RS_A3D_CLASS_ID_ELEMENT) { - ALOGE("element loading skipped due to invalid class id\n"); - return NULL; - } - - String8 name; - stream->loadString(&name); - - Component component; - component.loadFromStream(stream); - - uint32_t fieldCount = stream->loadU32(); - if (!fieldCount) { - return (Element *)Element::create(rsc, - component.getType(), - component.getKind(), - component.getIsNormalized(), - component.getVectorSize());; - } - - const Element **subElems = new const Element *[fieldCount]; - const char **subElemNames = new const char *[fieldCount]; - size_t *subElemNamesLengths = new size_t[fieldCount]; - uint32_t *arraySizes = new uint32_t[fieldCount]; - - String8 elemName; - for (uint32_t ct = 0; ct < fieldCount; ct ++) { - stream->loadString(&elemName); - subElemNamesLengths[ct] = elemName.length(); - char *tmpName = new char[subElemNamesLengths[ct]]; - memcpy(tmpName, elemName.string(), subElemNamesLengths[ct]); - subElemNames[ct] = tmpName; - arraySizes[ct] = stream->loadU32(); - subElems[ct] = Element::createFromStream(rsc, stream); - } - - const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames, - subElemNamesLengths, arraySizes); - for (uint32_t ct = 0; ct < fieldCount; ct ++) { - delete [] subElemNames[ct]; - subElems[ct]->decUserRef(); - } - delete[] subElems; - delete[] subElemNames; - delete[] subElemNamesLengths; - delete[] arraySizes; - - return (Element *)elem; -} - -void Element::compute() { - mHal.state.dataType = mComponent.getType(); - mHal.state.dataKind = mComponent.getKind(); - mHal.state.vectorSize = mComponent.getVectorSize(); - - if (mFieldCount == 0) { - mBits = mComponent.getBits(); - mBitsUnpadded = mComponent.getBitsUnpadded(); - mHasReference = mComponent.isReference(); - - mHal.state.elementSizeBytes = getSizeBytes(); - return; - } - - uint32_t noPaddingFieldCount = 0; - for (uint32_t ct = 0; ct < mFieldCount; ct ++) { - if (mFields[ct].name.string()[0] != '#') { - noPaddingFieldCount ++; - } - } - - mHal.state.fields = new const Element*[noPaddingFieldCount]; - mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount]; - mHal.state.fieldNames = new const char*[noPaddingFieldCount]; - mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount]; - mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount]; - mHal.state.fieldsCount = noPaddingFieldCount; - - size_t bits = 0; - size_t bitsUnpadded = 0; - for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) { - mFields[ct].offsetBits = bits; - mFields[ct].offsetBitsUnpadded = bitsUnpadded; - bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize; - bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize; - - if (mFields[ct].e->mHasReference) { - mHasReference = true; - } - - if (mFields[ct].name.string()[0] == '#') { - continue; - } - - mHal.state.fields[ctNoPadding] = mFields[ct].e.get(); - mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize; - mHal.state.fieldNames[ctNoPadding] = mFields[ct].name.string(); - mHal.state.fieldNameLengths[ctNoPadding] = mFields[ct].name.length() + 1; // to include 0 - mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3; - - ctNoPadding ++; - } - - mHal.state.elementSizeBytes = getSizeBytes(); -} - -ObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk, - bool isNorm, uint32_t vecSize) { - ObjectBaseRef<const Element> returnRef; - // Look for an existing match. - ObjectBase::asyncLock(); - for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { - const Element *ee = rsc->mStateElement.mElements[ct]; - if (!ee->getFieldCount() && - (ee->getComponent().getType() == dt) && - (ee->getComponent().getKind() == dk) && - (ee->getComponent().getIsNormalized() == isNorm) && - (ee->getComponent().getVectorSize() == vecSize)) { - // Match - returnRef.set(ee); - ObjectBase::asyncUnlock(); - return ee; - } - } - ObjectBase::asyncUnlock(); - - Element *e = new Element(rsc); - returnRef.set(e); - e->mComponent.set(dt, dk, isNorm, vecSize); - e->compute(); - - ObjectBase::asyncLock(); - rsc->mStateElement.mElements.push(e); - ObjectBase::asyncUnlock(); - - return returnRef; -} - -ObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein, - const char **nin, const size_t * lengths, const uint32_t *asin) { - - ObjectBaseRef<const Element> returnRef; - // Look for an existing match. - ObjectBase::asyncLock(); - for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { - const Element *ee = rsc->mStateElement.mElements[ct]; - if (ee->getFieldCount() == count) { - bool match = true; - for (uint32_t i=0; i < count; i++) { - if ((ee->mFields[i].e.get() != ein[i]) || - (ee->mFields[i].name.length() != lengths[i]) || - (ee->mFields[i].name != nin[i]) || - (ee->mFields[i].arraySize != asin[i])) { - match = false; - break; - } - } - if (match) { - returnRef.set(ee); - ObjectBase::asyncUnlock(); - return returnRef; - } - } - } - ObjectBase::asyncUnlock(); - - Element *e = new Element(rsc); - returnRef.set(e); - e->mFields = new ElementField_t [count]; - e->mFieldCount = count; - for (size_t ct=0; ct < count; ct++) { - e->mFields[ct].e.set(ein[ct]); - e->mFields[ct].name.setTo(nin[ct], lengths[ct]); - e->mFields[ct].arraySize = asin[ct]; - } - e->compute(); - - ObjectBase::asyncLock(); - rsc->mStateElement.mElements.push(e); - ObjectBase::asyncUnlock(); - - return returnRef; -} - -void Element::incRefs(const void *ptr) const { - if (!mFieldCount) { - if (mComponent.isReference()) { - ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); - ObjectBase *ob = obp[0]; - if (ob) ob->incSysRef(); - } - return; - } - - const uint8_t *p = static_cast<const uint8_t *>(ptr); - for (uint32_t i=0; i < mFieldCount; i++) { - if (mFields[i].e->mHasReference) { - const uint8_t *p2 = &p[mFields[i].offsetBits >> 3]; - for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { - mFields[i].e->incRefs(p2); - p2 += mFields[i].e->getSizeBytes(); - } - } - } -} - -void Element::decRefs(const void *ptr) const { - if (!mFieldCount) { - if (mComponent.isReference()) { - ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); - ObjectBase *ob = obp[0]; - if (ob) ob->decSysRef(); - } - return; - } - - const uint8_t *p = static_cast<const uint8_t *>(ptr); - for (uint32_t i=0; i < mFieldCount; i++) { - if (mFields[i].e->mHasReference) { - const uint8_t *p2 = &p[mFields[i].offsetBits >> 3]; - for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { - mFields[i].e->decRefs(p2); - p2 += mFields[i].e->getSizeBytes(); - } - } - } -} - -Element::Builder::Builder() { - const uint32_t initialCapacity = 32; - mBuilderElementRefs.setCapacity(initialCapacity); - mBuilderElements.setCapacity(initialCapacity); - mBuilderNameStrings.setCapacity(initialCapacity); - mBuilderNameLengths.setCapacity(initialCapacity); - mBuilderArrays.setCapacity(initialCapacity); -} - -void Element::Builder::add(const Element *e, const char *nameStr, uint32_t arraySize) { - mBuilderElementRefs.push(ObjectBaseRef<const Element>(e)); - mBuilderElements.push(e); - mBuilderNameStrings.push(nameStr); - mBuilderNameLengths.push(strlen(nameStr)); - mBuilderArrays.push(arraySize); - -} - -ObjectBaseRef<const Element> Element::Builder::create(Context *rsc) { - return Element::createRef(rsc, mBuilderElements.size(), - &(mBuilderElements.editArray()[0]), - &(mBuilderNameStrings.editArray()[0]), - mBuilderNameLengths.editArray(), - mBuilderArrays.editArray()); -} - - -ElementState::ElementState() { -} - -ElementState::~ElementState() { - rsAssert(!mElements.size()); -} - -///////////////////////////////////////// -// - -namespace android { -namespace renderscript { - -RsElement rsi_ElementCreate(Context *rsc, - RsDataType dt, - RsDataKind dk, - bool norm, - uint32_t vecSize) { - return (RsElement)Element::create(rsc, dt, dk, norm, vecSize); -} - - -RsElement rsi_ElementCreate2(Context *rsc, - const RsElement * ein, - size_t ein_length, - - const char ** names, - size_t nameLengths_length, - const size_t * nameLengths, - - const uint32_t * arraySizes, - size_t arraySizes_length) { - return (RsElement)Element::create(rsc, ein_length, (const Element **)ein, - names, nameLengths, arraySizes); -} - -} -} - -void rsaElementGetNativeData(RsContext con, RsElement elem, - uint32_t *elemData, uint32_t elemDataSize) { - rsAssert(elemDataSize == 5); - // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements - Element *e = static_cast<Element *>(elem); - - (*elemData++) = (uint32_t)e->getType(); - (*elemData++) = (uint32_t)e->getKind(); - (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0; - (*elemData++) = e->getComponent().getVectorSize(); - (*elemData++) = e->getFieldCount(); -} - -void rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids, - const char **names, uint32_t *arraySizes, uint32_t dataSize) { - Element *e = static_cast<Element *>(elem); - rsAssert(e->getFieldCount() == dataSize); - - for (uint32_t i = 0; i < dataSize; i ++) { - e->getField(i)->incUserRef(); - ids[i] = (uint32_t)e->getField(i); - names[i] = e->getFieldName(i); - arraySizes[i] = e->getFieldArraySize(i); - } -} diff --git a/libs/rs/rsElement.h b/libs/rs/rsElement.h deleted file mode 100644 index b86d3bc..0000000 --- a/libs/rs/rsElement.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2009 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_STRUCTURED_ELEMENT_H -#define ANDROID_STRUCTURED_ELEMENT_H - -#include "rsComponent.h" -#include "rsUtils.h" -#include "rsDefines.h" -#include "rsObjectBase.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { -/***************************************************************************** - * CAUTION - * - * Any layout changes for this class may require a corresponding change to be - * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains - * a partial copy of the information below. - * - *****************************************************************************/ -// An element is a group of Components that occupies one cell in a structure. -class Element : public ObjectBase { -public: - struct Hal { - mutable void *drv; - - struct State { - RsDataType dataType; - RsDataKind dataKind; - uint32_t vectorSize; - uint32_t elementSizeBytes; - - // Subelements - const Element **fields; - uint32_t *fieldArraySizes; - const char **fieldNames; - uint32_t *fieldNameLengths; - uint32_t *fieldOffsetBytes; - uint32_t fieldsCount; - }; - State state; - }; - Hal mHal; - - class Builder { - public: - Builder(); - void add(const Element *e, const char *nameStr, uint32_t arraySize); - ObjectBaseRef<const Element> create(Context *rsc); - private: - Vector<ObjectBaseRef<const Element> > mBuilderElementRefs; - Vector<const Element *> mBuilderElements; - Vector<const char*> mBuilderNameStrings; - Vector<size_t> mBuilderNameLengths; - Vector<uint32_t> mBuilderArrays; - }; - uint32_t getGLType() const; - uint32_t getGLFormat() const; - - size_t getSizeBitsUnpadded() const; - size_t getSizeBytesUnpadded() const { - return (getSizeBitsUnpadded() + 7) >> 3; - } - - size_t getSizeBits() const; - size_t getSizeBytes() const { - return (getSizeBits() + 7) >> 3; - } - - size_t getFieldOffsetBits(uint32_t componentNumber) const { - return mFields[componentNumber].offsetBits; - } - size_t getFieldOffsetBytes(uint32_t componentNumber) const { - return mFields[componentNumber].offsetBits >> 3; - } - - size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const { - return mFields[componentNumber].offsetBitsUnpadded >> 3; - } - - uint32_t getFieldCount() const {return mFieldCount;} - const Element * getField(uint32_t idx) const {return mFields[idx].e.get();} - const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();} - uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;} - - const Component & getComponent() const {return mComponent;} - RsDataType getType() const {return mComponent.getType();} - RsDataKind getKind() const {return mComponent.getKind();} - uint32_t getBits() const {return mBits;} - uint32_t getBitsUnpadded() const {return mBitsUnpadded;} - - void dumpLOGV(const char *prefix) const; - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; } - static Element *createFromStream(Context *rsc, IStream *stream); - - static ObjectBaseRef<const Element> createRef(Context *rsc, - RsDataType dt, - RsDataKind dk, - bool isNorm, - uint32_t vecSize); - static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count, - const Element **, - const char **, - const size_t * lengths, - const uint32_t *asin); - - static const Element* create(Context *rsc, - RsDataType dt, - RsDataKind dk, - bool isNorm, - uint32_t vecSize) { - ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize); - elem->incUserRef(); - return elem.get(); - } - static const Element* create(Context *rsc, size_t count, - const Element **ein, - const char **nin, - const size_t * lengths, - const uint32_t *asin) { - ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin); - elem->incUserRef(); - return elem.get(); - } - - void incRefs(const void *) const; - void decRefs(const void *) const; - bool getHasReferences() const {return mHasReference;} - -protected: - // deallocate any components that are part of this element. - void clear(); - - typedef struct { - String8 name; - ObjectBaseRef<const Element> e; - uint32_t offsetBits; - uint32_t offsetBitsUnpadded; - uint32_t arraySize; - } ElementField_t; - ElementField_t *mFields; - size_t mFieldCount; - bool mHasReference; - - - virtual ~Element(); - Element(Context *); - - Component mComponent; - uint32_t mBitsUnpadded; - uint32_t mBits; - - void compute(); - - virtual void preDestroy() const; -}; - - -class ElementState { -public: - ElementState(); - ~ElementState(); - - // Cache of all existing elements. - Vector<Element *> mElements; -}; - - -} -} -#endif //ANDROID_STRUCTURED_ELEMENT_H diff --git a/libs/rs/rsEnv.h b/libs/rs/rsEnv.h deleted file mode 100644 index b82eaf1..0000000 --- a/libs/rs/rsEnv.h +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdint.h> - - -typedef void * RsAdapter1D; -typedef void * RsAdapter2D; -typedef void * RsAllocation; -typedef void * RsContext; -typedef void * RsDevice; -typedef void * RsElement; -typedef void * RsSampler; -typedef void * RsScript; -typedef void * RsMesh; -typedef void * RsType; -typedef void * RsProgramFragment; -typedef void * RsProgramStore; - -typedef struct { - float m[16]; -} rsc_Matrix; - - -typedef struct { - float v[4]; -} rsc_Vector4; - -#define RS_PROGRAM_VERTEX_MODELVIEW_OFFSET 0 -#define RS_PROGRAM_VERTEX_PROJECTION_OFFSET 16 -#define RS_PROGRAM_VERTEX_TEXTURE_OFFSET 32 -#define RS_PROGRAM_VERTEX_MVP_OFFSET 48 diff --git a/libs/rs/rsFBOCache.cpp b/libs/rs/rsFBOCache.cpp deleted file mode 100644 index d50f3e0..0000000 --- a/libs/rs/rsFBOCache.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 "rsFBOCache.h" - -#include "rsContext.h" -#include "rsAllocation.h" - -using namespace android; -using namespace android::renderscript; - - -FBOCache::FBOCache() { - mDirty = true; - mHal.state.colorTargetsCount = 1; - mHal.state.colorTargets = new Allocation*[mHal.state.colorTargetsCount]; - mColorTargets = new ObjectBaseRef<Allocation>[mHal.state.colorTargetsCount]; - resetAll(NULL); -} - -FBOCache::~FBOCache() { - delete[] mHal.state.colorTargets; - delete[] mColorTargets; -} - -void FBOCache::init(Context *rsc) { - rsc->mHal.funcs.framebuffer.init(rsc, this); -} - -void FBOCache::deinit(Context *rsc) { - rsc->mHal.funcs.framebuffer.destroy(rsc, this); -} - -void FBOCache::bindColorTarget(Context *rsc, Allocation *a, uint32_t slot) { - if (slot >= mHal.state.colorTargetsCount) { - ALOGE("Invalid render target index"); - return; - } - if (a != NULL) { - if (!a->getIsTexture()) { - ALOGE("Invalid Color Target"); - return; - } - } - mColorTargets[slot].set(a); - mHal.state.colorTargets[slot] = a; - mDirty = true; -} - -void FBOCache::bindDepthTarget(Context *rsc, Allocation *a) { - if (a != NULL) { - if (!a->getIsRenderTarget()) { - ALOGE("Invalid Depth Target"); - return; - } - } - mDepthTarget.set(a); - mHal.state.depthTarget = a; - mDirty = true; -} - -void FBOCache::resetAll(Context *) { - for (uint32_t i = 0; i < mHal.state.colorTargetsCount; i ++) { - mColorTargets[i].set(NULL); - mHal.state.colorTargets[i] = NULL; - } - mDepthTarget.set(NULL); - mHal.state.depthTarget = NULL; - mDirty = true; -} - -void FBOCache::setup(Context *rsc) { - if (!mDirty) { - return; - } - - rsc->mHal.funcs.framebuffer.setActive(rsc, this); - - mDirty = false; -} diff --git a/libs/rs/rsFBOCache.h b/libs/rs/rsFBOCache.h deleted file mode 100644 index abb84de..0000000 --- a/libs/rs/rsFBOCache.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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_FRAME_BUFFER_OBJECT_CACHE_H -#define ANDROID_FRAME_BUFFER_OBJECT_CACHE_H - -#include "rsObjectBase.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class Allocation; - -class FBOCache { -public: - FBOCache(); - ~FBOCache(); - - void init(Context *rsc); - void deinit(Context *rsc); - - void bindColorTarget(Context *rsc, Allocation *a, uint32_t slot); - void bindDepthTarget(Context *, Allocation *a); - void resetAll(Context *); - - void setup(Context *); - void updateSize() { mDirty = true; } - - struct Hal { - mutable void *drv; - - struct State { - Allocation **colorTargets; - uint32_t colorTargetsCount; - Allocation *depthTarget; - }; - State state; - }; - Hal mHal; - -protected: - ObjectBaseRef<Allocation> *mColorTargets; - ObjectBaseRef<Allocation> mDepthTarget; - bool mDirty; - void checkError(Context *); - void setColorAttachment(Context *rsc); - void setDepthAttachment(Context *rsc); - bool renderToFramebuffer(); - -}; - -} // renderscript -} // android - -#endif //ANDROID_FRAME_BUFFER_OBJECT_CACHE_H diff --git a/libs/rs/rsFifo.h b/libs/rs/rsFifo.h deleted file mode 100644 index 911f446..0000000 --- a/libs/rs/rsFifo.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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_FIFO_H -#define ANDROID_RS_FIFO_H - - -#include "rsUtils.h" - -namespace android { -namespace renderscript { - - -// A simple FIFO to be used as a producer / consumer between two -// threads. One is writer and one is reader. The common cases -// will not require locking. It is not threadsafe for multiple -// readers or writers by design. - -class Fifo { -protected: - Fifo(); - virtual ~Fifo(); - -public: - bool virtual writeAsync(const void *data, size_t bytes, bool waitForSpace = true) = 0; - void virtual writeWaitReturn(void *ret, size_t retSize) = 0; - size_t virtual read(void *data, size_t bytes, bool doWait = true, uint64_t timeToWait = 0) = 0; - void virtual readReturn(const void *data, size_t bytes) = 0; - - void virtual flush() = 0; - -}; - -} -} -#endif diff --git a/libs/rs/rsFifoSocket.cpp b/libs/rs/rsFifoSocket.cpp deleted file mode 100644 index bd511cf..0000000 --- a/libs/rs/rsFifoSocket.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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 "rsFifoSocket.h" -#include "utils/Timers.h" -#include "utils/StopWatch.h" - -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> -#include <unistd.h> -#include <poll.h> -#include <sys/types.h> -#include <sys/socket.h> - -using namespace android; -using namespace android::renderscript; - -FifoSocket::FifoSocket() { - mShutdown = false; -} - -FifoSocket::~FifoSocket() { - -} - -bool FifoSocket::init(bool supportNonBlocking, bool supportReturnValues, size_t maxDataSize) { - int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sv); - return false; -} - -void FifoSocket::shutdown() { - mShutdown = true; - uint64_t d = 0; - ::send(sv[0], &d, sizeof(d), 0); - ::send(sv[1], &d, sizeof(d), 0); - close(sv[0]); - close(sv[1]); -} - -bool FifoSocket::writeAsync(const void *data, size_t bytes, bool waitForSpace) { - if (bytes == 0) { - return true; - } - //ALOGE("writeAsync %p %i", data, bytes); - size_t ret = ::send(sv[0], data, bytes, 0); - //ALOGE("writeAsync ret %i", ret); - rsAssert(ret == bytes); - return true; -} - -void FifoSocket::writeWaitReturn(void *retData, size_t retBytes) { - if (mShutdown) { - return; - } - - //ALOGE("writeWaitReturn %p %i", retData, retBytes); - size_t ret = ::recv(sv[0], retData, retBytes, MSG_WAITALL); - //ALOGE("writeWaitReturn %i", ret); - rsAssert(ret == retBytes); -} - -size_t FifoSocket::read(void *data, size_t bytes) { - if (mShutdown) { - return 0; - } - - //ALOGE("read %p %i", data, bytes); - size_t ret = ::recv(sv[1], data, bytes, MSG_WAITALL); - rsAssert(ret == bytes || mShutdown); - //ALOGE("read ret %i bytes %i", ret, bytes); - if (mShutdown) { - ret = 0; - } - return ret; -} - -bool FifoSocket::isEmpty() { - struct pollfd p; - p.fd = sv[1]; - p.events = POLLIN; - int r = poll(&p, 1, 0); - //ALOGE("poll r=%i", r); - return r == 0; -} - - -void FifoSocket::readReturn(const void *data, size_t bytes) { - //ALOGE("readReturn %p %Zu", data, bytes); - size_t ret = ::send(sv[1], data, bytes, 0); - //ALOGE("readReturn %Zu", ret); - //rsAssert(ret == bytes); -} - - diff --git a/libs/rs/rsFifoSocket.h b/libs/rs/rsFifoSocket.h deleted file mode 100644 index cac0a75..0000000 --- a/libs/rs/rsFifoSocket.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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_FIFO_SOCKET_H -#define ANDROID_RS_FIFO_SOCKET_H - - -#include "rsFifo.h" - -namespace android { -namespace renderscript { - - -class FifoSocket { -public: - FifoSocket(); - virtual ~FifoSocket(); - - bool init(bool supportNonBlocking = true, - bool supportReturnValues = true, - size_t maxDataSize = 0); - void shutdown(); - - bool writeAsync(const void *data, size_t bytes, bool waitForSpace = true); - void writeWaitReturn(void *ret, size_t retSize); - size_t read(void *data, size_t bytes); - void readReturn(const void *data, size_t bytes); - bool isEmpty(); - - int getWriteFd() {return sv[0];} - int getReadFd() {return sv[1];} - -protected: - int sv[2]; - bool mShutdown; -}; - -} -} - -#endif diff --git a/libs/rs/rsFileA3D.cpp b/libs/rs/rsFileA3D.cpp deleted file mode 100644 index 173b9a5..0000000 --- a/libs/rs/rsFileA3D.cpp +++ /dev/null @@ -1,453 +0,0 @@ - -/* - * Copyright (C) 2009 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" -#include "rsFileA3D.h" - -#include "rsMesh.h" -#include "rsAnimation.h" -#include "rs.h" - -using namespace android; -using namespace android::renderscript; - -FileA3D::FileA3D(Context *rsc) : ObjectBase(rsc) { - mAlloc = NULL; - mData = NULL; - mWriteStream = NULL; - mReadStream = NULL; - mAsset = NULL; - - mMajorVersion = 0; - mMinorVersion = 1; - mDataSize = 0; -} - -FileA3D::~FileA3D() { - for (size_t i = 0; i < mIndex.size(); i ++) { - delete mIndex[i]; - } - for (size_t i = 0; i < mWriteIndex.size(); i ++) { - delete mWriteIndex[i]; - } - if (mWriteStream) { - delete mWriteStream; - } - if (mReadStream) { - delete mWriteStream; - } - if (mAlloc) { - free(mAlloc); - } - if (mAsset) { - delete mAsset; - } -} - -void FileA3D::parseHeader(IStream *headerStream) { - mMajorVersion = headerStream->loadU32(); - mMinorVersion = headerStream->loadU32(); - uint32_t flags = headerStream->loadU32(); - mUse64BitOffsets = (flags & 1) != 0; - - uint32_t numIndexEntries = headerStream->loadU32(); - for (uint32_t i = 0; i < numIndexEntries; i ++) { - A3DIndexEntry *entry = new A3DIndexEntry(); - headerStream->loadString(&entry->mObjectName); - //ALOGV("Header data, entry name = %s", entry->mObjectName.string()); - entry->mType = (RsA3DClassID)headerStream->loadU32(); - if (mUse64BitOffsets){ - entry->mOffset = headerStream->loadOffset(); - entry->mLength = headerStream->loadOffset(); - } else { - entry->mOffset = headerStream->loadU32(); - entry->mLength = headerStream->loadU32(); - } - entry->mRsObj = NULL; - mIndex.push(entry); - } -} - -bool FileA3D::load(Asset *asset) { - mAsset = asset; - return load(asset->getBuffer(false), asset->getLength()); -} - -bool FileA3D::load(const void *data, size_t length) { - const uint8_t *localData = (const uint8_t *)data; - - size_t lengthRemaining = length; - size_t magicStrLen = 12; - if ((length < magicStrLen) || - memcmp(data, "Android3D_ff", magicStrLen)) { - return false; - } - - localData += magicStrLen; - lengthRemaining -= magicStrLen; - - // Next we get our header size - uint64_t headerSize = 0; - if (lengthRemaining < sizeof(headerSize)) { - return false; - } - - memcpy(&headerSize, localData, sizeof(headerSize)); - localData += sizeof(headerSize); - lengthRemaining -= sizeof(headerSize); - - if (lengthRemaining < headerSize) { - return false; - } - - // Now open the stream to parse the header - IStream headerStream(localData, false); - parseHeader(&headerStream); - - localData += headerSize; - lengthRemaining -= headerSize; - - if (lengthRemaining < sizeof(mDataSize)) { - return false; - } - - // Read the size of the data - memcpy(&mDataSize, localData, sizeof(mDataSize)); - localData += sizeof(mDataSize); - lengthRemaining -= sizeof(mDataSize); - - if (lengthRemaining < mDataSize) { - return false; - } - - // We should know enough to read the file in at this point. - mData = (uint8_t *)localData; - mReadStream = new IStream(mData, mUse64BitOffsets); - - return true; -} - -bool FileA3D::load(FILE *f) { - char magicString[12]; - size_t len; - - ALOGV("file open 1"); - len = fread(magicString, 1, 12, f); - if ((len != 12) || - memcmp(magicString, "Android3D_ff", 12)) { - return false; - } - - // Next thing is the size of the header - uint64_t headerSize = 0; - len = fread(&headerSize, 1, sizeof(headerSize), f); - if (len != sizeof(headerSize) || headerSize == 0) { - return false; - } - - uint8_t *headerData = (uint8_t *)malloc(headerSize); - if (!headerData) { - return false; - } - - len = fread(headerData, 1, headerSize, f); - if (len != headerSize) { - return false; - } - - // Now open the stream to parse the header - IStream headerStream(headerData, false); - parseHeader(&headerStream); - - free(headerData); - - // Next thing is the size of the header - len = fread(&mDataSize, 1, sizeof(mDataSize), f); - if (len != sizeof(mDataSize) || mDataSize == 0) { - return false; - } - - ALOGV("file open size = %lli", mDataSize); - - // We should know enough to read the file in at this point. - mAlloc = malloc(mDataSize); - if (!mAlloc) { - return false; - } - mData = (uint8_t *)mAlloc; - len = fread(mAlloc, 1, mDataSize, f); - if (len != mDataSize) { - return false; - } - - mReadStream = new IStream(mData, mUse64BitOffsets); - - ALOGV("Header is read an stream initialized"); - return true; -} - -size_t FileA3D::getNumIndexEntries() const { - return mIndex.size(); -} - -const FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const { - if (index < mIndex.size()) { - return mIndex[index]; - } - return NULL; -} - -ObjectBase *FileA3D::initializeFromEntry(size_t index) { - if (index >= mIndex.size()) { - return NULL; - } - - FileA3D::A3DIndexEntry *entry = mIndex[index]; - if (!entry) { - return NULL; - } - - if (entry->mRsObj) { - entry->mRsObj->incUserRef(); - return entry->mRsObj; - } - - // Seek to the beginning of object - mReadStream->reset(entry->mOffset); - switch (entry->mType) { - case RS_A3D_CLASS_ID_UNKNOWN: - return NULL; - case RS_A3D_CLASS_ID_MESH: - entry->mRsObj = Mesh::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_TYPE: - entry->mRsObj = Type::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_ELEMENT: - entry->mRsObj = Element::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_ALLOCATION: - entry->mRsObj = Allocation::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_PROGRAM_VERTEX: - //entry->mRsObj = ProgramVertex::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_PROGRAM_RASTER: - //entry->mRsObj = ProgramRaster::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_PROGRAM_FRAGMENT: - //entry->mRsObj = ProgramFragment::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_PROGRAM_STORE: - //entry->mRsObj = ProgramStore::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_SAMPLER: - //entry->mRsObj = Sampler::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_ANIMATION: - //entry->mRsObj = Animation::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_ADAPTER_1D: - //entry->mRsObj = Adapter1D::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_ADAPTER_2D: - //entry->mRsObj = Adapter2D::createFromStream(mRSC, mReadStream); - break; - case RS_A3D_CLASS_ID_SCRIPT_C: - break; - } - if (entry->mRsObj) { - entry->mRsObj->incUserRef(); - } - return entry->mRsObj; -} - -bool FileA3D::writeFile(const char *filename) { - if (!mWriteStream) { - ALOGE("No objects to write\n"); - return false; - } - if (mWriteStream->getPos() == 0) { - ALOGE("No objects to write\n"); - return false; - } - - FILE *writeHandle = fopen(filename, "wb"); - if (!writeHandle) { - ALOGE("Couldn't open the file for writing\n"); - return false; - } - - // Open a new stream to make writing the header easier - OStream headerStream(5*1024, false); - headerStream.addU32(mMajorVersion); - headerStream.addU32(mMinorVersion); - uint32_t is64Bit = 0; - headerStream.addU32(is64Bit); - - uint32_t writeIndexSize = mWriteIndex.size(); - headerStream.addU32(writeIndexSize); - for (uint32_t i = 0; i < writeIndexSize; i ++) { - headerStream.addString(&mWriteIndex[i]->mObjectName); - headerStream.addU32((uint32_t)mWriteIndex[i]->mType); - if (mUse64BitOffsets){ - headerStream.addOffset(mWriteIndex[i]->mOffset); - headerStream.addOffset(mWriteIndex[i]->mLength); - } else { - uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset; - headerStream.addU32(offset); - offset = (uint32_t)mWriteIndex[i]->mLength; - headerStream.addU32(offset); - } - } - - // Write our magic string so we know we are reading the right file - String8 magicString(A3D_MAGIC_KEY); - fwrite(magicString.string(), sizeof(char), magicString.size(), writeHandle); - - // Store the size of the header to make it easier to parse when we read it - uint64_t headerSize = headerStream.getPos(); - fwrite(&headerSize, sizeof(headerSize), 1, writeHandle); - - // Now write our header - fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle); - - // Now write the size of the data part of the file for easier parsing later - uint64_t fileDataSize = mWriteStream->getPos(); - fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle); - - fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle); - - int status = fclose(writeHandle); - - if (status != 0) { - ALOGE("Couldn't close file\n"); - return false; - } - - return true; -} - -void FileA3D::appendToFile(ObjectBase *obj) { - if (!obj) { - return; - } - if (!mWriteStream) { - const uint64_t initialStreamSize = 256*1024; - mWriteStream = new OStream(initialStreamSize, false); - } - A3DIndexEntry *indexEntry = new A3DIndexEntry(); - indexEntry->mObjectName.setTo(obj->getName()); - indexEntry->mType = obj->getClassId(); - indexEntry->mOffset = mWriteStream->getPos(); - indexEntry->mRsObj = obj; - mWriteIndex.push(indexEntry); - obj->serialize(mWriteStream); - indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset; - mWriteStream->align(4); -} - -RsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) { - FileA3D *fa3d = static_cast<FileA3D *>(file); - if (!fa3d) { - ALOGE("Can't load entry. No valid file"); - return NULL; - } - - ObjectBase *obj = fa3d->initializeFromEntry(index); - //ALOGV("Returning object with name %s", obj->getName()); - - return obj; -} - - -void rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file) { - FileA3D *fa3d = static_cast<FileA3D *>(file); - - if (fa3d) { - *numEntries = fa3d->getNumIndexEntries(); - } else { - *numEntries = 0; - } -} - -void rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file) { - FileA3D *fa3d = static_cast<FileA3D *>(file); - - if (!fa3d) { - ALOGE("Can't load index entries. No valid file"); - return; - } - - uint32_t numFileEntries = fa3d->getNumIndexEntries(); - if (numFileEntries != numEntries || numEntries == 0 || fileEntries == NULL) { - ALOGE("Can't load index entries. Invalid number requested"); - return; - } - - for (uint32_t i = 0; i < numFileEntries; i ++) { - const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i); - fileEntries[i].classID = entry->getType(); - fileEntries[i].objectName = entry->getObjectName().string(); - } -} - -RsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) { - if (data == NULL) { - ALOGE("File load failed. Asset stream is NULL"); - return NULL; - } - - Context *rsc = static_cast<Context *>(con); - FileA3D *fa3d = new FileA3D(rsc); - fa3d->incUserRef(); - - fa3d->load(data, len); - return fa3d; -} - -RsFile rsaFileA3DCreateFromAsset(RsContext con, void *_asset) { - Context *rsc = static_cast<Context *>(con); - Asset *asset = static_cast<Asset *>(_asset); - FileA3D *fa3d = new FileA3D(rsc); - fa3d->incUserRef(); - - fa3d->load(asset); - return fa3d; -} - -RsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) { - if (path == NULL) { - ALOGE("File load failed. Path is NULL"); - return NULL; - } - - Context *rsc = static_cast<Context *>(con); - FileA3D *fa3d = NULL; - - FILE *f = fopen(path, "rb"); - if (f) { - fa3d = new FileA3D(rsc); - fa3d->incUserRef(); - fa3d->load(f); - fclose(f); - } else { - ALOGE("Could not open file %s", path); - } - - return fa3d; -} diff --git a/libs/rs/rsFileA3D.h b/libs/rs/rsFileA3D.h deleted file mode 100644 index 08062c6..0000000 --- a/libs/rs/rsFileA3D.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2009 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_FILE_A3D_H -#define ANDROID_RS_FILE_A3D_H - -#include "rsMesh.h" - -#include <androidfw/Asset.h> -#include <utils/String8.h> -#include "rsStream.h" -#include <stdio.h> - -#define A3D_MAGIC_KEY "Android3D_ff" - -// --------------------------------------------------------------------------- -namespace android { - -namespace renderscript { - -class FileA3D : public ObjectBase { -public: - FileA3D(Context *rsc); - ~FileA3D(); - - uint32_t mMajorVersion; - uint32_t mMinorVersion; - uint64_t mIndexOffset; - uint64_t mStringTableOffset; - bool mUse64BitOffsets; - - class A3DIndexEntry { - String8 mObjectName; - RsA3DClassID mType; - uint64_t mOffset; - uint64_t mLength; - ObjectBase *mRsObj; - public: - friend class FileA3D; - const String8 &getObjectName() const { - return mObjectName; - } - RsA3DClassID getType() const { - return mType; - } - }; - - bool load(FILE *f); - bool load(Asset *asset); - bool load(const void *data, size_t length); - - size_t getNumIndexEntries() const; - const A3DIndexEntry* getIndexEntry(size_t index) const; - ObjectBase *initializeFromEntry(size_t index); - - void appendToFile(ObjectBase *obj); - bool writeFile(const char *filename); - - // Currently files do not get serialized, - // but we need to inherit from ObjectBase for ref tracking - virtual void serialize(OStream *stream) const { - } - virtual RsA3DClassID getClassId() const { - return RS_A3D_CLASS_ID_UNKNOWN; - } - -protected: - - void parseHeader(IStream *headerStream); - - const uint8_t * mData; - void * mAlloc; - uint64_t mDataSize; - Asset *mAsset; - - OStream *mWriteStream; - Vector<A3DIndexEntry*> mWriteIndex; - - IStream *mReadStream; - Vector<A3DIndexEntry*> mIndex; -}; - - -} -} -#endif //ANDROID_RS_FILE_A3D_H - - diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp deleted file mode 100644 index 1f53c79..0000000 --- a/libs/rs/rsFont.cpp +++ /dev/null @@ -1,873 +0,0 @@ - -/* - * Copyright (C) 2009 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" -#include "rs.h" -#include "rsFont.h" -#include "rsProgramFragment.h" -#include "rsMesh.h" -#include <cutils/properties.h> - -#ifndef ANDROID_RS_SERIALIZE -#include <ft2build.h> -#include FT_FREETYPE_H -#include FT_BITMAP_H -#endif //ANDROID_RS_SERIALIZE - -using namespace android; -using namespace android::renderscript; - -Font::Font(Context *rsc) : ObjectBase(rsc), mCachedGlyphs(NULL) { - mInitialized = false; - mHasKerning = false; - mFace = NULL; -} - -bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data, uint32_t dataLen) { -#ifndef ANDROID_RS_SERIALIZE - if (mInitialized) { - ALOGE("Reinitialization of fonts not supported"); - return false; - } - - FT_Error error = 0; - if (data != NULL && dataLen > 0) { - error = FT_New_Memory_Face(mRSC->mStateFont.getLib(), (const FT_Byte*)data, dataLen, 0, &mFace); - } else { - error = FT_New_Face(mRSC->mStateFont.getLib(), name, 0, &mFace); - } - - if (error) { - ALOGE("Unable to initialize font %s", name); - return false; - } - - mFontName = name; - mFontSize = fontSize; - mDpi = dpi; - - error = FT_Set_Char_Size(mFace, (FT_F26Dot6)(fontSize * 64.0f), 0, dpi, 0); - if (error) { - ALOGE("Unable to set font size on %s", name); - return false; - } - - mHasKerning = FT_HAS_KERNING(mFace); - - mInitialized = true; -#endif //ANDROID_RS_SERIALIZE - return true; -} - -void Font::preDestroy() const { - for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) { - if (mRSC->mStateFont.mActiveFonts[ct] == this) { - mRSC->mStateFont.mActiveFonts.removeAt(ct); - break; - } - } -} - -void Font::invalidateTextureCache() { - for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) { - mCachedGlyphs.valueAt(i)->mIsValid = false; - } -} - -void Font::drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y) { - FontState *state = &mRSC->mStateFont; - - int32_t nPenX = x + glyph->mBitmapLeft; - int32_t nPenY = y - glyph->mBitmapTop + glyph->mBitmapHeight; - - float u1 = glyph->mBitmapMinU; - float u2 = glyph->mBitmapMaxU; - float v1 = glyph->mBitmapMinV; - float v2 = glyph->mBitmapMaxV; - - int32_t width = (int32_t) glyph->mBitmapWidth; - int32_t height = (int32_t) glyph->mBitmapHeight; - - state->appendMeshQuad(nPenX, nPenY, 0, u1, v2, - nPenX + width, nPenY, 0, u2, v2, - nPenX + width, nPenY - height, 0, u2, v1, - nPenX, nPenY - height, 0, u1, v1); -} - -void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int32_t x, int32_t y, - uint8_t* bitmap, uint32_t bitmapW, uint32_t bitmapH) { - int32_t nPenX = x + glyph->mBitmapLeft; - int32_t nPenY = y + glyph->mBitmapTop; - - uint32_t endX = glyph->mBitmapMinX + glyph->mBitmapWidth; - uint32_t endY = glyph->mBitmapMinY + glyph->mBitmapHeight; - - FontState *state = &mRSC->mStateFont; - uint32_t cacheWidth = state->getCacheTextureType()->getDimX(); - const uint8_t* cacheBuffer = state->getTextTextureData(); - - uint32_t cacheX = 0, cacheY = 0; - int32_t bX = 0, bY = 0; - for (cacheX = glyph->mBitmapMinX, bX = nPenX; cacheX < endX; cacheX++, bX++) { - for (cacheY = glyph->mBitmapMinY, bY = nPenY; cacheY < endY; cacheY++, bY++) { - if (bX < 0 || bY < 0 || bX >= (int32_t) bitmapW || bY >= (int32_t) bitmapH) { - ALOGE("Skipping invalid index"); - continue; - } - uint8_t tempCol = cacheBuffer[cacheY * cacheWidth + cacheX]; - bitmap[bY * bitmapW + bX] = tempCol; - } - } -} - -void Font::measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds) { - int32_t nPenX = x + glyph->mBitmapLeft; - int32_t nPenY = y - glyph->mBitmapTop + glyph->mBitmapHeight; - - int32_t width = (int32_t) glyph->mBitmapWidth; - int32_t height = (int32_t) glyph->mBitmapHeight; - - // 0, 0 is top left, so bottom is a positive number - if (bounds->bottom < nPenY) { - bounds->bottom = nPenY; - } - if (bounds->left > nPenX) { - bounds->left = nPenX; - } - if (bounds->right < nPenX + width) { - bounds->right = nPenX + width; - } - if (bounds->top > nPenY - height) { - bounds->top = nPenY - height; - } -} - -void Font::renderUTF(const char *text, uint32_t len, int32_t x, int32_t y, - uint32_t start, int32_t numGlyphs, - RenderMode mode, Rect *bounds, - uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH) { - if (!mInitialized || numGlyphs == 0 || text == NULL || len == 0) { - return; - } - - if (mode == Font::MEASURE) { - if (bounds == NULL) { - ALOGE("No return rectangle provided to measure text"); - return; - } - // Reset min and max of the bounding box to something large - bounds->set(1e6, -1e6, 1e6, -1e6); - } - - int32_t penX = x, penY = y; - int32_t glyphsLeft = 1; - if (numGlyphs > 0) { - glyphsLeft = numGlyphs; - } - - size_t index = start; - size_t nextIndex = 0; - - while (glyphsLeft > 0) { - - int32_t utfChar = utf32_from_utf8_at(text, len, index, &nextIndex); - - // Reached the end of the string or encountered - if (utfChar < 0) { - break; - } - - // Move to the next character in the array - index = nextIndex; - - CachedGlyphInfo *cachedGlyph = getCachedUTFChar(utfChar); - - // If it's still not valid, we couldn't cache it, so we shouldn't draw garbage - if (cachedGlyph->mIsValid) { - switch (mode) { - case FRAMEBUFFER: - drawCachedGlyph(cachedGlyph, penX, penY); - break; - case BITMAP: - drawCachedGlyph(cachedGlyph, penX, penY, bitmap, bitmapW, bitmapH); - break; - case MEASURE: - measureCachedGlyph(cachedGlyph, penX, penY, bounds); - break; - } - } - - penX += (cachedGlyph->mAdvanceX >> 6); - - // If we were given a specific number of glyphs, decrement - if (numGlyphs > 0) { - glyphsLeft --; - } - } -} - -Font::CachedGlyphInfo* Font::getCachedUTFChar(int32_t utfChar) { - - CachedGlyphInfo *cachedGlyph = mCachedGlyphs.valueFor((uint32_t)utfChar); - if (cachedGlyph == NULL) { - cachedGlyph = cacheGlyph((uint32_t)utfChar); - } - // Is the glyph still in texture cache? - if (!cachedGlyph->mIsValid) { - updateGlyphCache(cachedGlyph); - } - - return cachedGlyph; -} - -void Font::updateGlyphCache(CachedGlyphInfo *glyph) { -#ifndef ANDROID_RS_SERIALIZE - FT_Error error = FT_Load_Glyph( mFace, glyph->mGlyphIndex, FT_LOAD_RENDER ); - if (error) { - ALOGE("Couldn't load glyph."); - return; - } - - glyph->mAdvanceX = mFace->glyph->advance.x; - glyph->mAdvanceY = mFace->glyph->advance.y; - glyph->mBitmapLeft = mFace->glyph->bitmap_left; - glyph->mBitmapTop = mFace->glyph->bitmap_top; - - FT_Bitmap *bitmap = &mFace->glyph->bitmap; - - // Now copy the bitmap into the cache texture - uint32_t startX = 0; - uint32_t startY = 0; - - // Let the font state figure out where to put the bitmap - FontState *state = &mRSC->mStateFont; - glyph->mIsValid = state->cacheBitmap(bitmap, &startX, &startY); - - if (!glyph->mIsValid) { - return; - } - - uint32_t endX = startX + bitmap->width; - uint32_t endY = startY + bitmap->rows; - - glyph->mBitmapMinX = startX; - glyph->mBitmapMinY = startY; - glyph->mBitmapWidth = bitmap->width; - glyph->mBitmapHeight = bitmap->rows; - - uint32_t cacheWidth = state->getCacheTextureType()->getDimX(); - uint32_t cacheHeight = state->getCacheTextureType()->getDimY(); - - glyph->mBitmapMinU = (float)startX / (float)cacheWidth; - glyph->mBitmapMinV = (float)startY / (float)cacheHeight; - glyph->mBitmapMaxU = (float)endX / (float)cacheWidth; - glyph->mBitmapMaxV = (float)endY / (float)cacheHeight; -#endif //ANDROID_RS_SERIALIZE -} - -Font::CachedGlyphInfo *Font::cacheGlyph(uint32_t glyph) { - CachedGlyphInfo *newGlyph = new CachedGlyphInfo(); - mCachedGlyphs.add(glyph, newGlyph); -#ifndef ANDROID_RS_SERIALIZE - newGlyph->mGlyphIndex = FT_Get_Char_Index(mFace, glyph); - newGlyph->mIsValid = false; -#endif //ANDROID_RS_SERIALIZE - updateGlyphCache(newGlyph); - - return newGlyph; -} - -Font * Font::create(Context *rsc, const char *name, float fontSize, uint32_t dpi, - const void *data, uint32_t dataLen) { - rsc->mStateFont.checkInit(); - Vector<Font*> &activeFonts = rsc->mStateFont.mActiveFonts; - - for (uint32_t i = 0; i < activeFonts.size(); i ++) { - Font *ithFont = activeFonts[i]; - if (ithFont->mFontName == name && ithFont->mFontSize == fontSize && ithFont->mDpi == dpi) { - return ithFont; - } - } - - Font *newFont = new Font(rsc); - bool isInitialized = newFont->init(name, fontSize, dpi, data, dataLen); - if (isInitialized) { - activeFonts.push(newFont); - rsc->mStateFont.precacheLatin(newFont); - return newFont; - } - - ObjectBase::checkDelete(newFont); - return NULL; -} - -Font::~Font() { -#ifndef ANDROID_RS_SERIALIZE - if (mFace) { - FT_Done_Face(mFace); - } -#endif - - for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) { - CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i); - delete glyph; - } -} - -FontState::FontState() { - mInitialized = false; - mMaxNumberOfQuads = 1024; - mCurrentQuadIndex = 0; - mRSC = NULL; -#ifndef ANDROID_RS_SERIALIZE - mLibrary = NULL; -#endif //ANDROID_RS_SERIALIZE - - // Get the renderer properties - char property[PROPERTY_VALUE_MAX]; - - // Get the gamma - float gamma = DEFAULT_TEXT_GAMMA; - if (property_get(PROPERTY_TEXT_GAMMA, property, NULL) > 0) { - gamma = atof(property); - } - - // Get the black gamma threshold - int32_t blackThreshold = DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD; - if (property_get(PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD, property, NULL) > 0) { - blackThreshold = atoi(property); - } - mBlackThreshold = (float)(blackThreshold) / 255.0f; - - // Get the white gamma threshold - int32_t whiteThreshold = DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD; - if (property_get(PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD, property, NULL) > 0) { - whiteThreshold = atoi(property); - } - mWhiteThreshold = (float)(whiteThreshold) / 255.0f; - - // Compute the gamma tables - mBlackGamma = gamma; - mWhiteGamma = 1.0f / gamma; - - setFontColor(0.1f, 0.1f, 0.1f, 1.0f); -} - -FontState::~FontState() { - for (uint32_t i = 0; i < mCacheLines.size(); i ++) { - delete mCacheLines[i]; - } - - rsAssert(!mActiveFonts.size()); -} -#ifndef ANDROID_RS_SERIALIZE -FT_Library FontState::getLib() { - if (!mLibrary) { - FT_Error error = FT_Init_FreeType(&mLibrary); - if (error) { - ALOGE("Unable to initialize freetype"); - return NULL; - } - } - - return mLibrary; -} -#endif //ANDROID_RS_SERIALIZE - - -void FontState::init(Context *rsc) { - mRSC = rsc; -} - -void FontState::flushAllAndInvalidate() { - if (mCurrentQuadIndex != 0) { - issueDrawCommand(); - mCurrentQuadIndex = 0; - } - for (uint32_t i = 0; i < mActiveFonts.size(); i ++) { - mActiveFonts[i]->invalidateTextureCache(); - } - for (uint32_t i = 0; i < mCacheLines.size(); i ++) { - mCacheLines[i]->mCurrentCol = 0; - } -} - -#ifndef ANDROID_RS_SERIALIZE -bool FontState::cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) { - // If the glyph is too tall, don't cache it - if ((uint32_t)bitmap->rows > mCacheLines[mCacheLines.size()-1]->mMaxHeight) { - ALOGE("Font size to large to fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows); - return false; - } - - // Now copy the bitmap into the cache texture - uint32_t startX = 0; - uint32_t startY = 0; - - bool bitmapFit = false; - for (uint32_t i = 0; i < mCacheLines.size(); i ++) { - bitmapFit = mCacheLines[i]->fitBitmap(bitmap, &startX, &startY); - if (bitmapFit) { - break; - } - } - - // If the new glyph didn't fit, flush the state so far and invalidate everything - if (!bitmapFit) { - flushAllAndInvalidate(); - - // Try to fit it again - for (uint32_t i = 0; i < mCacheLines.size(); i ++) { - bitmapFit = mCacheLines[i]->fitBitmap(bitmap, &startX, &startY); - if (bitmapFit) { - break; - } - } - - // if we still don't fit, something is wrong and we shouldn't draw - if (!bitmapFit) { - ALOGE("Bitmap doesn't fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows); - return false; - } - } - - *retOriginX = startX; - *retOriginY = startY; - - uint32_t endX = startX + bitmap->width; - uint32_t endY = startY + bitmap->rows; - - uint32_t cacheWidth = getCacheTextureType()->getDimX(); - - uint8_t *cacheBuffer = (uint8_t*)mTextTexture->getPtr(); - uint8_t *bitmapBuffer = bitmap->buffer; - - uint32_t cacheX = 0, bX = 0, cacheY = 0, bY = 0; - for (cacheX = startX, bX = 0; cacheX < endX; cacheX ++, bX ++) { - for (cacheY = startY, bY = 0; cacheY < endY; cacheY ++, bY ++) { - uint8_t tempCol = bitmapBuffer[bY * bitmap->width + bX]; - cacheBuffer[cacheY*cacheWidth + cacheX] = tempCol; - } - } - - // This will dirty the texture and the shader so next time - // we draw it will upload the data - - mTextTexture->sendDirty(mRSC); - mFontShaderF->bindTexture(mRSC, 0, mTextTexture.get()); - - // Some debug code - /*for (uint32_t i = 0; i < mCacheLines.size(); i ++) { - ALOGE("Cache Line: H: %u Empty Space: %f", - mCacheLines[i]->mMaxHeight, - (1.0f - (float)mCacheLines[i]->mCurrentCol/(float)mCacheLines[i]->mMaxWidth)*100.0f); - - }*/ - - return true; -} -#endif //ANDROID_RS_SERIALIZE - -void FontState::initRenderState() { - String8 shaderString("varying vec2 varTex0;\n"); - shaderString.append("void main() {\n"); - shaderString.append(" lowp vec4 col = UNI_Color;\n"); - shaderString.append(" col.a = texture2D(UNI_Tex0, varTex0.xy).a;\n"); - shaderString.append(" col.a = pow(col.a, UNI_Gamma);\n"); - shaderString.append(" gl_FragColor = col;\n"); - shaderString.append("}\n"); - - const char *textureNames[] = { "Tex0" }; - const size_t textureNamesLengths[] = { 4 }; - size_t numTextures = sizeof(textureNamesLengths)/sizeof(*textureNamesLengths); - - ObjectBaseRef<const Element> colorElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, - RS_KIND_USER, false, 4); - ObjectBaseRef<const Element> gammaElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, - RS_KIND_USER, false, 1); - Element::Builder builder; - builder.add(colorElem.get(), "Color", 1); - builder.add(gammaElem.get(), "Gamma", 1); - ObjectBaseRef<const Element> constInput = builder.create(mRSC); - - ObjectBaseRef<Type> inputType = Type::getTypeRef(mRSC, constInput.get(), 1, 0, 0, false, false); - - uint32_t tmp[4]; - tmp[0] = RS_PROGRAM_PARAM_CONSTANT; - tmp[1] = (uint32_t)inputType.get(); - tmp[2] = RS_PROGRAM_PARAM_TEXTURE_TYPE; - tmp[3] = RS_TEXTURE_2D; - - mFontShaderFConstant.set(Allocation::createAllocation(mRSC, inputType.get(), - RS_ALLOCATION_USAGE_SCRIPT | - RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS)); - ProgramFragment *pf = new ProgramFragment(mRSC, shaderString.string(), shaderString.length(), - textureNames, numTextures, textureNamesLengths, - tmp, 4); - mFontShaderF.set(pf); - mFontShaderF->bindAllocation(mRSC, mFontShaderFConstant.get(), 0); - - mFontSampler.set(Sampler::getSampler(mRSC, RS_SAMPLER_NEAREST, RS_SAMPLER_NEAREST, - RS_SAMPLER_CLAMP, RS_SAMPLER_CLAMP, - RS_SAMPLER_CLAMP).get()); - mFontShaderF->bindSampler(mRSC, 0, mFontSampler.get()); - - mFontProgramStore.set(ProgramStore::getProgramStore(mRSC, true, true, true, true, - false, false, - RS_BLEND_SRC_SRC_ALPHA, - RS_BLEND_DST_ONE_MINUS_SRC_ALPHA, - RS_DEPTH_FUNC_ALWAYS).get()); - mFontProgramStore->init(); -} - -void FontState::initTextTexture() { - ObjectBaseRef<const Element> alphaElem = Element::createRef(mRSC, RS_TYPE_UNSIGNED_8, - RS_KIND_PIXEL_A, true, 1); - - // We will allocate a texture to initially hold 32 character bitmaps - ObjectBaseRef<Type> texType = Type::getTypeRef(mRSC, alphaElem.get(), - 1024, 256, 0, false, false); - - Allocation *cacheAlloc = Allocation::createAllocation(mRSC, texType.get(), - RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE); - mTextTexture.set(cacheAlloc); - mTextTexture->syncAll(mRSC, RS_ALLOCATION_USAGE_SCRIPT); - - // Split up our cache texture into lines of certain widths - int32_t nextLine = 0; - mCacheLines.push(new CacheTextureLine(16, texType->getDimX(), nextLine, 0)); - nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(24, texType->getDimX(), nextLine, 0)); - nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(24, texType->getDimX(), nextLine, 0)); - nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(32, texType->getDimX(), nextLine, 0)); - nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(32, texType->getDimX(), nextLine, 0)); - nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(40, texType->getDimX(), nextLine, 0)); - nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(texType->getDimY() - nextLine, texType->getDimX(), nextLine, 0)); -} - -// Avoid having to reallocate memory and render quad by quad -void FontState::initVertexArrayBuffers() { - // Now lets write index data - ObjectBaseRef<const Element> indexElem = Element::createRef(mRSC, RS_TYPE_UNSIGNED_16, RS_KIND_USER, false, 1); - uint32_t numIndicies = mMaxNumberOfQuads * 6; - ObjectBaseRef<Type> indexType = Type::getTypeRef(mRSC, indexElem.get(), numIndicies, 0, 0, false, false); - - Allocation *indexAlloc = Allocation::createAllocation(mRSC, indexType.get(), - RS_ALLOCATION_USAGE_SCRIPT | - RS_ALLOCATION_USAGE_GRAPHICS_VERTEX); - uint16_t *indexPtr = (uint16_t*)indexAlloc->getPtr(); - - // Four verts, two triangles , six indices per quad - for (uint32_t i = 0; i < mMaxNumberOfQuads; i ++) { - int32_t i6 = i * 6; - int32_t i4 = i * 4; - - indexPtr[i6 + 0] = i4 + 0; - indexPtr[i6 + 1] = i4 + 1; - indexPtr[i6 + 2] = i4 + 2; - - indexPtr[i6 + 3] = i4 + 0; - indexPtr[i6 + 4] = i4 + 2; - indexPtr[i6 + 5] = i4 + 3; - } - - indexAlloc->sendDirty(mRSC); - - ObjectBaseRef<const Element> posElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3); - ObjectBaseRef<const Element> texElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 2); - - Element::Builder builder; - builder.add(posElem.get(), "position", 1); - builder.add(texElem.get(), "texture0", 1); - ObjectBaseRef<const Element> vertexDataElem = builder.create(mRSC); - - ObjectBaseRef<Type> vertexDataType = Type::getTypeRef(mRSC, vertexDataElem.get(), - mMaxNumberOfQuads * 4, - 0, 0, false, false); - - Allocation *vertexAlloc = Allocation::createAllocation(mRSC, vertexDataType.get(), - RS_ALLOCATION_USAGE_SCRIPT); - mTextMeshPtr = (float*)vertexAlloc->getPtr(); - - mMesh.set(new Mesh(mRSC, 1, 1)); - mMesh->setVertexBuffer(vertexAlloc, 0); - mMesh->setPrimitive(indexAlloc, RS_PRIMITIVE_TRIANGLE, 0); - mMesh->init(); -} - -// We don't want to allocate anything unless we actually draw text -void FontState::checkInit() { - if (mInitialized) { - return; - } - - initTextTexture(); - initRenderState(); - - initVertexArrayBuffers(); - - // We store a string with letters in a rough frequency of occurrence - mLatinPrecache = String8(" eisarntolcdugpmhbyfvkwzxjq"); - mLatinPrecache += String8("EISARNTOLCDUGPMHBYFVKWZXJQ"); - mLatinPrecache += String8(",.?!()-+@;:`'"); - mLatinPrecache += String8("0123456789"); - - mInitialized = true; -} - -void FontState::issueDrawCommand() { - Context::PushState ps(mRSC); - - mRSC->setProgramVertex(mRSC->getDefaultProgramVertex()); - mRSC->setProgramRaster(mRSC->getDefaultProgramRaster()); - mRSC->setProgramFragment(mFontShaderF.get()); - mRSC->setProgramStore(mFontProgramStore.get()); - - if (mConstantsDirty) { - mFontShaderFConstant->data(mRSC, 0, 0, 1, &mConstants, sizeof(mConstants)); - mConstantsDirty = false; - } - - if (!mRSC->setupCheck()) { - return; - } - - mMesh->renderPrimitiveRange(mRSC, 0, 0, mCurrentQuadIndex * 6); -} - -void FontState::appendMeshQuad(float x1, float y1, float z1, - float u1, float v1, - float x2, float y2, float z2, - float u2, float v2, - float x3, float y3, float z3, - float u3, float v3, - float x4, float y4, float z4, - float u4, float v4) { - const uint32_t vertsPerQuad = 4; - const uint32_t floatsPerVert = 6; - float *currentPos = mTextMeshPtr + mCurrentQuadIndex * vertsPerQuad * floatsPerVert; - - if (x1 > mSurfaceWidth || y1 < 0.0f || x2 < 0 || y4 > mSurfaceHeight) { - return; - } - - /*LOGE("V0 x: %f y: %f z: %f", x1, y1, z1); - ALOGE("V1 x: %f y: %f z: %f", x2, y2, z2); - ALOGE("V2 x: %f y: %f z: %f", x3, y3, z3); - ALOGE("V3 x: %f y: %f z: %f", x4, y4, z4);*/ - - (*currentPos++) = x1; - (*currentPos++) = y1; - (*currentPos++) = z1; - (*currentPos++) = 0; - (*currentPos++) = u1; - (*currentPos++) = v1; - - (*currentPos++) = x2; - (*currentPos++) = y2; - (*currentPos++) = z2; - (*currentPos++) = 0; - (*currentPos++) = u2; - (*currentPos++) = v2; - - (*currentPos++) = x3; - (*currentPos++) = y3; - (*currentPos++) = z3; - (*currentPos++) = 0; - (*currentPos++) = u3; - (*currentPos++) = v3; - - (*currentPos++) = x4; - (*currentPos++) = y4; - (*currentPos++) = z4; - (*currentPos++) = 0; - (*currentPos++) = u4; - (*currentPos++) = v4; - - mCurrentQuadIndex ++; - - if (mCurrentQuadIndex == mMaxNumberOfQuads) { - issueDrawCommand(); - mCurrentQuadIndex = 0; - } -} - -uint32_t FontState::getRemainingCacheCapacity() { - uint32_t remainingCapacity = 0; - uint32_t totalPixels = 0; - for (uint32_t i = 0; i < mCacheLines.size(); i ++) { - remainingCapacity += (mCacheLines[i]->mMaxWidth - mCacheLines[i]->mCurrentCol); - totalPixels += mCacheLines[i]->mMaxWidth; - } - remainingCapacity = (remainingCapacity * 100) / totalPixels; - return remainingCapacity; -} - -void FontState::precacheLatin(Font *font) { - // Remaining capacity is measured in % - uint32_t remainingCapacity = getRemainingCacheCapacity(); - uint32_t precacheIdx = 0; - while (remainingCapacity > 25 && precacheIdx < mLatinPrecache.size()) { - font->getCachedUTFChar((int32_t)mLatinPrecache[precacheIdx]); - remainingCapacity = getRemainingCacheCapacity(); - precacheIdx ++; - } -} - - -void FontState::renderText(const char *text, uint32_t len, int32_t x, int32_t y, - uint32_t startIndex, int32_t numGlyphs, - Font::RenderMode mode, - Font::Rect *bounds, - uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH) { - checkInit(); - - // Render code here - Font *currentFont = mRSC->getFont(); - if (!currentFont) { - if (!mDefault.get()) { - String8 fontsDir("/fonts/Roboto-Regular.ttf"); - String8 fullPath(getenv("ANDROID_ROOT")); - fullPath += fontsDir; - - mDefault.set(Font::create(mRSC, fullPath.string(), 8, mRSC->getDPI())); - } - currentFont = mDefault.get(); - } - if (!currentFont) { - ALOGE("Unable to initialize any fonts"); - return; - } - - // Cull things that are off the screen - mSurfaceWidth = (float)mRSC->getCurrentSurfaceWidth(); - mSurfaceHeight = (float)mRSC->getCurrentSurfaceHeight(); - - currentFont->renderUTF(text, len, x, y, startIndex, numGlyphs, - mode, bounds, bitmap, bitmapW, bitmapH); - - if (mCurrentQuadIndex != 0) { - issueDrawCommand(); - mCurrentQuadIndex = 0; - } -} - -void FontState::measureText(const char *text, uint32_t len, Font::Rect *bounds) { - renderText(text, len, 0, 0, 0, -1, Font::MEASURE, bounds); - bounds->bottom = - bounds->bottom; - bounds->top = - bounds->top; -} - -void FontState::setFontColor(float r, float g, float b, float a) { - mConstants.mFontColor[0] = r; - mConstants.mFontColor[1] = g; - mConstants.mFontColor[2] = b; - mConstants.mFontColor[3] = a; - - mConstants.mGamma = 1.0f; - const float luminance = (r * 2.0f + g * 5.0f + b) / 8.0f; - if (luminance <= mBlackThreshold) { - mConstants.mGamma = mBlackGamma; - } else if (luminance >= mWhiteThreshold) { - mConstants.mGamma = mWhiteGamma; - } - - mConstantsDirty = true; -} - -void FontState::getFontColor(float *r, float *g, float *b, float *a) const { - *r = mConstants.mFontColor[0]; - *g = mConstants.mFontColor[1]; - *b = mConstants.mFontColor[2]; - *a = mConstants.mFontColor[3]; -} - -void FontState::deinit(Context *rsc) { - mInitialized = false; - - mFontShaderFConstant.clear(); - - mMesh.clear(); - - mFontShaderF.clear(); - mFontSampler.clear(); - mFontProgramStore.clear(); - - mTextTexture.clear(); - for (uint32_t i = 0; i < mCacheLines.size(); i ++) { - delete mCacheLines[i]; - } - mCacheLines.clear(); - - mDefault.clear(); -#ifndef ANDROID_RS_SERIALIZE - if (mLibrary) { - FT_Done_FreeType( mLibrary ); - mLibrary = NULL; - } -#endif //ANDROID_RS_SERIALIZE -} - -#ifndef ANDROID_RS_SERIALIZE -bool FontState::CacheTextureLine::fitBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) { - if ((uint32_t)bitmap->rows > mMaxHeight) { - return false; - } - - if (mCurrentCol + (uint32_t)bitmap->width < mMaxWidth) { - *retOriginX = mCurrentCol; - *retOriginY = mCurrentRow; - mCurrentCol += bitmap->width; - mDirty = true; - return true; - } - - return false; -} -#endif //ANDROID_RS_SERIALIZE - -namespace android { -namespace renderscript { - -RsFont rsi_FontCreateFromFile(Context *rsc, - char const *name, size_t name_length, - float fontSize, uint32_t dpi) { - Font *newFont = Font::create(rsc, name, fontSize, dpi); - if (newFont) { - newFont->incUserRef(); - } - return newFont; -} - -RsFont rsi_FontCreateFromMemory(Context *rsc, - char const *name, size_t name_length, - float fontSize, uint32_t dpi, - const void *data, size_t data_length) { - Font *newFont = Font::create(rsc, name, fontSize, dpi, data, data_length); - if (newFont) { - newFont->incUserRef(); - } - return newFont; -} - -} // renderscript -} // android diff --git a/libs/rs/rsFont.h b/libs/rs/rsFont.h deleted file mode 100644 index 2bd30b7..0000000 --- a/libs/rs/rsFont.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (C) 2009 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_FONT_H -#define ANDROID_RS_FONT_H - -#include "rsStream.h" -#include <utils/String8.h> -#include <utils/Vector.h> -#include <utils/KeyedVector.h> - -struct FT_LibraryRec_; -struct FT_FaceRec_; -struct FT_Bitmap_; - -// --------------------------------------------------------------------------- -namespace android { - -namespace renderscript { - -// Gamma (>= 1.0, <= 10.0) -#define PROPERTY_TEXT_GAMMA "ro.text_gamma" -#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold" -#define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold" - -#define DEFAULT_TEXT_GAMMA 1.4f -#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64 -#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192 - -class FontState; - -class Font : public ObjectBase { -public: - enum RenderMode { - FRAMEBUFFER, - BITMAP, - MEASURE, - }; - - struct Rect { - int32_t left; - int32_t top; - int32_t right; - int32_t bottom; - void set(int32_t l, int32_t r, int32_t t, int32_t b) { - left = l; - right = r; - top = t; - bottom = b; - } - }; - - ~Font(); - - // Currently files do not get serialized, - // but we need to inherit from ObjectBase for ref tracking - virtual void serialize(OStream *stream) const { - } - virtual RsA3DClassID getClassId() const { - return RS_A3D_CLASS_ID_UNKNOWN; - } - - static Font * create(Context *rsc, const char *name, float fontSize, uint32_t dpi, - const void *data = NULL, uint32_t dataLen = 0); - -protected: - - friend class FontState; - - // Pointer to the utf data, length of data, where to start, number of glyphs ot read - // (each glyph may be longer than a char because we are dealing with utf data) - // Last two variables are the initial pen position - void renderUTF(const char *text, uint32_t len, int32_t x, int32_t y, - uint32_t start, int32_t numGlyphs, - RenderMode mode = FRAMEBUFFER, Rect *bounds = NULL, - uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0); - - void invalidateTextureCache(); - struct CachedGlyphInfo - { - // Has the cache been invalidated? - bool mIsValid; - // Location of the cached glyph in the bitmap - // in case we need to resize the texture - uint32_t mBitmapMinX; - uint32_t mBitmapMinY; - uint32_t mBitmapWidth; - uint32_t mBitmapHeight; - // Also cache texture coords for the quad - float mBitmapMinU; - float mBitmapMinV; - float mBitmapMaxU; - float mBitmapMaxV; - // Minimize how much we call freetype - int32_t mGlyphIndex; - int32_t mAdvanceX; - int32_t mAdvanceY; - // Values below contain a glyph's origin in the bitmap - int32_t mBitmapLeft; - int32_t mBitmapTop; - }; - - String8 mFontName; - float mFontSize; - uint32_t mDpi; - - Font(Context *rsc); - bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0); - - virtual void preDestroy() const; - FT_FaceRec_ *mFace; - bool mInitialized; - bool mHasKerning; - - DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs; - CachedGlyphInfo* getCachedUTFChar(int32_t utfChar); - - CachedGlyphInfo *cacheGlyph(uint32_t glyph); - void updateGlyphCache(CachedGlyphInfo *glyph); - void measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds); - void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y); - void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, - uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH); -}; - -class FontState { -public: - FontState(); - ~FontState(); - - void init(Context *rsc); - void deinit(Context *rsc); - - ObjectBaseRef<Font> mDefault; - - void renderText(const char *text, uint32_t len, int32_t x, int32_t y, - uint32_t startIndex = 0, int numGlyphs = -1, - Font::RenderMode mode = Font::FRAMEBUFFER, - Font::Rect *bounds = NULL, - uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0); - - void measureText(const char *text, uint32_t len, Font::Rect *bounds); - - void setFontColor(float r, float g, float b, float a); - void getFontColor(float *r, float *g, float *b, float *a) const; - -protected: - - float mSurfaceWidth; - float mSurfaceHeight; - - friend class Font; - - struct CacheTextureLine { - uint32_t mMaxHeight; - uint32_t mMaxWidth; - uint32_t mCurrentRow; - uint32_t mCurrentCol; - bool mDirty; - - CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol) - : mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow), - mCurrentCol(currentCol), mDirty(false) { - } - - bool fitBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY); - }; - - Vector<CacheTextureLine*> mCacheLines; - uint32_t getRemainingCacheCapacity(); - - void precacheLatin(Font *font); - String8 mLatinPrecache; - - Context *mRSC; - - struct { - float mFontColor[4]; - float mGamma; - } mConstants; - bool mConstantsDirty; - - float mBlackGamma; - float mWhiteGamma; - - float mBlackThreshold; - float mWhiteThreshold; - - // Free type library, we only need one copy -#ifndef ANDROID_RS_SERIALIZE - FT_LibraryRec_ *mLibrary; - FT_LibraryRec_ *getLib(); -#endif //ANDROID_RS_SERIALIZE - Vector<Font*> mActiveFonts; - - // Render state for the font - ObjectBaseRef<Allocation> mFontShaderFConstant; - ObjectBaseRef<ProgramFragment> mFontShaderF; - ObjectBaseRef<Sampler> mFontSampler; - ObjectBaseRef<ProgramStore> mFontProgramStore; - void initRenderState(); - - // Texture to cache glyph bitmaps - ObjectBaseRef<Allocation> mTextTexture; - void initTextTexture(); - const uint8_t* getTextTextureData() const { - return (uint8_t*)mTextTexture->getPtr(); - } - -#ifndef ANDROID_RS_SERIALIZE - bool cacheBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY); -#endif //ANDROID_RS_SERIALIZE - const Type* getCacheTextureType() { - return mTextTexture->getType(); - } - - void flushAllAndInvalidate(); - - // Pointer to vertex data to speed up frame to frame work - float *mTextMeshPtr; - uint32_t mCurrentQuadIndex; - uint32_t mMaxNumberOfQuads; - - void initVertexArrayBuffers(); - ObjectBaseRef<Mesh> mMesh; - - bool mInitialized; - - void checkInit(); - - void issueDrawCommand(); - - void appendMeshQuad(float x1, float y1, float z1, - float u1, float v1, - float x2, float y2, float z2, - float u2, float v2, - float x3, float y3, float z3, - float u3, float v3, - float x4, float y4, float z4, - float u4, float v4); -}; - -} -} - -#endif diff --git a/libs/rs/rsMatrix2x2.cpp b/libs/rs/rsMatrix2x2.cpp deleted file mode 100644 index 622113c..0000000 --- a/libs/rs/rsMatrix2x2.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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 "rsMatrix2x2.h" -#include "rsMatrix3x3.h" -#include "rsMatrix4x4.h" - -#include "stdlib.h" -#include "string.h" -#include "math.h" - -using namespace android; -using namespace android::renderscript; - - -void Matrix2x2::loadIdentity() { - m[0] = 1.f; - m[1] = 0.f; - m[2] = 0.f; - m[3] = 1.f; -} - -void Matrix2x2::load(const float *v) { - memcpy(m, v, sizeof(m)); -} - -void Matrix2x2::load(const rs_matrix2x2 *v) { - memcpy(m, v->m, sizeof(m)); -} - -void Matrix2x2::loadMultiply(const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) { - for (int i=0 ; i<2 ; i++) { - float ri0 = 0; - float ri1 = 0; - for (int j=0 ; j<2 ; j++) { - const float rhs_ij = ((const Matrix2x2 *)rhs)->get(i, j); - ri0 += ((const Matrix2x2 *)lhs)->get(j, 0) * rhs_ij; - ri1 += ((const Matrix2x2 *)lhs)->get(j, 1) * rhs_ij; - } - set(i, 0, ri0); - set(i, 1, ri1); - } -} - -void Matrix2x2::transpose() { - float temp = m[1]; - m[1] = m[2]; - m[2] = temp; -} - diff --git a/libs/rs/rsMatrix2x2.h b/libs/rs/rsMatrix2x2.h deleted file mode 100644 index 4dcb84a..0000000 --- a/libs/rs/rsMatrix2x2.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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_MATRIX_2x2_H -#define ANDROID_RS_MATRIX_2x2_H - -#include "rsType.h" - - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -struct Matrix2x2 : public rs_matrix2x2 { - inline float get(uint32_t row, uint32_t col) const { - return m[row*2 + col]; - } - - inline void set(uint32_t row, uint32_t col, float v) { - m[row*2 + col] = v; - } - - void loadIdentity(); - void load(const float *); - void load(const rs_matrix2x2 *); - - void loadMultiply(const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs); - - void transpose(); - - void multiply(const rs_matrix2x2 *rhs) { - Matrix2x2 tmp; - tmp.loadMultiply(this, rhs); - load(&tmp); - } -}; - -} -} - - - - -#endif - - - - - diff --git a/libs/rs/rsMatrix3x3.cpp b/libs/rs/rsMatrix3x3.cpp deleted file mode 100644 index 3f9a2d1..0000000 --- a/libs/rs/rsMatrix3x3.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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 "rsMatrix2x2.h" -#include "rsMatrix3x3.h" -#include "rsMatrix4x4.h" - -#include "stdlib.h" -#include "string.h" -#include "math.h" - -using namespace android; -using namespace android::renderscript; - -void Matrix3x3::loadIdentity() { - m[0] = 1.f; - m[1] = 0.f; - m[2] = 0.f; - m[3] = 0.f; - m[4] = 1.f; - m[5] = 0.f; - m[6] = 0.f; - m[7] = 0.f; - m[8] = 1.f; -} - -void Matrix3x3::load(const float *v) { - memcpy(m, v, sizeof(m)); -} - -void Matrix3x3::load(const rs_matrix3x3 *v) { - memcpy(m, v->m, sizeof(m)); -} - -void Matrix3x3::loadMultiply(const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) { - for (int i=0 ; i<3 ; i++) { - float ri0 = 0; - float ri1 = 0; - float ri2 = 0; - for (int j=0 ; j<3 ; j++) { - const float rhs_ij = ((const Matrix3x3 *)rhs)->get(i, j); - ri0 += ((const Matrix3x3 *)lhs)->get(j, 0) * rhs_ij; - ri1 += ((const Matrix3x3 *)lhs)->get(j, 1) * rhs_ij; - ri2 += ((const Matrix3x3 *)lhs)->get(j, 2) * rhs_ij; - } - set(i, 0, ri0); - set(i, 1, ri1); - set(i, 2, ri2); - } -} - -void Matrix3x3::transpose() { - int i, j; - float temp; - for (i = 0; i < 2; ++i) { - for (j = i + 1; j < 3; ++j) { - temp = get(i, j); - set(i, j, get(j, i)); - set(j, i, temp); - } - } -} - diff --git a/libs/rs/rsMatrix3x3.h b/libs/rs/rsMatrix3x3.h deleted file mode 100644 index f96d270..0000000 --- a/libs/rs/rsMatrix3x3.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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_MATRIX_3x3_H -#define ANDROID_RS_MATRIX_3x3_H - -#include "rsType.h" - - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -struct Matrix3x3 : public rs_matrix3x3 { - inline float get(uint32_t row, uint32_t col) const { - return m[row*3 + col]; - } - - inline void set(uint32_t row, uint32_t col, float v) { - m[row*3 + col] = v; - } - - void loadIdentity(); - void load(const float *); - void load(const rs_matrix3x3 *); - - void loadMultiply(const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs); - - void transpose(); - - void multiply(const rs_matrix3x3 *rhs) { - Matrix3x3 tmp; - tmp.loadMultiply(this, rhs); - load(&tmp); - } -}; - -} -} - - - - -#endif - - - - - diff --git a/libs/rs/rsMatrix4x4.cpp b/libs/rs/rsMatrix4x4.cpp deleted file mode 100644 index c6f96d8..0000000 --- a/libs/rs/rsMatrix4x4.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/* - * 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 "rsMatrix2x2.h" -#include "rsMatrix3x3.h" -#include "rsMatrix4x4.h" - -#include "stdlib.h" -#include "string.h" -#include "math.h" - -using namespace android; -using namespace android::renderscript; - -////////////////////////////////////////////////////////////////////////////// -// Heavy math functions -////////////////////////////////////////////////////////////////////////////// - - - - - -// Returns true if the matrix was successfully inversed -bool Matrix4x4::inverse() { - rs_matrix4x4 result; - - int i, j; - for (i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) { - // computeCofactor for int i, int j - int c0 = (i+1) % 4; - int c1 = (i+2) % 4; - int c2 = (i+3) % 4; - int r0 = (j+1) % 4; - int r1 = (j+2) % 4; - int r2 = (j+3) % 4; - - float minor = - (m[c0 + 4*r0] * (m[c1 + 4*r1] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r1])) - - (m[c0 + 4*r1] * (m[c1 + 4*r0] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r0])) - + (m[c0 + 4*r2] * (m[c1 + 4*r0] * m[c2 + 4*r1] - m[c1 + 4*r1] * m[c2 + 4*r0])); - - float cofactor = (i+j) & 1 ? -minor : minor; - - result.m[4*i + j] = cofactor; - } - } - - // Dot product of 0th column of source and 0th row of result - float det = m[0]*result.m[0] + m[4]*result.m[1] + - m[8]*result.m[2] + m[12]*result.m[3]; - - if (fabs(det) < 1e-6) { - return false; - } - - det = 1.0f / det; - for (i = 0; i < 16; ++i) { - m[i] = result.m[i] * det; - } - - return true; -} - -// Returns true if the matrix was successfully inversed -bool Matrix4x4::inverseTranspose() { - rs_matrix4x4 result; - - int i, j; - for (i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) { - // computeCofactor for int i, int j - int c0 = (i+1) % 4; - int c1 = (i+2) % 4; - int c2 = (i+3) % 4; - int r0 = (j+1) % 4; - int r1 = (j+2) % 4; - int r2 = (j+3) % 4; - - float minor = (m[c0 + 4*r0] * (m[c1 + 4*r1] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r1])) - - (m[c0 + 4*r1] * (m[c1 + 4*r0] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r0])) - + (m[c0 + 4*r2] * (m[c1 + 4*r0] * m[c2 + 4*r1] - m[c1 + 4*r1] * m[c2 + 4*r0])); - - float cofactor = (i+j) & 1 ? -minor : minor; - - result.m[4*j + i] = cofactor; - } - } - - // Dot product of 0th column of source and 0th column of result - float det = m[0]*result.m[0] + m[4]*result.m[4] + - m[8]*result.m[8] + m[12]*result.m[12]; - - if (fabs(det) < 1e-6) { - return false; - } - - det = 1.0f / det; - for (i = 0; i < 16; ++i) { - m[i] = result.m[i] * det; - } - - return true; -} - -void Matrix4x4::transpose() { - int i, j; - float temp; - for (i = 0; i < 3; ++i) { - for (j = i + 1; j < 4; ++j) { - temp = m[i*4 + j]; - m[i*4 + j] = m[j*4 + i]; - m[j*4 + i] = temp; - } - } -} - - -/////////////////////////////////////////////////////////////////////////////////// - -void Matrix4x4::loadIdentity() { - m[0] = 1.f; - m[1] = 0.f; - m[2] = 0.f; - m[3] = 0.f; - m[4] = 0.f; - m[5] = 1.f; - m[6] = 0.f; - m[7] = 0.f; - m[8] = 0.f; - m[9] = 0.f; - m[10] = 1.f; - m[11] = 0.f; - m[12] = 0.f; - m[13] = 0.f; - m[14] = 0.f; - m[15] = 1.f; -} - -void Matrix4x4::load(const float *v) { - memcpy(m, v, sizeof(m)); -} - -void Matrix4x4::load(const rs_matrix4x4 *v) { - memcpy(m, v->m, sizeof(m)); -} - -void Matrix4x4::load(const rs_matrix3x3 *v) { - m[0] = v->m[0]; - m[1] = v->m[1]; - m[2] = v->m[2]; - m[3] = 0.f; - m[4] = v->m[3]; - m[5] = v->m[4]; - m[6] = v->m[5]; - m[7] = 0.f; - m[8] = v->m[6]; - m[9] = v->m[7]; - m[10] = v->m[8]; - m[11] = 0.f; - m[12] = 0.f; - m[13] = 0.f; - m[14] = 0.f; - m[15] = 1.f; -} - -void Matrix4x4::load(const rs_matrix2x2 *v) { - m[0] = v->m[0]; - m[1] = v->m[1]; - m[2] = 0.f; - m[3] = 0.f; - m[4] = v->m[2]; - m[5] = v->m[3]; - m[6] = 0.f; - m[7] = 0.f; - m[8] = 0.f; - m[9] = 0.f; - m[10] = 1.f; - m[11] = 0.f; - m[12] = 0.f; - m[13] = 0.f; - m[14] = 0.f; - m[15] = 1.f; -} - - -void Matrix4x4::loadRotate(float rot, float x, float y, float z) { - float c, s; - m[3] = 0; - m[7] = 0; - m[11]= 0; - m[12]= 0; - m[13]= 0; - m[14]= 0; - m[15]= 1; - rot *= float(M_PI / 180.0f); - c = cosf(rot); - s = sinf(rot); - - const float len = x*x + y*y + z*z; - if (len != 1) { - const float recipLen = 1.f / sqrtf(len); - x *= recipLen; - y *= recipLen; - z *= recipLen; - } - const float nc = 1.0f - c; - const float xy = x * y; - const float yz = y * z; - const float zx = z * x; - const float xs = x * s; - const float ys = y * s; - const float zs = z * s; - m[ 0] = x*x*nc + c; - m[ 4] = xy*nc - zs; - m[ 8] = zx*nc + ys; - m[ 1] = xy*nc + zs; - m[ 5] = y*y*nc + c; - m[ 9] = yz*nc - xs; - m[ 2] = zx*nc - ys; - m[ 6] = yz*nc + xs; - m[10] = z*z*nc + c; -} - -void Matrix4x4::loadScale(float x, float y, float z) { - loadIdentity(); - set(0, 0, x); - set(1, 1, y); - set(2, 2, z); -} - -void Matrix4x4::loadTranslate(float x, float y, float z) { - loadIdentity(); - m[12] = x; - m[13] = y; - m[14] = z; -} - -void Matrix4x4::loadMultiply(const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) { - for (int i=0 ; i<4 ; i++) { - float ri0 = 0; - float ri1 = 0; - float ri2 = 0; - float ri3 = 0; - for (int j=0 ; j<4 ; j++) { - const float rhs_ij = ((const Matrix4x4 *)rhs)->get(i,j); - ri0 += ((const Matrix4x4 *)lhs)->get(j,0) * rhs_ij; - ri1 += ((const Matrix4x4 *)lhs)->get(j,1) * rhs_ij; - ri2 += ((const Matrix4x4 *)lhs)->get(j,2) * rhs_ij; - ri3 += ((const Matrix4x4 *)lhs)->get(j,3) * rhs_ij; - } - set(i,0, ri0); - set(i,1, ri1); - set(i,2, ri2); - set(i,3, ri3); - } -} - -void Matrix4x4::loadOrtho(float left, float right, float bottom, float top, float near, float far) { - loadIdentity(); - m[0] = 2.f / (right - left); - m[5] = 2.f / (top - bottom); - m[10]= -2.f / (far - near); - m[12]= -(right + left) / (right - left); - m[13]= -(top + bottom) / (top - bottom); - m[14]= -(far + near) / (far - near); -} - -void Matrix4x4::loadFrustum(float left, float right, float bottom, float top, float near, float far) { - loadIdentity(); - m[0] = 2.f * near / (right - left); - m[5] = 2.f * near / (top - bottom); - m[8] = (right + left) / (right - left); - m[9] = (top + bottom) / (top - bottom); - m[10]= -(far + near) / (far - near); - m[11]= -1.f; - m[14]= -2.f * far * near / (far - near); - m[15]= 0.f; -} - -void Matrix4x4::loadPerspective(float fovy, float aspect, float near, float far) { - float top = near * tan((float) (fovy * M_PI / 360.0f)); - float bottom = -top; - float left = bottom * aspect; - float right = top * aspect; - loadFrustum(left, right, bottom, top, near, far); -} - -void Matrix4x4::vectorMultiply(float *out, const float *in) const { - out[0] = (m[0] * in[0]) + (m[4] * in[1]) + (m[8] * in[2]) + m[12]; - out[1] = (m[1] * in[0]) + (m[5] * in[1]) + (m[9] * in[2]) + m[13]; - out[2] = (m[2] * in[0]) + (m[6] * in[1]) + (m[10] * in[2]) + m[14]; - out[3] = (m[3] * in[0]) + (m[7] * in[1]) + (m[11] * in[2]) + m[15]; -} - -void Matrix4x4::logv(const char *s) const { - ALOGV("%s {%f, %f, %f, %f", s, m[0], m[4], m[8], m[12]); - ALOGV("%s %f, %f, %f, %f", s, m[1], m[5], m[9], m[13]); - ALOGV("%s %f, %f, %f, %f", s, m[2], m[6], m[10], m[14]); - ALOGV("%s %f, %f, %f, %f}", s, m[3], m[7], m[11], m[15]); -} diff --git a/libs/rs/rsMatrix4x4.h b/libs/rs/rsMatrix4x4.h deleted file mode 100644 index d30184f..0000000 --- a/libs/rs/rsMatrix4x4.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2009 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_MATRIX_4x4_H -#define ANDROID_RS_MATRIX_4x4_H - -#include "rsType.h" - - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -struct Matrix4x4 : public rs_matrix4x4 { - float get(uint32_t row, uint32_t col) const { - return m[row*4 + col]; - } - - void set(uint32_t row, uint32_t col, float v) { - m[row*4 + col] = v; - } - - void loadIdentity(); - void load(const float *); - void load(const rs_matrix4x4 *); - void load(const rs_matrix3x3 *); - void load(const rs_matrix2x2 *); - - void loadRotate(float rot, float x, float y, float z); - void loadScale(float x, float y, float z); - void loadTranslate(float x, float y, float z); - void loadMultiply(const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs); - - void loadOrtho(float l, float r, float b, float t, float n, float f); - void loadFrustum(float l, float r, float b, float t, float n, float f); - void loadPerspective(float fovy, float aspect, float near, float far); - - void vectorMultiply(float *v4out, const float *v3in) const; - - bool inverse(); - bool inverseTranspose(); - void transpose(); - - void logv(const char *s) const; - - - void multiply(const rs_matrix4x4 *rhs) { - Matrix4x4 tmp; - tmp.loadMultiply(this, rhs); - load(&tmp); - } - void rotate(float rot, float x, float y, float z) { - Matrix4x4 tmp; - tmp.loadRotate(rot, x, y, z); - multiply(&tmp); - } - void scale(float x, float y, float z) { - Matrix4x4 tmp; - tmp.loadScale(x, y, z); - multiply(&tmp); - } - void translate(float x, float y, float z) { - Matrix4x4 tmp; - tmp.loadTranslate(x, y, z); - multiply(&tmp); - } -}; - -} -} - - - - -#endif - - - - diff --git a/libs/rs/rsMesh.cpp b/libs/rs/rsMesh.cpp deleted file mode 100644 index 399a52b..0000000 --- a/libs/rs/rsMesh.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* - * 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" -#include "rsMesh.h" -#include "rs.h" - -using namespace android; -using namespace android::renderscript; - -Mesh::Mesh(Context *rsc) : ObjectBase(rsc) { - mHal.drv = NULL; - mHal.state.primitives = NULL; - mHal.state.primitivesCount = 0; - mHal.state.indexBuffers = NULL; - mHal.state.indexBuffersCount = 0; - mHal.state.vertexBuffers = NULL; - mHal.state.vertexBuffersCount = 0; - mInitialized = false; - - mVertexBuffers = NULL; - mIndexBuffers = NULL; -} - -Mesh::Mesh(Context *rsc, - uint32_t vertexBuffersCount, - uint32_t primitivesCount) : ObjectBase(rsc) { - mHal.drv = NULL; - mHal.state.primitivesCount = primitivesCount; - mHal.state.indexBuffersCount = primitivesCount; - mHal.state.primitives = new RsPrimitive[mHal.state.primitivesCount]; - mHal.state.indexBuffers = new Allocation *[mHal.state.indexBuffersCount]; - for (uint32_t i = 0; i < mHal.state.primitivesCount; i ++) { - mHal.state.primitives[i] = RS_PRIMITIVE_POINT; - } - for (uint32_t i = 0; i < mHal.state.indexBuffersCount; i ++) { - mHal.state.indexBuffers[i] = NULL; - } - mHal.state.vertexBuffersCount = vertexBuffersCount; - mHal.state.vertexBuffers = new Allocation *[mHal.state.vertexBuffersCount]; - for (uint32_t i = 0; i < mHal.state.vertexBuffersCount; i ++) { - mHal.state.vertexBuffers[i] = NULL; - } - - mVertexBuffers = new ObjectBaseRef<Allocation>[mHal.state.vertexBuffersCount]; - mIndexBuffers = new ObjectBaseRef<Allocation>[mHal.state.primitivesCount]; -} - -Mesh::~Mesh() { -#ifndef ANDROID_RS_SERIALIZE - mRSC->mHal.funcs.mesh.destroy(mRSC, this); -#endif - - delete[] mHal.state.vertexBuffers; - delete[] mHal.state.primitives; - delete[] mHal.state.indexBuffers; - - delete[] mVertexBuffers; - delete[] mIndexBuffers; -} - -void Mesh::init() { -#ifndef ANDROID_RS_SERIALIZE - mRSC->mHal.funcs.mesh.init(mRSC, this); -#endif -} - -void Mesh::serialize(OStream *stream) const { - // Need to identify ourselves - stream->addU32((uint32_t)getClassId()); - - String8 name(getName()); - stream->addString(&name); - - // Store number of vertex streams - stream->addU32(mHal.state.vertexBuffersCount); - for (uint32_t vCount = 0; vCount < mHal.state.vertexBuffersCount; vCount ++) { - mHal.state.vertexBuffers[vCount]->serialize(stream); - } - - stream->addU32(mHal.state.primitivesCount); - // Store the primitives - for (uint32_t pCount = 0; pCount < mHal.state.primitivesCount; pCount ++) { - stream->addU8((uint8_t)mHal.state.primitives[pCount]); - - if (mHal.state.indexBuffers[pCount]) { - stream->addU32(1); - mHal.state.indexBuffers[pCount]->serialize(stream); - } else { - stream->addU32(0); - } - } -} - -Mesh *Mesh::createFromStream(Context *rsc, IStream *stream) { - // First make sure we are reading the correct object - RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); - if (classID != RS_A3D_CLASS_ID_MESH) { - ALOGE("mesh loading skipped due to invalid class id"); - return NULL; - } - - String8 name; - stream->loadString(&name); - - uint32_t vertexBuffersCount = stream->loadU32(); - ObjectBaseRef<Allocation> *vertexBuffers = NULL; - if (vertexBuffersCount) { - vertexBuffers = new ObjectBaseRef<Allocation>[vertexBuffersCount]; - - for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { - Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); - vertexBuffers[vCount].set(vertexAlloc); - } - } - - uint32_t primitivesCount = stream->loadU32(); - ObjectBaseRef<Allocation> *indexBuffers = NULL; - RsPrimitive *primitives = NULL; - if (primitivesCount) { - indexBuffers = new ObjectBaseRef<Allocation>[primitivesCount]; - primitives = new RsPrimitive[primitivesCount]; - - // load all primitives - for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { - primitives[pCount] = (RsPrimitive)stream->loadU8(); - - // Check to see if the index buffer was stored - uint32_t isIndexPresent = stream->loadU32(); - if (isIndexPresent) { - Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); - indexBuffers[pCount].set(indexAlloc); - } - } - } - - Mesh *mesh = new Mesh(rsc, vertexBuffersCount, primitivesCount); - mesh->setName(name.string(), name.size()); - for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { - mesh->setVertexBuffer(vertexBuffers[vCount].get(), vCount); - } - for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { - mesh->setPrimitive(indexBuffers[pCount].get(), primitives[pCount], pCount); - } - - // Cleanup - if (vertexBuffersCount) { - delete[] vertexBuffers; - } - if (primitivesCount) { - delete[] indexBuffers; - delete[] primitives; - } - -#ifndef ANDROID_RS_SERIALIZE - mesh->init(); - mesh->uploadAll(rsc); -#endif - return mesh; -} - -void Mesh::render(Context *rsc) const { - for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { - renderPrimitive(rsc, ct); - } -} - -void Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { - if (primIndex >= mHal.state.primitivesCount) { - ALOGE("Invalid primitive index"); - return; - } - - if (mHal.state.indexBuffers[primIndex]) { - renderPrimitiveRange(rsc, primIndex, 0, mHal.state.indexBuffers[primIndex]->getType()->getDimX()); - return; - } - - renderPrimitiveRange(rsc, primIndex, 0, mHal.state.vertexBuffers[0]->getType()->getDimX()); -} - -void Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { - if (len < 1 || primIndex >= mHal.state.primitivesCount) { - ALOGE("Invalid mesh or parameters"); - return; - } - - mRSC->mHal.funcs.mesh.draw(mRSC, this, primIndex, start, len); -} - -void Mesh::uploadAll(Context *rsc) { - for (uint32_t ct = 0; ct < mHal.state.vertexBuffersCount; ct ++) { - if (mHal.state.vertexBuffers[ct]) { - rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.vertexBuffers[ct]); - } - } - - for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { - if (mHal.state.indexBuffers[ct]) { - rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.indexBuffers[ct]); - } - } -} - -void Mesh::computeBBox() { - float *posPtr = NULL; - uint32_t vectorSize = 0; - uint32_t stride = 0; - uint32_t numVerts = 0; - // First we need to find the position ptr and stride - for (uint32_t ct=0; ct < mHal.state.vertexBuffersCount; ct++) { - const Type *bufferType = mHal.state.vertexBuffers[ct]->getType(); - const Element *bufferElem = bufferType->getElement(); - - for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { - if (strcmp(bufferElem->getFieldName(ct), "position") == 0) { - vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); - stride = bufferElem->getSizeBytes() / sizeof(float); - uint32_t offset = bufferElem->getFieldOffsetBytes(ct); - posPtr = (float*)((uint8_t*)mHal.state.vertexBuffers[ct]->getPtr() + offset); - numVerts = bufferType->getDimX(); - break; - } - } - if (posPtr) { - break; - } - } - - mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; - mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; - if (!posPtr) { - ALOGE("Unable to compute bounding box"); - mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; - mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; - return; - } - - for (uint32_t i = 0; i < numVerts; i ++) { - for (uint32_t v = 0; v < vectorSize; v ++) { - mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); - mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); - } - posPtr += stride; - } -} - -namespace android { -namespace renderscript { - -RsMesh rsi_MeshCreate(Context *rsc, - RsAllocation * vtx, size_t vtxCount, - RsAllocation * idx, size_t idxCount, - uint32_t * primType, size_t primTypeCount) { - rsAssert(idxCount == primTypeCount); - Mesh *sm = new Mesh(rsc, vtxCount, idxCount); - sm->incUserRef(); - - for (uint32_t i = 0; i < vtxCount; i ++) { - sm->setVertexBuffer((Allocation*)vtx[i], i); - } - - for (uint32_t i = 0; i < idxCount; i ++) { - sm->setPrimitive((Allocation*)idx[i], (RsPrimitive)primType[i], i); - } - - sm->init(); - - return sm; -} - -}} - -void rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) { - Mesh *sm = static_cast<Mesh *>(mv); - *numVtx = sm->mHal.state.vertexBuffersCount; -} - -void rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) { - Mesh *sm = static_cast<Mesh *>(mv); - *numIdx = sm->mHal.state.primitivesCount; -} - -void rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) { - Mesh *sm = static_cast<Mesh *>(mv); - rsAssert(vtxDataCount == sm->mHal.state.vertexBuffersCount); - - for (uint32_t ct = 0; ct < vtxDataCount; ct ++) { - vtxData[ct] = sm->mHal.state.vertexBuffers[ct]; - sm->mHal.state.vertexBuffers[ct]->incUserRef(); - } -} - -void rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) { - Mesh *sm = static_cast<Mesh *>(mv); - rsAssert(idxDataCount == sm->mHal.state.primitivesCount); - - for (uint32_t ct = 0; ct < idxDataCount; ct ++) { - va[ct] = sm->mHal.state.indexBuffers[ct]; - primType[ct] = sm->mHal.state.primitives[ct]; - if (sm->mHal.state.indexBuffers[ct]) { - sm->mHal.state.indexBuffers[ct]->incUserRef(); - } - } -} diff --git a/libs/rs/rsMesh.h b/libs/rs/rsMesh.h deleted file mode 100644 index 7ca63cf..0000000 --- a/libs/rs/rsMesh.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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_MESH_H -#define ANDROID_RS_MESH_H - - -#include "rsObjectBase.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { -/***************************************************************************** - * CAUTION - * - * Any layout changes for this class may require a corresponding change to be - * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains - * a partial copy of the information below. - * - *****************************************************************************/ - -// An element is a group of Components that occupies one cell in a structure. -class Mesh : public ObjectBase { -public: - struct Hal { - mutable void *drv; - - struct State { - // Contains vertex data - // Position, normal, texcoord, etc could either be strided in one allocation - // of provided separetely in multiple ones - Allocation **vertexBuffers; - uint32_t vertexBuffersCount; - - // indexBuffers[i] could be NULL, in which case only primitives[i] is used - Allocation **indexBuffers; - uint32_t indexBuffersCount; - RsPrimitive *primitives; - uint32_t primitivesCount; - }; - State state; - }; - Hal mHal; - - Mesh(Context *); - Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount); - ~Mesh(); - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; } - static Mesh *createFromStream(Context *rsc, IStream *stream); - void init(); - - void setVertexBuffer(Allocation *vb, uint32_t index) { - mVertexBuffers[index].set(vb); - mHal.state.vertexBuffers[index] = vb; - } - - void setPrimitive(Allocation *idx, RsPrimitive prim, uint32_t index) { - mIndexBuffers[index].set(idx); - mHal.state.indexBuffers[index] = idx; - mHal.state.primitives[index] = prim; - } - - void render(Context *) const; - void renderPrimitive(Context *, uint32_t primIndex) const; - void renderPrimitiveRange(Context *, uint32_t primIndex, uint32_t start, uint32_t len) const; - void uploadAll(Context *); - - // Bounding volumes - float mBBoxMin[3]; - float mBBoxMax[3]; - void computeBBox(); -protected: - ObjectBaseRef<Allocation> *mVertexBuffers; - ObjectBaseRef<Allocation> *mIndexBuffers; - bool mInitialized; -}; - -class MeshContext { -public: - MeshContext() { - } - ~MeshContext() { - } -}; - -} -} -#endif //ANDROID_RS_MESH_H - - - diff --git a/libs/rs/rsMutex.cpp b/libs/rs/rsMutex.cpp deleted file mode 100644 index 6512372..0000000 --- a/libs/rs/rsMutex.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2009 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 "rsMutex.h" - -using namespace android; -using namespace android::renderscript; - - -Mutex::Mutex() { -} - -Mutex::~Mutex() { - pthread_mutex_destroy(&mMutex); -} - -bool Mutex::init() { - int status = pthread_mutex_init(&mMutex, NULL); - if (status) { - ALOGE("Mutex::Mutex init failure"); - return false; - } - return true; -} - -bool Mutex::lock() { - int status; - status = pthread_mutex_lock(&mMutex); - if (status) { - ALOGE("Mutex: error %i locking.", status); - return false; - } - return true; -} - -bool Mutex::unlock() { - int status; - status = pthread_mutex_unlock(&mMutex); - if (status) { - ALOGE("Mutex error %i unlocking.", status); - return false; - } - return true; -} - - diff --git a/libs/rs/rsMutex.h b/libs/rs/rsMutex.h deleted file mode 100644 index 47725d7..0000000 --- a/libs/rs/rsMutex.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2009 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_MUTEX_H -#define ANDROID_RS_MUTEX_H - - -#include "rsUtils.h" - -namespace android { -namespace renderscript { - -class Mutex { -public: - Mutex(); - ~Mutex(); - - bool init(); - bool lock(); - bool unlock(); - -protected: - pthread_mutex_t mMutex; -}; - -} -} - -#endif - diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp deleted file mode 100644 index 6a64582..0000000 --- a/libs/rs/rsObjectBase.cpp +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (C) 2009 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 "rsObjectBase.h" -#include "rsContext.h" - -using namespace android; -using namespace android::renderscript; - -pthread_mutex_t ObjectBase::gObjectInitMutex = PTHREAD_MUTEX_INITIALIZER; - -ObjectBase::ObjectBase(Context *rsc) { - mUserRefCount = 0; - mSysRefCount = 0; - mRSC = rsc; - mNext = NULL; - mPrev = NULL; - -#if RS_OBJECT_DEBUG - mStack.update(2); -#endif - - rsAssert(rsc); - add(); - //ALOGV("ObjectBase %p con", this); -} - -ObjectBase::~ObjectBase() { - //ALOGV("~ObjectBase %p ref %i,%i", this, mUserRefCount, mSysRefCount); -#if RS_OBJECT_DEBUG - mStack.dump(); -#endif - - if (mPrev || mNext) { - // While the normal practice is to call remove before we call - // delete. Its possible for objects without a re-use list - // for avoiding duplication to be created on the stack. In those - // cases we need to remove ourself here. - asyncLock(); - remove(); - asyncUnlock(); - } - - rsAssert(!mUserRefCount); - rsAssert(!mSysRefCount); -} - -void ObjectBase::dumpLOGV(const char *op) const { - if (mName.size()) { - ALOGV("%s RSobj %p, name %s, refs %i,%i links %p,%p,%p", - op, this, mName.string(), mUserRefCount, mSysRefCount, mNext, mPrev, mRSC); - } else { - ALOGV("%s RSobj %p, no-name, refs %i,%i links %p,%p,%p", - op, this, mUserRefCount, mSysRefCount, mNext, mPrev, mRSC); - } -} - -void ObjectBase::incUserRef() const { - android_atomic_inc(&mUserRefCount); - //ALOGV("ObjectBase %p incU ref %i, %i", this, mUserRefCount, mSysRefCount); -} - -void ObjectBase::incSysRef() const { - android_atomic_inc(&mSysRefCount); - //ALOGV("ObjectBase %p incS ref %i, %i", this, mUserRefCount, mSysRefCount); -} - -void ObjectBase::preDestroy() const { -} - -bool ObjectBase::freeChildren() { - return false; -} - -bool ObjectBase::checkDelete(const ObjectBase *ref) { - if (!ref) { - return false; - } - - asyncLock(); - // This lock protects us against the non-RS threads changing - // the ref counts. At this point we should be the only thread - // working on them. - if (ref->mUserRefCount || ref->mSysRefCount) { - asyncUnlock(); - return false; - } - - ref->remove(); - // At this point we can unlock because there should be no possible way - // for another thread to reference this object. - ref->preDestroy(); - asyncUnlock(); - delete ref; - return true; -} - -bool ObjectBase::decUserRef() const { - rsAssert(mUserRefCount > 0); -#if RS_OBJECT_DEBUG - ALOGV("ObjectBase %p decU ref %i, %i", this, mUserRefCount, mSysRefCount); - if (mUserRefCount <= 0) { - mStack.dump(); - } -#endif - - - if ((android_atomic_dec(&mUserRefCount) <= 1) && - (android_atomic_acquire_load(&mSysRefCount) <= 0)) { - return checkDelete(this); - } - return false; -} - -bool ObjectBase::zeroUserRef() const { - //ALOGV("ObjectBase %p zeroU ref %i, %i", this, mUserRefCount, mSysRefCount); - android_atomic_acquire_store(0, &mUserRefCount); - if (android_atomic_acquire_load(&mSysRefCount) <= 0) { - return checkDelete(this); - } - return false; -} - -bool ObjectBase::decSysRef() const { - //ALOGV("ObjectBase %p decS ref %i, %i", this, mUserRefCount, mSysRefCount); - rsAssert(mSysRefCount > 0); - if ((android_atomic_dec(&mSysRefCount) <= 1) && - (android_atomic_acquire_load(&mUserRefCount) <= 0)) { - return checkDelete(this); - } - return false; -} - -void ObjectBase::setName(const char *name) { - mName.setTo(name); -} - -void ObjectBase::setName(const char *name, uint32_t len) { - mName.setTo(name, len); -} - -void ObjectBase::asyncLock() { - pthread_mutex_lock(&gObjectInitMutex); -} - -void ObjectBase::asyncUnlock() { - pthread_mutex_unlock(&gObjectInitMutex); -} - -void ObjectBase::add() const { - asyncLock(); - - rsAssert(!mNext); - rsAssert(!mPrev); - //ALOGV("calling add rsc %p", mRSC); - mNext = mRSC->mObjHead; - if (mRSC->mObjHead) { - mRSC->mObjHead->mPrev = this; - } - mRSC->mObjHead = this; - - asyncUnlock(); -} - -void ObjectBase::remove() const { - //ALOGV("calling remove rsc %p", mRSC); - if (!mRSC) { - rsAssert(!mPrev); - rsAssert(!mNext); - return; - } - - if (mRSC->mObjHead == this) { - mRSC->mObjHead = mNext; - } - if (mPrev) { - mPrev->mNext = mNext; - } - if (mNext) { - mNext->mPrev = mPrev; - } - mPrev = NULL; - mNext = NULL; -} - -void ObjectBase::zeroAllUserRef(Context *rsc) { - if (rsc->props.mLogObjects) { - ALOGV("Forcing release of all outstanding user refs."); - } - - // This operation can be slow, only to be called during context cleanup. - const ObjectBase * o = rsc->mObjHead; - while (o) { - //ALOGE("o %p", o); - if (o->zeroUserRef()) { - // deleted the object and possibly others, restart from head. - o = rsc->mObjHead; - //ALOGE("o head %p", o); - } else { - o = o->mNext; - //ALOGE("o next %p", o); - } - } - - if (rsc->props.mLogObjects) { - ALOGV("Objects remaining."); - dumpAll(rsc); - } -} - -void ObjectBase::freeAllChildren(Context *rsc) { - if (rsc->props.mLogObjects) { - ALOGV("Forcing release of all child objects."); - } - - // This operation can be slow, only to be called during context cleanup. - ObjectBase * o = (ObjectBase *)rsc->mObjHead; - while (o) { - if (o->freeChildren()) { - // deleted ref to self and possibly others, restart from head. - o = (ObjectBase *)rsc->mObjHead; - } else { - o = (ObjectBase *)o->mNext; - } - } - - if (rsc->props.mLogObjects) { - ALOGV("Objects remaining."); - dumpAll(rsc); - } -} - -void ObjectBase::dumpAll(Context *rsc) { - asyncLock(); - - ALOGV("Dumping all objects"); - const ObjectBase * o = rsc->mObjHead; - while (o) { - ALOGV(" Object %p", o); - o->dumpLOGV(" "); - o = o->mNext; - } - - asyncUnlock(); -} - -bool ObjectBase::isValid(const Context *rsc, const ObjectBase *obj) { - asyncLock(); - - const ObjectBase * o = rsc->mObjHead; - while (o) { - if (o == obj) { - asyncUnlock(); - return true; - } - o = o->mNext; - } - asyncUnlock(); - return false; -} - diff --git a/libs/rs/rsObjectBase.h b/libs/rs/rsObjectBase.h deleted file mode 100644 index 586da19..0000000 --- a/libs/rs/rsObjectBase.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2009 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_OBJECT_BASE_H -#define ANDROID_RS_OBJECT_BASE_H - -#include "rsUtils.h" -#include "rsDefines.h" - -#define RS_OBJECT_DEBUG 0 - -#include <utils/CallStack.h> - -namespace android { -namespace renderscript { - -class Context; -class OStream; - -// An element is a group of Components that occupies one cell in a structure. -class ObjectBase { -public: - ObjectBase(Context *rsc); - - void incSysRef() const; - bool decSysRef() const; - - void incUserRef() const; - bool decUserRef() const; - bool zeroUserRef() const; - - static bool checkDelete(const ObjectBase *); - - const char * getName() const { - return mName.string(); - } - void setName(const char *); - void setName(const char *, uint32_t len); - - Context * getContext() const {return mRSC;} - virtual bool freeChildren(); - - static void zeroAllUserRef(Context *rsc); - static void freeAllChildren(Context *rsc); - static void dumpAll(Context *rsc); - - virtual void dumpLOGV(const char *prefix) const; - virtual void serialize(OStream *stream) const = 0; - virtual RsA3DClassID getClassId() const = 0; - - static bool isValid(const Context *rsc, const ObjectBase *obj); - - // The async lock is taken during object creation in non-rs threads - // and object deletion in the rs thread. - static void asyncLock(); - static void asyncUnlock(); - -protected: - // Called inside the async lock for any object list management that is - // necessary in derived classes. - virtual void preDestroy() const; - - Context *mRSC; - virtual ~ObjectBase(); - -private: - static pthread_mutex_t gObjectInitMutex; - - void add() const; - void remove() const; - - String8 mName; - mutable int32_t mSysRefCount; - mutable int32_t mUserRefCount; - - mutable const ObjectBase * mPrev; - mutable const ObjectBase * mNext; - -#if RS_OBJECT_DEBUG - CallStack mStack; -#endif - -}; - -template<class T> -class ObjectBaseRef { -public: - ObjectBaseRef() { - mRef = NULL; - } - - ObjectBaseRef(const ObjectBaseRef &ref) { - mRef = ref.get(); - if (mRef) { - mRef->incSysRef(); - } - } - - ObjectBaseRef(T *ref) { - mRef = ref; - if (mRef) { - ref->incSysRef(); - } - } - - ObjectBaseRef & operator= (const ObjectBaseRef &ref) { - if (&ref != this) { - set(ref); - } - return *this; - } - - ~ObjectBaseRef() { - clear(); - } - - void set(T *ref) { - if (mRef != ref) { - clear(); - mRef = ref; - if (mRef) { - ref->incSysRef(); - } - } - } - - void set(const ObjectBaseRef &ref) { - set(ref.mRef); - } - - void clear() { - if (mRef) { - mRef->decSysRef(); - } - mRef = NULL; - } - - inline T * get() const { - return mRef; - } - - inline T * operator-> () const { - return mRef; - } - -protected: - T * mRef; -}; - -} -} - -#endif //ANDROID_RS_OBJECT_BASE_H - diff --git a/libs/rs/rsPath.cpp b/libs/rs/rsPath.cpp deleted file mode 100644 index 055bb86..0000000 --- a/libs/rs/rsPath.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * 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" -#include "rs.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 deleted file mode 100644 index 1abfc9a..0000000 --- a/libs/rs/rsPath.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 "rsObjectBase.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/rsProgram.cpp b/libs/rs/rsProgram.cpp deleted file mode 100644 index 7114f29..0000000 --- a/libs/rs/rsProgram.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* - * 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" -#include "rsProgram.h" - -using namespace android; -using namespace android::renderscript; - -Program::Program(Context *rsc, const char * shaderText, size_t shaderLength, - const uint32_t * params, size_t paramLength) - : ProgramBase(rsc) { - - initMemberVars(); - for (uint32_t ct=0; ct < paramLength; ct+=2) { - if (params[ct] == RS_PROGRAM_PARAM_INPUT) { - mHal.state.inputElementsCount++; - } - if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) { - mHal.state.constantsCount++; - } - if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) { - mHal.state.texturesCount++; - } - } - - mTextures = new ObjectBaseRef<Allocation>[mHal.state.texturesCount]; - mSamplers = new ObjectBaseRef<Sampler>[mHal.state.texturesCount]; - mInputElements = new ObjectBaseRef<Element>[mHal.state.inputElementsCount]; - mConstantTypes = new ObjectBaseRef<Type>[mHal.state.constantsCount]; - mConstants = new ObjectBaseRef<Allocation>[mHal.state.constantsCount]; - - mHal.state.textures = new Allocation*[mHal.state.texturesCount]; - mHal.state.samplers = new Sampler*[mHal.state.texturesCount]; - mHal.state.textureTargets = new RsTextureTarget[mHal.state.texturesCount]; - mHal.state.inputElements = new Element*[mHal.state.inputElementsCount]; - mHal.state.constantTypes = new Type*[mHal.state.constantsCount]; - mHal.state.constants = new Allocation*[mHal.state.constantsCount]; - - // Will initialize everything - freeChildren(); - - uint32_t input = 0; - uint32_t constant = 0; - uint32_t texture = 0; - for (uint32_t ct=0; ct < paramLength; ct+=2) { - if (params[ct] == RS_PROGRAM_PARAM_INPUT) { - mInputElements[input].set(reinterpret_cast<Element *>(params[ct+1])); - mHal.state.inputElements[input++] = reinterpret_cast<Element *>(params[ct+1]); - } - if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) { - mConstantTypes[constant].set(reinterpret_cast<Type *>(params[ct+1])); - mHal.state.constantTypes[constant++] = reinterpret_cast<Type *>(params[ct+1]); - } - if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) { - mHal.state.textureTargets[texture++] = (RsTextureTarget)params[ct+1]; - } - } - mIsInternal = false; - uint32_t internalTokenLen = strlen(RS_SHADER_INTERNAL); - if (shaderLength > internalTokenLen && - strncmp(RS_SHADER_INTERNAL, shaderText, internalTokenLen) == 0) { - mIsInternal = true; - shaderText += internalTokenLen; - shaderLength -= internalTokenLen; - } - mUserShader.setTo(shaderText, shaderLength); -} - -Program::~Program() { - freeChildren(); - - delete[] mTextures; - delete[] mSamplers; - delete[] mInputElements; - delete[] mConstantTypes; - delete[] mConstants; - - delete[] mHal.state.textures; - delete[] mHal.state.samplers; - delete[] mHal.state.textureTargets; - delete[] mHal.state.inputElements; - delete[] mHal.state.constantTypes; - delete[] mHal.state.constants; - mHal.state.inputElementsCount = 0; - mHal.state.constantsCount = 0; - mHal.state.texturesCount = 0; -} - -bool Program::freeChildren() { - for (uint32_t ct=0; ct < mHal.state.constantsCount; ct++) { - bindAllocation(NULL, NULL, ct); - } - - for (uint32_t ct=0; ct < mHal.state.texturesCount; ct++) { - bindTexture(NULL, ct, NULL); - bindSampler(NULL, ct, NULL); - } - return false; -} - -void Program::initMemberVars() { - mDirty = true; - - mHal.drv = NULL; - mHal.state.textures = NULL; - mHal.state.samplers = NULL; - mHal.state.textureTargets = NULL; - mHal.state.inputElements = NULL; - mHal.state.constantTypes = NULL; - mHal.state.constants = NULL; - - mHal.state.inputElementsCount = 0; - mHal.state.constantsCount = 0; - mHal.state.texturesCount = 0; - - mTextures = NULL; - mSamplers = NULL; - mInputElements = NULL; - mConstantTypes = NULL; - mConstants = NULL; - - mIsInternal = false; -} - -void Program::bindAllocation(Context *rsc, Allocation *alloc, uint32_t slot) { - if (alloc != NULL) { - if (slot >= mHal.state.constantsCount) { - ALOGE("Attempt to bind alloc at slot %u, on shader id %u, but const count is %u", - slot, (uint32_t)this, mHal.state.constantsCount); - rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation"); - return; - } - if (alloc->getType() != mConstantTypes[slot].get()) { - ALOGE("Attempt to bind alloc at slot %u, on shader id %u, but types mismatch", - slot, (uint32_t)this); - rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation"); - return; - } - } - if (mConstants[slot].get() == alloc) { - return; - } - if (mConstants[slot].get()) { - mConstants[slot]->removeProgramToDirty(this); - } - mConstants[slot].set(alloc); - mHal.state.constants[slot] = alloc; - if (alloc) { - alloc->addProgramToDirty(this); - } - mDirty = true; -} - -void Program::bindTexture(Context *rsc, uint32_t slot, Allocation *a) { - if (slot >= mHal.state.texturesCount) { - ALOGE("Attempt to bind texture to slot %u but tex count is %u", slot, mHal.state.texturesCount); - rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind texture"); - return; - } - - if (a && a->getType()->getDimFaces() && mHal.state.textureTargets[slot] != RS_TEXTURE_CUBE) { - ALOGE("Attempt to bind cubemap to slot %u but 2d texture needed", slot); - rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind cubemap to 2d texture slot"); - return; - } - - mTextures[slot].set(a); - mHal.state.textures[slot] = a; - - mDirty = true; -} - -void Program::bindSampler(Context *rsc, uint32_t slot, Sampler *s) { - if (slot >= mHal.state.texturesCount) { - ALOGE("Attempt to bind sampler to slot %u but tex count is %u", slot, mHal.state.texturesCount); - rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind sampler"); - return; - } - - mSamplers[slot].set(s); - mHal.state.samplers[slot] = s; - mDirty = true; -} - -namespace android { -namespace renderscript { - -void rsi_ProgramBindConstants(Context *rsc, RsProgram vp, uint32_t slot, RsAllocation constants) { - Program *p = static_cast<Program *>(vp); - p->bindAllocation(rsc, static_cast<Allocation *>(constants), slot); -} - -void rsi_ProgramBindTexture(Context *rsc, RsProgram vpf, uint32_t slot, RsAllocation a) { - Program *p = static_cast<Program *>(vpf); - p->bindTexture(rsc, slot, static_cast<Allocation *>(a)); -} - -void rsi_ProgramBindSampler(Context *rsc, RsProgram vpf, uint32_t slot, RsSampler s) { - Program *p = static_cast<Program *>(vpf); - p->bindSampler(rsc, slot, static_cast<Sampler *>(s)); -} - -} -} - diff --git a/libs/rs/rsProgram.h b/libs/rs/rsProgram.h deleted file mode 100644 index d032930..0000000 --- a/libs/rs/rsProgram.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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_PROGRAM_H -#define ANDROID_RS_PROGRAM_H - -#include "rsProgramBase.h" -#include "rsElement.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -#define RS_SHADER_INTERNAL "//rs_shader_internal\n" -#define RS_SHADER_ATTR "ATTRIB_" -#define RS_SHADER_UNI "UNI_" - -class Program : public ProgramBase { -public: - struct Hal { - mutable void *drv; - - struct State { - // The difference between Textures and Constants is how they are accessed - // Texture lookups go though a sampler which in effect converts normalized - // coordinates into type specific. Multiple samples may also be taken - // and filtered. - // - // Constants are strictly accessed by the shader code - Allocation **textures; - RsTextureTarget *textureTargets; - uint32_t texturesCount; - - Sampler **samplers; - uint32_t samplersCount; - - Allocation **constants; - Type **constantTypes; - uint32_t constantsCount; - - Element **inputElements; - uint32_t inputElementsCount; - }; - State state; - }; - Hal mHal; - - Program(Context *, const char * shaderText, size_t shaderLength, - const uint32_t * params, size_t paramLength); - virtual ~Program(); - virtual bool freeChildren(); - - void bindAllocation(Context *, Allocation *, uint32_t slot); - - bool isUserProgram() const {return !mIsInternal;} - - void bindTexture(Context *, uint32_t slot, Allocation *); - void bindSampler(Context *, uint32_t slot, Sampler *); - -protected: - ObjectBaseRef<Allocation> *mTextures; - ObjectBaseRef<Sampler> *mSamplers; - ObjectBaseRef<Allocation> *mConstants; - ObjectBaseRef<Type> *mConstantTypes; - ObjectBaseRef<Element> *mInputElements; - - bool mIsInternal; - String8 mUserShader; - void initMemberVars(); -}; - -} -} -#endif // ANDROID_RS_PROGRAM_H - - - diff --git a/libs/rs/rsProgramBase.h b/libs/rs/rsProgramBase.h deleted file mode 100644 index 80da453..0000000 --- a/libs/rs/rsProgramBase.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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_PROGRAM_BASE_H -#define ANDROID_RS_PROGRAM_BASE_H - -#include "rsObjectBase.h" -#include "rsElement.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class ProgramBase : public ObjectBase { -public: - ProgramBase(Context *rsc) : ObjectBase(rsc) { - mDirty = true; - } - - void forceDirty() const {mDirty = true;} - -protected: - mutable bool mDirty; -}; - -} -} -#endif // ANDROID_RS_PROGRAM_BASE_H - - - diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp deleted file mode 100644 index bebde1e..0000000 --- a/libs/rs/rsProgramFragment.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2009 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" -#include "rsProgramFragment.h" - -using namespace android; -using namespace android::renderscript; - -ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, size_t shaderLength, - const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength, - - const uint32_t * params, size_t paramLength) - : Program(rsc, shaderText, shaderLength, params, paramLength) { - mConstantColor[0] = 1.f; - mConstantColor[1] = 1.f; - mConstantColor[2] = 1.f; - mConstantColor[3] = 1.f; - - mRSC->mHal.funcs.fragment.init(mRSC, this, mUserShader.string(), mUserShader.length(), - textureNames, textureNamesCount, textureNamesLength); -} - -ProgramFragment::~ProgramFragment() { - mRSC->mHal.funcs.fragment.destroy(mRSC, this); -} - -void ProgramFragment::setConstantColor(Context *rsc, float r, float g, float b, float a) { - if (isUserProgram()) { - ALOGE("Attempting to set fixed function emulation color on user program"); - rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set fixed function emulation color on user program"); - return; - } - if (mHal.state.constants[0] == NULL) { - ALOGE("Unable to set fixed function emulation color because allocation is missing"); - rsc->setError(RS_ERROR_BAD_SHADER, "Unable to set fixed function emulation color because allocation is missing"); - return; - } - mConstantColor[0] = r; - mConstantColor[1] = g; - mConstantColor[2] = b; - mConstantColor[3] = a; - memcpy(mHal.state.constants[0]->getPtr(), mConstantColor, 4*sizeof(float)); - mDirty = true; -} - -void ProgramFragment::setup(Context *rsc, ProgramFragmentState *state) { - if ((state->mLast.get() == this) && !mDirty) { - return; - } - state->mLast.set(this); - - for (uint32_t ct=0; ct < mHal.state.texturesCount; ct++) { - if (!mHal.state.textures[ct]) { - ALOGE("No texture bound for shader id %u, texture unit %u", (uint)this, ct); - rsc->setError(RS_ERROR_BAD_SHADER, "No texture bound"); - continue; - } - } - - rsc->mHal.funcs.fragment.setActive(rsc, this); -} - -void ProgramFragment::serialize(OStream *stream) const { -} - -ProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - -ProgramFragmentState::ProgramFragmentState() { - mPF = NULL; -} - -ProgramFragmentState::~ProgramFragmentState() { - ObjectBase::checkDelete(mPF); - mPF = NULL; -} - -void ProgramFragmentState::init(Context *rsc) { - String8 shaderString(RS_SHADER_INTERNAL); - shaderString.append("varying lowp vec4 varColor;\n"); - shaderString.append("varying vec2 varTex0;\n"); - shaderString.append("void main() {\n"); - shaderString.append(" lowp vec4 col = UNI_Color;\n"); - shaderString.append(" gl_FragColor = col;\n"); - shaderString.append("}\n"); - - ObjectBaseRef<const Element> colorElem = Element::createRef(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); - Element::Builder builder; - builder.add(colorElem.get(), "Color", 1); - ObjectBaseRef<const Element> constInput = builder.create(rsc); - - ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false); - - uint32_t tmp[2]; - tmp[0] = RS_PROGRAM_PARAM_CONSTANT; - tmp[1] = (uint32_t)inputType.get(); - - Allocation *constAlloc = Allocation::createAllocation(rsc, inputType.get(), - RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS); - ProgramFragment *pf = new ProgramFragment(rsc, shaderString.string(), shaderString.length(), - NULL, 0, NULL, tmp, 2); - pf->bindAllocation(rsc, constAlloc, 0); - pf->setConstantColor(rsc, 1.0f, 1.0f, 1.0f, 1.0f); - - mDefault.set(pf); -} - -void ProgramFragmentState::deinit(Context *rsc) { - mDefault.clear(); - mLast.clear(); -} - -namespace android { -namespace renderscript { - -RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc, const char * shaderText, - size_t shaderLength, - const char** textureNames, - size_t textureNamesCount, - const size_t *textureNamesLength, - const uint32_t * params, size_t paramLength) { - ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, - textureNames, textureNamesCount, textureNamesLength, - params, paramLength); - pf->incUserRef(); - //ALOGE("rsi_ProgramFragmentCreate %p", pf); - return pf; -} - -} -} - diff --git a/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h deleted file mode 100644 index 4eb28e7..0000000 --- a/libs/rs/rsProgramFragment.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2009 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_PROGRAM_FRAGMENT_H -#define ANDROID_RS_PROGRAM_FRAGMENT_H - -#include "rsProgram.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class ProgramFragmentState; - -class ProgramFragment : public Program { -public: - ProgramFragment(Context *rsc, const char * shaderText, size_t shaderLength, - const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength, - const uint32_t * params, size_t paramLength); - virtual ~ProgramFragment(); - - virtual void setup(Context *, ProgramFragmentState *); - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_FRAGMENT; } - static ProgramFragment *createFromStream(Context *rsc, IStream *stream); - - void setConstantColor(Context *, float, float, float, float); - -protected: - float mConstantColor[4]; - int32_t mTextureUniformIndexStart; -}; - -class ProgramFragmentState { -public: - ProgramFragmentState(); - ~ProgramFragmentState(); - - ProgramFragment *mPF; - void init(Context *rsc); - void deinit(Context *rsc); - - ObjectBaseRef<ProgramFragment> mDefault; - Vector<ProgramFragment *> mPrograms; - - ObjectBaseRef<ProgramFragment> mLast; -}; - -} -} -#endif - - - - diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp deleted file mode 100644 index 94bfe42..0000000 --- a/libs/rs/rsProgramRaster.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2009 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" -#include "rsProgramRaster.h" - -using namespace android; -using namespace android::renderscript; - - -ProgramRaster::ProgramRaster(Context *rsc, bool pointSprite, RsCullMode cull) - : ProgramBase(rsc) { - - memset(&mHal, 0, sizeof(mHal)); - mHal.state.pointSprite = pointSprite; - mHal.state.cull = cull; - rsc->mHal.funcs.raster.init(rsc, this); -} - -void ProgramRaster::preDestroy() const { - for (uint32_t ct = 0; ct < mRSC->mStateRaster.mRasterPrograms.size(); ct++) { - if (mRSC->mStateRaster.mRasterPrograms[ct] == this) { - mRSC->mStateRaster.mRasterPrograms.removeAt(ct); - break; - } - } -} - -ProgramRaster::~ProgramRaster() { - mRSC->mHal.funcs.raster.destroy(mRSC, this); -} - -void ProgramRaster::setup(const Context *rsc, ProgramRasterState *state) { - if (state->mLast.get() == this && !mDirty) { - return; - } - state->mLast.set(this); - mDirty = false; - - rsc->mHal.funcs.raster.setActive(rsc, this); -} - -void ProgramRaster::serialize(OStream *stream) const { -} - -ProgramRaster *ProgramRaster::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - -ProgramRasterState::ProgramRasterState() { -} - -ProgramRasterState::~ProgramRasterState() { -} - -void ProgramRasterState::init(Context *rsc) { - mDefault.set(ProgramRaster::getProgramRaster(rsc, false, RS_CULL_BACK).get()); -} - -void ProgramRasterState::deinit(Context *rsc) { - mDefault.clear(); - mLast.clear(); -} - -ObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc, - bool pointSprite, - RsCullMode cull) { - ObjectBaseRef<ProgramRaster> returnRef; - ObjectBase::asyncLock(); - for (uint32_t ct = 0; ct < rsc->mStateRaster.mRasterPrograms.size(); ct++) { - ProgramRaster *existing = rsc->mStateRaster.mRasterPrograms[ct]; - if (existing->mHal.state.pointSprite != pointSprite) continue; - if (existing->mHal.state.cull != cull) continue; - returnRef.set(existing); - ObjectBase::asyncUnlock(); - return returnRef; - } - ObjectBase::asyncUnlock(); - - ProgramRaster *pr = new ProgramRaster(rsc, pointSprite, cull); - returnRef.set(pr); - - ObjectBase::asyncLock(); - rsc->mStateRaster.mRasterPrograms.push(pr); - ObjectBase::asyncUnlock(); - - return returnRef; -} - -namespace android { -namespace renderscript { - -RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSprite, RsCullMode cull) { - ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSprite, cull); - pr->incUserRef(); - return pr.get(); -} - -} -} - diff --git a/libs/rs/rsProgramRaster.h b/libs/rs/rsProgramRaster.h deleted file mode 100644 index c552ea3..0000000 --- a/libs/rs/rsProgramRaster.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2009-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_PROGRAM_RASTER_H -#define ANDROID_RS_PROGRAM_RASTER_H - -#include "rsProgramBase.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class ProgramRasterState; -/***************************************************************************** - * CAUTION - * - * Any layout changes for this class may require a corresponding change to be - * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains - * a partial copy of the information below. - * - *****************************************************************************/ -class ProgramRaster : public ProgramBase { -public: - struct Hal { - mutable void *drv; - - struct State { - bool pointSprite; - RsCullMode cull; - }; - State state; - }; - Hal mHal; - - virtual void setup(const Context *, ProgramRasterState *); - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_RASTER; } - static ProgramRaster *createFromStream(Context *rsc, IStream *stream); - - static ObjectBaseRef<ProgramRaster> getProgramRaster(Context *rsc, - bool pointSprite, - RsCullMode cull); -protected: - virtual void preDestroy() const; - virtual ~ProgramRaster(); - -private: - ProgramRaster(Context *rsc, - bool pointSprite, - RsCullMode cull); - -}; - -class ProgramRasterState { -public: - ProgramRasterState(); - ~ProgramRasterState(); - void init(Context *rsc); - void deinit(Context *rsc); - - ObjectBaseRef<ProgramRaster> mDefault; - ObjectBaseRef<ProgramRaster> mLast; - - // Cache of all existing raster programs. - Vector<ProgramRaster *> mRasterPrograms; -}; - - -} -} -#endif - - - - diff --git a/libs/rs/rsProgramStore.cpp b/libs/rs/rsProgramStore.cpp deleted file mode 100644 index 7e25a22..0000000 --- a/libs/rs/rsProgramStore.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2009 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" -#include "rsProgramStore.h" - -using namespace android; -using namespace android::renderscript; - - -ProgramStore::ProgramStore(Context *rsc, - bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA, - bool depthMask, bool ditherEnable, - RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc, - RsDepthFunc depthFunc) : ProgramBase(rsc) { - memset(&mHal, 0, sizeof(mHal)); - - mHal.state.ditherEnable = ditherEnable; - - mHal.state.colorRWriteEnable = colorMaskR; - mHal.state.colorGWriteEnable = colorMaskG; - mHal.state.colorBWriteEnable = colorMaskB; - mHal.state.colorAWriteEnable = colorMaskA; - mHal.state.blendSrc = srcFunc; - mHal.state.blendDst = destFunc; - - mHal.state.depthWriteEnable = depthMask; - mHal.state.depthFunc = depthFunc; -} - -void ProgramStore::preDestroy() const { - for (uint32_t ct = 0; ct < mRSC->mStateFragmentStore.mStorePrograms.size(); ct++) { - if (mRSC->mStateFragmentStore.mStorePrograms[ct] == this) { - mRSC->mStateFragmentStore.mStorePrograms.removeAt(ct); - break; - } - } -} - -ProgramStore::~ProgramStore() { - mRSC->mHal.funcs.store.destroy(mRSC, this); -} - -void ProgramStore::setup(const Context *rsc, ProgramStoreState *state) { - if (state->mLast.get() == this) { - return; - } - state->mLast.set(this); - - rsc->mHal.funcs.store.setActive(rsc, this); -} - -void ProgramStore::serialize(OStream *stream) const { -} - -ProgramStore *ProgramStore::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - -void ProgramStore::init() { - mRSC->mHal.funcs.store.init(mRSC, this); -} - -ProgramStoreState::ProgramStoreState() { -} - -ProgramStoreState::~ProgramStoreState() { -} - -ObjectBaseRef<ProgramStore> ProgramStore::getProgramStore(Context *rsc, - bool colorMaskR, - bool colorMaskG, - bool colorMaskB, - bool colorMaskA, - bool depthMask, bool ditherEnable, - RsBlendSrcFunc srcFunc, - RsBlendDstFunc destFunc, - RsDepthFunc depthFunc) { - ObjectBaseRef<ProgramStore> returnRef; - ObjectBase::asyncLock(); - for (uint32_t ct = 0; ct < rsc->mStateFragmentStore.mStorePrograms.size(); ct++) { - ProgramStore *existing = rsc->mStateFragmentStore.mStorePrograms[ct]; - if (existing->mHal.state.ditherEnable != ditherEnable) continue; - if (existing->mHal.state.colorRWriteEnable != colorMaskR) continue; - if (existing->mHal.state.colorGWriteEnable != colorMaskG) continue; - if (existing->mHal.state.colorBWriteEnable != colorMaskB) continue; - if (existing->mHal.state.colorAWriteEnable != colorMaskA) continue; - if (existing->mHal.state.blendSrc != srcFunc) continue; - if (existing->mHal.state.blendDst != destFunc) continue; - if (existing->mHal.state.depthWriteEnable != depthMask) continue; - if (existing->mHal.state.depthFunc != depthFunc) continue; - - returnRef.set(existing); - ObjectBase::asyncUnlock(); - return returnRef; - } - ObjectBase::asyncUnlock(); - - ProgramStore *pfs = new ProgramStore(rsc, - colorMaskR, colorMaskG, colorMaskB, colorMaskA, - depthMask, ditherEnable, - srcFunc, destFunc, depthFunc); - returnRef.set(pfs); - - pfs->init(); - - ObjectBase::asyncLock(); - rsc->mStateFragmentStore.mStorePrograms.push(pfs); - ObjectBase::asyncUnlock(); - - return returnRef; -} - - - -void ProgramStoreState::init(Context *rsc) { - mDefault.set(ProgramStore::getProgramStore(rsc, - true, true, true, true, - true, true, - RS_BLEND_SRC_ONE, RS_BLEND_DST_ZERO, - RS_DEPTH_FUNC_LESS).get()); -} - -void ProgramStoreState::deinit(Context *rsc) { - mDefault.clear(); - mLast.clear(); -} - - -namespace android { -namespace renderscript { - -RsProgramStore rsi_ProgramStoreCreate(Context *rsc, - bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA, - bool depthMask, bool ditherEnable, - RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc, - RsDepthFunc depthFunc) { - - - ObjectBaseRef<ProgramStore> ps = ProgramStore::getProgramStore(rsc, - colorMaskR, colorMaskG, - colorMaskB, colorMaskA, - depthMask, ditherEnable, - srcFunc, destFunc, depthFunc); - ps->incUserRef(); - return ps.get(); -} - -} -} diff --git a/libs/rs/rsProgramStore.h b/libs/rs/rsProgramStore.h deleted file mode 100644 index 9bb2795..0000000 --- a/libs/rs/rsProgramStore.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * 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_PROGRAM_FRAGMENT_STORE_H -#define ANDROID_RS_PROGRAM_FRAGMENT_STORE_H - -#include "rsProgramBase.h" -#include "rsStream.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class ProgramStoreState; -/***************************************************************************** - * CAUTION - * - * Any layout changes for this class may require a corresponding change to be - * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains - * a partial copy of the information below. - * - *****************************************************************************/ -class ProgramStore : public ProgramBase { -public: - struct Hal { - mutable void *drv; - - struct State { - bool ditherEnable; - - //bool blendEnable; - bool colorRWriteEnable; - bool colorGWriteEnable; - bool colorBWriteEnable; - bool colorAWriteEnable; - RsBlendSrcFunc blendSrc; - RsBlendDstFunc blendDst; - - //bool depthTestEnable; - bool depthWriteEnable; - RsDepthFunc depthFunc; - }; - State state; - }; - Hal mHal; - - virtual void setup(const Context *, ProgramStoreState *); - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_STORE; } - static ProgramStore *createFromStream(Context *rsc, IStream *stream); - static ObjectBaseRef<ProgramStore> getProgramStore(Context *, - bool colorMaskR, bool colorMaskG, - bool colorMaskB, bool colorMaskA, - bool depthMask, bool ditherEnable, - RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc, - RsDepthFunc depthFunc); - void init(); -protected: - virtual void preDestroy() const; - virtual ~ProgramStore(); - -private: - ProgramStore(Context *, - bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA, - bool depthMask, bool ditherEnable, - RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc, - RsDepthFunc depthFunc); -}; - -class ProgramStoreState { -public: - ProgramStoreState(); - ~ProgramStoreState(); - void init(Context *rsc); - void deinit(Context *rsc); - - ObjectBaseRef<ProgramStore> mDefault; - ObjectBaseRef<ProgramStore> mLast; - - // Cache of all existing store programs. - Vector<ProgramStore *> mStorePrograms; -}; - -} -} -#endif - - - diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp deleted file mode 100644 index 23fcbe7..0000000 --- a/libs/rs/rsProgramVertex.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - * 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" -#include "rsProgramVertex.h" -#include "rsMatrix4x4.h" - -using namespace android; -using namespace android::renderscript; - - -ProgramVertex::ProgramVertex(Context *rsc, const char * shaderText, size_t shaderLength, - const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength, - - const uint32_t * params, size_t paramLength) - : Program(rsc, shaderText, shaderLength, params, paramLength) { - mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader.string(), mUserShader.length(), - textureNames, textureNamesCount, textureNamesLength); -} - -ProgramVertex::~ProgramVertex() { - mRSC->mHal.funcs.vertex.destroy(mRSC, this); -} - -void ProgramVertex::setup(Context *rsc, ProgramVertexState *state) { - if ((state->mLast.get() == this) && !mDirty) { - return; - } - - if (!isUserProgram()) { - if (mHal.state.constants[0] == NULL) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Unable to set fixed function emulation matrices because allocation is missing"); - return; - } - float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); - Matrix4x4 mvp; - mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); - Matrix4x4 t; - t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]); - mvp.multiply(&t); - for (uint32_t i = 0; i < 16; i ++) { - f[RS_PROGRAM_VERTEX_MVP_OFFSET + i] = mvp.m[i]; - } - } - - state->mLast.set(this); - - rsc->mHal.funcs.vertex.setActive(rsc, this); -} - -void ProgramVertex::setProjectionMatrix(Context *rsc, const rsc_Matrix *m) const { - if (isUserProgram()) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Attempting to set fixed function emulation matrix projection on user program"); - return; - } - if (mHal.state.constants[0] == NULL) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Unable to set fixed function emulation matrix projection because allocation is missing"); - return; - } - float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); - memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix)); - mDirty = true; -} - -void ProgramVertex::setModelviewMatrix(Context *rsc, const rsc_Matrix *m) const { - if (isUserProgram()) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Attempting to set fixed function emulation matrix modelview on user program"); - return; - } - if (mHal.state.constants[0] == NULL) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Unable to set fixed function emulation matrix modelview because allocation is missing"); - return; - } - float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); - memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix)); - mDirty = true; -} - -void ProgramVertex::setTextureMatrix(Context *rsc, const rsc_Matrix *m) const { - if (isUserProgram()) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Attempting to set fixed function emulation matrix texture on user program"); - return; - } - if (mHal.state.constants[0] == NULL) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Unable to set fixed function emulation matrix texture because allocation is missing"); - return; - } - float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); - memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix)); - mDirty = true; -} - -void ProgramVertex::getProjectionMatrix(Context *rsc, rsc_Matrix *m) const { - if (isUserProgram()) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Attempting to get fixed function emulation matrix projection on user program"); - return; - } - if (mHal.state.constants[0] == NULL) { - rsc->setError(RS_ERROR_FATAL_UNKNOWN, - "Unable to get fixed function emulation matrix projection because allocation is missing"); - return; - } - float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); - memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix)); -} - -void ProgramVertex::transformToScreen(Context *rsc, float *v4out, const float *v3in) const { - if (isUserProgram()) { - return; - } - float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); - Matrix4x4 mvp; - mvp.loadMultiply((Matrix4x4 *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], - (Matrix4x4 *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); - mvp.vectorMultiply(v4out, v3in); -} - -void ProgramVertex::serialize(OStream *stream) const { -} - -ProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - - -/////////////////////////////////////////////////////////////////////// - -ProgramVertexState::ProgramVertexState() { -} - -ProgramVertexState::~ProgramVertexState() { -} - -void ProgramVertexState::init(Context *rsc) { - ObjectBaseRef<const Element> matrixElem = Element::createRef(rsc, RS_TYPE_MATRIX_4X4, - RS_KIND_USER, false, 1); - ObjectBaseRef<const Element> f2Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32, - RS_KIND_USER, false, 2); - ObjectBaseRef<const Element> f3Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32, - RS_KIND_USER, false, 3); - ObjectBaseRef<const Element> f4Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32, - RS_KIND_USER, false, 4); - - Element::Builder constBuilder; - constBuilder.add(matrixElem.get(), "MV", 1); - constBuilder.add(matrixElem.get(), "P", 1); - constBuilder.add(matrixElem.get(), "TexMatrix", 1); - constBuilder.add(matrixElem.get(), "MVP", 1); - ObjectBaseRef<const Element> constInput = constBuilder.create(rsc); - - Element::Builder inputBuilder; - inputBuilder.add(f4Elem.get(), "position", 1); - inputBuilder.add(f4Elem.get(), "color", 1); - inputBuilder.add(f3Elem.get(), "normal", 1); - inputBuilder.add(f2Elem.get(), "texture0", 1); - ObjectBaseRef<const Element> attrElem = inputBuilder.create(rsc); - - ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false); - - String8 shaderString(RS_SHADER_INTERNAL); - shaderString.append("varying vec4 varColor;\n"); - shaderString.append("varying vec2 varTex0;\n"); - shaderString.append("void main() {\n"); - shaderString.append(" gl_Position = UNI_MVP * ATTRIB_position;\n"); - shaderString.append(" gl_PointSize = 1.0;\n"); - shaderString.append(" varColor = ATTRIB_color;\n"); - shaderString.append(" varTex0 = ATTRIB_texture0;\n"); - shaderString.append("}\n"); - - uint32_t tmp[4]; - tmp[0] = RS_PROGRAM_PARAM_CONSTANT; - tmp[1] = (uint32_t)inputType.get(); - tmp[2] = RS_PROGRAM_PARAM_INPUT; - tmp[3] = (uint32_t)attrElem.get(); - - ProgramVertex *pv = new ProgramVertex(rsc, shaderString.string(), shaderString.length(), - NULL, 0, NULL, tmp, 4); - Allocation *alloc = Allocation::createAllocation(rsc, inputType.get(), - RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS); - pv->bindAllocation(rsc, alloc, 0); - - mDefaultAlloc.set(alloc); - mDefault.set(pv); - - updateSize(rsc); -} - -void ProgramVertexState::updateSize(Context *rsc) { - float *f = static_cast<float *>(mDefaultAlloc->getPtr()); - - float surfaceWidth = (float)rsc->getCurrentSurfaceWidth(); - float surfaceHeight = (float)rsc->getCurrentSurfaceHeight(); - - Matrix4x4 m; - m.loadOrtho(0, surfaceWidth, surfaceHeight, 0, -1, 1); - memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m.m, sizeof(m)); - memcpy(&f[RS_PROGRAM_VERTEX_MVP_OFFSET], m.m, sizeof(m)); - - m.loadIdentity(); - memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m.m, sizeof(m)); - memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m.m, sizeof(m)); -} - -void ProgramVertexState::deinit(Context *rsc) { - mDefaultAlloc.clear(); - mDefault.clear(); - mLast.clear(); -} - - -namespace android { -namespace renderscript { - -RsProgramVertex rsi_ProgramVertexCreate(Context *rsc, const char * shaderText, size_t shaderLength, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength, - const uint32_t * params, size_t paramLength) { - ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, - textureNames, textureNamesCount, textureNamesLength, - params, paramLength); - pv->incUserRef(); - return pv; -} - -} -} diff --git a/libs/rs/rsProgramVertex.h b/libs/rs/rsProgramVertex.h deleted file mode 100644 index 67c2a88..0000000 --- a/libs/rs/rsProgramVertex.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2009 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_PROGRAM_VERTEX_H -#define ANDROID_RS_PROGRAM_VERTEX_H - -#include "rsProgram.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class ProgramVertexState; - -class ProgramVertex : public Program { -public: - ProgramVertex(Context *,const char * shaderText, size_t shaderLength, - const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength, - const uint32_t * params, size_t paramLength); - virtual ~ProgramVertex(); - - virtual void setup(Context *rsc, ProgramVertexState *state); - - void setProjectionMatrix(Context *, const rsc_Matrix *) const; - void getProjectionMatrix(Context *, rsc_Matrix *) const; - void setModelviewMatrix(Context *, const rsc_Matrix *) const; - void setTextureMatrix(Context *, const rsc_Matrix *) const; - - void transformToScreen(Context *, float *v4out, const float *v3in) const; - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_VERTEX; } - static ProgramVertex *createFromStream(Context *rsc, IStream *stream); -}; - -class ProgramVertexState { -public: - ProgramVertexState(); - ~ProgramVertexState(); - - void init(Context *rsc); - void deinit(Context *rsc); - void updateSize(Context *rsc); - - ObjectBaseRef<ProgramVertex> mDefault; - ObjectBaseRef<ProgramVertex> mLast; - ObjectBaseRef<Allocation> mDefaultAlloc; -}; - -} -} -#endif - - diff --git a/libs/rs/rsRuntime.h b/libs/rs/rsRuntime.h deleted file mode 100644 index 64f2de8..0000000 --- a/libs/rs/rsRuntime.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (C) 2009 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" -#include "rsScriptC.h" - -#include "utils/Timers.h" - -#include <time.h> - -namespace android { -namespace renderscript { - - -////////////////////////////////////////////////////////////////////////////// -// Context -////////////////////////////////////////////////////////////////////////////// - -void rsrBindTexture(Context *, Script *, ProgramFragment *, uint32_t slot, Allocation *); -void rsrBindConstant(Context *, Script *, ProgramFragment *, uint32_t slot, Allocation *); -void rsrBindConstant(Context *, Script *, ProgramVertex*, uint32_t slot, Allocation *); -void rsrBindSampler(Context *, Script *, ProgramFragment *, uint32_t slot, Sampler *); -void rsrBindProgramStore(Context *, Script *, ProgramStore *); -void rsrBindProgramFragment(Context *, Script *, ProgramFragment *); -void rsrBindProgramVertex(Context *, Script *, ProgramVertex *); -void rsrBindProgramRaster(Context *, Script *, ProgramRaster *); -void rsrBindFrameBufferObjectColorTarget(Context *, Script *, Allocation *, uint32_t slot); -void rsrBindFrameBufferObjectDepthTarget(Context *, Script *, Allocation *); -void rsrClearFrameBufferObjectColorTarget(Context *, Script *, uint32_t slot); -void rsrClearFrameBufferObjectDepthTarget(Context *, Script *); -void rsrClearFrameBufferObjectTargets(Context *, Script *); - -////////////////////////////////////////////////////////////////////////////// -// VP -////////////////////////////////////////////////////////////////////////////// - -void rsrVpLoadProjectionMatrix(Context *, Script *, const rsc_Matrix *m); -void rsrVpLoadModelMatrix(Context *, Script *, const rsc_Matrix *m); -void rsrVpLoadTextureMatrix(Context *, Script *, const rsc_Matrix *m); -void rsrPfConstantColor(Context *, Script *, ProgramFragment *, float r, float g, float b, float a); -void rsrVpGetProjectionMatrix(Context *, Script *, rsc_Matrix *m); - -////////////////////////////////////////////////////////////////////////////// -// Drawing -////////////////////////////////////////////////////////////////////////////// - -void rsrDrawQuadTexCoords(Context *, Script *, - float x1, float y1, float z1, float u1, float v1, - float x2, float y2, float z2, float u2, float v2, - float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4); -void rsrDrawQuad(Context *, Script *, - float x1, float y1, float z1, - float x2, float y2, float z2, - float x3, float y3, float z3, - float x4, float y4, float z4); -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 *, - uint32_t primIndex, uint32_t start, uint32_t len); -void rsrMeshComputeBoundingBox(Context *, Script *, Mesh *, - float *minX, float *minY, float *minZ, - float *maxX, float *maxY, float *maxZ); - - -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// - - -void rsrColor(Context *, Script *, float r, float g, float b, float a); -void rsrAllocationSyncAll(Context *, Script *, Allocation *); - -void rsrAllocationCopy1DRange(Context *, Allocation *dstAlloc, - uint32_t dstOff, - uint32_t dstMip, - uint32_t count, - Allocation *srcAlloc, - uint32_t srcOff, uint32_t srcMip); -void rsrAllocationCopy2DRange(Context *, Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, - uint32_t dstMip, uint32_t dstFace, - uint32_t width, uint32_t height, - Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, - uint32_t srcMip, uint32_t srcFace); - -void rsrPrepareClear(Context *, Script *); -uint32_t rsrGetWidth(Context *, Script *); -uint32_t rsrGetHeight(Context *, Script *); -void rsrDrawTextAlloc(Context *, Script *, Allocation *, int x, int y); -void rsrDrawText(Context *, Script *, const char *text, int x, int y); -void rsrSetMetrics(Context *, Script *, Font::Rect *metrics, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom); -void rsrMeasureTextAlloc(Context *, Script *, Allocation *, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom); -void rsrMeasureText(Context *, Script *, const char *text, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom); -void rsrBindFont(Context *, Script *, Font *); -void rsrFontColor(Context *, Script *, float r, float g, float b, float a); - -////////////////////////////////////////////////////////////////////////////// -// Time routines -////////////////////////////////////////////////////////////////////////////// - -float rsrGetDt(Context *, Script *); -time_t rsrTime(Context *, Script *, time_t *timer); -tm* rsrLocalTime(Context *, Script *, tm *local, time_t *timer); -int64_t rsrUptimeMillis(Context *, Script *); -int64_t rsrUptimeNanos(Context *, Script *); - -////////////////////////////////////////////////////////////////////////////// -// Message routines -////////////////////////////////////////////////////////////////////////////// - -uint32_t rsrToClient(Context *, Script *, int cmdID, void *data, int len); -uint32_t rsrToClientBlocking(Context *, Script *, int cmdID, void *data, int len); - -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// - -void rsrSetObject(const Context *, const Script *, ObjectBase **dst, ObjectBase * src); -void rsrClearObject(const Context *, const Script *, ObjectBase **dst); -bool rsrIsObject(const Context *, const Script *, const ObjectBase *src); - -void rsrAllocationIncRefs(const Context *, const Allocation *, void *ptr, - size_t elementCount, size_t startOffset); -void rsrAllocationDecRefs(const Context *, const Allocation *, void *ptr, - size_t elementCount, size_t startOffset); - - -uint32_t rsrToClient(Context *, Script *, int cmdID, void *data, int len); -uint32_t rsrToClientBlocking(Context *, Script *, int cmdID, void *data, int len); -const Allocation * rsrGetAllocation(Context *, Script *, const void *ptr); - -void rsrAllocationMarkDirty(Context *, Script *, RsAllocation a); -void rsrAllocationSyncAll(Context *, Script *, Allocation *a, RsAllocationUsageType source); - - -void rsrForEach(Context *, Script *, Script *target, - Allocation *in, - Allocation *out, - const void *usr, - uint32_t usrBytes, - const RsScriptCall *call); - - -////////////////////////////////////////////////////////////////////////////// -// Heavy math functions -////////////////////////////////////////////////////////////////////////////// - - -void rsrMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v); -float rsrMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col); -void rsrMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v); -float rsrMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col); -void rsrMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v); -float rsrMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col); -void rsrMatrixLoadIdentity_4x4(rs_matrix4x4 *m); -void rsrMatrixLoadIdentity_3x3(rs_matrix3x3 *m); -void rsrMatrixLoadIdentity_2x2(rs_matrix2x2 *m); -void rsrMatrixLoad_4x4_f(rs_matrix4x4 *m, const float *v); -void rsrMatrixLoad_3x3_f(rs_matrix3x3 *m, const float *v); -void rsrMatrixLoad_2x2_f(rs_matrix2x2 *m, const float *v); -void rsrMatrixLoad_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *v); -void rsrMatrixLoad_4x4_3x3(rs_matrix4x4 *m, const rs_matrix3x3 *v); -void rsrMatrixLoad_4x4_2x2(rs_matrix4x4 *m, const rs_matrix2x2 *v); -void rsrMatrixLoad_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *v); -void rsrMatrixLoad_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *v); -void rsrMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); -void rsrMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z); -void rsrMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z); -void rsrMatrixLoadMultiply_4x4_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, - const rs_matrix4x4 *rhs); -void rsrMatrixMultiply_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *rhs); -void rsrMatrixLoadMultiply_3x3_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, - const rs_matrix3x3 *rhs); -void rsrMatrixMultiply_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *rhs); -void rsrMatrixLoadMultiply_2x2_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, - const rs_matrix2x2 *rhs); -void rsrMatrixMultiply_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *rhs); -void rsrMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); -void rsrMatrixScale(rs_matrix4x4 *m, float x, float y, float z); -void rsrMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z); -void rsrMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, - float bottom, float top, float near, float far); -void rsrMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, - float bottom, float top, float near, float far); -void rsrMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far); - -// Returns true if the matrix was successfully inversed -bool rsrMatrixInverse_4x4(rs_matrix4x4 *m); -// Returns true if the matrix was successfully inversed -bool rsrMatrixInverseTranspose_4x4(rs_matrix4x4 *m); - -void rsrMatrixTranspose_4x4(rs_matrix4x4 *m); -void rsrMatrixTranspose_3x3(rs_matrix3x3 *m); -void rsrMatrixTranspose_2x2(rs_matrix2x2 *m); - -} -} diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp deleted file mode 100644 index c7180bd..0000000 --- a/libs/rs/rsSampler.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2009 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" -#include "rsSampler.h" -#include "rs.h" - -using namespace android; -using namespace android::renderscript; - - -Sampler::Sampler(Context *rsc) : ObjectBase(rsc) { - // Should not get called. - rsAssert(0); -} - -Sampler::Sampler(Context *rsc, - RsSamplerValue magFilter, - RsSamplerValue minFilter, - RsSamplerValue wrapS, - RsSamplerValue wrapT, - RsSamplerValue wrapR, - float aniso) : ObjectBase(rsc) { - mHal.state.magFilter = magFilter; - mHal.state.minFilter = minFilter; - mHal.state.wrapS = wrapS; - mHal.state.wrapT = wrapT; - mHal.state.wrapR = wrapR; - mHal.state.aniso = aniso; - - mRSC->mHal.funcs.sampler.init(mRSC, this); -} - -Sampler::~Sampler() { - mRSC->mHal.funcs.sampler.destroy(mRSC, this); -} - -void Sampler::preDestroy() const { - for (uint32_t ct = 0; ct < mRSC->mStateSampler.mAllSamplers.size(); ct++) { - if (mRSC->mStateSampler.mAllSamplers[ct] == this) { - mRSC->mStateSampler.mAllSamplers.removeAt(ct); - break; - } - } -} - -void Sampler::bindToContext(SamplerState *ss, uint32_t slot) { - ss->mSamplers[slot].set(this); - mBoundSlot = slot; -} - -void Sampler::unbindFromContext(SamplerState *ss) { - int32_t slot = mBoundSlot; - mBoundSlot = -1; - ss->mSamplers[slot].clear(); -} - -void Sampler::serialize(OStream *stream) const { -} - -Sampler *Sampler::createFromStream(Context *rsc, IStream *stream) { - return NULL; -} - -ObjectBaseRef<Sampler> Sampler::getSampler(Context *rsc, - RsSamplerValue magFilter, - RsSamplerValue minFilter, - RsSamplerValue wrapS, - RsSamplerValue wrapT, - RsSamplerValue wrapR, - float aniso) { - ObjectBaseRef<Sampler> returnRef; - ObjectBase::asyncLock(); - for (uint32_t ct = 0; ct < rsc->mStateSampler.mAllSamplers.size(); ct++) { - Sampler *existing = rsc->mStateSampler.mAllSamplers[ct]; - if (existing->mHal.state.magFilter != magFilter) continue; - if (existing->mHal.state.minFilter != minFilter ) continue; - if (existing->mHal.state.wrapS != wrapS) continue; - if (existing->mHal.state.wrapT != wrapT) continue; - if (existing->mHal.state.wrapR != wrapR) continue; - if (existing->mHal.state.aniso != aniso) continue; - returnRef.set(existing); - ObjectBase::asyncUnlock(); - return returnRef; - } - ObjectBase::asyncUnlock(); - - Sampler *s = new Sampler(rsc, magFilter, minFilter, wrapS, wrapT, wrapR, aniso); - returnRef.set(s); - - ObjectBase::asyncLock(); - rsc->mStateSampler.mAllSamplers.push(s); - ObjectBase::asyncUnlock(); - - return returnRef; -} - -//////////////////////////////// - -namespace android { -namespace renderscript { - -RsSampler rsi_SamplerCreate(Context * rsc, - RsSamplerValue magFilter, - RsSamplerValue minFilter, - RsSamplerValue wrapS, - RsSamplerValue wrapT, - RsSamplerValue wrapR, - float aniso) { - ObjectBaseRef<Sampler> s = Sampler::getSampler(rsc, magFilter, minFilter, - wrapS, wrapT, wrapR, aniso); - s->incUserRef(); - return s.get(); -} - -}} diff --git a/libs/rs/rsSampler.h b/libs/rs/rsSampler.h deleted file mode 100644 index dea4cb6..0000000 --- a/libs/rs/rsSampler.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2009 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_SAMPLER_H -#define ANDROID_RS_SAMPLER_H - -#include "rsAllocation.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -const static uint32_t RS_MAX_SAMPLER_SLOT = 16; - -class SamplerState; -/***************************************************************************** - * CAUTION - * - * Any layout changes for this class may require a corresponding change to be - * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains - * a partial copy of the information below. - * - *****************************************************************************/ -class Sampler : public ObjectBase { -public: - struct Hal { - mutable void *drv; - - struct State { - RsSamplerValue magFilter; - RsSamplerValue minFilter; - RsSamplerValue wrapS; - RsSamplerValue wrapT; - RsSamplerValue wrapR; - float aniso; - }; - State state; - }; - Hal mHal; - - static ObjectBaseRef<Sampler> getSampler(Context *, - RsSamplerValue magFilter, - RsSamplerValue minFilter, - RsSamplerValue wrapS, - RsSamplerValue wrapT, - RsSamplerValue wrapR, - float aniso = 1.0f); - void bindToContext(SamplerState *, uint32_t slot); - void unbindFromContext(SamplerState *); - - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SAMPLER; } - static Sampler *createFromStream(Context *rsc, IStream *stream); - -protected: - int32_t mBoundSlot; - - virtual void preDestroy() const; - virtual ~Sampler(); - -private: - Sampler(Context *); - Sampler(Context *, - RsSamplerValue magFilter, - RsSamplerValue minFilter, - RsSamplerValue wrapS, - RsSamplerValue wrapT, - RsSamplerValue wrapR, - float aniso = 1.0f); -}; - - -class SamplerState { -public: - ObjectBaseRef<Sampler> mSamplers[RS_MAX_SAMPLER_SLOT]; - void init(Context *rsc) { - } - void deinit(Context *rsc) { - for (uint32_t i = 0; i < RS_MAX_SAMPLER_SLOT; i ++) { - mSamplers[i].clear(); - } - } - // Cache of all existing raster programs. - Vector<Sampler *> mAllSamplers; -}; - -} -} -#endif //ANDROID_RS_SAMPLER_H - - - diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp deleted file mode 100644 index 6a3bd4b..0000000 --- a/libs/rs/rsScript.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2009-2012 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" -#include <time.h> - -using namespace android; -using namespace android::renderscript; - -Script::Script(Context *rsc) : ObjectBase(rsc) { - memset(&mEnviroment, 0, sizeof(mEnviroment)); - memset(&mHal, 0, sizeof(mHal)); - - mSlots = NULL; - mTypes = NULL; - mInitialized = false; -} - -Script::~Script() { - if (mSlots) { - delete [] mSlots; - mSlots = NULL; - } - if (mTypes) { - delete [] mTypes; - mTypes = NULL; - } -} - -void Script::setSlot(uint32_t slot, Allocation *a) { - //ALOGE("setSlot %i %p", slot, a); - if (slot >= mHal.info.exportedVariableCount) { - ALOGE("Script::setSlot unable to set allocation, invalid slot index"); - return; - } - - mSlots[slot].set(a); - if (a != NULL) { - mRSC->mHal.funcs.script.setGlobalBind(mRSC, this, slot, a->getPtr()); - } else { - mRSC->mHal.funcs.script.setGlobalBind(mRSC, this, slot, NULL); - } -} - -void Script::setVar(uint32_t slot, const void *val, size_t len) { - //ALOGE("setVar %i %p %i", slot, val, len); - if (slot >= mHal.info.exportedVariableCount) { - ALOGE("Script::setVar unable to set allocation, invalid slot index"); - return; - } - mRSC->mHal.funcs.script.setGlobalVar(mRSC, this, slot, (void *)val, len); -} - -void Script::setVarObj(uint32_t slot, ObjectBase *val) { - //ALOGE("setVarObj %i %p", slot, val); - if (slot >= mHal.info.exportedVariableCount) { - ALOGE("Script::setVarObj unable to set allocation, invalid slot index"); - return; - } - //ALOGE("setvarobj %i %p", slot, val); - mRSC->mHal.funcs.script.setGlobalObj(mRSC, this, slot, val); -} - -bool Script::freeChildren() { - incSysRef(); - mRSC->mHal.funcs.script.invokeFreeChildren(mRSC, this); - return decSysRef(); -} - -namespace android { -namespace renderscript { - -void rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot) { - Script *s = static_cast<Script *>(vs); - Allocation *a = static_cast<Allocation *>(va); - s->setSlot(slot, a); - //ALOGE("rsi_ScriptBindAllocation %i %p %p", slot, a, a->getPtr()); -} - -void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, size_t length) { - // We unfortunately need to make a new copy of the string, since it is - // not NULL-terminated. We then use setenv(), which properly handles - // freeing/duplicating the actual string for the environment. - char *tz = (char *) malloc(length + 1); - if (!tz) { - ALOGE("Couldn't allocate memory for timezone buffer"); - return; - } - strncpy(tz, timeZone, length); - tz[length] = '\0'; - if (setenv("TZ", tz, 1) == 0) { - tzset(); - } else { - ALOGE("Error setting timezone"); - } - free(tz); -} - -void rsi_ScriptForEach(Context *rsc, RsScript vs, uint32_t slot, - RsAllocation vain, RsAllocation vaout, - const void *params, size_t paramLen) { - Script *s = static_cast<Script *>(vs); - s->runForEach(rsc, slot, - static_cast<const Allocation *>(vain), static_cast<Allocation *>(vaout), - params, paramLen); - -} - -void rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot) { - Script *s = static_cast<Script *>(vs); - s->Invoke(rsc, slot, NULL, 0); -} - - -void rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data) { - Script *s = static_cast<Script *>(vs); - s->Invoke(rsc, slot, NULL, 0); -} - -void rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, size_t len) { - Script *s = static_cast<Script *>(vs); - s->Invoke(rsc, slot, data, len); -} - -void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value) { - Script *s = static_cast<Script *>(vs); - s->setVar(slot, &value, sizeof(value)); -} - -void rsi_ScriptSetVarObj(Context *rsc, RsScript vs, uint32_t slot, RsObjectBase value) { - Script *s = static_cast<Script *>(vs); - ObjectBase *o = static_cast<ObjectBase *>(value); - s->setVarObj(slot, o); -} - -void rsi_ScriptSetVarJ(Context *rsc, RsScript vs, uint32_t slot, long long value) { - Script *s = static_cast<Script *>(vs); - s->setVar(slot, &value, sizeof(value)); -} - -void rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value) { - Script *s = static_cast<Script *>(vs); - s->setVar(slot, &value, sizeof(value)); -} - -void rsi_ScriptSetVarD(Context *rsc, RsScript vs, uint32_t slot, double value) { - Script *s = static_cast<Script *>(vs); - s->setVar(slot, &value, sizeof(value)); -} - -void rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, size_t len) { - Script *s = static_cast<Script *>(vs); - s->setVar(slot, data, len); -} - -} -} - diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h deleted file mode 100644 index 7879ea6..0000000 --- a/libs/rs/rsScript.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2009-2012 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_SCRIPT_H -#define ANDROID_RS_SCRIPT_H - -#include "rsAllocation.h" - - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class ProgramVertex; -class ProgramFragment; -class ProgramRaster; -class ProgramStore; - -class Script : public ObjectBase { -public: - struct Hal { - void * drv; - - struct DriverInfo { - int mVersionMajor; - int mVersionMinor; - - size_t exportedVariableCount; - size_t exportedFunctionCount; - size_t exportedPragmaCount; - char const **exportedPragmaKeyList; - char const **exportedPragmaValueList; - - int (* root)(); - bool isThreadable; - }; - DriverInfo info; - }; - Hal mHal; - - typedef void (* InvokeFunc_t)(void); - - Script(Context *); - virtual ~Script(); - - struct Enviroment_t { - int64_t mStartTimeMillis; - int64_t mLastDtTime; - - ObjectBaseRef<ProgramVertex> mVertex; - ObjectBaseRef<ProgramFragment> mFragment; - ObjectBaseRef<ProgramRaster> mRaster; - ObjectBaseRef<ProgramStore> mFragmentStore; - }; - Enviroment_t mEnviroment; - - void setSlot(uint32_t slot, Allocation *a); - void setVar(uint32_t slot, const void *val, size_t len); - void setVarObj(uint32_t slot, ObjectBase *val); - - virtual bool freeChildren(); - - virtual void runForEach(Context *rsc, - uint32_t slot, - const Allocation * ain, - Allocation * aout, - const void * usr, - size_t usrBytes, - const RsScriptCall *sc = NULL) = 0; - - virtual void Invoke(Context *rsc, uint32_t slot, const void *data, size_t len) = 0; - virtual void setupScript(Context *rsc) = 0; - virtual uint32_t run(Context *) = 0; -protected: - bool mInitialized; - ObjectBaseRef<Allocation> *mSlots; - ObjectBaseRef<const Type> *mTypes; - -}; - - -} -} -#endif - diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp deleted file mode 100644 index 79725b9..0000000 --- a/libs/rs/rsScriptC.cpp +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (C) 2009-2012 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" -#include "rsScriptC.h" -#include "utils/Timers.h" -#include "utils/StopWatch.h" - -#ifndef ANDROID_RS_SERIALIZE -#include <bcinfo/BitcodeTranslator.h> -#include <bcinfo/BitcodeWrapper.h> -#endif - -using namespace android; -using namespace android::renderscript; - -#define GET_TLS() Context::ScriptTLSStruct * tls = \ - (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \ - Context * rsc = tls->mContext; \ - ScriptC * sc = (ScriptC *) tls->mScript - -ScriptC::ScriptC(Context *rsc) : Script(rsc) { -#ifndef ANDROID_RS_SERIALIZE - BT = NULL; -#endif -} - -ScriptC::~ScriptC() { -#ifndef ANDROID_RS_SERIALIZE - if (BT) { - delete BT; - BT = NULL; - } -#endif - if (mInitialized) { - mRSC->mHal.funcs.script.invokeFreeChildren(mRSC, this); - mRSC->mHal.funcs.script.destroy(mRSC, this); - } -} - -void ScriptC::setupScript(Context *rsc) { - mEnviroment.mStartTimeMillis - = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); - - for (uint32_t ct=0; ct < mHal.info.exportedVariableCount; ct++) { - if (mSlots[ct].get() && !mTypes[ct].get()) { - mTypes[ct].set(mSlots[ct]->getType()); - } - - if (!mTypes[ct].get()) - continue; - void *ptr = NULL; - if (mSlots[ct].get()) { - ptr = mSlots[ct]->getPtr(); - } - - rsc->mHal.funcs.script.setGlobalBind(rsc, this, ct, ptr); - } -} - -const Allocation *ScriptC::ptrToAllocation(const void *ptr) const { - //ALOGE("ptr to alloc %p", ptr); - if (!ptr) { - return NULL; - } - for (uint32_t ct=0; ct < mHal.info.exportedVariableCount; ct++) { - if (!mSlots[ct].get()) - continue; - if (mSlots[ct]->getPtr() == ptr) { - return mSlots[ct].get(); - } - } - ALOGE("ScriptC::ptrToAllocation, failed to find %p", ptr); - return NULL; -} - -void ScriptC::setupGLState(Context *rsc) { - if (mEnviroment.mFragmentStore.get()) { - rsc->setProgramStore(mEnviroment.mFragmentStore.get()); - } - if (mEnviroment.mFragment.get()) { - rsc->setProgramFragment(mEnviroment.mFragment.get()); - } - if (mEnviroment.mVertex.get()) { - rsc->setProgramVertex(mEnviroment.mVertex.get()); - } - if (mEnviroment.mRaster.get()) { - rsc->setProgramRaster(mEnviroment.mRaster.get()); - } -} - -uint32_t ScriptC::run(Context *rsc) { - if (mHal.info.root == NULL) { - rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script"); - return 0; - } - - setupGLState(rsc); - setupScript(rsc); - - uint32_t ret = 0; - - if (rsc->props.mLogScripts) { - ALOGV("%p ScriptC::run invoking root, ptr %p", rsc, mHal.info.root); - } - - ret = rsc->mHal.funcs.script.invokeRoot(rsc, this); - - if (rsc->props.mLogScripts) { - ALOGV("%p ScriptC::run invoking complete, ret=%i", rsc, ret); - } - - return ret; -} - - -void ScriptC::runForEach(Context *rsc, - uint32_t slot, - const Allocation * ain, - Allocation * aout, - const void * usr, - size_t usrBytes, - const RsScriptCall *sc) { - - Context::PushState ps(rsc); - - setupGLState(rsc); - setupScript(rsc); - rsc->mHal.funcs.script.invokeForEach(rsc, this, slot, ain, aout, usr, usrBytes, sc); -} - -void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, size_t len) { - if (slot >= mHal.info.exportedFunctionCount) { - rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script"); - return; - } - setupScript(rsc); - - if (rsc->props.mLogScripts) { - ALOGV("%p ScriptC::Invoke invoking slot %i, ptr %p", rsc, slot, this); - } - rsc->mHal.funcs.script.invokeFunction(rsc, this, slot, data, len); -} - -ScriptCState::ScriptCState() { -} - -ScriptCState::~ScriptCState() { -} - -/* -static void* symbolLookup(void* pContext, char const* name) { - const ScriptCState::SymbolTable_t *sym; - ScriptC *s = (ScriptC *)pContext; - if (!strcmp(name, "__isThreadable")) { - return (void*) s->mHal.info.isThreadable; - } else if (!strcmp(name, "__clearThreadable")) { - s->mHal.info.isThreadable = false; - return NULL; - } - sym = ScriptCState::lookupSymbol(name); - if (!sym) { - sym = ScriptCState::lookupSymbolCL(name); - } - if (!sym) { - sym = ScriptCState::lookupSymbolGL(name); - } - if (sym) { - s->mHal.info.isThreadable &= sym->threadable; - return sym->mPtr; - } - ALOGE("ScriptC sym lookup failed for %s", name); - return NULL; -} -*/ - -#if 0 -extern const char rs_runtime_lib_bc[]; -extern unsigned rs_runtime_lib_bc_size; -#endif - -bool ScriptC::runCompiler(Context *rsc, - const char *resName, - const char *cacheDir, - const uint8_t *bitcode, - size_t bitcodeLen) { - - //ALOGE("runCompiler %p %p %p %p %p %i", rsc, this, resName, cacheDir, bitcode, bitcodeLen); -#ifndef ANDROID_RS_SERIALIZE - uint32_t sdkVersion = 0; - bcinfo::BitcodeWrapper bcWrapper((const char *)bitcode, bitcodeLen); - if (!bcWrapper.unwrap()) { - ALOGE("Bitcode is not in proper container format (raw or wrapper)"); - return false; - } - - if (bcWrapper.getBCFileType() == bcinfo::BC_WRAPPER) { - sdkVersion = bcWrapper.getTargetAPI(); - } - - if (sdkVersion == 0) { - // This signals that we didn't have a wrapper containing information - // about the bitcode. - sdkVersion = rsc->getTargetSdkVersion(); - } - - if (BT) { - delete BT; - } - BT = new bcinfo::BitcodeTranslator((const char *)bitcode, bitcodeLen, - sdkVersion); - if (!BT->translate()) { - ALOGE("Failed to translate bitcode from version: %u", sdkVersion); - delete BT; - BT = NULL; - return false; - } - bitcode = (const uint8_t *) BT->getTranslatedBitcode(); - bitcodeLen = BT->getTranslatedBitcodeSize(); -#endif - - if (!rsc->mHal.funcs.script.init(rsc, this, resName, cacheDir, bitcode, bitcodeLen, 0)) { - return false; - } - - mInitialized = true; - mEnviroment.mFragment.set(rsc->getDefaultProgramFragment()); - mEnviroment.mVertex.set(rsc->getDefaultProgramVertex()); - mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore()); - mEnviroment.mRaster.set(rsc->getDefaultProgramRaster()); - - rsc->mHal.funcs.script.invokeInit(rsc, this); - - for (size_t i=0; i < mHal.info.exportedPragmaCount; ++i) { - const char * key = mHal.info.exportedPragmaKeyList[i]; - const char * value = mHal.info.exportedPragmaValueList[i]; - //ALOGE("pragma %s %s", keys[i], values[i]); - if (!strcmp(key, "version")) { - if (!strcmp(value, "1")) { - continue; - } - ALOGE("Invalid version pragma value: %s\n", value); - return false; - } - - if (!strcmp(key, "stateVertex")) { - if (!strcmp(value, "default")) { - continue; - } - if (!strcmp(value, "parent")) { - mEnviroment.mVertex.clear(); - continue; - } - ALOGE("Unrecognized value %s passed to stateVertex", value); - return false; - } - - if (!strcmp(key, "stateRaster")) { - if (!strcmp(value, "default")) { - continue; - } - if (!strcmp(value, "parent")) { - mEnviroment.mRaster.clear(); - continue; - } - ALOGE("Unrecognized value %s passed to stateRaster", value); - return false; - } - - if (!strcmp(key, "stateFragment")) { - if (!strcmp(value, "default")) { - continue; - } - if (!strcmp(value, "parent")) { - mEnviroment.mFragment.clear(); - continue; - } - ALOGE("Unrecognized value %s passed to stateFragment", value); - return false; - } - - if (!strcmp(key, "stateStore")) { - if (!strcmp(value, "default")) { - continue; - } - if (!strcmp(value, "parent")) { - mEnviroment.mFragmentStore.clear(); - continue; - } - ALOGE("Unrecognized value %s passed to stateStore", value); - return false; - } - } - - mSlots = new ObjectBaseRef<Allocation>[mHal.info.exportedVariableCount]; - mTypes = new ObjectBaseRef<const Type>[mHal.info.exportedVariableCount]; - - return true; -} - -namespace android { -namespace renderscript { - -RsScript rsi_ScriptCCreate(Context *rsc, - const char *resName, size_t resName_length, - const char *cacheDir, size_t cacheDir_length, - const char *text, size_t text_length) -{ - ScriptC *s = new ScriptC(rsc); - - if (!s->runCompiler(rsc, resName, cacheDir, (uint8_t *)text, text_length)) { - // Error during compile, destroy s and return null. - ObjectBase::checkDelete(s); - return NULL; - } - - s->incUserRef(); - return s; -} - -} -} diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h deleted file mode 100644 index 92e1f4f..0000000 --- a/libs/rs/rsScriptC.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2009-2012 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_SCRIPT_C_H -#define ANDROID_RS_SCRIPT_C_H - -#include "rsScript.h" - -#include "rsEnv.h" - -#ifndef ANDROID_RS_SERIALIZE -#include "bcinfo/BitcodeTranslator.h" -#endif - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - - -class ScriptC : public Script { -public: - typedef int (*RunScript_t)(); - typedef void (*VoidFunc_t)(); - - ScriptC(Context *); - virtual ~ScriptC(); - - - const Allocation *ptrToAllocation(const void *) const; - - - virtual void Invoke(Context *rsc, uint32_t slot, const void *data, size_t len); - - virtual uint32_t run(Context *); - - virtual void runForEach(Context *rsc, - uint32_t slot, - const Allocation * ain, - Allocation * aout, - const void * usr, - size_t usrBytes, - const RsScriptCall *sc = NULL); - - virtual void serialize(OStream *stream) const { } - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SCRIPT_C; } - static Type *createFromStream(Context *rsc, IStream *stream) { return NULL; } - - bool runCompiler(Context *rsc, const char *resName, const char *cacheDir, - const uint8_t *bitcode, size_t bitcodeLen); - -//protected: - void setupScript(Context *); - void setupGLState(Context *); - Script * setTLS(Script *); - private: -#ifndef ANDROID_RS_SERIALIZE - bcinfo::BitcodeTranslator *BT; -#endif -}; - -class ScriptCState { -public: - ScriptCState(); - ~ScriptCState(); - - char * mScriptText; - size_t mScriptLen; - - struct SymbolTable_t { - const char * mName; - void * mPtr; - bool threadable; - }; - static const SymbolTable_t * lookupSymbol(const char *); - static const SymbolTable_t * lookupSymbolCL(const char *); - static const SymbolTable_t * lookupSymbolGL(const char *); -}; - - -} -} -#endif diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp deleted file mode 100644 index 749495d..0000000 --- a/libs/rs/rsScriptC_Lib.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2009-2012 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" -#include "rsScriptC.h" -#include "rsMatrix4x4.h" -#include "rsMatrix3x3.h" -#include "rsMatrix2x2.h" -#include "rsgApiStructs.h" - -#include "utils/Timers.h" - -#include <time.h> - -using namespace android; -using namespace android::renderscript; - - -namespace android { -namespace renderscript { - - -////////////////////////////////////////////////////////////////////////////// -// Math routines -////////////////////////////////////////////////////////////////////////////// - -#if 0 -static float SC_sinf_fast(float x) { - const float A = 1.0f / (2.0f * M_PI); - const float B = -16.0f; - const float C = 8.0f; - - // scale angle for easy argument reduction - x *= A; - - if (fabsf(x) >= 0.5f) { - // argument reduction - x = x - ceilf(x + 0.5f) + 1.0f; - } - - const float y = B * x * fabsf(x) + C * x; - return 0.2215f * (y * fabsf(y) - y) + y; -} - -static float SC_cosf_fast(float x) { - x += float(M_PI / 2); - - const float A = 1.0f / (2.0f * M_PI); - const float B = -16.0f; - const float C = 8.0f; - - // scale angle for easy argument reduction - x *= A; - - if (fabsf(x) >= 0.5f) { - // argument reduction - x = x - ceilf(x + 0.5f) + 1.0f; - } - - const float y = B * x * fabsf(x) + C * x; - return 0.2215f * (y * fabsf(y) - y) + y; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// Time routines -////////////////////////////////////////////////////////////////////////////// - -time_t rsrTime(Context *rsc, Script *sc, time_t *timer) { - return time(timer); -} - -tm* rsrLocalTime(Context *rsc, Script *sc, tm *local, time_t *timer) { - if (!local) { - return NULL; - } - - // The native localtime function is not thread-safe, so we - // have to apply locking for proper behavior in RenderScript. - pthread_mutex_lock(&rsc->gLibMutex); - tm *tmp = localtime(timer); - memcpy(local, tmp, sizeof(*tmp)); - pthread_mutex_unlock(&rsc->gLibMutex); - return local; -} - -int64_t rsrUptimeMillis(Context *rsc, Script *sc) { - return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); -} - -int64_t rsrUptimeNanos(Context *rsc, Script *sc) { - return systemTime(SYSTEM_TIME_MONOTONIC); -} - -float rsrGetDt(Context *rsc, Script *sc) { - int64_t l = sc->mEnviroment.mLastDtTime; - sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC); - return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9; -} - -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// - -void rsrSetObject(const Context *rsc, const Script *sc, ObjectBase **dst, ObjectBase * src) { - //ALOGE("rsiSetObject %p,%p %p", vdst, *vdst, vsrc); - if (src) { - CHECK_OBJ(src); - src->incSysRef(); - } - if (dst[0]) { - CHECK_OBJ(dst[0]); - dst[0]->decSysRef(); - } - *dst = src; -} - -void rsrClearObject(const Context *rsc, const Script *sc, ObjectBase **dst) { - //ALOGE("rsiClearObject %p,%p", vdst, *vdst); - if (dst[0]) { - CHECK_OBJ(dst[0]); - dst[0]->decSysRef(); - } - *dst = NULL; -} - -bool rsrIsObject(const Context *rsc, const Script *sc, const ObjectBase *src) { - return src != NULL; -} - - -uint32_t rsrToClient(Context *rsc, Script *sc, int cmdID, void *data, int len) { - //ALOGE("SC_toClient %i %i %i", cmdID, len); - return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false); -} - -uint32_t rsrToClientBlocking(Context *rsc, Script *sc, int cmdID, void *data, int len) { - //ALOGE("SC_toClientBlocking %i %i", cmdID, len); - return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true); -} - - -void rsrForEach(Context *rsc, Script *sc, - Script *target, - Allocation *in, Allocation *out, - const void *usr, uint32_t usrBytes, - const RsScriptCall *call) { - target->runForEach(rsc, /* root slot */ 0, in, out, usr, usrBytes, call); -} - -void rsrAllocationSyncAll(Context *rsc, Script *sc, Allocation *a, RsAllocationUsageType usage) { - a->syncAll(rsc, usage); -} - -void rsrAllocationCopy1DRange(Context *rsc, Allocation *dstAlloc, - uint32_t dstOff, - uint32_t dstMip, - uint32_t count, - Allocation *srcAlloc, - uint32_t srcOff, uint32_t srcMip) { - rsi_AllocationCopy2DRange(rsc, dstAlloc, dstOff, 0, - dstMip, 0, count, 1, - srcAlloc, srcOff, 0, srcMip, 0); -} - -void rsrAllocationCopy2DRange(Context *rsc, Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, - uint32_t dstMip, uint32_t dstFace, - uint32_t width, uint32_t height, - Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, - uint32_t srcMip, uint32_t srcFace) { - rsi_AllocationCopy2DRange(rsc, dstAlloc, dstXoff, dstYoff, - dstMip, dstFace, width, height, - srcAlloc, srcXoff, srcYoff, srcMip, srcFace); -} - -const Allocation * rsrGetAllocation(Context *rsc, Script *s, const void *ptr) { - ScriptC *sc = (ScriptC *)s; - return sc->ptrToAllocation(ptr); -} - -} -} - diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp deleted file mode 100644 index 21b1c42..0000000 --- a/libs/rs/rsScriptC_LibGL.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/* - * 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" -#include "rsScriptC.h" -#include "rsMatrix4x4.h" -#include "rsMatrix3x3.h" -#include "rsMatrix2x2.h" -#include "rsMesh.h" -#include "rsgApiStructs.h" - -#include "utils/Timers.h" -#include "driver/rsdVertexArray.h" -#include "driver/rsdShaderCache.h" -#include "driver/rsdCore.h" - -#define GL_GLEXT_PROTOTYPES - -#include <GLES/gl.h> -#include <GLES/glext.h> -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> - -#include <time.h> - -using namespace android; -using namespace android::renderscript; - -namespace android { -namespace renderscript { - -////////////////////////////////////////////////////////////////////////////// -// Context -////////////////////////////////////////////////////////////////////////////// - -void rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) { - CHECK_OBJ_OR_NULL(a); - CHECK_OBJ(pf); - pf->bindTexture(rsc, slot, a); -} - -void rsrBindConstant(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) { - CHECK_OBJ_OR_NULL(a); - CHECK_OBJ(pf); - pf->bindAllocation(rsc, a, slot); -} - -void rsrBindConstant(Context *rsc, Script *sc, ProgramVertex *pv, uint32_t slot, Allocation *a) { - CHECK_OBJ_OR_NULL(a); - CHECK_OBJ(pv); - pv->bindAllocation(rsc, a, slot); -} - -void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) { - CHECK_OBJ_OR_NULL(vs); - CHECK_OBJ(vpf); - pf->bindSampler(rsc, slot, s); -} - -void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) { - CHECK_OBJ_OR_NULL(ps); - rsc->setProgramStore(ps); -} - -void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) { - CHECK_OBJ_OR_NULL(pf); - rsc->setProgramFragment(pf); -} - -void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) { - CHECK_OBJ_OR_NULL(pv); - rsc->setProgramVertex(pv); -} - -void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) { - CHECK_OBJ_OR_NULL(pr); - rsc->setProgramRaster(pr); -} - -void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) { - CHECK_OBJ(va); - rsc->mFBOCache.bindColorTarget(rsc, a, slot); - rsc->mStateVertex.updateSize(rsc); -} - -void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) { - CHECK_OBJ(va); - rsc->mFBOCache.bindDepthTarget(rsc, a); - rsc->mStateVertex.updateSize(rsc); -} - -void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) { - rsc->mFBOCache.bindColorTarget(rsc, NULL, slot); - rsc->mStateVertex.updateSize(rsc); -} - -void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) { - rsc->mFBOCache.bindDepthTarget(rsc, NULL); - rsc->mStateVertex.updateSize(rsc); -} - -void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) { - rsc->mFBOCache.resetAll(rsc); - rsc->mStateVertex.updateSize(rsc); -} - -////////////////////////////////////////////////////////////////////////////// -// VP -////////////////////////////////////////////////////////////////////////////// - -void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { - rsc->getProgramVertex()->setProjectionMatrix(rsc, m); -} - -void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { - rsc->getProgramVertex()->setModelviewMatrix(rsc, m); -} - -void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) { - rsc->getProgramVertex()->setTextureMatrix(rsc, m); -} - -void rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf, - float r, float g, float b, float a) { - CHECK_OBJ(pf); - pf->setConstantColor(rsc, r, g, b, a); -} - -void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) { - rsc->getProgramVertex()->getProjectionMatrix(rsc, m); -} - -////////////////////////////////////////////////////////////////////////////// -// Drawing -////////////////////////////////////////////////////////////////////////////// - -void rsrDrawQuadTexCoords(Context *rsc, Script *sc, - float x1, float y1, float z1, float u1, float v1, - float x2, float y2, float z2, float u2, float v2, - float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4) { - if (!rsc->setupCheck()) { - return; - } - - RsdHal *dc = (RsdHal *)rsc->mHal.drv; - if (!dc->gl.shaderCache->setup(rsc)) { - return; - } - - //ALOGE("Quad"); - //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); - //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); - //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); - //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); - - float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; - const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; - - RsdVertexArray::Attrib attribs[2]; - attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position"); - attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0"); - - RsdVertexArray va(attribs, 2); - va.setup(rsc); - - RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4); -} - -void rsrDrawQuad(Context *rsc, Script *sc, - float x1, float y1, float z1, - float x2, float y2, float z2, - float x3, float y3, float z3, - float x4, float y4, float z4) { - rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1, - x2, y2, z2, 1, 1, - x3, y3, z3, 1, 0, - x4, y4, z4, 0, 0); -} - -void rsrDrawSpriteScreenspace(Context *rsc, Script *sc, - float x, float y, float z, float w, float h) { - ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); - rsc->setProgramVertex(rsc->getDefaultProgramVertex()); - //rsc->setupCheck(); - - //GLint crop[4] = {0, h, w, -h}; - - float sh = rsc->getHeight(); - - rsrDrawQuad(rsc, sc, - x, sh - y, z, - x+w, sh - y, z, - x+w, sh - (y+h), z, - x, sh - (y+h), z); - rsc->setProgramVertex((ProgramVertex *)tmp.get()); -} - -void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) { - //ALOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z); - 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()) { - return; - } - sm->render(rsc); -} - -void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) { - CHECK_OBJ(sm); - if (!rsc->setupCheck()) { - return; - } - sm->renderPrimitive(rsc, primIndex); -} - -void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex, - uint32_t start, uint32_t len) { - CHECK_OBJ(sm); - if (!rsc->setupCheck()) { - return; - } - sm->renderPrimitiveRange(rsc, primIndex, start, len); -} - -void rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm, - float *minX, float *minY, float *minZ, - float *maxX, float *maxY, float *maxZ) { - CHECK_OBJ(sm); - sm->computeBBox(); - *minX = sm->mBBoxMin[0]; - *minY = sm->mBBoxMin[1]; - *minZ = sm->mBBoxMin[2]; - *maxX = sm->mBBoxMax[0]; - *maxY = sm->mBBoxMax[1]; - *maxZ = sm->mBBoxMax[2]; -} - - -////////////////////////////////////////////////////////////////////////////// -// -////////////////////////////////////////////////////////////////////////////// - - -void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) { - ProgramFragment *pf = rsc->getProgramFragment(); - pf->setConstantColor(rsc, r, g, b, a); -} - -void rsrPrepareClear(Context *rsc, Script *sc) { - rsc->mFBOCache.setup(rsc); - rsc->setupProgramStore(); -} - -uint32_t rsrGetWidth(Context *rsc, Script *sc) { - return rsc->getWidth(); -} - -uint32_t rsrGetHeight(Context *rsc, Script *sc) { - return rsc->getHeight(); -} - -void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) { - const char *text = (const char *)a->getPtr(); - size_t allocSize = a->getType()->getSizeBytes(); - rsc->mStateFont.renderText(text, allocSize, x, y); -} - -void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) { - size_t textLen = strlen(text); - rsc->mStateFont.renderText(text, textLen, x, y); -} - -static void SetMetrics(Font::Rect *metrics, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { - if (left) { - *left = metrics->left; - } - if (right) { - *right = metrics->right; - } - if (top) { - *top = metrics->top; - } - if (bottom) { - *bottom = metrics->bottom; - } -} - -void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { - CHECK_OBJ(a); - const char *text = (const char *)a->getPtr(); - size_t textLen = a->getType()->getSizeBytes(); - Font::Rect metrics; - rsc->mStateFont.measureText(text, textLen, &metrics); - SetMetrics(&metrics, left, right, top, bottom); -} - -void rsrMeasureText(Context *rsc, Script *sc, const char *text, - int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { - size_t textLen = strlen(text); - Font::Rect metrics; - rsc->mStateFont.measureText(text, textLen, &metrics); - SetMetrics(&metrics, left, right, top, bottom); -} - -void rsrBindFont(Context *rsc, Script *sc, Font *font) { - CHECK_OBJ(font); - rsi_ContextBindFont(rsc, font); -} - -void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) { - rsc->mStateFont.setFontColor(r, g, b, a); -} - -} -} diff --git a/libs/rs/rsSignal.cpp b/libs/rs/rsSignal.cpp deleted file mode 100644 index 3f6a13c..0000000 --- a/libs/rs/rsSignal.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2009 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 "rsSignal.h" - -using namespace android; -using namespace android::renderscript; - - -Signal::Signal() { - mSet = true; -} - -Signal::~Signal() { - pthread_mutex_destroy(&mMutex); - pthread_cond_destroy(&mCondition); -} - -bool Signal::init() { - int status = pthread_mutex_init(&mMutex, NULL); - if (status) { - ALOGE("LocklessFifo mutex init failure"); - return false; - } - - status = pthread_cond_init(&mCondition, NULL); - if (status) { - ALOGE("LocklessFifo condition init failure"); - pthread_mutex_destroy(&mMutex); - return false; - } - - return true; -} - -void Signal::set() { - int status; - - status = pthread_mutex_lock(&mMutex); - if (status) { - ALOGE("LocklessCommandFifo: error %i locking for set condition.", status); - return; - } - - mSet = true; - - status = pthread_cond_signal(&mCondition); - if (status) { - ALOGE("LocklessCommandFifo: error %i on set condition.", status); - } - - status = pthread_mutex_unlock(&mMutex); - if (status) { - ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status); - } -} - -bool Signal::wait(uint64_t timeout) { - int status; - bool ret = false; - - status = pthread_mutex_lock(&mMutex); - if (status) { - ALOGE("LocklessCommandFifo: error %i locking for condition.", status); - return false; - } - - if (!mSet) { - if (!timeout) { - status = pthread_cond_wait(&mCondition, &mMutex); - } else { -#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE) - status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000); -#else - // This is safe it will just make things less reponsive - status = pthread_cond_wait(&mCondition, &mMutex); -#endif - } - } - - if (!status) { - mSet = false; - ret = true; - } else { - if (status != ETIMEDOUT) { - ALOGE("LocklessCommandFifo: error %i waiting for condition.", status); - } - } - - status = pthread_mutex_unlock(&mMutex); - if (status) { - ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status); - } - - return ret; -} - diff --git a/libs/rs/rsSignal.h b/libs/rs/rsSignal.h deleted file mode 100644 index fc31883..0000000 --- a/libs/rs/rsSignal.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2009 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_SIGNAL_H -#define ANDROID_RS_SIGNAL_H - - -#include "rsUtils.h" - -namespace android { -namespace renderscript { - -class Signal { -public: - Signal(); - ~Signal(); - - bool init(); - - void set(); - - // returns true if the signal occured - // false for timeout - bool wait(uint64_t timeout = 0); - -protected: - bool mSet; - pthread_mutex_t mMutex; - pthread_cond_t mCondition; -}; - -} -} - -#endif - diff --git a/libs/rs/rsStream.cpp b/libs/rs/rsStream.cpp deleted file mode 100644 index b9df0cc..0000000 --- a/libs/rs/rsStream.cpp +++ /dev/null @@ -1,113 +0,0 @@ - -/* - * Copyright (C) 2009 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" -#include "rsStream.h" - -using namespace android; -using namespace android::renderscript; - -IStream::IStream(const uint8_t *buf, bool use64) { - mData = buf; - mPos = 0; - mUse64 = use64; -} - -void IStream::loadByteArray(void *dest, size_t numBytes) { - memcpy(dest, mData + mPos, numBytes); - mPos += numBytes; -} - -uint64_t IStream::loadOffset() { - uint64_t tmp; - if (mUse64) { - mPos = (mPos + 7) & (~7); - tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0]; - mPos += sizeof(uint64_t); - return tmp; - } - return loadU32(); -} - -void IStream::loadString(String8 *s) { - uint32_t len = loadU32(); - s->setTo((const char *)&mData[mPos], len); - mPos += len; -} - -// Output stream implementation -OStream::OStream(uint64_t len, bool use64) { - mData = (uint8_t*)malloc(len); - mLength = len; - mPos = 0; - mUse64 = use64; -} - -OStream::~OStream() { - free(mData); -} - -void OStream::addByteArray(const void *src, size_t numBytes) { - // We need to potentially grow more than once if the number of byes we write is substantial - while (mPos + numBytes >= mLength) { - growSize(); - } - memcpy(mData + mPos, src, numBytes); - mPos += numBytes; -} - -void OStream::addOffset(uint64_t v) { - if (mUse64) { - mPos = (mPos + 7) & (~7); - if (mPos + sizeof(v) >= mLength) { - growSize(); - } - mData[mPos++] = (uint8_t)(v & 0xff); - mData[mPos++] = (uint8_t)((v >> 8) & 0xff); - mData[mPos++] = (uint8_t)((v >> 16) & 0xff); - mData[mPos++] = (uint8_t)((v >> 24) & 0xff); - mData[mPos++] = (uint8_t)((v >> 32) & 0xff); - mData[mPos++] = (uint8_t)((v >> 40) & 0xff); - mData[mPos++] = (uint8_t)((v >> 48) & 0xff); - mData[mPos++] = (uint8_t)((v >> 56) & 0xff); - } else { - addU32(v); - } -} - -void OStream::addString(String8 *s) { - uint32_t len = s->size(); - addU32(len); - if (mPos + len*sizeof(char) >= mLength) { - growSize(); - } - char *stringData = reinterpret_cast<char *>(&mData[mPos]); - for (uint32_t i = 0; i < len; i ++) { - stringData[i] = s->string()[i]; - } - mPos += len*sizeof(char); -} - -void OStream::growSize() { - uint8_t *newData = (uint8_t*)malloc(mLength*2); - memcpy(newData, mData, mLength*sizeof(uint8_t)); - mLength = mLength * 2; - free(mData); - mData = newData; -} - - diff --git a/libs/rs/rsStream.h b/libs/rs/rsStream.h deleted file mode 100644 index 62bcf94..0000000 --- a/libs/rs/rsStream.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2009 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_STREAM_H -#define ANDROID_RS_STREAM_H - -#include <utils/String8.h> -#include <stdio.h> - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class IStream { -public: - IStream(const uint8_t *, bool use64); - - float loadF() { - mPos = (mPos + 3) & (~3); - float tmp = reinterpret_cast<const float *>(&mData[mPos])[0]; - mPos += sizeof(float); - return tmp; - } - int32_t loadI32() { - mPos = (mPos + 3) & (~3); - int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0]; - mPos += sizeof(int32_t); - return tmp; - } - uint32_t loadU32() { - mPos = (mPos + 3) & (~3); - uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0]; - mPos += sizeof(uint32_t); - return tmp; - } - uint16_t loadU16() { - mPos = (mPos + 1) & (~1); - uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0]; - mPos += sizeof(uint16_t); - return tmp; - } - inline uint8_t loadU8() { - uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0]; - mPos += sizeof(uint8_t); - return tmp; - } - void loadByteArray(void *dest, size_t numBytes); - uint64_t loadOffset(); - void loadString(String8 *s); - uint64_t getPos() const { - return mPos; - } - void reset(uint64_t pos) { - mPos = pos; - } - void reset() { - mPos = 0; - } - - const uint8_t * getPtr() const { - return mData; - } -protected: - const uint8_t * mData; - uint64_t mPos; - bool mUse64; -}; - -class OStream { -public: - OStream(uint64_t length, bool use64); - ~OStream(); - - void align(uint32_t bytes) { - mPos = (mPos + (bytes - 1)) & (~(bytes - 1)); - if (mPos >= mLength) { - growSize(); - } - } - - void addF(float v) { - uint32_t uintV = *reinterpret_cast<uint32_t*> (&v); - addU32(uintV); - } - void addI32(int32_t v) { - mPos = (mPos + 3) & (~3); - if (mPos + sizeof(v) >= mLength) { - growSize(); - } - mData[mPos++] = (uint8_t)(v & 0xff); - mData[mPos++] = (uint8_t)((v >> 8) & 0xff); - mData[mPos++] = (uint8_t)((v >> 16) & 0xff); - mData[mPos++] = (uint8_t)((v >> 24) & 0xff); - } - void addU32(uint32_t v) { - mPos = (mPos + 3) & (~3); - if (mPos + sizeof(v) >= mLength) { - growSize(); - } - mData[mPos++] = (uint8_t)(v & 0xff); - mData[mPos++] = (uint8_t)((v >> 8) & 0xff); - mData[mPos++] = (uint8_t)((v >> 16) & 0xff); - mData[mPos++] = (uint8_t)((v >> 24) & 0xff); - } - void addU16(uint16_t v) { - mPos = (mPos + 1) & (~1); - if (mPos + sizeof(v) >= mLength) { - growSize(); - } - mData[mPos++] = (uint8_t)(v & 0xff); - mData[mPos++] = (uint8_t)(v >> 8); - } - inline void addU8(uint8_t v) { - if (mPos + 1 >= mLength) { - growSize(); - } - reinterpret_cast<uint8_t *>(&mData[mPos])[0] = v; - mPos ++; - } - void addByteArray(const void *src, size_t numBytes); - void addOffset(uint64_t v); - void addString(String8 *s); - uint64_t getPos() const { - return mPos; - } - void reset(uint64_t pos) { - mPos = pos; - } - void reset() { - mPos = 0; - } - const uint8_t * getPtr() const { - return mData; - } -protected: - void growSize(); - uint8_t * mData; - uint64_t mLength; - uint64_t mPos; - bool mUse64; -}; - - -} // renderscript -} // android -#endif //ANDROID_RS_STREAM_H - - diff --git a/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp deleted file mode 100644 index 8a0a5dc..0000000 --- a/libs/rs/rsThreadIO.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2009 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" -#include "rsThreadIO.h" -#include "rsgApiStructs.h" - -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <fcntl.h> -#include <poll.h> - - -using namespace android; -using namespace android::renderscript; - -ThreadIO::ThreadIO() { - mRunning = true; - mPureFifo = false; - mMaxInlineSize = 1024; -} - -ThreadIO::~ThreadIO() { -} - -void ThreadIO::init() { - mToClient.init(); - mToCore.init(); -} - -void ThreadIO::shutdown() { - mRunning = false; - mToCore.shutdown(); -} - -void * ThreadIO::coreHeader(uint32_t cmdID, size_t dataLen) { - //ALOGE("coreHeader %i %i", cmdID, dataLen); - CoreCmdHeader *hdr = (CoreCmdHeader *)&mSendBuffer[0]; - hdr->bytes = dataLen; - hdr->cmdID = cmdID; - mSendLen = dataLen + sizeof(CoreCmdHeader); - //mToCoreSocket.writeAsync(&hdr, sizeof(hdr)); - //ALOGE("coreHeader ret "); - return &mSendBuffer[sizeof(CoreCmdHeader)]; -} - -void ThreadIO::coreCommit() { - mToCore.writeAsync(&mSendBuffer, mSendLen); -} - -void ThreadIO::clientShutdown() { - mToClient.shutdown(); -} - -void ThreadIO::coreWrite(const void *data, size_t len) { - //ALOGV("core write %p %i", data, (int)len); - mToCore.writeAsync(data, len, true); -} - -void ThreadIO::coreRead(void *data, size_t len) { - //ALOGV("core read %p %i", data, (int)len); - mToCore.read(data, len); -} - -void ThreadIO::coreSetReturn(const void *data, size_t dataLen) { - uint32_t buf; - if (data == NULL) { - data = &buf; - dataLen = sizeof(buf); - } - - mToCore.readReturn(data, dataLen); -} - -void ThreadIO::coreGetReturn(void *data, size_t dataLen) { - uint32_t buf; - if (data == NULL) { - data = &buf; - dataLen = sizeof(buf); - } - - mToCore.writeWaitReturn(data, dataLen); -} - -void ThreadIO::setTimeoutCallback(void (*cb)(void *), void *dat, uint64_t timeout) { - //mToCore.setTimeoutCallback(cb, dat, timeout); -} - -bool ThreadIO::playCoreCommands(Context *con, int waitFd) { - bool ret = false; - const bool isLocal = !isPureFifo(); - - uint8_t buf[2 * 1024]; - const CoreCmdHeader *cmd = (const CoreCmdHeader *)&buf[0]; - const void * data = (const void *)&buf[sizeof(CoreCmdHeader)]; - - struct pollfd p[2]; - p[0].fd = mToCore.getReadFd(); - p[0].events = POLLIN; - p[0].revents = 0; - p[1].fd = waitFd; - p[1].events = POLLIN; - p[1].revents = 0; - int pollCount = 1; - if (waitFd >= 0) { - pollCount = 2; - } - - if (con->props.mLogTimes) { - con->timerSet(Context::RS_TIMER_IDLE); - } - - int waitTime = -1; - while (mRunning) { - int pr = poll(p, pollCount, waitTime); - if (pr <= 0) { - break; - } - - if (p[0].revents) { - size_t r = 0; - if (isLocal) { - r = mToCore.read(&buf[0], sizeof(CoreCmdHeader)); - mToCore.read(&buf[sizeof(CoreCmdHeader)], cmd->bytes); - if (r != sizeof(CoreCmdHeader)) { - // exception or timeout occurred. - break; - } - } else { - r = mToCore.read((void *)&cmd->cmdID, sizeof(cmd->cmdID)); - } - - - ret = true; - if (con->props.mLogTimes) { - con->timerSet(Context::RS_TIMER_INTERNAL); - } - //ALOGV("playCoreCommands 3 %i %i", cmd->cmdID, cmd->bytes); - - if (cmd->cmdID >= (sizeof(gPlaybackFuncs) / sizeof(void *))) { - rsAssert(cmd->cmdID < (sizeof(gPlaybackFuncs) / sizeof(void *))); - ALOGE("playCoreCommands error con %p, cmd %i", con, cmd->cmdID); - } - - if (isLocal) { - gPlaybackFuncs[cmd->cmdID](con, data, cmd->bytes); - } else { - gPlaybackRemoteFuncs[cmd->cmdID](con, this); - } - - if (con->props.mLogTimes) { - con->timerSet(Context::RS_TIMER_IDLE); - } - - if (waitFd < 0) { - // If we don't have a secondary wait object we should stop blocking now - // that at least one command has been processed. - waitTime = 0; - } - } - - if (p[1].revents && !p[0].revents) { - // We want to finish processing fifo events before processing the vsync. - // Otherwise we can end up falling behind and having tremendous lag. - break; - } - } - return ret; -} - -RsMessageToClientType ThreadIO::getClientHeader(size_t *receiveLen, uint32_t *usrID) { - //ALOGE("getClientHeader"); - mToClient.read(&mLastClientHeader, sizeof(mLastClientHeader)); - - receiveLen[0] = mLastClientHeader.bytes; - usrID[0] = mLastClientHeader.userID; - //ALOGE("getClientHeader %i %i %i", mLastClientHeader.cmdID, usrID[0], receiveLen[0]); - return (RsMessageToClientType)mLastClientHeader.cmdID; -} - -RsMessageToClientType ThreadIO::getClientPayload(void *data, size_t *receiveLen, - uint32_t *usrID, size_t bufferLen) { - //ALOGE("getClientPayload"); - receiveLen[0] = mLastClientHeader.bytes; - usrID[0] = mLastClientHeader.userID; - if (bufferLen < mLastClientHeader.bytes) { - return RS_MESSAGE_TO_CLIENT_RESIZE; - } - if (receiveLen[0]) { - mToClient.read(data, receiveLen[0]); - } - //ALOGE("getClientPayload x"); - return (RsMessageToClientType)mLastClientHeader.cmdID; -} - -bool ThreadIO::sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, - size_t dataLen, bool waitForSpace) { - - //ALOGE("sendToClient %i %i %i", cmdID, usrID, (int)dataLen); - ClientCmdHeader hdr; - hdr.bytes = dataLen; - hdr.cmdID = cmdID; - hdr.userID = usrID; - - mToClient.writeAsync(&hdr, sizeof(hdr)); - if (dataLen) { - mToClient.writeAsync(data, dataLen); - } - - //ALOGE("sendToClient x"); - return true; -} - diff --git a/libs/rs/rsThreadIO.h b/libs/rs/rsThreadIO.h deleted file mode 100644 index cb7d4ab..0000000 --- a/libs/rs/rsThreadIO.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2009 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_THREAD_IO_H -#define ANDROID_RS_THREAD_IO_H - -#include "rsUtils.h" -#include "rsFifoSocket.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { - -class Context; - -class ThreadIO { -public: - ThreadIO(); - ~ThreadIO(); - - void init(); - void shutdown(); - - size_t getMaxInlineSize() { - return mMaxInlineSize; - } - bool isPureFifo() { - return mPureFifo; - } - - // Plays back commands from the client. - // Returns true if any commands were processed. - bool playCoreCommands(Context *con, int waitFd); - - void setTimeoutCallback(void (*)(void *), void *, uint64_t timeout); - - void * coreHeader(uint32_t, size_t dataLen); - void coreCommit(); - - void coreSetReturn(const void *data, size_t dataLen); - void coreGetReturn(void *data, size_t dataLen); - void coreWrite(const void *data, size_t len); - void coreRead(void *data, size_t len); - - void asyncSetReturn(const void *data, size_t dataLen); - void asyncGetReturn(void *data, size_t dataLen); - void asyncWrite(const void *data, size_t len); - void asyncRead(void *data, size_t len); - - - RsMessageToClientType getClientHeader(size_t *receiveLen, uint32_t *usrID); - RsMessageToClientType getClientPayload(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen); - bool sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, size_t dataLen, bool waitForSpace); - void clientShutdown(); - - -protected: - typedef struct CoreCmdHeaderRec { - uint32_t cmdID; - uint32_t bytes; - } CoreCmdHeader; - typedef struct ClientCmdHeaderRec { - uint32_t cmdID; - uint32_t bytes; - uint32_t userID; - } ClientCmdHeader; - ClientCmdHeader mLastClientHeader; - - bool mRunning; - bool mPureFifo; - size_t mMaxInlineSize; - - FifoSocket mToClient; - FifoSocket mToCore; - - intptr_t mToCoreRet; - - size_t mSendLen; - uint8_t mSendBuffer[2 * 1024]; - -}; - - -} -} -#endif - diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp deleted file mode 100644 index b668a78..0000000 --- a/libs/rs/rsType.cpp +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (C) 2009 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; - -Type::Type(Context *rsc) : ObjectBase(rsc) { - memset(&mHal, 0, sizeof(mHal)); - mDimLOD = false; -} - -void Type::preDestroy() const { - for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) { - if (mRSC->mStateType.mTypes[ct] == this) { - mRSC->mStateType.mTypes.removeAt(ct); - break; - } - } -} - -Type::~Type() { - clear(); -} - -void Type::clear() { - if (mHal.state.lodCount) { - delete [] mHal.state.lodDimX; - delete [] mHal.state.lodDimY; - delete [] mHal.state.lodDimZ; - delete [] mHal.state.lodOffset; - } - mElement.clear(); - memset(&mHal, 0, sizeof(mHal)); -} - -TypeState::TypeState() { -} - -TypeState::~TypeState() { - rsAssert(!mTypes.size()); -} - -size_t Type::getOffsetForFace(uint32_t face) const { - rsAssert(mHal.state.faces); - return 0; -} - -void Type::compute() { - uint32_t oldLODCount = mHal.state.lodCount; - if (mDimLOD) { - uint32_t l2x = rsFindHighBit(mHal.state.dimX) + 1; - uint32_t l2y = rsFindHighBit(mHal.state.dimY) + 1; - uint32_t l2z = rsFindHighBit(mHal.state.dimZ) + 1; - - mHal.state.lodCount = rsMax(l2x, l2y); - mHal.state.lodCount = rsMax(mHal.state.lodCount, l2z); - } else { - mHal.state.lodCount = 1; - } - if (mHal.state.lodCount != oldLODCount) { - if (oldLODCount) { - delete [] mHal.state.lodDimX; - delete [] mHal.state.lodDimY; - delete [] mHal.state.lodDimZ; - delete [] mHal.state.lodOffset; - } - mHal.state.lodDimX = new uint32_t[mHal.state.lodCount]; - mHal.state.lodDimY = new uint32_t[mHal.state.lodCount]; - mHal.state.lodDimZ = new uint32_t[mHal.state.lodCount]; - mHal.state.lodOffset = new uint32_t[mHal.state.lodCount]; - } - - uint32_t tx = mHal.state.dimX; - uint32_t ty = mHal.state.dimY; - uint32_t tz = mHal.state.dimZ; - size_t offset = 0; - for (uint32_t lod=0; lod < mHal.state.lodCount; lod++) { - mHal.state.lodDimX[lod] = tx; - mHal.state.lodDimY[lod] = ty; - mHal.state.lodDimZ[lod] = tz; - mHal.state.lodOffset[lod] = offset; - offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes(); - if (tx > 1) tx >>= 1; - if (ty > 1) ty >>= 1; - if (tz > 1) tz >>= 1; - } - - // At this point the offset is the size of a mipmap chain; - mMipChainSizeBytes = offset; - - if (mHal.state.faces) { - offset *= 6; - } - mTotalSizeBytes = offset; - mHal.state.element = mElement.get(); -} - -uint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const { - uint32_t offset = mHal.state.lodOffset[lod]; - offset += x * mElement->getSizeBytes(); - return offset; -} - -uint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const { - uint32_t offset = mHal.state.lodOffset[lod]; - offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); - return offset; -} - -uint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const { - uint32_t offset = mHal.state.lodOffset[lod]; - offset += (x + - y * mHal.state.lodDimX[lod] + - z * mHal.state.lodDimX[lod] * mHal.state.lodDimY[lod]) * mElement->getSizeBytes(); - return offset; -} - -uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, - uint32_t x, uint32_t y) const { - uint32_t offset = mHal.state.lodOffset[lod]; - offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes(); - - if (face != 0) { - uint32_t faceOffset = getSizeBytes() / 6; - offset += faceOffset * face; - } - return offset; -} - -void Type::dumpLOGV(const char *prefix) const { - char buf[1024]; - ObjectBase::dumpLOGV(prefix); - ALOGV("%s Type: x=%u y=%u z=%u mip=%i face=%i", prefix, - mHal.state.dimX, - mHal.state.dimY, - mHal.state.dimZ, - mHal.state.lodCount, - mHal.state.faces); - snprintf(buf, sizeof(buf), "%s element: ", prefix); - mElement->dumpLOGV(buf); -} - -void Type::serialize(OStream *stream) const { - // Need to identify ourselves - stream->addU32((uint32_t)getClassId()); - - String8 name(getName()); - stream->addString(&name); - - mElement->serialize(stream); - - stream->addU32(mHal.state.dimX); - stream->addU32(mHal.state.dimY); - stream->addU32(mHal.state.dimZ); - - stream->addU8((uint8_t)(mHal.state.lodCount ? 1 : 0)); - stream->addU8((uint8_t)(mHal.state.faces ? 1 : 0)); -} - -Type *Type::createFromStream(Context *rsc, IStream *stream) { - // First make sure we are reading the correct object - RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); - if (classID != RS_A3D_CLASS_ID_TYPE) { - ALOGE("type loading skipped due to invalid class id\n"); - return NULL; - } - - String8 name; - stream->loadString(&name); - - Element *elem = Element::createFromStream(rsc, stream); - if (!elem) { - return NULL; - } - - uint32_t x = stream->loadU32(); - uint32_t y = stream->loadU32(); - uint32_t z = stream->loadU32(); - uint8_t lod = stream->loadU8(); - uint8_t faces = stream->loadU8(); - Type *type = Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0 ); - elem->decUserRef(); - return type; -} - -bool Type::getIsNp2() const { - uint32_t x = getDimX(); - uint32_t y = getDimY(); - uint32_t z = getDimZ(); - - if (x && (x & (x-1))) { - return true; - } - if (y && (y & (y-1))) { - return true; - } - if (z && (z & (z-1))) { - return true; - } - return false; -} - -ObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, - uint32_t dimX, uint32_t dimY, uint32_t dimZ, - bool dimLOD, bool dimFaces) { - ObjectBaseRef<Type> returnRef; - - TypeState * stc = &rsc->mStateType; - - ObjectBase::asyncLock(); - for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) { - Type *t = stc->mTypes[ct]; - if (t->getElement() != e) continue; - if (t->getDimX() != dimX) continue; - if (t->getDimY() != dimY) continue; - if (t->getDimZ() != dimZ) continue; - if (t->getDimLOD() != dimLOD) continue; - if (t->getDimFaces() != dimFaces) continue; - returnRef.set(t); - ObjectBase::asyncUnlock(); - return returnRef; - } - ObjectBase::asyncUnlock(); - - - Type *nt = new Type(rsc); - nt->mDimLOD = dimLOD; - returnRef.set(nt); - nt->mElement.set(e); - nt->mHal.state.dimX = dimX; - nt->mHal.state.dimY = dimY; - nt->mHal.state.dimZ = dimZ; - nt->mHal.state.faces = dimFaces; - nt->compute(); - - ObjectBase::asyncLock(); - stc->mTypes.push(nt); - ObjectBase::asyncUnlock(); - - return returnRef; -} - -ObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const { - return getTypeRef(rsc, mElement.get(), dimX, - getDimY(), getDimZ(), getDimLOD(), getDimFaces()); -} - -ObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc, - uint32_t dimX, - uint32_t dimY) const { - return getTypeRef(rsc, mElement.get(), dimX, dimY, - getDimZ(), getDimLOD(), getDimFaces()); -} - - -////////////////////////////////////////////////// -// -namespace android { -namespace renderscript { - -RsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX, - uint32_t dimY, uint32_t dimZ, bool mips, bool faces) { - Element *e = static_cast<Element *>(_e); - - return Type::getType(rsc, e, dimX, dimY, dimZ, mips, faces); -} - -} -} - -void rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) { - rsAssert(typeDataSize == 6); - // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ; - // mHal.state.lodCount; mHal.state.faces; mElement; into typeData - Type *t = static_cast<Type *>(type); - - (*typeData++) = t->getDimX(); - (*typeData++) = t->getDimY(); - (*typeData++) = t->getDimZ(); - (*typeData++) = t->getDimLOD() ? 1 : 0; - (*typeData++) = t->getDimFaces() ? 1 : 0; - (*typeData++) = (uint32_t)t->getElement(); - t->getElement()->incUserRef(); -} diff --git a/libs/rs/rsType.h b/libs/rs/rsType.h deleted file mode 100644 index f1aeb0a..0000000 --- a/libs/rs/rsType.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * 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_STRUCTURED_TYPE_H -#define ANDROID_STRUCTURED_TYPE_H - -#include "rsElement.h" - -// --------------------------------------------------------------------------- -namespace android { -namespace renderscript { -/***************************************************************************** - * CAUTION - * - * Any layout changes for this class may require a corresponding change to be - * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains - * a partial copy of the information below. - * - *****************************************************************************/ - -class Type : public ObjectBase { -public: - struct Hal { - mutable void *drv; - - struct State { - const Element * element; - - // Size of the structure in the various dimensions. A missing Dimension is - // specified as a 0 and not a 1. - uint32_t dimX; - uint32_t dimY; - uint32_t dimZ; - uint32_t *lodDimX; - uint32_t *lodDimY; - uint32_t *lodDimZ; - uint32_t *lodOffset; - uint32_t lodCount; - bool faces; - }; - State state; - }; - Hal mHal; - - Type * createTex2D(const Element *, size_t w, size_t h, bool mip); - - size_t getOffsetForFace(uint32_t face) const; - - size_t getSizeBytes() const {return mTotalSizeBytes;} - size_t getElementSizeBytes() const {return mElement->getSizeBytes();} - const Element * getElement() const {return mElement.get();} - - uint32_t getDimX() const {return mHal.state.dimX;} - uint32_t getDimY() const {return mHal.state.dimY;} - uint32_t getDimZ() const {return mHal.state.dimZ;} - bool getDimLOD() const {return mDimLOD;} - bool getDimFaces() const {return mHal.state.faces;} - - uint32_t getLODDimX(uint32_t lod) const { - rsAssert(lod < mHal.state.lodCount); - return mHal.state.lodDimX[lod]; - } - uint32_t getLODDimY(uint32_t lod) const { - rsAssert(lod < mHal.state.lodCount); - return mHal.state.lodDimY[lod]; - } - uint32_t getLODDimZ(uint32_t lod) const { - rsAssert(lod < mHal.state.lodCount); - return mHal.state.lodDimZ[lod]; - } - uint32_t getLODOffset(uint32_t lod) const { - rsAssert(lod < mHal.state.lodCount); - return mHal.state.lodOffset[lod]; - } - uint32_t getLODOffset(uint32_t lod, uint32_t x) const; - uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const; - uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const; - - uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, - uint32_t x, uint32_t y) const; - - uint32_t getLODCount() const {return mHal.state.lodCount;} - bool getIsNp2() const; - - void clear(); - void compute(); - - void dumpLOGV(const char *prefix) const; - virtual void serialize(OStream *stream) const; - virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_TYPE; } - static Type *createFromStream(Context *rsc, IStream *stream); - - ObjectBaseRef<Type> cloneAndResize1D(Context *rsc, uint32_t dimX) const; - ObjectBaseRef<Type> cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const; - - static ObjectBaseRef<Type> getTypeRef(Context *rsc, const Element *e, - uint32_t dimX, uint32_t dimY, uint32_t dimZ, - bool dimLOD, bool dimFaces); - - static Type* getType(Context *rsc, const Element *e, - uint32_t dimX, uint32_t dimY, uint32_t dimZ, - bool dimLOD, bool dimFaces) { - ObjectBaseRef<Type> type = getTypeRef(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces); - type->incUserRef(); - return type.get(); - } - -protected: - void makeLODTable(); - bool mDimLOD; - - // Internal structure from most to least significant. - // * Array dimensions - // * Faces - // * Mipmaps - // * xyz - - ObjectBaseRef<const Element> mElement; - - // count of mipmap levels, 0 indicates no mipmapping - - size_t mMipChainSizeBytes; - size_t mTotalSizeBytes; -protected: - virtual void preDestroy() const; - virtual ~Type(); - -private: - Type(Context *); - Type(const Type &); -}; - - -class TypeState { -public: - TypeState(); - ~TypeState(); - - // Cache of all existing types. - Vector<Type *> mTypes; -}; - - -} -} -#endif //ANDROID_STRUCTURED_TYPE diff --git a/libs/rs/rsUtils.h b/libs/rs/rsUtils.h deleted file mode 100644 index cbbae6c..0000000 --- a/libs/rs/rsUtils.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2009 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_UTILS_H -#define ANDROID_RS_UTILS_H - -#define LOG_NDEBUG 0 -#define LOG_TAG "RenderScript" - -#include <utils/Log.h> - -#include "rsStream.h" - -#include <utils/String8.h> -#include <utils/Vector.h> - -#include <stdlib.h> -#include <pthread.h> -#include <time.h> -#include <cutils/atomic.h> - -#include <math.h> - -namespace android { -namespace renderscript { - -#if 1 -#define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0) -#else -#define rsAssert(v) while (0) -#endif - -typedef float rsvF_2 __attribute__ ((vector_size (8))); -typedef float rsvF_4 __attribute__ ((vector_size (16))); -typedef uint8_t rsvU8_4 __attribute__ ((vector_size (4))); - -union float2 { - rsvF_2 v; - float f[2]; -}; - -union float4 { - rsvF_4 v; - float f[4]; -}; - -union uchar4 { - rsvU8_4 v; - uint8_t f[4]; - uint32_t packed; -}; - -template<typename T> -T rsMin(T in1, T in2) -{ - if (in1 > in2) { - return in2; - } - return in1; -} - -template<typename T> -T rsMax(T in1, T in2) { - if (in1 < in2) { - return in2; - } - return in1; -} - -template<typename T> -T rsFindHighBit(T val) { - uint32_t bit = 0; - while (val > 1) { - bit++; - val>>=1; - } - return bit; -} - -template<typename T> -bool rsIsPow2(T val) { - return (val & (val-1)) == 0; -} - -template<typename T> -T rsHigherPow2(T v) { - if (rsIsPow2(v)) { - return v; - } - return 1 << (rsFindHighBit(v) + 1); -} - -template<typename T> -T rsLowerPow2(T v) { - if (rsIsPow2(v)) { - return v; - } - return 1 << rsFindHighBit(v); -} - -static inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) { - uint16_t t = 0; - t |= b >> 3; - t |= (g >> 2) << 5; - t |= (r >> 3) << 11; - return t; -} - -static inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) { - uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f)); - uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f); - uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11)); - return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11); -} - -static inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) { - uint32_t r = (i1 & 0xff) + (i2 & 0xff) + (i3 & 0xff) + (i4 & 0xff); - uint32_t g = ((i1 >> 8) & 0xff) + ((i2 >> 8) & 0xff) + ((i3 >> 8) & 0xff) + ((i4 >> 8) & 0xff); - uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff); - uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff); - return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24); -} - -} -} - -#endif //ANDROID_RS_OBJECT_BASE_H - - diff --git a/libs/rs/rs_hal.h b/libs/rs/rs_hal.h deleted file mode 100644 index e4bf17f..0000000 --- a/libs/rs/rs_hal.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * 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 RS_HAL_H -#define RS_HAL_H - -#include <rsDefines.h> - -struct ANativeWindow; - -namespace android { -namespace renderscript { - -class Context; -class ObjectBase; -class Element; -class Type; -class Allocation; -class Script; -class ScriptC; -class Path; -class Program; -class ProgramStore; -class ProgramRaster; -class ProgramVertex; -class ProgramFragment; -class Mesh; -class Sampler; -class FBOCache; - -typedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName); - -typedef struct { - const void *in; - void *out; - const void *usr; - size_t usr_len; - uint32_t x; - uint32_t y; - uint32_t z; - uint32_t lod; - RsAllocationCubemapFace face; - uint32_t ar[16]; -} RsForEachStubParamStruct; - -/** - * Script management functions - */ -typedef struct { - bool (*initGraphics)(const Context *); - void (*shutdownGraphics)(const Context *); - bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow); - void (*swap)(const Context *); - - void (*shutdownDriver)(Context *); - void (*getVersion)(unsigned int *major, unsigned int *minor); - void (*setPriority)(const Context *, int32_t priority); - - - - struct { - bool (*init)(const Context *rsc, ScriptC *s, - char const *resName, - char const *cacheDir, - uint8_t const *bitcode, - size_t bitcodeSize, - uint32_t flags); - - void (*invokeFunction)(const Context *rsc, Script *s, - uint32_t slot, - const void *params, - size_t paramLength); - int (*invokeRoot)(const Context *rsc, Script *s); - void (*invokeForEach)(const Context *rsc, - Script *s, - uint32_t slot, - const Allocation * ain, - Allocation * aout, - const void * usr, - uint32_t usrLen, - const RsScriptCall *sc); - void (*invokeInit)(const Context *rsc, Script *s); - void (*invokeFreeChildren)(const Context *rsc, Script *s); - - void (*setGlobalVar)(const Context *rsc, const Script *s, - uint32_t slot, - void *data, - size_t dataLength); - void (*setGlobalBind)(const Context *rsc, const Script *s, - uint32_t slot, - void *data); - void (*setGlobalObj)(const Context *rsc, const Script *s, - uint32_t slot, - ObjectBase *data); - - void (*destroy)(const Context *rsc, Script *s); - } script; - - struct { - bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero); - void (*destroy)(const Context *rsc, Allocation *alloc); - - void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType, - bool zeroNew); - void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src); - void (*markDirty)(const Context *rsc, const Allocation *alloc); - - int32_t (*initSurfaceTexture)(const Context *rsc, const Allocation *alloc); - void (*setSurfaceTexture)(const Context *rsc, Allocation *alloc, ANativeWindow *sur); - void (*ioSend)(const Context *rsc, Allocation *alloc); - void (*ioReceive)(const Context *rsc, Allocation *alloc); - - void (*data1D)(const Context *rsc, const Allocation *alloc, - uint32_t xoff, uint32_t lod, uint32_t count, - const void *data, size_t sizeBytes); - void (*data2D)(const Context *rsc, const Allocation *alloc, - uint32_t xoff, uint32_t yoff, uint32_t lod, - RsAllocationCubemapFace face, uint32_t w, uint32_t h, - const void *data, size_t sizeBytes); - void (*data3D)(const Context *rsc, const Allocation *alloc, - uint32_t xoff, uint32_t yoff, uint32_t zoff, - uint32_t lod, RsAllocationCubemapFace face, - uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes); - - // Allocation to allocation copies - void (*allocData1D)(const Context *rsc, - const Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstLod, uint32_t count, - const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod); - void (*allocData2D)(const Context *rsc, - const Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod, - RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h, - const Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod, - RsAllocationCubemapFace srcFace); - void (*allocData3D)(const Context *rsc, - const Allocation *dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, - uint32_t dstLod, RsAllocationCubemapFace dstFace, - uint32_t w, uint32_t h, uint32_t d, - const Allocation *srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, - uint32_t srcLod, RsAllocationCubemapFace srcFace); - - void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x, - const void *data, uint32_t elementOff, size_t sizeBytes); - void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y, - const void *data, uint32_t elementOff, size_t sizeBytes); - - - } allocation; - - struct { - bool (*init)(const Context *rsc, const ProgramStore *ps); - void (*setActive)(const Context *rsc, const ProgramStore *ps); - void (*destroy)(const Context *rsc, const ProgramStore *ps); - } store; - - struct { - bool (*init)(const Context *rsc, const ProgramRaster *ps); - void (*setActive)(const Context *rsc, const ProgramRaster *ps); - void (*destroy)(const Context *rsc, const ProgramRaster *ps); - } raster; - - struct { - bool (*init)(const Context *rsc, const ProgramVertex *pv, - const char* shader, size_t shaderLen, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength); - void (*setActive)(const Context *rsc, const ProgramVertex *pv); - void (*destroy)(const Context *rsc, const ProgramVertex *pv); - } vertex; - - struct { - bool (*init)(const Context *rsc, const ProgramFragment *pf, - const char* shader, size_t shaderLen, - const char** textureNames, size_t textureNamesCount, - const size_t *textureNamesLength); - void (*setActive)(const Context *rsc, const ProgramFragment *pf); - void (*destroy)(const Context *rsc, const ProgramFragment *pf); - } fragment; - - struct { - bool (*init)(const Context *rsc, const Mesh *m); - void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len); - void (*destroy)(const Context *rsc, const Mesh *m); - } 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; - - struct { - bool (*init)(const Context *rsc, const FBOCache *fb); - void (*setActive)(const Context *rsc, const FBOCache *fb); - void (*destroy)(const Context *rsc, const FBOCache *fb); - } framebuffer; - -} RsdHalFunctions; - - -} -} - - -bool rsdHalInit(android::renderscript::Context *, uint32_t version_major, uint32_t version_minor); - -#endif - diff --git a/libs/rs/rsgApi.cpp.rsg b/libs/rs/rsgApi.cpp.rsg deleted file mode 100644 index 0cfbf08..0000000 --- a/libs/rs/rsgApi.cpp.rsg +++ /dev/null @@ -1 +0,0 @@ -2 diff --git a/libs/rs/rsgApiFuncDecl.h.rsg b/libs/rs/rsgApiFuncDecl.h.rsg deleted file mode 100644 index d00491f..0000000 --- a/libs/rs/rsgApiFuncDecl.h.rsg +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/libs/rs/rsgApiReplay.cpp.rsg b/libs/rs/rsgApiReplay.cpp.rsg deleted file mode 100644 index 00750ed..0000000 --- a/libs/rs/rsgApiReplay.cpp.rsg +++ /dev/null @@ -1 +0,0 @@ -3 diff --git a/libs/rs/rsgApiStructs.h.rsg b/libs/rs/rsgApiStructs.h.rsg deleted file mode 100644 index 573541a..0000000 --- a/libs/rs/rsgApiStructs.h.rsg +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/libs/rs/rsg_generator.c b/libs/rs/rsg_generator.c deleted file mode 100644 index c0f82dc..0000000 --- a/libs/rs/rsg_generator.c +++ /dev/null @@ -1,684 +0,0 @@ - -#include "spec.h" -#include <stdio.h> - -void printFileHeader(FILE *f) { - fprintf(f, "/*\n"); - fprintf(f, " * Copyright (C) 2011 The Android Open Source Project\n"); - fprintf(f, " *\n"); - fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"); - fprintf(f, " * you may not use this file except in compliance with the License.\n"); - fprintf(f, " * You may obtain a copy of the License at\n"); - fprintf(f, " *\n"); - fprintf(f, " * http://www.apache.org/licenses/LICENSE-2.0\n"); - fprintf(f, " *\n"); - fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n"); - fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - fprintf(f, " * See the License for the specific language governing permissions and\n"); - fprintf(f, " * limitations under the License.\n"); - fprintf(f, " */\n\n"); -} - -void printVarType(FILE *f, const VarType *vt) { - int ct; - if (vt->isConst) { - fprintf(f, "const "); - } - - switch (vt->type) { - case 0: - fprintf(f, "void"); - break; - case 1: - fprintf(f, "int%i_t", vt->bits); - break; - case 2: - fprintf(f, "uint%i_t", vt->bits); - break; - case 3: - if (vt->bits == 32) - fprintf(f, "float"); - else - fprintf(f, "double"); - break; - case 4: - fprintf(f, "%s", vt->typeName); - break; - } - - if (vt->ptrLevel) { - fprintf(f, " "); - for (ct=0; ct < vt->ptrLevel; ct++) { - fprintf(f, "*"); - } - } -} - -void printVarTypeAndName(FILE *f, const VarType *vt) { - printVarType(f, vt); - - if (vt->name[0]) { - fprintf(f, " %s", vt->name); - } -} - -void printArgList(FILE *f, const ApiEntry * api, int assumePrevious) { - int ct; - for (ct=0; ct < api->paramCount; ct++) { - if (ct || assumePrevious) { - fprintf(f, ", "); - } - printVarTypeAndName(f, &api->params[ct]); - } -} - -void printStructures(FILE *f) { - int ct; - int ct2; - - for (ct=0; ct < apiCount; ct++) { - fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name); - } - fprintf(f, "\n"); - - for (ct=0; ct < apiCount; ct++) { - const ApiEntry * api = &apis[ct]; - fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1); - fprintf(f, "struct RS_CMD_%s_rec {\n", api->name); - //fprintf(f, " RsCommandHeader _hdr;\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - fprintf(f, " "); - printVarTypeAndName(f, &api->params[ct2]); - fprintf(f, ";\n"); - } - fprintf(f, "};\n\n"); - } -} - -void printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) { - printVarTypeAndName(f, &api->ret); - if (isFnPtr) { - char t[1024]; - strcpy(t, api->name); - if (strlen(prefix) == 0) { - if (t[0] > 'A' && t[0] < 'Z') { - t[0] -= 'A' - 'a'; - } - } - fprintf(f, " (* %s%s) (", prefix, api->name); - } else { - fprintf(f, " %s%s (", prefix, api->name); - } - if (!api->nocontext) { - if (addContext) { - fprintf(f, "Context *"); - } else { - fprintf(f, "RsContext rsc"); - } - } - printArgList(f, api, !api->nocontext); - fprintf(f, ")"); -} - -void printFuncDecls(FILE *f, const char *prefix, int addContext) { - int ct; - for (ct=0; ct < apiCount; ct++) { - printFuncDecl(f, &apis[ct], prefix, addContext, 0); - fprintf(f, ";\n"); - } - fprintf(f, "\n\n"); -} - -void printFuncPointers(FILE *f, int addContext) { - fprintf(f, "\n"); - fprintf(f, "typedef struct RsApiEntrypoints {\n"); - int ct; - for (ct=0; ct < apiCount; ct++) { - fprintf(f, " "); - printFuncDecl(f, &apis[ct], "", addContext, 1); - fprintf(f, ";\n"); - } - fprintf(f, "} RsApiEntrypoints_t;\n\n"); -} - -void printPlaybackFuncs(FILE *f, const char *prefix) { - int ct; - for (ct=0; ct < apiCount; ct++) { - if (apis[ct].direct) { - continue; - } - - fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name); - } -} - -static int hasInlineDataPointers(const ApiEntry * api) { - int ret = 0; - int ct; - if (api->sync || api->ret.typeName[0]) { - return 0; - } - for (ct=0; ct < api->paramCount; ct++) { - const VarType *vt = &api->params[ct]; - - if (!vt->isConst && vt->ptrLevel) { - // Non-const pointers cannot be inlined. - return 0; - } - if (vt->ptrLevel > 1) { - // not handled yet. - return 0; - } - - if (vt->isConst && vt->ptrLevel) { - // Non-const pointers cannot be inlined. - ret = 1; - } - } - return ret; -} - -void printApiCpp(FILE *f) { - int ct; - int ct2; - - fprintf(f, "#include \"rsDevice.h\"\n"); - fprintf(f, "#include \"rsContext.h\"\n"); - fprintf(f, "#include \"rsThreadIO.h\"\n"); - fprintf(f, "#include \"rsgApiStructs.h\"\n"); - fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); - fprintf(f, "#include \"rsFifo.h\"\n"); - fprintf(f, "\n"); - fprintf(f, "using namespace android;\n"); - fprintf(f, "using namespace android::renderscript;\n"); - fprintf(f, "\n"); - - printFuncPointers(f, 0); - - // Generate RS funcs for local fifo - for (ct=0; ct < apiCount; ct++) { - int needFlush = 0; - const ApiEntry * api = &apis[ct]; - - fprintf(f, "static "); - printFuncDecl(f, api, "LF_", 0, 0); - fprintf(f, "\n{\n"); - if (api->direct) { - fprintf(f, " "); - if (api->ret.typeName[0]) { - fprintf(f, "return "); - } - fprintf(f, "rsi_%s(", api->name); - if (!api->nocontext) { - fprintf(f, "(Context *)rsc"); - } - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (ct2 > 0 || !api->nocontext) { - fprintf(f, ", "); - } - fprintf(f, "%s", vt->name); - } - fprintf(f, ");\n"); - } else { - fprintf(f, " ThreadIO *io = &((Context *)rsc)->mIO;\n"); - fprintf(f, " const uint32_t size = sizeof(RS_CMD_%s);\n", api->name); - if (hasInlineDataPointers(api)) { - fprintf(f, " uint32_t dataSize = 0;\n"); - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (vt->isConst && vt->ptrLevel) { - fprintf(f, " dataSize += %s_length;\n", vt->name); - } - } - } - - //fprintf(f, " ALOGE(\"add command %s\\n\");\n", api->name); - if (hasInlineDataPointers(api)) { - fprintf(f, " RS_CMD_%s *cmd = NULL;\n", api->name); - fprintf(f, " if (dataSize < io->getMaxInlineSize()) {;\n"); - fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name); - fprintf(f, " } else {\n"); - fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name); - fprintf(f, " }\n"); - fprintf(f, " uint8_t *payload = (uint8_t *)&cmd[1];\n"); - } else { - fprintf(f, " RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name, api->name); - } - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - needFlush += vt->ptrLevel; - if (vt->ptrLevel && hasInlineDataPointers(api)) { - fprintf(f, " if (dataSize < io->getMaxInlineSize()) {\n"); - fprintf(f, " memcpy(payload, %s, %s_length);\n", vt->name, vt->name); - fprintf(f, " cmd->%s = (", vt->name); - printVarType(f, vt); - fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n"); - fprintf(f, " payload += %s_length;\n", vt->name); - fprintf(f, " } else {\n"); - fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); - fprintf(f, " }\n"); - - } else { - fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); - } - } - if (api->ret.typeName[0] || api->sync) { - needFlush = 1; - } - - fprintf(f, " io->coreCommit();\n"); - if (hasInlineDataPointers(api)) { - fprintf(f, " if (dataSize >= io->getMaxInlineSize()) {\n"); - fprintf(f, " io->coreGetReturn(NULL, 0);\n"); - fprintf(f, " }\n"); - } else if (api->ret.typeName[0]) { - fprintf(f, "\n "); - printVarType(f, &api->ret); - fprintf(f, " ret;\n"); - fprintf(f, " io->coreGetReturn(&ret, sizeof(ret));\n"); - fprintf(f, " return ret;\n"); - } else if (needFlush) { - fprintf(f, " io->coreGetReturn(NULL, 0);\n"); - } - } - fprintf(f, "};\n\n"); - - - // Generate a remote sender function - const char * str = "core"; - if (api->direct) { - str = "async"; - } - - fprintf(f, "static "); - printFuncDecl(f, api, "RF_", 0, 0); - fprintf(f, "\n{\n"); - fprintf(f, " ThreadIO *io = &((Context *)rsc)->mIO;\n"); - fprintf(f, " const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name); - fprintf(f, " io->%sWrite(&cmdID, sizeof(cmdID));\n\n", str); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (vt->ptrLevel == 0) { - fprintf(f, " io->%sWrite(& %s, sizeof(%s));\n", str, vt->name, vt->name); - } - } - fprintf(f, "\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if ((vt->ptrLevel == 1) && (vt->isConst)) { - fprintf(f, " io->%sWrite(%s, %s_length);\n", str, vt->name, vt->name); - } - } - fprintf(f, "\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if ((vt->ptrLevel == 2) && (vt->isConst)) { - fprintf(f, " for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name); - fprintf(f, " io->%sWrite(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name); - fprintf(f, " }\n"); - } - } - fprintf(f, "\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if ((vt->ptrLevel == 1) && (!vt->isConst)) { - fprintf(f, " io->%sGetReturn(%s, %s_length);\n", str, vt->name, vt->name); - } - } - fprintf(f, "\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if ((vt->ptrLevel == 2) && (!vt->isConst)) { - fprintf(f, " for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name); - fprintf(f, " io->%sGetReturn(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name); - fprintf(f, " }\n"); - } - } - fprintf(f, "\n"); - - if (api->ret.typeName[0]) { - fprintf(f, " "); - printVarType(f, &api->ret); - fprintf(f, " retValue;\n"); - fprintf(f, " io->%sGetReturn(&retValue, sizeof(retValue));\n", str); - fprintf(f, " return retValue;\n"); - } else /*if (api->sync)*/ { - fprintf(f, " io->%sGetReturn(NULL, 0);\n", str); - } - fprintf(f, "}\n\n"); - } - - fprintf(f, "\n"); - fprintf(f, "static RsApiEntrypoints_t s_LocalTable = {\n"); - for (ct=0; ct < apiCount; ct++) { - fprintf(f, " LF_%s,\n", apis[ct].name); - } - fprintf(f, "};\n"); - - fprintf(f, "\n"); - fprintf(f, "static RsApiEntrypoints_t s_RemoteTable = {\n"); - for (ct=0; ct < apiCount; ct++) { - fprintf(f, " RF_%s,\n", apis[ct].name); - } - fprintf(f, "};\n"); - - fprintf(f, "static RsApiEntrypoints_t *s_CurrentTable = &s_LocalTable;\n\n"); - for (ct=0; ct < apiCount; ct++) { - int needFlush = 0; - const ApiEntry * api = &apis[ct]; - - printFuncDecl(f, api, "rs", 0, 0); - fprintf(f, "\n{\n"); - fprintf(f, " "); - if (api->ret.typeName[0]) { - fprintf(f, "return "); - } - fprintf(f, "s_CurrentTable->%s(", api->name); - - if (!api->nocontext) { - fprintf(f, "(Context *)rsc"); - } - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (ct2 > 0 || !api->nocontext) { - fprintf(f, ", "); - } - fprintf(f, "%s", vt->name); - } - fprintf(f, ");\n"); - fprintf(f, "}\n\n"); - } - -} - -void printPlaybackCpp(FILE *f) { - int ct; - int ct2; - - fprintf(f, "#include \"rsDevice.h\"\n"); - fprintf(f, "#include \"rsContext.h\"\n"); - fprintf(f, "#include \"rsThreadIO.h\"\n"); - fprintf(f, "#include \"rsgApiStructs.h\"\n"); - fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); - fprintf(f, "\n"); - fprintf(f, "namespace android {\n"); - fprintf(f, "namespace renderscript {\n"); - fprintf(f, "\n"); - - for (ct=0; ct < apiCount; ct++) { - const ApiEntry * api = &apis[ct]; - int needFlush = 0; - - if (api->direct) { - continue; - } - - fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name); - fprintf(f, " const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name); - - if (hasInlineDataPointers(api)) { - fprintf(f, " const uint8_t *baseData = 0;\n"); - fprintf(f, " if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name); - fprintf(f, " baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n"); - fprintf(f, " }\n"); - } - - fprintf(f, " "); - if (api->ret.typeName[0]) { - fprintf(f, "\n "); - printVarType(f, &api->ret); - fprintf(f, " ret = "); - } - fprintf(f, "rsi_%s(con", api->name); - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - needFlush += vt->ptrLevel; - - if (hasInlineDataPointers(api) && vt->ptrLevel) { - fprintf(f, ",\n (const %s *)&baseData[(intptr_t)cmd->%s]", vt->typeName, vt->name); - } else { - fprintf(f, ",\n cmd->%s", vt->name); - } - } - fprintf(f, ");\n"); - - if (hasInlineDataPointers(api)) { - fprintf(f, " size_t totalSize = 0;\n"); - for (ct2=0; ct2 < api->paramCount; ct2++) { - if (api->params[ct2].ptrLevel) { - fprintf(f, " totalSize += cmd->%s_length;\n", api->params[ct2].name); - } - } - - fprintf(f, " if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name); - fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); - fprintf(f, " }\n"); - } else if (api->ret.typeName[0]) { - fprintf(f, " con->mIO.coreSetReturn(&ret, sizeof(ret));\n"); - } else if (api->sync || needFlush) { - fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); - } - - fprintf(f, "};\n\n"); - } - - for (ct=0; ct < apiCount; ct++) { - const ApiEntry * api = &apis[ct]; - int needFlush = 0; - - fprintf(f, "void rspr_%s(Context *con, ThreadIO *io) {\n", api->name); - fprintf(f, " RS_CMD_%s cmd;\n", api->name); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (vt->ptrLevel == 0) { - fprintf(f, " io->coreRead(&cmd.%s, sizeof(cmd.%s));\n", vt->name, vt->name); - } - } - fprintf(f, "\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (vt->ptrLevel == 1) { - fprintf(f, " cmd.%s = (", vt->name); - printVarType(f, vt); - fprintf(f, ")malloc(cmd.%s_length);\n", vt->name); - - if (vt->isConst) { - fprintf(f, " if (cmd.%s_length) io->coreRead((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name, vt->name); - } - } - } - fprintf(f, "\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (vt->ptrLevel == 2) { - fprintf(f, " for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name); - fprintf(f, " cmd.%s = (", vt->name); - printVarType(f, vt); - fprintf(f, ")malloc(cmd.%s_length[ct]);\n", vt->name); - fprintf(f, " io->coreRead(& cmd.%s, cmd.%s_length[ct]);\n", vt->name, vt->name); - fprintf(f, " }\n"); - } - } - fprintf(f, "\n"); - - if (api->ret.typeName[0]) { - fprintf(f, " "); - printVarType(f, &api->ret); - fprintf(f, " ret =\n"); - } - - fprintf(f, " rsi_%s(", api->name); - if (!api->nocontext) { - fprintf(f, "con"); - } - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (ct2 > 0 || !api->nocontext) { - fprintf(f, ",\n"); - } - fprintf(f, " cmd.%s", vt->name); - } - fprintf(f, ");\n"); - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if ((vt->ptrLevel == 1) && (!vt->isConst)) { - fprintf(f, " io->coreSetReturn((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name); - } - } - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if ((vt->ptrLevel == 2) && (!vt->isConst)) { - fprintf(f, " for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name); - fprintf(f, " io->coreSetReturn((void *)cmd.%s[ct], cmd.%s_length[ct]);\n", vt->name, vt->name); - fprintf(f, " }\n"); - } - } - fprintf(f, "\n"); - - if (api->ret.typeName[0]) { - fprintf(f, " io->coreSetReturn(&ret, sizeof(ret));\n"); - } else /*if (needFlush)*/ { - fprintf(f, " io->coreSetReturn(NULL, 0);\n"); - } - - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (vt->ptrLevel == 1) { - fprintf(f, " free((void *)cmd.%s);\n", vt->name); - } - } - for (ct2=0; ct2 < api->paramCount; ct2++) { - const VarType *vt = &api->params[ct2]; - if (vt->ptrLevel == 2) { - fprintf(f, " for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name); - fprintf(f, " free((void *)cmd.%s);\n", vt->name); - fprintf(f, " }\n"); - } - } - - fprintf(f, "};\n\n"); - } - - fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1); - fprintf(f, " NULL,\n"); - for (ct=0; ct < apiCount; ct++) { - if (apis[ct].direct) { - fprintf(f, " NULL,\n"); - } else { - fprintf(f, " %s%s,\n", "rsp_", apis[ct].name); - } - } - fprintf(f, "};\n"); - - fprintf(f, "RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i] = {\n", apiCount + 1); - fprintf(f, " NULL,\n"); - for (ct=0; ct < apiCount; ct++) { - fprintf(f, " %s%s,\n", "rspr_", apis[ct].name); - } - fprintf(f, "};\n"); - - fprintf(f, "};\n"); - fprintf(f, "};\n"); -} - -void yylex(); - -int main(int argc, char **argv) { - if (argc != 3) { - fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]); - return 1; - } - const char* rsgFile = argv[1]; - const char* outFile = argv[2]; - FILE* input = fopen(rsgFile, "r"); - - char choice = fgetc(input); - fclose(input); - - if (choice < '0' || choice > '3') { - fprintf(stderr, "Uknown command: \'%c\'\n", choice); - return -2; - } - - yylex(); - // printf("# of lines = %d\n", num_lines); - - FILE *f = fopen(outFile, "w"); - - printFileHeader(f); - switch (choice) { - case '0': // rsgApiStructs.h - { - fprintf(f, "\n"); - fprintf(f, "#include \"rsContext.h\"\n"); - fprintf(f, "#include \"rsFifo.h\"\n"); - fprintf(f, "\n"); - fprintf(f, "namespace android {\n"); - fprintf(f, "namespace renderscript {\n"); - printStructures(f); - printFuncDecls(f, "rsi_", 1); - printPlaybackFuncs(f, "rsp_"); - fprintf(f, "\n\ntypedef struct RsPlaybackRemoteHeaderRec {\n"); - fprintf(f, " uint32_t command;\n"); - fprintf(f, " uint32_t size;\n"); - fprintf(f, "} RsPlaybackRemoteHeader;\n\n"); - fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n"); - fprintf(f, "typedef void (*RsPlaybackRemoteFunc)(Context *, ThreadIO *);\n"); - fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1); - fprintf(f, "extern RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i];\n", apiCount + 1); - - fprintf(f, "}\n"); - fprintf(f, "}\n"); - } - break; - - case '1': // rsgApiFuncDecl.h - { - printFuncDecls(f, "rs", 0); - } - break; - - case '2': // rsgApi.cpp - { - printApiCpp(f); - } - break; - - case '3': // rsgApiReplay.cpp - { - printFileHeader(f); - printPlaybackCpp(f); - } - break; - - case '4': // rsgApiStream.cpp - { - printFileHeader(f); - printPlaybackCpp(f); - } - - case '5': // rsgApiStreamReplay.cpp - { - printFileHeader(f); - printPlaybackCpp(f); - } - break; - } - fclose(f); - return 0; -} diff --git a/libs/rs/scriptc/rs_allocation.rsh b/libs/rs/scriptc/rs_allocation.rsh deleted file mode 100644 index b0840a0..0000000 --- a/libs/rs/scriptc/rs_allocation.rsh +++ /dev/null @@ -1,199 +0,0 @@ -/* - * 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. - */ - -/** @file rs_allocation.rsh - * \brief Allocation routines - * - * - */ - -#ifndef __RS_ALLOCATION_RSH__ -#define __RS_ALLOCATION_RSH__ - -/** - * Returns the Allocation for a given pointer. The pointer should point within - * a valid allocation. The results are undefined if the pointer is not from a - * valid allocation. - */ -extern rs_allocation __attribute__((overloadable)) - rsGetAllocation(const void *); - -/** - * Query the dimension of an allocation. - * - * @return uint32_t The X dimension of the allocation. - */ -extern uint32_t __attribute__((overloadable)) - rsAllocationGetDimX(rs_allocation); - -/** - * Query the dimension of an allocation. - * - * @return uint32_t The Y dimension of the allocation. - */ -extern uint32_t __attribute__((overloadable)) - rsAllocationGetDimY(rs_allocation); - -/** - * Query the dimension of an allocation. - * - * @return uint32_t The Z dimension of the allocation. - */ -extern uint32_t __attribute__((overloadable)) - rsAllocationGetDimZ(rs_allocation); - -/** - * Query an allocation for the presence of more than one LOD. - * - * @return uint32_t Returns 1 if more than one LOD is present, 0 otherwise. - */ -extern uint32_t __attribute__((overloadable)) - rsAllocationGetDimLOD(rs_allocation); - -/** - * Query an allocation for the presence of more than one face. - * - * @return uint32_t Returns 1 if more than one face is present, 0 otherwise. - */ -extern uint32_t __attribute__((overloadable)) - rsAllocationGetDimFaces(rs_allocation); - -#if (defined(RS_VERSION) && (RS_VERSION >= 14)) - -/** - * Copy part of an allocation from another allocation. - * - * @param dstAlloc Allocation to copy data into. - * @param dstOff The offset of the first element to be copied in - * the destination allocation. - * @param dstMip Mip level in the destination allocation. - * @param count The number of elements to be copied. - * @param srcAlloc The source data allocation. - * @param srcOff The offset of the first element in data to be - * copied in the source allocation. - * @param srcMip Mip level in the source allocation. - */ -extern void __attribute__((overloadable)) - rsAllocationCopy1DRange(rs_allocation dstAlloc, - uint32_t dstOff, uint32_t dstMip, - uint32_t count, - rs_allocation srcAlloc, - uint32_t srcOff, uint32_t srcMip); - -/** - * Copy a rectangular region into the allocation from another - * allocation. - * - * @param dstAlloc allocation to copy data into. - * @param dstXoff X offset of the region to update in the - * destination allocation. - * @param dstYoff Y offset of the region to update in the - * destination allocation. - * @param dstMip Mip level in the destination allocation. - * @param dstFace Cubemap face of the destination allocation, - * ignored for allocations that aren't cubemaps. - * @param width Width of the incoming region to update. - * @param height Height of the incoming region to update. - * @param srcAlloc The source data allocation. - * @param srcXoff X offset in data of the source allocation. - * @param srcYoff Y offset in data of the source allocation. - * @param srcMip Mip level in the source allocation. - * @param srcFace Cubemap face of the source allocation, - * ignored for allocations that aren't cubemaps. - */ -extern void __attribute__((overloadable)) - rsAllocationCopy2DRange(rs_allocation dstAlloc, - uint32_t dstXoff, uint32_t dstYoff, - uint32_t dstMip, - rs_allocation_cubemap_face dstFace, - uint32_t width, uint32_t height, - rs_allocation srcAlloc, - uint32_t srcXoff, uint32_t srcYoff, - uint32_t srcMip, - rs_allocation_cubemap_face srcFace); - -#endif //defined(RS_VERSION) && (RS_VERSION >= 14) - -/** - * Extract a single element from an allocation. - */ -extern const void * __attribute__((overloadable)) - rsGetElementAt(rs_allocation, uint32_t x); -/** - * \overload - */ -extern const void * __attribute__((overloadable)) - rsGetElementAt(rs_allocation, uint32_t x, uint32_t y); -/** - * \overload - */ -extern const void * __attribute__((overloadable)) - rsGetElementAt(rs_allocation, uint32_t x, uint32_t y, uint32_t z); - -#if (defined(RS_VERSION) && (RS_VERSION >= 16)) - -/** - * @param a allocation to get data from - * @return element describing allocation layout - */ -extern rs_element __attribute__((overloadable)) - rsAllocationGetElement(rs_allocation a); - -/** - * Fetch allocation in a way described by the sampler - * @param a 1D allocation to sample from - * @param s sampler state - * @param location to sample from - */ -extern const float4 __attribute__((overloadable)) - rsSample(rs_allocation a, rs_sampler s, float location); -/** - * Fetch allocation in a way described by the sampler - * @param a 1D allocation to sample from - * @param s sampler state - * @param location to sample from - * @param lod mip level to sample from, for fractional values - * mip levels will be interpolated if - * RS_SAMPLER_LINEAR_MIP_LINEAR is used - */ -extern const float4 __attribute__((overloadable)) - rsSample(rs_allocation a, rs_sampler s, float location, float lod); - -/** - * Fetch allocation in a way described by the sampler - * @param a 2D allocation to sample from - * @param s sampler state - * @param location to sample from - */ -extern const float4 __attribute__((overloadable)) - rsSample(rs_allocation a, rs_sampler s, float2 location); - -/** - * Fetch allocation in a way described by the sampler - * @param a 2D allocation to sample from - * @param s sampler state - * @param location to sample from - * @param lod mip level to sample from, for fractional values - * mip levels will be interpolated if - * RS_SAMPLER_LINEAR_MIP_LINEAR is used - */ -extern const float4 __attribute__((overloadable)) - rsSample(rs_allocation a, rs_sampler s, float2 location, float lod); - -#endif // (defined(RS_VERSION) && (RS_VERSION >= 16)) - -#endif - diff --git a/libs/rs/scriptc/rs_atomic.rsh b/libs/rs/scriptc/rs_atomic.rsh deleted file mode 100644 index a455edd..0000000 --- a/libs/rs/scriptc/rs_atomic.rsh +++ /dev/null @@ -1,250 +0,0 @@ -/* - * 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. - */ - -/** @file rs_atomic.rsh - * \brief Atomic routines - * - * - */ - -#ifndef __RS_ATOMIC_RSH__ -#define __RS_ATOMIC_RSH__ - -#if (defined(RS_VERSION) && (RS_VERSION >= 14)) - -/** - * Atomic add one to the value at addr. - * Equal to rsAtomicAdd(addr, 1) - * - * @param addr Address of value to increment - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicInc(volatile int32_t* addr); -/** - * Atomic add one to the value at addr. - * Equal to rsAtomicAdd(addr, 1) - * - * @param addr Address of value to increment - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicInc(volatile uint32_t* addr); - -/** - * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1) - * - * @param addr Address of value to decrement - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicDec(volatile int32_t* addr); -/** - * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1) - * - * @param addr Address of value to decrement - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicDec(volatile uint32_t* addr); - -/** - * Atomic add a value to the value at addr. addr[0] += value - * - * @param addr Address of value to modify - * @param value Amount to add to the value at addr - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicAdd(volatile int32_t* addr, int32_t value); -/** - * Atomic add a value to the value at addr. addr[0] += value - * - * @param addr Address of value to modify - * @param value Amount to add to the value at addr - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicAdd(volatile uint32_t* addr, uint32_t value); - -/** - * Atomic Subtract a value from the value at addr. addr[0] -= value - * - * @param addr Address of value to modify - * @param value Amount to subtract from the value at addr - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicSub(volatile int32_t* addr, int32_t value); -/** - * Atomic Subtract a value from the value at addr. addr[0] -= value - * - * @param addr Address of value to modify - * @param value Amount to subtract from the value at addr - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicSub(volatile uint32_t* addr, uint32_t value); - -/** - * Atomic Bitwise and a value from the value at addr. addr[0] &= value - * - * @param addr Address of value to modify - * @param value Amount to and with the value at addr - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicAnd(volatile int32_t* addr, int32_t value); -/** - * Atomic Bitwise and a value from the value at addr. addr[0] &= value - * - * @param addr Address of value to modify - * @param value Amount to and with the value at addr - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicAnd(volatile uint32_t* addr, uint32_t value); - -/** - * Atomic Bitwise or a value from the value at addr. addr[0] |= value - * - * @param addr Address of value to modify - * @param value Amount to or with the value at addr - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicOr(volatile int32_t* addr, int32_t value); -/** - * Atomic Bitwise or a value from the value at addr. addr[0] |= value - * - * @param addr Address of value to modify - * @param value Amount to or with the value at addr - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicOr(volatile uint32_t* addr, uint32_t value); - -/** - * Atomic Bitwise xor a value from the value at addr. addr[0] ^= value - * - * @param addr Address of value to modify - * @param value Amount to xor with the value at addr - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicXor(volatile uint32_t* addr, uint32_t value); -/** - * Atomic Bitwise xor a value from the value at addr. addr[0] ^= value - * - * @param addr Address of value to modify - * @param value Amount to xor with the value at addr - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicXor(volatile int32_t* addr, int32_t value); - -/** - * Atomic Set the value at addr to the min of addr and value - * addr[0] = rsMin(addr[0], value) - * - * @param addr Address of value to modify - * @param value comparison value - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicMin(volatile uint32_t* addr, uint32_t value); -/** - * Atomic Set the value at addr to the min of addr and value - * addr[0] = rsMin(addr[0], value) - * - * @param addr Address of value to modify - * @param value comparison value - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicMin(volatile int32_t* addr, int32_t value); - -/** - * Atomic Set the value at addr to the max of addr and value - * addr[0] = rsMax(addr[0], value) - * - * @param addr Address of value to modify - * @param value comparison value - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicMax(volatile uint32_t* addr, uint32_t value); -/** - * Atomic Set the value at addr to the max of addr and value - * addr[0] = rsMin(addr[0], value) - * - * @param addr Address of value to modify - * @param value comparison value - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicMax(volatile int32_t* addr, int32_t value); - -/** - * Compare-and-set operation with a full memory barrier. - * - * If the value at addr matches compareValue then newValue is written. - * - * @param addr The address to compare and replace if the compare passes. - * @param compareValue The value to test addr[0] against. - * @param newValue The value to write if the test passes. - * - * @return old value - */ -extern int32_t __attribute__((overloadable)) - rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue); - -/** - * Compare-and-set operation with a full memory barrier. - * - * If the value at addr matches compareValue then newValue is written. - * - * @param addr The address to compare and replace if the compare passes. - * @param compareValue The value to test addr[0] against. - * @param newValue The value to write if the test passes. - * - * @return old value - */ -extern uint32_t __attribute__((overloadable)) - rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue); - -#endif //defined(RS_VERSION) && (RS_VERSION >= 14) - -#endif - diff --git a/libs/rs/scriptc/rs_cl.rsh b/libs/rs/scriptc/rs_cl.rsh deleted file mode 100644 index bbc8fc5..0000000 --- a/libs/rs/scriptc/rs_cl.rsh +++ /dev/null @@ -1,867 +0,0 @@ -/* - * 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. - */ - -/** @file rs_cl.rsh - * \brief Basic math functions - * - * - */ - -#ifndef __RS_CL_RSH__ -#define __RS_CL_RSH__ - -// Conversions -#define CVT_FUNC_2(typeout, typein) \ -_RS_RUNTIME typeout##2 __attribute__((overloadable)) \ - convert_##typeout##2(typein##2 v); \ -_RS_RUNTIME typeout##3 __attribute__((overloadable)) \ - convert_##typeout##3(typein##3 v); \ -_RS_RUNTIME typeout##4 __attribute__((overloadable)) \ - convert_##typeout##4(typein##4 v); - - -#define CVT_FUNC(type) CVT_FUNC_2(type, uchar) \ - CVT_FUNC_2(type, char) \ - CVT_FUNC_2(type, ushort) \ - CVT_FUNC_2(type, short) \ - CVT_FUNC_2(type, uint) \ - CVT_FUNC_2(type, int) \ - CVT_FUNC_2(type, float) - -CVT_FUNC(char) -CVT_FUNC(uchar) -CVT_FUNC(short) -CVT_FUNC(ushort) -CVT_FUNC(int) -CVT_FUNC(uint) -CVT_FUNC(float) - -// Float ops, 6.11.2 - -#define FN_FUNC_FN(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v); \ -_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v); \ -_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v); - -#define IN_FUNC_FN(fnc) \ -_RS_RUNTIME int2 __attribute__((overloadable)) fnc(float2 v); \ -_RS_RUNTIME int3 __attribute__((overloadable)) fnc(float3 v); \ -_RS_RUNTIME int4 __attribute__((overloadable)) fnc(float4 v); - -#define FN_FUNC_FN_FN(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2); \ -_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2); \ -_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2); - -#define FN_FUNC_FN_F(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, float v2); \ -_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, float v2); \ -_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, float v2); - -#define FN_FUNC_FN_IN(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2); \ -_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2); \ -_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2); \ - -#define FN_FUNC_FN_I(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int v2); \ -_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int v2); \ -_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int v2); - -#define FN_FUNC_FN_PFN(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) \ - fnc(float2 v1, float2 *v2); \ -_RS_RUNTIME float3 __attribute__((overloadable)) \ - fnc(float3 v1, float3 *v2); \ -_RS_RUNTIME float4 __attribute__((overloadable)) \ - fnc(float4 v1, float4 *v2); - -#define FN_FUNC_FN_PIN(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2); \ -_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2); \ -_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2); - -#define FN_FUNC_FN_FN_FN(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) \ - fnc(float2 v1, float2 v2, float2 v3); \ -_RS_RUNTIME float3 __attribute__((overloadable)) \ - fnc(float3 v1, float3 v2, float3 v3); \ -_RS_RUNTIME float4 __attribute__((overloadable)) \ - fnc(float4 v1, float4 v2, float4 v3); - -#define FN_FUNC_FN_FN_PIN(fnc) \ -_RS_RUNTIME float2 __attribute__((overloadable)) \ - fnc(float2 v1, float2 v2, int2 *v3); \ -_RS_RUNTIME float3 __attribute__((overloadable)) \ - fnc(float3 v1, float3 v2, int3 *v3); \ -_RS_RUNTIME float4 __attribute__((overloadable)) \ - fnc(float4 v1, float4 v2, int4 *v3); - - -/** - * Return the inverse cosine. - * - * Supports float, float2, float3, float4 - */ -extern float __attribute__((overloadable)) acos(float); -FN_FUNC_FN(acos) - -/** - * Return the inverse hyperbolic cosine. - * - * Supports float, float2, float3, float4 - */ -extern float __attribute__((overloadable)) acosh(float); -FN_FUNC_FN(acosh) - -/** - * Return the inverse cosine divided by PI. - * - * Supports float, float2, float3, float4 - */ -_RS_RUNTIME float __attribute__((overloadable)) acospi(float v); -FN_FUNC_FN(acospi) - -/** - * Return the inverse sine. - * - * Supports float, float2, float3, float4 - */ -extern float __attribute__((overloadable)) asin(float); -FN_FUNC_FN(asin) - -/** - * Return the inverse hyperbolic sine. - * - * Supports float, float2, float3, float4 - */ -extern float __attribute__((overloadable)) asinh(float); -FN_FUNC_FN(asinh) - - -/** - * Return the inverse sine divided by PI. - * - * Supports float, float2, float3, float4 - */ -_RS_RUNTIME float __attribute__((overloadable)) asinpi(float v); -FN_FUNC_FN(asinpi) - -/** - * Return the inverse tangent. - * - * Supports float, float2, float3, float4 - */ -extern float __attribute__((overloadable)) atan(float); -FN_FUNC_FN(atan) - -/** - * Return the inverse tangent of y / x. - * - * Supports float, float2, float3, float4. Both arguments must be of the same - * type. - * - * @param y - * @param x - */ -extern float __attribute__((overloadable)) atan2(float y, float x); -FN_FUNC_FN_FN(atan2) - -/** - * Return the inverse hyperbolic tangent. - * - * Supports float, float2, float3, float4 - */ -extern float __attribute__((overloadable)) atanh(float); -FN_FUNC_FN(atanh) - -/** - * Return the inverse tangent divided by PI. - * - * Supports float, float2, float3, float4 - */ -_RS_RUNTIME float __attribute__((overloadable)) atanpi(float v); -FN_FUNC_FN(atanpi) - -/** - * Return the inverse tangent of y / x, divided by PI. - * - * Supports float, float2, float3, float4. Both arguments must be of the same - * type. - * - * @param y - * @param x - */ -_RS_RUNTIME float __attribute__((overloadable)) atan2pi(float y, float x); -FN_FUNC_FN_FN(atan2pi) - - -/** - * Return the cube root. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) cbrt(float); -FN_FUNC_FN(cbrt) - -/** - * Return the smallest integer not less than a value. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) ceil(float); -FN_FUNC_FN(ceil) - -/** - * Copy the sign bit from y to x. - * - * Supports float, float2, float3, float4. Both arguments must be of the same - * type. - * - * @param x - * @param y - */ -extern float __attribute__((overloadable)) copysign(float x, float y); -FN_FUNC_FN_FN(copysign) - -/** - * Return the cosine. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) cos(float); -FN_FUNC_FN(cos) - -/** - * Return the hypebolic cosine. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) cosh(float); -FN_FUNC_FN(cosh) - -/** - * Return the cosine of the value * PI. - * - * Supports float, float2, float3, float4. - */ -_RS_RUNTIME float __attribute__((overloadable)) cospi(float v); -FN_FUNC_FN(cospi) - -/** - * Return the complementary error function. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) erfc(float); -FN_FUNC_FN(erfc) - -/** - * Return the error function. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) erf(float); -FN_FUNC_FN(erf) - -/** - * Return e ^ value. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) exp(float); -FN_FUNC_FN(exp) - -/** - * Return 2 ^ value. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) exp2(float); -FN_FUNC_FN(exp2) - -/** - * Return x ^ y. - * - * Supports float, float2, float3, float4. Both arguments must be of the same - * type. - */ -extern float __attribute__((overloadable)) pow(float x, float y); -FN_FUNC_FN_FN(pow) - -/** - * Return 10 ^ value. - * - * Supports float, float2, float3, float4. - */ -_RS_RUNTIME float __attribute__((overloadable)) exp10(float v); -FN_FUNC_FN(exp10) - -/** - * Return (e ^ value) - 1. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) expm1(float); -FN_FUNC_FN(expm1) - -/** - * Return the absolute value of a value. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) fabs(float); -FN_FUNC_FN(fabs) - -/** - * Return the positive difference between two values. - * - * Supports float, float2, float3, float4. Both arguments must be of the same - * type. - */ -extern float __attribute__((overloadable)) fdim(float, float); -FN_FUNC_FN_FN(fdim) - -/** - * Return the smallest integer not greater than a value. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) floor(float); -FN_FUNC_FN(floor) - -/** - * Return a*b + c. - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) fma(float a, float b, float c); -FN_FUNC_FN_FN_FN(fma) - -/** - * Return (x < y ? y : x) - * - * Supports float, float2, float3, float4. - * @param x: may be float, float2, float3, float4 - * @param y: may be float or vector. If vector must match type of x. - */ -extern float __attribute__((overloadable)) fmax(float x, float y); -FN_FUNC_FN_FN(fmax); -FN_FUNC_FN_F(fmax); - -/** - * Return (x > y ? y : x) - * - * @param x: may be float, float2, float3, float4 - * @param y: may be float or vector. If vector must match type of x. - */ -extern float __attribute__((overloadable)) fmin(float x, float y); -FN_FUNC_FN_FN(fmin); -FN_FUNC_FN_F(fmin); - -/** - * Return the remainder from x / y - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) fmod(float x, float y); -FN_FUNC_FN_FN(fmod) - - -/** - * Return fractional part of v - * - * @param iptr iptr[0] will be set to the floor of the input value. - * Supports float, float2, float3, float4. - */ -_RS_RUNTIME float __attribute__((overloadable)) fract(float v, float *iptr); -FN_FUNC_FN_PFN(fract) - -/** - * Return the mantissa and place the exponent into iptr[0] - * - * @param v Supports float, float2, float3, float4. - * @param iptr Must have the same vector size as v. - */ -extern float __attribute__((overloadable)) frexp(float v, int *iptr); -FN_FUNC_FN_PIN(frexp) - -/** - * Return sqrt(x*x + y*y) - * - * Supports float, float2, float3, float4. - */ -extern float __attribute__((overloadable)) hypot(float x, float y); -FN_FUNC_FN_FN(hypot) - -/** - * Return the integer exponent of a value - * - * Supports 1,2,3,4 components - */ -extern int __attribute__((overloadable)) ilogb(float); -IN_FUNC_FN(ilogb) - -/** - * Return (x * 2^y) - * - * @param x Supports 1,2,3,4 components - * @param y Supports single component or matching vector. - */ -extern float __attribute__((overloadable)) ldexp(float x, int y); -FN_FUNC_FN_IN(ldexp) -FN_FUNC_FN_I(ldexp) - -/** - * Return the log gamma - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) lgamma(float); -FN_FUNC_FN(lgamma) - -/** - * Return the log gamma and sign - * - * @param x Supports 1,2,3,4 components - * @param y Supports matching vector. - */ -extern float __attribute__((overloadable)) lgamma(float x, int* y); -FN_FUNC_FN_PIN(lgamma) - -/** - * Return the natural logarithm - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) log(float); -FN_FUNC_FN(log) - -/** - * Return the base 10 logarithm - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) log10(float); -FN_FUNC_FN(log10) - -/** - * Return the base 2 logarithm - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) log2(float v); -FN_FUNC_FN(log2) - -/** - * Return the natural logarithm of (v + 1.0f) - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) log1p(float v); -FN_FUNC_FN(log1p) - -/** - * Compute the exponent of the value. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) logb(float); -FN_FUNC_FN(logb) - -/** - * Compute (a * b) + c - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) mad(float a, float b, float c); -FN_FUNC_FN_FN_FN(mad) - -/** - * Return the integral and fractional components of a number - * Supports 1,2,3,4 components - * - * @param x Source value - * @param iret iret[0] will be set to the integral portion of the number. - * @return The floating point portion of the value. - */ -extern float __attribute__((overloadable)) modf(float x, float *iret); -FN_FUNC_FN_PFN(modf); - -//extern float __attribute__((overloadable)) nan(uint); - -/** - * Return the next floating point number from x towards y. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) nextafter(float x, float y); -FN_FUNC_FN_FN(nextafter) - -/** - * Return (v ^ p). - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) pown(float v, int p); -FN_FUNC_FN_IN(pown) - -/** - * Return (v ^ p). - * @param v must be greater than 0. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) powr(float v, float p); -FN_FUNC_FN_FN(powr) - -/** - * Return round x/y to the nearest integer then compute the remander. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) remainder(float x, float y); -FN_FUNC_FN_FN(remainder) - -// document once we know the precision of bionic -extern float __attribute__((overloadable)) remquo(float, float, int *); -FN_FUNC_FN_FN_PIN(remquo) - -/** - * Round to the nearest integral value. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) rint(float); -FN_FUNC_FN(rint) - -/** - * Compute the Nth root of a value. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) rootn(float v, int n); -FN_FUNC_FN_IN(rootn) - -/** - * Round to the nearest integral value. Half values are rounded away from zero. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) round(float); -FN_FUNC_FN(round) - -/** - * Return the square root of a value. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) sqrt(float); -FN_FUNC_FN(sqrt) - -/** - * Return (1 / sqrt(value)). - * - * @param v The incoming value in radians - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) rsqrt(float v); -FN_FUNC_FN(rsqrt) - -/** - * Return the sine of a value specified in radians. - * - * @param v The incoming value in radians - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) sin(float v); -FN_FUNC_FN(sin) - -/** - * Return the sine and cosine of a value. - * - * @return sine - * @param v The incoming value in radians - * @param *cosptr cosptr[0] will be set to the cosine value. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) sincos(float v, float *cosptr); -FN_FUNC_FN_PFN(sincos); - -/** - * Return the hyperbolic sine of a value specified in radians. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) sinh(float); -FN_FUNC_FN(sinh) - -/** - * Return the sin(v * PI). - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) sinpi(float v); -FN_FUNC_FN(sinpi) - -/** - * Return the tangent of a value. - * - * Supports 1,2,3,4 components - * @param v The incoming value in radians - */ -extern float __attribute__((overloadable)) tan(float v); -FN_FUNC_FN(tan) - -/** - * Return the hyperbolic tangent of a value. - * - * Supports 1,2,3,4 components - * @param v The incoming value in radians - */ -extern float __attribute__((overloadable)) tanh(float); -FN_FUNC_FN(tanh) - -/** - * Return tan(v * PI) - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) tanpi(float v); -FN_FUNC_FN(tanpi) - -/** - * Compute the gamma function of a value. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) tgamma(float); -FN_FUNC_FN(tgamma) - -/** - * Round to integral using truncation. - * - * Supports 1,2,3,4 components - */ -extern float __attribute__((overloadable)) trunc(float); -FN_FUNC_FN(trunc) - - -#define XN_FUNC_YN(typeout, fnc, typein) \ -extern typeout __attribute__((overloadable)) fnc(typein); \ -_RS_RUNTIME typeout##2 __attribute__((overloadable)) fnc(typein##2 v); \ -_RS_RUNTIME typeout##3 __attribute__((overloadable)) fnc(typein##3 v); \ -_RS_RUNTIME typeout##4 __attribute__((overloadable)) fnc(typein##4 v); - -#define UIN_FUNC_IN(fnc) \ -XN_FUNC_YN(uchar, fnc, char) \ -XN_FUNC_YN(ushort, fnc, short) \ -XN_FUNC_YN(uint, fnc, int) - -#define IN_FUNC_IN(fnc) \ -XN_FUNC_YN(uchar, fnc, uchar) \ -XN_FUNC_YN(char, fnc, char) \ -XN_FUNC_YN(ushort, fnc, ushort) \ -XN_FUNC_YN(short, fnc, short) \ -XN_FUNC_YN(uint, fnc, uint) \ -XN_FUNC_YN(int, fnc, int) - - -#define XN_FUNC_XN_XN_BODY(type, fnc, body) \ -_RS_RUNTIME type __attribute__((overloadable)) \ - fnc(type v1, type v2); \ -_RS_RUNTIME type##2 __attribute__((overloadable)) \ - fnc(type##2 v1, type##2 v2); \ -_RS_RUNTIME type##3 __attribute__((overloadable)) \ - fnc(type##3 v1, type##3 v2); \ -_RS_RUNTIME type##4 __attribute__((overloadable)) \ - fnc(type##4 v1, type##4 v2); - -#define IN_FUNC_IN_IN_BODY(fnc, body) \ -XN_FUNC_XN_XN_BODY(uchar, fnc, body) \ -XN_FUNC_XN_XN_BODY(char, fnc, body) \ -XN_FUNC_XN_XN_BODY(ushort, fnc, body) \ -XN_FUNC_XN_XN_BODY(short, fnc, body) \ -XN_FUNC_XN_XN_BODY(uint, fnc, body) \ -XN_FUNC_XN_XN_BODY(int, fnc, body) \ -XN_FUNC_XN_XN_BODY(float, fnc, body) - -UIN_FUNC_IN(abs) -IN_FUNC_IN(clz) - -/** - * Return the minimum of two values. - * - * Supports 1,2,3,4 components of uchar, char, ushort, short, uint, int, float. - */ -IN_FUNC_IN_IN_BODY(min, (v1 < v2 ? v1 : v2)) -FN_FUNC_FN_F(min) - -/** - * Return the maximum of two values. - * - * Supports 1,2,3,4 components of uchar, char, ushort, short, uint, int, float. - */ -IN_FUNC_IN_IN_BODY(max, (v1 > v2 ? v1 : v2)) -FN_FUNC_FN_F(max) - -/** - * Clamp a value to a specified high and low bound. - * - * @param amount value to be clamped. Supports 1,2,3,4 components - * @param low Lower bound, must be scalar or matching vector. - * @param high High bound, must match type of low - */ -_RS_RUNTIME float __attribute__((overloadable)) clamp(float amount, float low, float high); -_RS_RUNTIME float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high); -_RS_RUNTIME float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high); -_RS_RUNTIME float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high); -_RS_RUNTIME float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high); -_RS_RUNTIME float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high); -_RS_RUNTIME float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high); - -/** - * Convert from radians to degrees. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) degrees(float radians); -FN_FUNC_FN(degrees) - -/** - * return start + ((stop - start) * amount); - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) mix(float start, float stop, float amount); -_RS_RUNTIME float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount); -_RS_RUNTIME float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount); -_RS_RUNTIME float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount); -_RS_RUNTIME float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount); -_RS_RUNTIME float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount); -_RS_RUNTIME float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount); - -/** - * Convert from degrees to radians. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) radians(float degrees); -FN_FUNC_FN(radians) - -/** - * if (v < edge) - * return 0.f; - * else - * return 1.f; - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) step(float edge, float v); -_RS_RUNTIME float2 __attribute__((overloadable)) step(float2 edge, float2 v); -_RS_RUNTIME float3 __attribute__((overloadable)) step(float3 edge, float3 v); -_RS_RUNTIME float4 __attribute__((overloadable)) step(float4 edge, float4 v); -_RS_RUNTIME float2 __attribute__((overloadable)) step(float2 edge, float v); -_RS_RUNTIME float3 __attribute__((overloadable)) step(float3 edge, float v); -_RS_RUNTIME float4 __attribute__((overloadable)) step(float4 edge, float v); - -// not implemented -extern float __attribute__((overloadable)) smoothstep(float, float, float); -extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2); -extern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3); -extern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4); -extern float2 __attribute__((overloadable)) smoothstep(float, float, float2); -extern float3 __attribute__((overloadable)) smoothstep(float, float, float3); -extern float4 __attribute__((overloadable)) smoothstep(float, float, float4); - -/** - * if (v < 0) return -1.f; - * else if (v > 0) return 1.f; - * else return 0.f; - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) sign(float v); -FN_FUNC_FN(sign) - -/** - * Compute the cross product of two vectors. - * - * Supports 3,4 components - */ -_RS_RUNTIME float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs); -_RS_RUNTIME float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs); - -/** - * Compute the dot product of two vectors. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) dot(float lhs, float rhs); -_RS_RUNTIME float __attribute__((overloadable)) dot(float2 lhs, float2 rhs); -_RS_RUNTIME float __attribute__((overloadable)) dot(float3 lhs, float3 rhs); -_RS_RUNTIME float __attribute__((overloadable)) dot(float4 lhs, float4 rhs); - -/** - * Compute the length of a vector. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) length(float v); -_RS_RUNTIME float __attribute__((overloadable)) length(float2 v); -_RS_RUNTIME float __attribute__((overloadable)) length(float3 v); -_RS_RUNTIME float __attribute__((overloadable)) length(float4 v); - -/** - * Compute the distance between two points. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) distance(float lhs, float rhs); -_RS_RUNTIME float __attribute__((overloadable)) distance(float2 lhs, float2 rhs); -_RS_RUNTIME float __attribute__((overloadable)) distance(float3 lhs, float3 rhs); -_RS_RUNTIME float __attribute__((overloadable)) distance(float4 lhs, float4 rhs); - -/** - * Normalize a vector. - * - * Supports 1,2,3,4 components - */ -_RS_RUNTIME float __attribute__((overloadable)) normalize(float v); -_RS_RUNTIME float2 __attribute__((overloadable)) normalize(float2 v); -_RS_RUNTIME float3 __attribute__((overloadable)) normalize(float3 v); -_RS_RUNTIME float4 __attribute__((overloadable)) normalize(float4 v); - -#undef CVT_FUNC -#undef CVT_FUNC_2 -#undef FN_FUNC_FN -#undef IN_FUNC_FN -#undef FN_FUNC_FN_FN -#undef FN_FUNC_FN_F -#undef FN_FUNC_FN_IN -#undef FN_FUNC_FN_I -#undef FN_FUNC_FN_PFN -#undef FN_FUNC_FN_PIN -#undef FN_FUNC_FN_FN_FN -#undef FN_FUNC_FN_FN_PIN -#undef XN_FUNC_YN -#undef UIN_FUNC_IN -#undef IN_FUNC_IN -#undef XN_FUNC_XN_XN_BODY -#undef IN_FUNC_IN_IN_BODY - -#endif diff --git a/libs/rs/scriptc/rs_core.rsh b/libs/rs/scriptc/rs_core.rsh deleted file mode 100644 index 1b0f9db..0000000 --- a/libs/rs/scriptc/rs_core.rsh +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2011-2012 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. - */ - - /*! \mainpage notitle - * - * Renderscript is a high-performance runtime that provides graphics rendering and - * compute operations at the native level. Renderscript code is compiled on devices - * at runtime to allow platform-independence as well. - * This reference documentation describes the Renderscript runtime APIs, which you - * can utilize to write Renderscript code in C99. The Renderscript header - * files are automatically included for you, except for the rs_graphics.rsh header. If - * you are doing graphics rendering, include the graphics header file like this: - * - * <code>#include "rs_graphics.rsh"</code> - * - * To use Renderscript, you need to utilize the Renderscript runtime APIs documented here - * as well as the Android framework APIs for Renderscript. - * For documentation on the Android framework APIs, see the <a target="_parent" href= - * "http://developer.android.com/reference/android/renderscript/package-summary.html"> - * android.renderscript</a> package reference. - * For more information on how to develop with Renderscript and how the runtime and - * Android framework APIs interact, see the <a target="_parent" href= - * "http://developer.android.com/guide/topics/renderscript/index.html">Renderscript - * developer guide</a> and the <a target="_parent" href= - * "http://developer.android.com/resources/samples/RenderScript/index.html"> - * Renderscript samples</a>. - */ - -/** @file rs_core.rsh - * \brief todo-jsams - * - * todo-jsams - * - */ - -#ifndef __RS_CORE_RSH__ -#define __RS_CORE_RSH__ - -#define _RS_RUNTIME extern - -#include "rs_types.rsh" -#include "rs_allocation.rsh" -#include "rs_atomic.rsh" -#include "rs_cl.rsh" -#include "rs_debug.rsh" -#include "rs_element.rsh" -#include "rs_math.rsh" -#include "rs_matrix.rsh" -#include "rs_object.rsh" -#include "rs_quaternion.rsh" -#include "rs_sampler.rsh" -#include "rs_time.rsh" - -/** - * Send a message back to the client. Will not block and returns true - * if the message was sendable and false if the fifo was full. - * A message ID is required. Data payload is optional. - */ -extern bool __attribute__((overloadable)) - rsSendToClient(int cmdID); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsSendToClient(int cmdID, const void *data, uint len); -/** - * Send a message back to the client, blocking until the message is queued. - * A message ID is required. Data payload is optional. - */ -extern void __attribute__((overloadable)) - rsSendToClientBlocking(int cmdID); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSendToClientBlocking(int cmdID, const void *data, uint len); - - -/** - * Launch order hint for rsForEach calls. This provides a hint to the system to - * determine in which order the root function of the target is called with each - * cell of the allocation. - * - * This is a hint and implementations may not obey the order. - */ -enum rs_for_each_strategy { - RS_FOR_EACH_STRATEGY_SERIAL, - RS_FOR_EACH_STRATEGY_DONT_CARE, - RS_FOR_EACH_STRATEGY_DST_LINEAR, - RS_FOR_EACH_STRATEGY_TILE_SMALL, - RS_FOR_EACH_STRATEGY_TILE_MEDIUM, - RS_FOR_EACH_STRATEGY_TILE_LARGE -}; - - -/** - * Structure to provide extra information to a rsForEach call. Primarly used to - * restrict the call to a subset of cells in the allocation. - */ -typedef struct rs_script_call { - enum rs_for_each_strategy strategy; - uint32_t xStart; - uint32_t xEnd; - uint32_t yStart; - uint32_t yEnd; - uint32_t zStart; - uint32_t zEnd; - uint32_t arrayStart; - uint32_t arrayEnd; -} rs_script_call_t; - -/** - * Make a script to script call to launch work. One of the input or output is - * required to be a valid object. The input and output must be of the same - * dimensions. - * API 10-13 - * - * @param script The target script to call - * @param input The allocation to source data from - * @param output the allocation to write date into - * @param usrData The user definied params to pass to the root script. May be - * NULL. - * @param sc Extra control infomation used to select a sub-region of the - * allocation to be processed or suggest a walking strategy. May be - * NULL. - * - * */ -#if !defined(RS_VERSION) || (RS_VERSION < 14) -extern void __attribute__((overloadable)) - rsForEach(rs_script script, rs_allocation input, - rs_allocation output, const void * usrData, - const rs_script_call_t *sc); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsForEach(rs_script script, rs_allocation input, - rs_allocation output, const void * usrData); -#else - -/** - * Make a script to script call to launch work. One of the input or output is - * required to be a valid object. The input and output must be of the same - * dimensions. - * API 14+ - * - * @param script The target script to call - * @param input The allocation to source data from - * @param output the allocation to write date into - * @param usrData The user definied params to pass to the root script. May be - * NULL. - * @param usrDataLen The size of the userData structure. This will be used to - * perform a shallow copy of the data if necessary. - * @param sc Extra control infomation used to select a sub-region of the - * allocation to be processed or suggest a walking strategy. May be - * NULL. - * - */ -extern void __attribute__((overloadable)) - rsForEach(rs_script script, rs_allocation input, rs_allocation output, - const void * usrData, size_t usrDataLen, const rs_script_call_t *); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsForEach(rs_script script, rs_allocation input, rs_allocation output, - const void * usrData, size_t usrDataLen); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsForEach(rs_script script, rs_allocation input, rs_allocation output); -#endif - - - -#undef _RS_RUNTIME - -#endif diff --git a/libs/rs/scriptc/rs_debug.rsh b/libs/rs/scriptc/rs_debug.rsh deleted file mode 100644 index 074c28f..0000000 --- a/libs/rs/scriptc/rs_debug.rsh +++ /dev/null @@ -1,123 +0,0 @@ -/* - * 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. - */ - -/** @file rs_debug.rsh - * \brief Utility debugging routines - * - * Routines intended to be used during application developement. These should - * not be used in shipping applications. All print a string and value pair to - * the standard log. - * - */ - -#ifndef __RS_DEBUG_RSH__ -#define __RS_DEBUG_RSH__ - - - -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, float); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, float, float); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, float, float, float); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, float, float, float, float); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, double); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, const rs_matrix4x4 *); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, const rs_matrix3x3 *); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, const rs_matrix2x2 *); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, int); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, uint); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, long); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, unsigned long); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, long long); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, unsigned long long); -/** - * Debug function. Prints a string and value to the log. - */ -extern void __attribute__((overloadable)) - rsDebug(const char *, const void *); -#define RS_DEBUG(a) rsDebug(#a, a) -#define RS_DEBUG_MARKER rsDebug(__FILE__, __LINE__) - - -/** - * Debug function. Prints a string and value to the log. - */ -_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float2 v); -/** - * Debug function. Prints a string and value to the log. - */ -_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float3 v); -/** - * Debug function. Prints a string and value to the log. - */ -_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float4 v); - -#endif diff --git a/libs/rs/scriptc/rs_element.rsh b/libs/rs/scriptc/rs_element.rsh deleted file mode 100644 index 1a4cdb75..0000000 --- a/libs/rs/scriptc/rs_element.rsh +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -/** @file rs_element.rsh - * \brief Element routines - * - * - */ - -#ifndef __RS_ELEMENT_RSH__ -#define __RS_ELEMENT_RSH__ - -#if (defined(RS_VERSION) && (RS_VERSION >= 16)) - -/** - * @param e element to get data from - * @return number of sub-elements in this element - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementCount(rs_element e); - -/** - * @param e element to get data from - * @param index index of the sub-element to return - * @return sub-element in this element at given index - */ -extern rs_element __attribute__((overloadable)) - rsElementGetSubElement(rs_element, uint32_t index); - -/** - * @param e element to get data from - * @param index index of the sub-element to return - * @return length of the sub-element name including the null - * terminator (size of buffer needed to write the name) - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementNameLength(rs_element e, uint32_t index); - -/** - * @param e element to get data from - * @param index index of the sub-element - * @param name array to store the name into - * @param nameLength length of the provided name array - * @return number of characters actually written, excluding the - * null terminator - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementName(rs_element e, uint32_t index, char *name, uint32_t nameLength); - -/** - * @param e element to get data from - * @param index index of the sub-element - * @return array size of sub-element in this element at given - * index - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementArraySize(rs_element e, uint32_t index); - -/** - * @param e element to get data from - * @param index index of the sub-element - * @return offset in bytes of sub-element in this element at - * given index - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementOffsetBytes(rs_element e, uint32_t index); - -/** - * @param e element to get data from - * @return total size of the element in bytes - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSizeBytes(rs_element e); - -/** - * @param e element to get data from - * @return element's data type - */ -extern rs_data_type __attribute__((overloadable)) - rsElementGetDataType(rs_element e); - -/** - * @param e element to get data from - * @return element's data size - */ -extern rs_data_kind __attribute__((overloadable)) - rsElementGetDataKind(rs_element e); - -/** - * @param e element to get data from - * @return length of the element vector (for float2, float3, - * etc.) - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetVectorSize(rs_element e); - -#endif // (defined(RS_VERSION) && (RS_VERSION >= 16)) - -#endif // __RS_ELEMENT_RSH__ - diff --git a/libs/rs/scriptc/rs_graphics.rsh b/libs/rs/scriptc/rs_graphics.rsh deleted file mode 100644 index 44ee99f..0000000 --- a/libs/rs/scriptc/rs_graphics.rsh +++ /dev/null @@ -1,421 +0,0 @@ -/* - * Copyright (C) 2011-2012 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. - */ - -/** @file rs_graphics.rsh - * \brief Renderscript graphics API - * - * A set of graphics functions used by Renderscript. - * - */ -#ifndef __RS_GRAPHICS_RSH__ -#define __RS_GRAPHICS_RSH__ - -#include "rs_mesh.rsh" -#include "rs_program.rsh" - -#if (defined(RS_VERSION) && (RS_VERSION >= 14)) -/** - * Set the color target used for all subsequent rendering calls - * @param colorTarget - * @param slot - */ -extern void __attribute__((overloadable)) - rsgBindColorTarget(rs_allocation colorTarget, uint slot); - -/** - * Clear the previously set color target - * @param slot - */ -extern void __attribute__((overloadable)) - rsgClearColorTarget(uint slot); - -/** - * Set the depth target used for all subsequent rendering calls - * @param depthTarget - */ -extern void __attribute__((overloadable)) - rsgBindDepthTarget(rs_allocation depthTarget); - -/** - * Clear the previously set depth target - */ -extern void __attribute__((overloadable)) - rsgClearDepthTarget(void); - -/** - * Clear all color and depth targets and resume rendering into - * the framebuffer - */ -extern void __attribute__((overloadable)) - rsgClearAllRenderTargets(void); - -/** - * Force Renderscript to finish all rendering commands - */ -extern uint __attribute__((overloadable)) - rsgFinish(void); - -#endif //defined(RS_VERSION) && (RS_VERSION >= 14) - -/** - * Bind a new ProgramFragment to the rendering context. - * - * @param pf - */ -extern void __attribute__((overloadable)) - rsgBindProgramFragment(rs_program_fragment pf); - -/** - * Bind a new ProgramStore to the rendering context. - * - * @param ps - */ -extern void __attribute__((overloadable)) - rsgBindProgramStore(rs_program_store ps); - -/** - * Bind a new ProgramVertex to the rendering context. - * - * @param pv - */ -extern void __attribute__((overloadable)) - rsgBindProgramVertex(rs_program_vertex pv); - -/** - * Bind a new ProgramRaster to the rendering context. - * - * @param pr - */ -extern void __attribute__((overloadable)) - rsgBindProgramRaster(rs_program_raster pr); - -/** - * Bind a new Sampler object to a ProgramFragment. The sampler will - * operate on the texture bound at the matching slot. - * - * @param slot - */ -extern void __attribute__((overloadable)) - rsgBindSampler(rs_program_fragment, uint slot, rs_sampler); - -/** - * 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 - * matching slot. - * - * @param slot - */ -extern void __attribute__((overloadable)) - rsgBindTexture(rs_program_fragment, uint slot, rs_allocation); - -/** - * Load the projection matrix for a currently bound fixed function - * vertex program. Calling this function with a custom vertex shader - * would result in an error. - * @param proj projection matrix - */ -extern void __attribute__((overloadable)) - rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *proj); -/** - * Load the model matrix for a currently bound fixed function - * vertex program. Calling this function with a custom vertex shader - * would result in an error. - * @param model model matrix - */ -extern void __attribute__((overloadable)) - rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *model); -/** - * Load the texture matrix for a currently bound fixed function - * vertex program. Calling this function with a custom vertex shader - * would result in an error. - * @param tex texture matrix - */ -extern void __attribute__((overloadable)) - rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *tex); -/** - * Get the projection matrix for a currently bound fixed function - * vertex program. Calling this function with a custom vertex shader - * would result in an error. - * @param proj matrix to store the current projection matrix into - */ -extern void __attribute__((overloadable)) - rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *proj); - -/** - * Set the constant color for a fixed function emulation program. - * - * @param pf - * @param r - * @param g - * @param b - * @param a - */ -extern void __attribute__((overloadable)) - rsgProgramFragmentConstantColor(rs_program_fragment pf, float r, float g, float b, float a); - -/** - * Bind a new Allocation object to a ProgramFragment. The - * Allocation must be a valid constant input for the Program. - * - * @param ps program object - * @param slot index of the constant buffer on the program - * @param c constants to bind - */ -extern void __attribute__((overloadable)) - rsgBindConstant(rs_program_fragment ps, uint slot, rs_allocation c); - -/** - * Bind a new Allocation object to a ProgramVertex. The - * Allocation must be a valid constant input for the Program. - * - * @param pv program object - * @param slot index of the constant buffer on the program - * @param c constants to bind - */ -extern void __attribute__((overloadable)) - rsgBindConstant(rs_program_vertex pv, uint slot, rs_allocation c); - -/** - * Get the width of the current rendering surface. - * - * @return uint - */ -extern uint __attribute__((overloadable)) - rsgGetWidth(void); - -/** - * Get the height of the current rendering surface. - * - * @return uint - */ -extern uint __attribute__((overloadable)) - rsgGetHeight(void); - - -/** - * Sync the contents of an allocation from its SCRIPT memory space to its HW - * memory spaces. - * - * @param alloc - */ -extern void __attribute__((overloadable)) - rsgAllocationSyncAll(rs_allocation alloc); - -#if (defined(RS_VERSION) && (RS_VERSION >= 14)) - -/** - * Sync the contents of an allocation from memory space - * specified by source. - * - * @param alloc - * @param source - */ -extern void __attribute__((overloadable)) - rsgAllocationSyncAll(rs_allocation alloc, - rs_allocation_usage_type source); - -#endif //defined(RS_VERSION) && (RS_VERSION >= 14) - -/** - * Low performance utility function for drawing a simple rectangle. Not - * intended for drawing large quantities of geometry. - * - * @param x1 - * @param y1 - * @param x2 - * @param y2 - * @param z - */ -extern void __attribute__((overloadable)) - rsgDrawRect(float x1, float y1, float x2, float y2, float z); - -/** - * Low performance utility function for drawing a simple quad. Not intended for - * drawing large quantities of geometry. - * - * @param x1 - * @param y1 - * @param z1 - * @param x2 - * @param y2 - * @param z2 - * @param x3 - * @param y3 - * @param z3 - * @param x4 - * @param y4 - * @param z4 - */ -extern void __attribute__((overloadable)) - rsgDrawQuad(float x1, float y1, float z1, - float x2, float y2, float z2, - float x3, float y3, float z3, - float x4, float y4, float z4); - - -/** - * Low performance utility function for drawing a textured quad. Not intended - * for drawing large quantities of geometry. - * - * @param x1 - * @param y1 - * @param z1 - * @param u1 - * @param v1 - * @param x2 - * @param y2 - * @param z2 - * @param u2 - * @param v2 - * @param x3 - * @param y3 - * @param z3 - * @param u3 - * @param v3 - * @param x4 - * @param y4 - * @param z4 - * @param u4 - * @param v4 - */ -extern void __attribute__((overloadable)) - rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1, - float x2, float y2, float z2, float u2, float v2, - float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4); - - -/** - * Low performance function for drawing rectangles in screenspace. This - * function uses the default passthough ProgramVertex. Any bound ProgramVertex - * is ignored. This function has considerable overhead and should not be used - * for drawing in shipping applications. - * - * @param x - * @param y - * @param z - * @param w - * @param h - */ -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. - * - * @param ism - */ -extern void __attribute__((overloadable)) - rsgDrawMesh(rs_mesh ism); -/** - * Draw part of a mesh using the current context state. - * @param ism mesh object to render - * @param primitiveIndex for meshes that contain multiple primitive groups - * this parameter specifies the index of the group to draw. - */ -extern void __attribute__((overloadable)) - rsgDrawMesh(rs_mesh ism, uint primitiveIndex); -/** - * Draw specified index range of part of a mesh using the current context state. - * @param ism mesh object to render - * @param primitiveIndex for meshes that contain multiple primitive groups - * this parameter specifies the index of the group to draw. - * @param start starting index in the range - * @param len number of indices to draw - */ -extern void __attribute__((overloadable)) - rsgDrawMesh(rs_mesh ism, uint primitiveIndex, uint start, uint len); - -/** - * Clears the rendering surface to the specified color. - * - * @param r - * @param g - * @param b - * @param a - */ -extern void __attribute__((overloadable)) - rsgClearColor(float r, float g, float b, float a); - -/** - * Clears the depth suface to the specified value. - */ -extern void __attribute__((overloadable)) - rsgClearDepth(float value); -/** - * Draws text given a string and location - */ -extern void __attribute__((overloadable)) - rsgDrawText(const char *, int x, int y); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsgDrawText(rs_allocation, int x, int y); -/** - * Binds the font object to be used for all subsequent font rendering calls - * @param font object to bind - */ -extern void __attribute__((overloadable)) - rsgBindFont(rs_font font); -/** - * Sets the font color for all subsequent rendering calls - * @param r red component - * @param g green component - * @param b blue component - * @param a alpha component - */ -extern void __attribute__((overloadable)) - rsgFontColor(float r, float g, float b, float a); -/** - * Returns the bounding box of the text relative to (0, 0) - * Any of left, right, top, bottom could be NULL - */ -extern void __attribute__((overloadable)) - rsgMeasureText(const char *, int *left, int *right, int *top, int *bottom); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsgMeasureText(rs_allocation, int *left, int *right, int *top, int *bottom); -/** - * Computes an axis aligned bounding box of a mesh object - */ -extern void __attribute__((overloadable)) - rsgMeshComputeBoundingBox(rs_mesh mesh, float *minX, float *minY, float *minZ, - float *maxX, float *maxY, float *maxZ); -/** - * \overload - */ -__inline__ static void __attribute__((overloadable, always_inline)) -rsgMeshComputeBoundingBox(rs_mesh mesh, float3 *bBoxMin, float3 *bBoxMax) { - float x1, y1, z1, x2, y2, z2; - rsgMeshComputeBoundingBox(mesh, &x1, &y1, &z1, &x2, &y2, &z2); - bBoxMin->x = x1; - bBoxMin->y = y1; - bBoxMin->z = z1; - bBoxMax->x = x2; - bBoxMax->y = y2; - bBoxMax->z = z2; -} - -#endif - diff --git a/libs/rs/scriptc/rs_math.rsh b/libs/rs/scriptc/rs_math.rsh deleted file mode 100644 index 8117ca8..0000000 --- a/libs/rs/scriptc/rs_math.rsh +++ /dev/null @@ -1,248 +0,0 @@ -/* - * 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. - */ - -/** @file rs_math.rsh - * \brief todo-jsams - * - * todo-jsams - * - */ - -#ifndef __RS_MATH_RSH__ -#define __RS_MATH_RSH__ - - -/** - * Return a random value between 0 (or min_value) and max_malue. - */ -extern int __attribute__((overloadable)) - rsRand(int max_value); -/** - * \overload - */ -extern int __attribute__((overloadable)) - rsRand(int min_value, int max_value); -/** - * \overload - */ -extern float __attribute__((overloadable)) - rsRand(float max_value); -/** - * \overload - */ -extern float __attribute__((overloadable)) - rsRand(float min_value, float max_value); - -/** - * Returns the fractional part of a float - */ -extern float __attribute__((overloadable)) - rsFrac(float); - - -///////////////////////////////////////////////////// -// int ops -///////////////////////////////////////////////////// - -/** - * Clamp the value amount between low and high. - * - * @param amount The value to clamp - * @param low - * @param high - */ -_RS_RUNTIME uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high); - -/** - * \overload - */ -_RS_RUNTIME int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high); -/** - * \overload - */ -_RS_RUNTIME ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high); -/** - * \overload - */ -_RS_RUNTIME short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high); -/** - * \overload - */ -_RS_RUNTIME uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high); -/** - * \overload - */ -_RS_RUNTIME char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high); - - -/** - * Computes 6 frustum planes from the view projection matrix - * @param viewProj matrix to extract planes from - * @param left plane - * @param right plane - * @param top plane - * @param bottom plane - * @param near plane - * @param far plane - */ -__inline__ static void __attribute__((overloadable, always_inline)) -rsExtractFrustumPlanes(const rs_matrix4x4 *viewProj, - float4 *left, float4 *right, - float4 *top, float4 *bottom, - float4 *near, float4 *far) { - // x y z w = a b c d in the plane equation - left->x = viewProj->m[3] + viewProj->m[0]; - left->y = viewProj->m[7] + viewProj->m[4]; - left->z = viewProj->m[11] + viewProj->m[8]; - left->w = viewProj->m[15] + viewProj->m[12]; - - right->x = viewProj->m[3] - viewProj->m[0]; - right->y = viewProj->m[7] - viewProj->m[4]; - right->z = viewProj->m[11] - viewProj->m[8]; - right->w = viewProj->m[15] - viewProj->m[12]; - - top->x = viewProj->m[3] - viewProj->m[1]; - top->y = viewProj->m[7] - viewProj->m[5]; - top->z = viewProj->m[11] - viewProj->m[9]; - top->w = viewProj->m[15] - viewProj->m[13]; - - bottom->x = viewProj->m[3] + viewProj->m[1]; - bottom->y = viewProj->m[7] + viewProj->m[5]; - bottom->z = viewProj->m[11] + viewProj->m[9]; - bottom->w = viewProj->m[15] + viewProj->m[13]; - - near->x = viewProj->m[3] + viewProj->m[2]; - near->y = viewProj->m[7] + viewProj->m[6]; - near->z = viewProj->m[11] + viewProj->m[10]; - near->w = viewProj->m[15] + viewProj->m[14]; - - far->x = viewProj->m[3] - viewProj->m[2]; - far->y = viewProj->m[7] - viewProj->m[6]; - far->z = viewProj->m[11] - viewProj->m[10]; - far->w = viewProj->m[15] - viewProj->m[14]; - - float len = length(left->xyz); - *left /= len; - len = length(right->xyz); - *right /= len; - len = length(top->xyz); - *top /= len; - len = length(bottom->xyz); - *bottom /= len; - len = length(near->xyz); - *near /= len; - len = length(far->xyz); - *far /= len; -} - -/** - * Checks if a sphere is withing the 6 frustum planes - * @param sphere float4 representing the sphere - * @param left plane - * @param right plane - * @param top plane - * @param bottom plane - * @param near plane - * @param far plane - */ -__inline__ static bool __attribute__((overloadable, always_inline)) -rsIsSphereInFrustum(float4 *sphere, - float4 *left, float4 *right, - float4 *top, float4 *bottom, - float4 *near, float4 *far) { - - float distToCenter = dot(left->xyz, sphere->xyz) + left->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(right->xyz, sphere->xyz) + right->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(top->xyz, sphere->xyz) + top->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(near->xyz, sphere->xyz) + near->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(far->xyz, sphere->xyz) + far->w; - if (distToCenter < -sphere->w) { - return false; - } - return true; -} - - -/** - * Pack floating point (0-1) RGB values into a uchar4. The alpha component is - * set to 255 (1.0). - * - * @param r - * @param g - * @param b - * - * @return uchar4 - */ -_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b); - -/** - * Pack floating point (0-1) RGBA values into a uchar4. - * - * @param r - * @param g - * @param b - * @param a - * - * @return uchar4 - */ -_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a); - -/** - * Pack floating point (0-1) RGB values into a uchar4. The alpha component is - * set to 255 (1.0). - * - * @param color - * - * @return uchar4 - */ -_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color); - -/** - * Pack floating point (0-1) RGBA values into a uchar4. - * - * @param color - * - * @return uchar4 - */ -_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color); - -/** - * Unpack a uchar4 color to float4. The resulting float range will be (0-1). - * - * @param c - * - * @return float4 - */ -_RS_RUNTIME float4 rsUnpackColor8888(uchar4 c); - - -#endif diff --git a/libs/rs/scriptc/rs_matrix.rsh b/libs/rs/scriptc/rs_matrix.rsh deleted file mode 100644 index ebff7f4..0000000 --- a/libs/rs/scriptc/rs_matrix.rsh +++ /dev/null @@ -1,378 +0,0 @@ -/* - * 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. - */ - -/** @file rs_matrix.rsh - * \brief Matrix routines - * - * - */ - -#ifndef __RS_MATRIX_RSH__ -#define __RS_MATRIX_RSH__ - -/** - * Set one element of a matrix. - * - * @param m The matrix to be set - * @param row - * @param col - * @param v - * - * @return void - */ -_RS_RUNTIME void __attribute__((overloadable)) -rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v); -/** - * \overload - */ -_RS_RUNTIME void __attribute__((overloadable)) -rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v); -/** - * \overload - */ -_RS_RUNTIME void __attribute__((overloadable)) -rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v); - -/** - * Get one element of a matrix. - * - * @param m The matrix to read from - * @param row - * @param col - * - * @return float - */ -_RS_RUNTIME float __attribute__((overloadable)) -rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col); -/** - * \overload - */ -_RS_RUNTIME float __attribute__((overloadable)) -rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col); -/** - * \overload - */ -_RS_RUNTIME float __attribute__((overloadable)) -rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col); - -/** - * Set the elements of a matrix to the identity matrix. - * - * @param m - */ -extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m); - -/** - * Set the elements of a matrix from an array of floats. - * - * @param m - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v); - -/** - * Set the elements of a matrix from another matrix. - * - * @param m - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v); - -/** - * Load a rotation matrix. - * - * @param m - * @param rot - * @param x - * @param y - * @param z - */ -extern void __attribute__((overloadable)) -rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); - -/** - * Load a scale matrix. - * - * @param m - * @param x - * @param y - * @param z - */ -extern void __attribute__((overloadable)) -rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z); - -/** - * Load a translation matrix. - * - * @param m - * @param x - * @param y - * @param z - */ -extern void __attribute__((overloadable)) -rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z); - -/** - * Multiply two matrix (lhs, rhs) and place the result in m. - * - * @param m - * @param lhs - * @param rhs - */ -extern void __attribute__((overloadable)) -rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs); -/** - * \overload - */ -extern void __attribute__((overloadable)) -rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs); -/** - * \overload - */ -extern void __attribute__((overloadable)) -rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs); - -/** - * Multiply the matrix m by rhs and place the result back into m. - * - * @param m (lhs) - * @param rhs - */ -extern void __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs); -/** - * \overload - */ -extern void __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs); -/** - * \overload - */ -extern void __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs); - -/** - * Multiple matrix m with a rotation matrix - * - * @param m - * @param rot - * @param x - * @param y - * @param z - */ -extern void __attribute__((overloadable)) -rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); - -/** - * Multiple matrix m with a scale matrix - * - * @param m - * @param x - * @param y - * @param z - */ -extern void __attribute__((overloadable)) -rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z); - -/** - * Multiple matrix m with a translation matrix - * - * @param m - * @param x - * @param y - * @param z - */ -extern void __attribute__((overloadable)) -rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z); - -/** - * Load an Ortho projection matrix constructed from the 6 planes - * - * @param m - * @param left - * @param right - * @param bottom - * @param top - * @param near - * @param far - */ -extern void __attribute__((overloadable)) -rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); - -/** - * Load an Frustum projection matrix constructed from the 6 planes - * - * @param m - * @param left - * @param right - * @param bottom - * @param top - * @param near - * @param far - */ -extern void __attribute__((overloadable)) -rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); - -/** - * Load an perspective projection matrix constructed from the 6 planes - * - * @param m - * @param fovy Field of view, in degrees along the Y axis. - * @param aspect Ratio of x / y. - * @param near - * @param far - */ -extern void __attribute__((overloadable)) -rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far); - -#if !defined(RS_VERSION) || (RS_VERSION < 14) -/** - * Multiply a vector by a matrix and return the result vector. - * API version 10-13 - */ -_RS_RUNTIME float4 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, float4 in); - -/** - * \overload - */ -_RS_RUNTIME float4 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, float3 in); - -/** - * \overload - */ -_RS_RUNTIME float4 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, float2 in); - -/** - * \overload - */ -_RS_RUNTIME float3 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix3x3 *m, float3 in); - -/** - * \overload - */ -_RS_RUNTIME float3 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix3x3 *m, float2 in); - -/** - * \overload - */ -_RS_RUNTIME float2 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix2x2 *m, float2 in); -#else -/** - * Multiply a vector by a matrix and return the result vector. - * API version 14+ - */ -_RS_RUNTIME float4 __attribute__((overloadable)) -rsMatrixMultiply(const rs_matrix4x4 *m, float4 in); - -/** - * \overload - */ -_RS_RUNTIME float4 __attribute__((overloadable)) -rsMatrixMultiply(const rs_matrix4x4 *m, float3 in); - -/** - * \overload - */ -_RS_RUNTIME float4 __attribute__((overloadable)) -rsMatrixMultiply(const rs_matrix4x4 *m, float2 in); - -/** - * \overload - */ -_RS_RUNTIME float3 __attribute__((overloadable)) -rsMatrixMultiply(const rs_matrix3x3 *m, float3 in); - -/** - * \overload - */ -_RS_RUNTIME float3 __attribute__((overloadable)) -rsMatrixMultiply(const rs_matrix3x3 *m, float2 in); - -/** - * \overload - */ -_RS_RUNTIME float2 __attribute__((overloadable)) -rsMatrixMultiply(const rs_matrix2x2 *m, float2 in); -#endif - - -/** - * Returns true if the matrix was successfully inversed - * - * @param m - */ -extern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m); - -/** - * Returns true if the matrix was successfully inversed and transposed. - * - * @param m - */ -extern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m); - -/** - * Transpose the matrix m. - * - * @param m - */ -extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m); -/** - * \overload - */ -extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m); - - -#endif diff --git a/libs/rs/scriptc/rs_mesh.rsh b/libs/rs/scriptc/rs_mesh.rsh deleted file mode 100644 index 87ffd33..0000000 --- a/libs/rs/scriptc/rs_mesh.rsh +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -/** @file rs_mesh.rsh - * \brief Mesh routines - * - * - */ - -#ifndef __RS_MESH_RSH__ -#define __RS_MESH_RSH__ - -#if (defined(RS_VERSION) && (RS_VERSION >= 16)) - -/** - * @param m mesh to get data from - * @return number of allocations in the mesh that contain vertex - * data - */ -extern uint32_t __attribute__((overloadable)) - rsgMeshGetVertexAllocationCount(rs_mesh m); - -/** - * @param m mesh to get data from - * @return number of primitive groups in the mesh. This would - * include simple primitives as well as allocations - * containing index data - */ -extern uint32_t __attribute__((overloadable)) - rsgMeshGetPrimitiveCount(rs_mesh m); - -/** - * @param m mesh to get data from - * @param index index of the vertex allocation - * @return allocation containing vertex data - */ -extern rs_allocation __attribute__((overloadable)) - rsgMeshGetVertexAllocation(rs_mesh m, uint32_t index); - -/** - * @param m mesh to get data from - * @param index index of the index allocation - * @return allocation containing index data - */ -extern rs_allocation __attribute__((overloadable)) - rsgMeshGetIndexAllocation(rs_mesh m, uint32_t index); - -/** - * @param m mesh to get data from - * @param index index of the primitive - * @return primitive describing how the mesh is rendered - */ -extern rs_primitive __attribute__((overloadable)) - rsgMeshGetPrimitive(rs_mesh m, uint32_t index); - -#endif // (defined(RS_VERSION) && (RS_VERSION >= 16)) - -#endif // __RS_MESH_RSH__ - diff --git a/libs/rs/scriptc/rs_object.rsh b/libs/rs/scriptc/rs_object.rsh deleted file mode 100644 index 1fc3f83..0000000 --- a/libs/rs/scriptc/rs_object.rsh +++ /dev/null @@ -1,220 +0,0 @@ -/* - * 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. - */ - -/** @file rs_object.rsh - * \brief Object routines - * - * - */ - -#ifndef __RS_OBJECT_RSH__ -#define __RS_OBJECT_RSH__ - - -/** - * Copy reference to the specified object. - * - * @param dst - * @param src - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_element *dst, rs_element src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_type *dst, rs_type src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_allocation *dst, rs_allocation src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_sampler *dst, rs_sampler src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_script *dst, rs_script src); -/** - * \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 - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_program_fragment *dst, rs_program_fragment src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_program_vertex *dst, rs_program_vertex src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_program_raster *dst, rs_program_raster src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_program_store *dst, rs_program_store src); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsSetObject(rs_font *dst, rs_font src); - -/** - * Sets the object to NULL. - * - * @return bool - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_element *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_type *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_allocation *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_sampler *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_script *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_path *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_mesh *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_program_fragment *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_program_vertex *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_program_raster *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_program_store *dst); -/** - * \overload - */ -extern void __attribute__((overloadable)) - rsClearObject(rs_font *dst); - - - -/** - * Tests if the object is valid. Returns true if the object is valid, false if - * it is NULL. - * - * @return bool - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_element); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_type); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_allocation); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_sampler); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_script); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_path); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_mesh); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_program_fragment); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_program_vertex); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_program_raster); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_program_store); -/** - * \overload - */ -extern bool __attribute__((overloadable)) - rsIsObject(rs_font); - -#endif diff --git a/libs/rs/scriptc/rs_program.rsh b/libs/rs/scriptc/rs_program.rsh deleted file mode 100644 index 6a9929e..0000000 --- a/libs/rs/scriptc/rs_program.rsh +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -/** @file rs_program.rsh - * \brief Program object routines - * - * - */ - -#ifndef __RS_PROGRAM_RSH__ -#define __RS_PROGRAM_RSH__ - -#if (defined(RS_VERSION) && (RS_VERSION >= 16)) - -/** - * @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); - -/** - * @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); - -#endif // (defined(RS_VERSION) && (RS_VERSION >= 16)) - -#endif // __RS_PROGRAM_RSH__ - diff --git a/libs/rs/scriptc/rs_quaternion.rsh b/libs/rs/scriptc/rs_quaternion.rsh deleted file mode 100644 index 4e08d2f..0000000 --- a/libs/rs/scriptc/rs_quaternion.rsh +++ /dev/null @@ -1,253 +0,0 @@ -/* - * 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. - */ - -/** @file rs_quaternion.rsh - * \brief Quaternion routines - * - * - */ - -#ifndef __RS_QUATERNION_RSH__ -#define __RS_QUATERNION_RSH__ - - -/** - * Set the quaternion components - * @param w component - * @param x component - * @param y component - * @param z component - */ -static void __attribute__((overloadable)) -rsQuaternionSet(rs_quaternion *q, float w, float x, float y, float z) { - q->w = w; - q->x = x; - q->y = y; - q->z = z; -} - -/** - * Set the quaternion from another quaternion - * @param q destination quaternion - * @param rhs source quaternion - */ -static void __attribute__((overloadable)) -rsQuaternionSet(rs_quaternion *q, const rs_quaternion *rhs) { - q->w = rhs->w; - q->x = rhs->x; - q->y = rhs->y; - q->z = rhs->z; -} - -/** - * Multiply quaternion by a scalar - * @param q quaternion to multiply - * @param s scalar - */ -static void __attribute__((overloadable)) -rsQuaternionMultiply(rs_quaternion *q, float s) { - q->w *= s; - q->x *= s; - q->y *= s; - q->z *= s; -} - -/** - * Add two quaternions - * @param q destination quaternion to add to - * @param rsh right hand side quaternion to add - */ -static void -rsQuaternionAdd(rs_quaternion *q, const rs_quaternion *rhs) { - q->w *= rhs->w; - q->x *= rhs->x; - q->y *= rhs->y; - q->z *= rhs->z; -} - -/** - * Loads a quaternion that represents a rotation about an arbitrary unit vector - * @param q quaternion to set - * @param rot angle to rotate by - * @param x component of a vector - * @param y component of a vector - * @param x component of a vector - */ -static void -rsQuaternionLoadRotateUnit(rs_quaternion *q, float rot, float x, float y, float z) { - rot *= (float)(M_PI / 180.0f) * 0.5f; - float c = cos(rot); - float s = sin(rot); - - q->w = c; - q->x = x * s; - q->y = y * s; - q->z = z * s; -} - -/** - * Loads a quaternion that represents a rotation about an arbitrary vector - * (doesn't have to be unit) - * @param q quaternion to set - * @param rot angle to rotate by - * @param x component of a vector - * @param y component of a vector - * @param x component of a vector - */ -static void -rsQuaternionLoadRotate(rs_quaternion *q, float rot, float x, float y, float z) { - const float len = x*x + y*y + z*z; - if (len != 1) { - const float recipLen = 1.f / sqrt(len); - x *= recipLen; - y *= recipLen; - z *= recipLen; - } - rsQuaternionLoadRotateUnit(q, rot, x, y, z); -} - -/** - * Conjugates the quaternion - * @param q quaternion to conjugate - */ -static void -rsQuaternionConjugate(rs_quaternion *q) { - q->x = -q->x; - q->y = -q->y; - q->z = -q->z; -} - -/** - * Dot product of two quaternions - * @param q0 first quaternion - * @param q1 second quaternion - * @return dot product between q0 and q1 - */ -static float -rsQuaternionDot(const rs_quaternion *q0, const rs_quaternion *q1) { - return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z; -} - -/** - * Normalizes the quaternion - * @param q quaternion to normalize - */ -static void -rsQuaternionNormalize(rs_quaternion *q) { - const float len = rsQuaternionDot(q, q); - if (len != 1) { - const float recipLen = 1.f / sqrt(len); - rsQuaternionMultiply(q, recipLen); - } -} - -/** - * Multiply quaternion by another quaternion - * @param q destination quaternion - * @param rhs right hand side quaternion to multiply by - */ -static void __attribute__((overloadable)) -rsQuaternionMultiply(rs_quaternion *q, const rs_quaternion *rhs) { - rs_quaternion qtmp; - rsQuaternionSet(&qtmp, q); - - q->w = qtmp.w*rhs->w - qtmp.x*rhs->x - qtmp.y*rhs->y - qtmp.z*rhs->z; - q->x = qtmp.w*rhs->x + qtmp.x*rhs->w + qtmp.y*rhs->z - qtmp.z*rhs->y; - q->y = qtmp.w*rhs->y + qtmp.y*rhs->w + qtmp.z*rhs->x - qtmp.x*rhs->z; - q->z = qtmp.w*rhs->z + qtmp.z*rhs->w + qtmp.x*rhs->y - qtmp.y*rhs->x; - rsQuaternionNormalize(q); -} - -/** - * Performs spherical linear interpolation between two quaternions - * @param q result quaternion from interpolation - * @param q0 first param - * @param q1 second param - * @param t how much to interpolate by - */ -static void -rsQuaternionSlerp(rs_quaternion *q, const rs_quaternion *q0, const rs_quaternion *q1, float t) { - if (t <= 0.0f) { - rsQuaternionSet(q, q0); - return; - } - if (t >= 1.0f) { - rsQuaternionSet(q, q1); - return; - } - - rs_quaternion tempq0, tempq1; - rsQuaternionSet(&tempq0, q0); - rsQuaternionSet(&tempq1, q1); - - float angle = rsQuaternionDot(q0, q1); - if (angle < 0) { - rsQuaternionMultiply(&tempq0, -1.0f); - angle *= -1.0f; - } - - float scale, invScale; - if (angle + 1.0f > 0.05f) { - if (1.0f - angle >= 0.05f) { - float theta = acos(angle); - float invSinTheta = 1.0f / sin(theta); - scale = sin(theta * (1.0f - t)) * invSinTheta; - invScale = sin(theta * t) * invSinTheta; - } else { - scale = 1.0f - t; - invScale = t; - } - } else { - rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w); - scale = sin(M_PI * (0.5f - t)); - invScale = sin(M_PI * t); - } - - rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale, - tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale); -} - -/** - * Computes rotation matrix from the normalized quaternion - * @param m resulting matrix - * @param p normalized quaternion - */ -static void rsQuaternionGetMatrixUnit(rs_matrix4x4 *m, const rs_quaternion *q) { - float xx = q->x * q->x; - float xy = q->x * q->y; - float xz = q->x * q->z; - float xw = q->x * q->w; - float yy = q->y * q->y; - float yz = q->y * q->z; - float yw = q->y * q->w; - float zz = q->z * q->z; - float zw = q->z * q->w; - - m->m[0] = 1.0f - 2.0f * ( yy + zz ); - m->m[4] = 2.0f * ( xy - zw ); - m->m[8] = 2.0f * ( xz + yw ); - m->m[1] = 2.0f * ( xy + zw ); - m->m[5] = 1.0f - 2.0f * ( xx + zz ); - m->m[9] = 2.0f * ( yz - xw ); - m->m[2] = 2.0f * ( xz - yw ); - m->m[6] = 2.0f * ( yz + xw ); - m->m[10] = 1.0f - 2.0f * ( xx + yy ); - m->m[3] = m->m[7] = m->m[11] = m->m[12] = m->m[13] = m->m[14] = 0.0f; - m->m[15] = 1.0f; -} - -#endif - diff --git a/libs/rs/scriptc/rs_sampler.rsh b/libs/rs/scriptc/rs_sampler.rsh deleted file mode 100644 index c8948c7..0000000 --- a/libs/rs/scriptc/rs_sampler.rsh +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -/** @file rs_sampler.rsh - * \brief Sampler routines - * - * - */ - -#ifndef __RS_SAMPLER_RSH__ -#define __RS_SAMPLER_RSH__ - -#if (defined(RS_VERSION) && (RS_VERSION >= 16)) - -/** - * @hide - * Get sampler minification value - * - * @param pr - */ -extern rs_sampler_value __attribute__((overloadable)) - rsSamplerGetMinification(rs_sampler s); - -/** - * @hide - * Get sampler magnification value - * - * @param pr - */ -extern rs_sampler_value __attribute__((overloadable)) - rsSamplerGetMagnification(rs_sampler s); - -/** - * @hide - * Get sampler wrap S value - * - * @param pr - */ -extern rs_sampler_value __attribute__((overloadable)) - rsSamplerGetWrapS(rs_sampler s); - -/** - * @hide - * Get sampler wrap T value - * - * @param pr - */ -extern rs_sampler_value __attribute__((overloadable)) - rsSamplerGetWrapT(rs_sampler s); - -/** - * @hide - * Get sampler anisotropy - * - * @param pr - */ -extern float __attribute__((overloadable)) - rsSamplerGetAnisotropy(rs_sampler s); - -#endif // (defined(RS_VERSION) && (RS_VERSION >= 16)) - -#endif // __RS_SAMPLER_RSH__ - diff --git a/libs/rs/scriptc/rs_time.rsh b/libs/rs/scriptc/rs_time.rsh deleted file mode 100644 index 60e3dee..0000000 --- a/libs/rs/scriptc/rs_time.rsh +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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. - */ - -/** @file rs_time.rsh - * \brief Renderscript time routines - * - * This file contains Renderscript functions relating to time and date - * manipulation. - */ - -#ifndef __RS_TIME_RSH__ -#define __RS_TIME_RSH__ - -/** - * Calendar time interpreted as seconds elapsed since the Epoch (00:00:00 on - * January 1, 1970, Coordinated Universal Time (UTC)). - */ -typedef int rs_time_t; - -/** - * Data structure for broken-down time components. - * - * tm_sec - Seconds after the minute. This ranges from 0 to 59, but possibly - * up to 60 for leap seconds. - * tm_min - Minutes after the hour. This ranges from 0 to 59. - * tm_hour - Hours past midnight. This ranges from 0 to 23. - * tm_mday - Day of the month. This ranges from 1 to 31. - * tm_mon - Months since January. This ranges from 0 to 11. - * tm_year - Years since 1900. - * tm_wday - Days since Sunday. This ranges from 0 to 6. - * tm_yday - Days since January 1. This ranges from 0 to 365. - * tm_isdst - Flag to indicate whether daylight saving time is in effect. The - * value is positive if it is in effect, zero if it is not, and - * negative if the information is not available. - */ -typedef struct { - int tm_sec; ///< seconds - int tm_min; ///< minutes - int tm_hour; ///< hours - int tm_mday; ///< day of the month - int tm_mon; ///< month - int tm_year; ///< year - int tm_wday; ///< day of the week - int tm_yday; ///< day of the year - int tm_isdst; ///< daylight savings time -} rs_tm; - -/** - * Returns the number of seconds since the Epoch (00:00:00 UTC, January 1, - * 1970). If @p timer is non-NULL, the result is also stored in the memory - * pointed to by this variable. If an error occurs, a value of -1 is returned. - * - * @param timer Location to also store the returned calendar time. - * - * @return Seconds since the Epoch. - */ -extern rs_time_t __attribute__((overloadable)) - rsTime(rs_time_t *timer); - -/** - * Converts the time specified by @p timer into broken-down time and stores it - * in @p local. This function also returns a pointer to @p local. If @p local - * is NULL, this function does nothing and returns NULL. - * - * @param local Broken-down time. - * @param timer Input time as calendar time. - * - * @return Pointer to broken-down time (same as input @p local). - */ -extern rs_tm * __attribute__((overloadable)) - rsLocaltime(rs_tm *local, const rs_time_t *timer); - -/** - * Returns the current system clock (uptime) in milliseconds. - * - * @return Uptime in milliseconds. - */ -extern int64_t __attribute__((overloadable)) - rsUptimeMillis(void); - -/** - * Returns the current system clock (uptime) in nanoseconds. - * - * @return Uptime in nanoseconds. - */ -extern int64_t __attribute__((overloadable)) - rsUptimeNanos(void); - -/** - * Returns the time in seconds since this function was last called in this - * script. - * - * @return Time in seconds. - */ -extern float __attribute__((overloadable)) - rsGetDt(void); - -#endif diff --git a/libs/rs/scriptc/rs_types.rsh b/libs/rs/scriptc/rs_types.rsh deleted file mode 100644 index 10617d8..0000000 --- a/libs/rs/scriptc/rs_types.rsh +++ /dev/null @@ -1,559 +0,0 @@ -/* - * 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. - */ - -/** @file rs_types.rsh - * - * Define the standard Renderscript types - * - * Integers - * 8 bit: char, int8_t - * 16 bit: short, int16_t - * 32 bit: int, in32_t - * 64 bit: long, long long, int64_t - * - * Unsigned Integers - * 8 bit: uchar, uint8_t - * 16 bit: ushort, uint16_t - * 32 bit: uint, uint32_t - * 64 bit: ulong, uint64_t - * - * Floating point - * 32 bit: float - * 64 bit: double - * - * Vectors of length 2, 3, and 4 are supported for all the types above. - * - */ - -#ifndef __RS_TYPES_RSH__ -#define __RS_TYPES_RSH__ - -#define M_PI 3.14159265358979323846264338327950288f /* pi */ - -#include "stdbool.h" -/** - * 8 bit integer type - */ -typedef char int8_t; -/** - * 16 bit integer type - */ -typedef short int16_t; -/** - * 32 bit integer type - */ -typedef int int32_t; -/** - * 64 bit integer type - */ -typedef long long int64_t; -/** - * 8 bit unsigned integer type - */ -typedef unsigned char uint8_t; -/** - * 16 bit unsigned integer type - */ -typedef unsigned short uint16_t; -/** - * 32 bit unsigned integer type - */ -typedef unsigned int uint32_t; -/** - * 64 bit unsigned integer type - */ -typedef unsigned long long uint64_t; -/** - * 8 bit unsigned integer type - */ -typedef uint8_t uchar; -/** - * 16 bit unsigned integer type - */ -typedef uint16_t ushort; -/** - * 32 bit unsigned integer type - */ -typedef uint32_t uint; -/** - * Typedef for unsigned long (use for 64-bit unsigned integers) - */ -typedef uint64_t ulong; -/** - * Typedef for unsigned int - */ -typedef uint32_t size_t; -/** - * Typedef for int (use for 32-bit integers) - */ -typedef int32_t ssize_t; - -/** - * \brief Opaque handle to a Renderscript element. - * - * See: android.renderscript.Element - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_element; -/** - * \brief Opaque handle to a Renderscript type. - * - * See: android.renderscript.Type - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_type; -/** - * \brief Opaque handle to a Renderscript allocation. - * - * See: android.renderscript.Allocation - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_allocation; -/** - * \brief Opaque handle to a Renderscript sampler object. - * - * See: android.renderscript.Sampler - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_sampler; -/** - * \brief Opaque handle to a Renderscript script object. - * - * See: android.renderscript.ScriptC - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_script; -/** - * \brief Opaque handle to a Renderscript mesh object. - * - * See: android.renderscript.Mesh - */ -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 - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_fragment; -/** - * \brief Opaque handle to a Renderscript ProgramVertex object. - * - * See: android.renderscript.ProgramVertex - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_vertex; -/** - * \brief Opaque handle to a Renderscript ProgramRaster object. - * - * See: android.renderscript.ProgramRaster - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_raster; -/** - * \brief Opaque handle to a Renderscript ProgramStore object. - * - * See: android.renderscript.ProgramStore - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_store; -/** - * \brief Opaque handle to a Renderscript font object. - * - * See: android.renderscript.Font - */ -typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_font; - -/** - * Vector version of the basic float type. - * Provides two float fields packed into a single 64 bit field with 64 bit - * alignment. - */ -typedef float float2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic float type. Provides three float fields packed - * into a single 128 bit field with 128 bit alignment. - */ -typedef float float3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic float type. - * Provides four float fields packed into a single 128 bit field with 128 bit - * alignment. - */ -typedef float float4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic double type. Provides two double fields packed - * into a single 128 bit field with 128 bit alignment. - */ -typedef double double2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic double type. Provides three double fields packed - * into a single 256 bit field with 256 bit alignment. - */ -typedef double double3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic double type. Provides four double fields packed - * into a single 256 bit field with 256 bit alignment. - */ -typedef double double4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic uchar type. Provides two uchar fields packed - * into a single 16 bit field with 16 bit alignment. - */ -typedef uchar uchar2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic uchar type. Provides three uchar fields packed - * into a single 32 bit field with 32 bit alignment. - */ -typedef uchar uchar3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic uchar type. Provides four uchar fields packed - * into a single 32 bit field with 32 bit alignment. - */ -typedef uchar uchar4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic ushort type. Provides two ushort fields packed - * into a single 32 bit field with 32 bit alignment. - */ -typedef ushort ushort2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic ushort type. Provides three ushort fields packed - * into a single 64 bit field with 64 bit alignment. - */ -typedef ushort ushort3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic ushort type. Provides four ushort fields packed - * into a single 64 bit field with 64 bit alignment. - */ -typedef ushort ushort4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic uint type. Provides two uint fields packed into a - * single 64 bit field with 64 bit alignment. - */ -typedef uint uint2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic uint type. Provides three uint fields packed into - * a single 128 bit field with 128 bit alignment. - */ -typedef uint uint3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic uint type. Provides four uint fields packed into - * a single 128 bit field with 128 bit alignment. - */ -typedef uint uint4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic ulong type. Provides two ulong fields packed into - * a single 128 bit field with 128 bit alignment. - */ -typedef ulong ulong2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic ulong type. Provides three ulong fields packed - * into a single 256 bit field with 256 bit alignment. - */ -typedef ulong ulong3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic ulong type. Provides four ulong fields packed - * into a single 256 bit field with 256 bit alignment. - */ -typedef ulong ulong4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic char type. Provides two char fields packed into a - * single 16 bit field with 16 bit alignment. - */ -typedef char char2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic char type. Provides three char fields packed into - * a single 32 bit field with 32 bit alignment. - */ -typedef char char3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic char type. Provides four char fields packed into - * a single 32 bit field with 32 bit alignment. - */ -typedef char char4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic short type. Provides two short fields packed into - * a single 32 bit field with 32 bit alignment. - */ -typedef short short2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic short type. Provides three short fields packed - * into a single 64 bit field with 64 bit alignment. - */ -typedef short short3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic short type. Provides four short fields packed - * into a single 64 bit field with 64 bit alignment. - */ -typedef short short4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic int type. Provides two int fields packed into a - * single 64 bit field with 64 bit alignment. - */ -typedef int int2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic int type. Provides three int fields packed into a - * single 128 bit field with 128 bit alignment. - */ -typedef int int3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic int type. Provides two four fields packed into a - * single 128 bit field with 128 bit alignment. - */ -typedef int int4 __attribute__((ext_vector_type(4))); - -/** - * Vector version of the basic long type. Provides two long fields packed into a - * single 128 bit field with 128 bit alignment. - */ -typedef long long2 __attribute__((ext_vector_type(2))); -/** - * Vector version of the basic long type. Provides three long fields packed into - * a single 256 bit field with 256 bit alignment. - */ -typedef long long3 __attribute__((ext_vector_type(3))); -/** - * Vector version of the basic long type. Provides four long fields packed into - * a single 256 bit field with 256 bit alignment. - */ -typedef long long4 __attribute__((ext_vector_type(4))); - -/** - * \brief 4x4 float matrix - * - * Native holder for RS matrix. Elements are stored in the array at the - * location [row*4 + col] - */ -typedef struct { - float m[16]; -} rs_matrix4x4; -/** - * \brief 3x3 float matrix - * - * Native holder for RS matrix. Elements are stored in the array at the - * location [row*3 + col] - */ -typedef struct { - float m[9]; -} rs_matrix3x3; -/** - * \brief 2x2 float matrix - * - * Native holder for RS matrix. Elements are stored in the array at the - * location [row*2 + col] - */ -typedef struct { - float m[4]; -} rs_matrix2x2; - -/** - * quaternion type for use with the quaternion functions - */ -typedef float4 rs_quaternion; - -#define RS_PACKED __attribute__((packed, aligned(4))) -#define NULL ((void *)0) - -#if (defined(RS_VERSION) && (RS_VERSION >= 14)) - -/** - * \brief Enum for selecting cube map faces - */ -typedef enum { - RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X = 0, - RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_X = 1, - RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Y = 2, - RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Y = 3, - RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Z = 4, - RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Z = 5 -} rs_allocation_cubemap_face; - -/** - * \brief Bitfield to specify the usage types for an allocation. - * - * These values are ORed together to specify which usages or memory spaces are - * relevant to an allocation or an operation on an allocation. - */ -typedef enum { - RS_ALLOCATION_USAGE_SCRIPT = 0x0001, - RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE = 0x0002, - RS_ALLOCATION_USAGE_GRAPHICS_VERTEX = 0x0004, - RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS = 0x0008, - RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET = 0x0010 -} rs_allocation_usage_type; - -#endif //defined(RS_VERSION) && (RS_VERSION >= 14) - -#if (defined(RS_VERSION) && (RS_VERSION >= 16)) - -/** - * Describes the way mesh vertex data is interpreted when rendering - * - **/ -typedef enum { - RS_PRIMITIVE_POINT = 0, - RS_PRIMITIVE_LINE = 1, - RS_PRIMITIVE_LINE_STRIP = 2, - RS_PRIMITIVE_TRIANGLE = 3, - RS_PRIMITIVE_TRIANGLE_STRIP = 4, - RS_PRIMITIVE_TRIANGLE_FAN = 5, - - RS_PRIMITIVE_INVALID = 100, -} rs_primitive; - -/** - * \brief Enumeration for possible element data types - * - * DataType represents the basic type information for a basic element. The - * naming convention follows. For numeric types it is FLOAT, - * SIGNED, or UNSIGNED followed by the _BITS where BITS is the - * size of the data. BOOLEAN is a true / false (1,0) - * represented in an 8 bit container. The UNSIGNED variants - * with multiple bit definitions are for packed graphical data - * formats and represent vectors with per vector member sizes - * which are treated as a single unit for packing and alignment - * purposes. - * - * MATRIX the three matrix types contain FLOAT_32 elements and are treated - * as 32 bits for alignment purposes. - * - * RS_* objects. 32 bit opaque handles. - */ -typedef enum { - RS_TYPE_NONE = 0, - //RS_TYPE_FLOAT_16, - RS_TYPE_FLOAT_32 = 2, - RS_TYPE_FLOAT_64 = 3, - RS_TYPE_SIGNED_8 = 4, - RS_TYPE_SIGNED_16 = 5, - RS_TYPE_SIGNED_32 = 6, - RS_TYPE_SIGNED_64 = 7, - RS_TYPE_UNSIGNED_8 = 8, - RS_TYPE_UNSIGNED_16 = 9, - RS_TYPE_UNSIGNED_32 = 10, - RS_TYPE_UNSIGNED_64 = 11, - - RS_TYPE_BOOLEAN = 12, - - RS_TYPE_UNSIGNED_5_6_5 = 13, - RS_TYPE_UNSIGNED_5_5_5_1 = 14, - RS_TYPE_UNSIGNED_4_4_4_4 = 15, - - RS_TYPE_MATRIX_4X4 = 16, - RS_TYPE_MATRIX_3X3 = 17, - RS_TYPE_MATRIX_2X2 = 18, - - RS_TYPE_ELEMENT = 1000, - RS_TYPE_TYPE = 1001, - RS_TYPE_ALLOCATION = 1002, - RS_TYPE_SAMPLER = 1003, - RS_TYPE_SCRIPT = 1004, - RS_TYPE_MESH = 1005, - RS_TYPE_PROGRAM_FRAGMENT = 1006, - RS_TYPE_PROGRAM_VERTEX = 1007, - RS_TYPE_PROGRAM_RASTER = 1008, - RS_TYPE_PROGRAM_STORE = 1009, - - RS_TYPE_INVALID = 10000, -} rs_data_type; - -/** - * \brief Enumeration for possible element data kind - * - * The special interpretation of the data if required. This is primarly - * useful for graphical data. USER indicates no special interpretation is - * expected. PIXEL is used in conjunction with the standard data types for - * representing texture formats. - */ -typedef enum { - RS_KIND_USER = 0, - - RS_KIND_PIXEL_L = 7, - RS_KIND_PIXEL_A = 8, - RS_KIND_PIXEL_LA = 9, - RS_KIND_PIXEL_RGB = 10, - RS_KIND_PIXEL_RGBA = 11, - RS_KIND_PIXEL_DEPTH = 12, - - RS_KIND_INVALID = 100, -} rs_data_kind; - -typedef enum { - RS_DEPTH_FUNC_ALWAYS = 0, - RS_DEPTH_FUNC_LESS = 1, - RS_DEPTH_FUNC_LEQUAL = 2, - RS_DEPTH_FUNC_GREATER = 3, - RS_DEPTH_FUNC_GEQUAL = 4, - RS_DEPTH_FUNC_EQUAL = 5, - RS_DEPTH_FUNC_NOTEQUAL = 6, - - RS_DEPTH_FUNC_INVALID = 100, -} 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_INVALID = 100, -} 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_INVALID = 100, -} rs_blend_dst_func; - -typedef enum { - RS_CULL_BACK = 0, - RS_CULL_FRONT = 1, - RS_CULL_NONE = 2, - - RS_CULL_INVALID = 100, -} rs_cull_mode; - -typedef enum { - RS_SAMPLER_NEAREST = 0, - RS_SAMPLER_LINEAR = 1, - RS_SAMPLER_LINEAR_MIP_LINEAR = 2, - RS_SAMPLER_WRAP = 3, - RS_SAMPLER_CLAMP = 4, - RS_SAMPLER_LINEAR_MIP_NEAREST = 5, - - RS_SAMPLER_INVALID = 100, -} rs_sampler_value; - -#endif // (defined(RS_VERSION) && (RS_VERSION >= 16)) - -#endif // __RS_TYPES_RSH__ diff --git a/libs/rs/spec.h b/libs/rs/spec.h deleted file mode 100644 index ecc5cc7..0000000 --- a/libs/rs/spec.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef SPEC_H -#define SPEC_H - -#include <string.h> -#include <stdlib.h> - -#if __cplusplus -extern "C" { -#endif - -extern int num_lines; - -typedef struct { - int isConst; - int type; - int bits; - int ptrLevel; - char name[256]; - char typeName[256]; -} VarType; - -extern VarType *currType; - -typedef struct { - char name[256]; - int sync; - int handcodeApi; - int direct; - int nocontext; - int paramCount; - VarType ret; - VarType params[16]; -} ApiEntry; - -extern ApiEntry apis[128]; -extern int apiCount; - -extern int typeNextState; - -#if __cplusplus -} // extern "C" -#endif - -#endif // SPEC_H diff --git a/libs/rs/spec.l b/libs/rs/spec.l deleted file mode 100644 index a24bfd3..0000000 --- a/libs/rs/spec.l +++ /dev/null @@ -1,198 +0,0 @@ -%option stack - -%x comment -%x api_entry -%x api_entry2 -%x api_entry_param -%x var_type - -DIGIT [0-9] -ID [a-zA-Z_][a-zA-Z0-9_]* - - #include "spec.h" - - int num_lines = 0; - - VarType *currType = 0; - - ApiEntry apis[128]; - int apiCount = 0; - - int typeNextState; - - void checkPointerType() { - VarType *baseType = currType; - int curPtrLevel = 0; - while (curPtrLevel < baseType->ptrLevel) { - currType = &apis[apiCount].params[apis[apiCount].paramCount]; - currType->type = 4; - currType->ptrLevel = curPtrLevel; - if (currType->ptrLevel > 0) { - currType->isConst = 1; - } - sprintf(currType->typeName, "%s", "size_t"); - switch(baseType->ptrLevel - curPtrLevel) { - case 1: - sprintf(currType->name, "%s_length", baseType->name); - break; - case 2: - sprintf(currType->name, "%s_length_length", baseType->name); - break; - } - apis[apiCount].paramCount++; - curPtrLevel ++; - } - } - - extern "C" int yylex(); - -%% - -"/*" BEGIN(comment); -<comment>[^*\n]* /* eat anything that's not a '*' */ -<comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ -<comment>\n ++num_lines; -<comment>"*"+"/" BEGIN(INITIAL); - -<*>" " //printf("found ' '\n"); -<*>"\t" //printf("found ' '\n"); -<*>"\n" ++num_lines; //printf("found lf \n"); - -{ID} { - memset(&apis[apiCount], 0, sizeof(ApiEntry)); - memcpy(apis[apiCount].name, yytext, yyleng); - BEGIN(api_entry); - } - -<api_entry>"{" { - BEGIN(api_entry2); - } - -<api_entry2>"sync" { - apis[apiCount].sync = 1; - } - -<api_entry2>"handcodeApi" { - apis[apiCount].handcodeApi = 1; - } - -<api_entry2>"direct" { - apis[apiCount].direct = 1; - } - -<api_entry2>"nocontext" { - apis[apiCount].nocontext = 1; - } - -<api_entry2>"ret" { - currType = &apis[apiCount].ret; - typeNextState = api_entry2; - BEGIN(var_type); - } - -<api_entry2>"param" { - currType = &apis[apiCount].params[apis[apiCount].paramCount]; - apis[apiCount].paramCount++; - typeNextState = api_entry_param; - BEGIN(var_type); - } - -<var_type>"const" { - currType->isConst = 1; - } - -<var_type>"i8" { - currType->type = 1; - currType->bits = 8; - BEGIN(typeNextState); - } - -<var_type>"i16" { - currType->type = 1; - currType->bits = 16; - BEGIN(typeNextState); - } - -<var_type>"i32" { - currType->type = 1; - currType->bits = 32; - BEGIN(typeNextState); - } - -<var_type>"i64" { - currType->type = 1; - currType->bits = 64; - BEGIN(typeNextState); - } - -<var_type>"u8" { - currType->type = 2; - currType->bits = 8; - BEGIN(typeNextState); - } - -<var_type>"u16" { - currType->type = 2; - currType->bits = 16; - BEGIN(typeNextState); - } - -<var_type>"u32" { - currType->type = 2; - currType->bits = 32; - BEGIN(typeNextState); - } - -<var_type>"u64" { - currType->type = 2; - currType->bits = 64; - BEGIN(typeNextState); - } - -<var_type>"f" { - currType->type = 3; - currType->bits = 32; - BEGIN(typeNextState); - } - -<var_type>"d" { - currType->type = 3; - currType->bits = 64; - BEGIN(typeNextState); - } - -<var_type>{ID} { - currType->type = 4; - currType->bits = 32; - memcpy(currType->typeName, yytext, yyleng); - BEGIN(typeNextState); - } - -<api_entry_param>"*" { - currType->ptrLevel ++; - } - -<api_entry_param>{ID} { - memcpy(currType->name, yytext, yyleng); - checkPointerType(); - BEGIN(api_entry2); - } - -<api_entry2>"*" { - currType->ptrLevel ++; - } - -<api_entry2>"}" { - apiCount++; - BEGIN(INITIAL); - } - - -%% - - -int yywrap() -{ - return 1; -} - diff --git a/libs/rs/tests/Android.mk b/libs/rs/tests/Android.mk deleted file mode 100644 index 627ff72..0000000 --- a/libs/rs/tests/Android.mk +++ /dev/null @@ -1,36 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= \ - compute.cpp \ - ScriptC_mono.cpp - -LOCAL_SHARED_LIBRARIES := \ - libRS \ - libz \ - libcutils \ - libutils \ - libEGL \ - libGLESv1_CM \ - libGLESv2 \ - libui \ - libbcc \ - libbcinfo \ - libgui - -LOCAL_MODULE:= rstest-compute - -LOCAL_MODULE_TAGS := tests - -intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,) -librs_generated_headers := \ - $(intermediates)/rsgApiStructs.h \ - $(intermediates)/rsgApiFuncDecl.h -LOCAL_GENERATED_SOURCES := $(librs_generated_headers) - -LOCAL_C_INCLUDES += frameworks/base/libs/rs -LOCAL_C_INCLUDES += $(intermediates) - - -include $(BUILD_EXECUTABLE) - diff --git a/libs/rs/tests/ScriptC_mono.cpp b/libs/rs/tests/ScriptC_mono.cpp deleted file mode 100644 index a6c63a8..0000000 --- a/libs/rs/tests/ScriptC_mono.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - - -/* - * This file is auto-generated. DO NOT MODIFY! - * The source Renderscript file: mono.rs - */ - - -#include "ScriptC_mono.h" - -static const unsigned char __txt[] = { - 0xde,0xc0,0x17,0x0b,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xd0,0x04,0x00,0x00, - 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x42,0x43,0xc0,0xde,0x21,0x0c,0x00,0x00, - 0x31,0x01,0x00,0x00,0x01,0x10,0x00,0x00,0x12,0x00,0x00,0x00,0x07,0x81,0x23,0x91, - 0x41,0xc8,0x04,0x49,0x06,0x10,0x32,0x39,0x92,0x01,0x84,0x0c,0x25,0x05,0x08,0x19, - 0x1e,0x04,0x8b,0x62,0x80,0x14,0x45,0x02,0x42,0x92,0x0b,0x42,0xa4,0x10,0x32,0x14, - 0x38,0x08,0x18,0x49,0x0a,0x32,0x44,0x24,0x48,0x0a,0x90,0x21,0x23,0xc4,0x52,0x80, - 0x0c,0x19,0x21,0x72,0x24,0x07,0xc8,0x48,0x11,0x62,0xa8,0xa0,0xa8,0x40,0xc6,0xf0, - 0x01,0x00,0x00,0x00,0x49,0x18,0x00,0x00,0x08,0x00,0x00,0x00,0x0b,0x8c,0x00,0x04, - 0x41,0x10,0x04,0x09,0x01,0x04,0x41,0x10,0x04,0x89,0xff,0xff,0xff,0xff,0x1f,0xc0, - 0x60,0x81,0xf0,0xff,0xff,0xff,0xff,0x03,0x18,0x00,0x00,0x00,0x89,0x20,0x00,0x00, - 0x14,0x00,0x00,0x00,0x32,0x22,0x48,0x09,0x20,0x64,0x85,0x04,0x93,0x22,0xa4,0x84, - 0x04,0x93,0x22,0xe3,0x84,0xa1,0x90,0x14,0x12,0x4c,0x8a,0x8c,0x0b,0x84,0xa4,0x4c, - 0x10,0x54,0x73,0x04,0x60,0x40,0x60,0x06,0x80,0xc4,0x1c,0x01,0x42,0x64,0x04,0x60, - 0x18,0x81,0x20,0xe8,0x94,0xc1,0x20,0x44,0x69,0x18,0x81,0x10,0x8a,0xb0,0x0e,0xb1, - 0x61,0x84,0x41,0x28,0x83,0x70,0x8e,0x5e,0x11,0x8e,0xa3,0x38,0x10,0x30,0x8c,0x30, - 0x00,0x00,0x00,0x00,0x13,0xb0,0x70,0x90,0x87,0x76,0xb0,0x87,0x3b,0x68,0x03,0x77, - 0x78,0x07,0x77,0x28,0x87,0x36,0x60,0x87,0x74,0x70,0x87,0x7a,0xc0,0x87,0x36,0x38, - 0x07,0x77,0xa8,0x87,0x72,0x08,0x07,0x71,0x48,0x87,0x0d,0xf2,0x50,0x0e,0x6d,0x00, - 0x0f,0x7a,0x30,0x07,0x72,0xa0,0x07,0x73,0x20,0x07,0x7a,0x30,0x07,0x72,0xd0,0x06, - 0xe9,0x10,0x07,0x7a,0x80,0x07,0x7a,0x80,0x07,0x6d,0x90,0x0e,0x78,0xa0,0x07,0x78, - 0xa0,0x07,0x78,0xd0,0x06,0xe9,0x10,0x07,0x76,0xa0,0x07,0x71,0x60,0x07,0x7a,0x10, - 0x07,0x76,0xd0,0x06,0xe9,0x30,0x07,0x72,0xa0,0x07,0x73,0x20,0x07,0x7a,0x30,0x07, - 0x72,0xd0,0x06,0xe9,0x60,0x07,0x74,0xa0,0x07,0x76,0x40,0x07,0x7a,0x60,0x07,0x74, - 0xd0,0x06,0xe6,0x30,0x07,0x72,0xa0,0x07,0x73,0x20,0x07,0x7a,0x30,0x07,0x72,0xd0, - 0x06,0xe6,0x60,0x07,0x74,0xa0,0x07,0x76,0x40,0x07,0x7a,0x60,0x07,0x74,0xd0,0x06, - 0xf6,0x60,0x07,0x74,0xa0,0x07,0x76,0x40,0x07,0x7a,0x60,0x07,0x74,0xd0,0x06,0xf6, - 0x10,0x07,0x72,0x80,0x07,0x7a,0x60,0x07,0x74,0xa0,0x07,0x71,0x20,0x07,0x78,0xd0, - 0x06,0xe1,0x00,0x07,0x7a,0x00,0x07,0x7a,0x60,0x07,0x74,0xd0,0x06,0xee,0x30,0x07, - 0x72,0xd0,0x06,0xb3,0x60,0x07,0x74,0xa0,0xf3,0x40,0x86,0x04,0x32,0x42,0x44,0x04, - 0x60,0x20,0x30,0x77,0x81,0x59,0x0a,0x34,0x44,0x51,0x00,0x00,0x08,0x00,0x00,0x00, - 0x80,0x21,0x4a,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x51,0x20,0x20,0x00,0x00, - 0x00,0x00,0x00,0x60,0x88,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x59,0x20,0x00, - 0x08,0x00,0x00,0x00,0x32,0x1e,0x98,0x10,0x19,0x11,0x4c,0x90,0x8c,0x09,0x26,0x47, - 0xc6,0x04,0x43,0x02,0x85,0x50,0x06,0x44,0x4a,0x80,0xc4,0x18,0x81,0xce,0x9a,0x73, - 0xfe,0x01,0x00,0x00,0x79,0x18,0x00,0x00,0x69,0x00,0x00,0x00,0x43,0x88,0x29,0x98, - 0x84,0x05,0x87,0x3d,0x94,0x83,0x3c,0xcc,0x43,0x3a,0xbc,0x83,0x3b,0x2c,0x08,0xe2, - 0x60,0x08,0x31,0x11,0x53,0xb1,0x20,0x52,0x87,0x70,0xb0,0x87,0x70,0xf8,0x05,0x78, - 0x08,0x87,0x71,0x58,0x87,0x70,0x38,0x87,0x72,0xf8,0x05,0x77,0x08,0x87,0x76,0x28, - 0x87,0x05,0x63,0x30,0x0e,0xef,0xd0,0x0e,0x6e,0x50,0x0e,0xf8,0x10,0x0e,0xed,0x00, - 0x0f,0xec,0x50,0x0e,0x6e,0x10,0x0e,0xee,0x40,0x0e,0xf2,0xf0,0x0e,0xe9,0x40,0x0e, - 0x6e,0x20,0x0f,0xf3,0xe0,0x06,0xe8,0x50,0x0e,0xec,0xc0,0x0e,0xef,0x30,0x0e,0xef, - 0xd0,0x0e,0xf0,0x50,0x0f,0xf4,0x50,0x0e,0x43,0x04,0x00,0x19,0x42,0x4c,0xc8,0x94, - 0x2c,0x20,0xce,0x21,0x15,0xdc,0x81,0x1e,0x16,0x04,0x75,0x30,0x84,0x98,0x96,0x49, - 0x58,0x60,0x8c,0x83,0x29,0xb0,0xc3,0x3b,0x84,0x03,0x3d,0x0c,0x21,0xa6,0x66,0x72, - 0x16,0x14,0xe7,0x20,0x0a,0xef,0xf0,0x0e,0xec,0xb0,0x40,0x88,0x83,0x38,0x18,0x22, - 0x4c,0xd0,0x02,0x42,0x1e,0xde,0xe1,0x1d,0xe8,0x61,0x88,0x30,0x49,0x0b,0x82,0x39, - 0x18,0x42,0x4c,0xd4,0x54,0x2d,0x78,0xde,0xa1,0x1d,0xdc,0x21,0x1d,0xe0,0xe1,0x1d, - 0xe8,0xa1,0x1c,0xdc,0x81,0x1e,0xc0,0x60,0x1c,0xd0,0x21,0x1c,0xe4,0x61,0x08,0x31, - 0x59,0x06,0xb0,0x20,0x9a,0x85,0x74,0x68,0x07,0x78,0x60,0x87,0x72,0x00,0x83,0x51, - 0x78,0x83,0x51,0x58,0x83,0x35,0x00,0x03,0x5a,0x10,0x85,0x50,0x08,0x85,0x11,0xc7, - 0x18,0xc0,0x83,0x3c,0x84,0xc3,0x39,0xb4,0x43,0x38,0x4c,0x11,0x80,0x61,0xc4,0x34, - 0x06,0xef,0x00,0x0f,0xf4,0x90,0x0e,0xed,0x90,0x0e,0xfa,0x10,0x0e,0xf4,0x90,0x0e, - 0xef,0xe0,0x0e,0xbf,0xc0,0x0e,0xe5,0x60,0x0f,0xe5,0xc0,0x0e,0x53,0x02,0x63,0x84, - 0x33,0x06,0xf2,0x30,0x0f,0xbf,0x50,0x0e,0xf8,0x00,0x0f,0xef,0x20,0x0f,0xf4,0xf0, - 0x0b,0xf6,0x10,0x0e,0xf2,0x30,0x65,0x38,0x14,0x66,0x04,0x34,0x06,0xf2,0x30,0x0f, - 0xbf,0xf0,0x0e,0xe2,0xa0,0x0e,0xe5,0x30,0x0e,0xf4,0xf0,0x0b,0xf3,0xc0,0x0e,0xef, - 0x40,0x0f,0xf3,0x30,0x05,0x18,0x71,0x8d,0x81,0x3c,0xcc,0xc3,0x2f,0x94,0x03,0x3e, - 0xc0,0xc3,0x3b,0xc8,0x03,0x3d,0xfc,0x82,0x39,0xbc,0x83,0x3c,0x94,0x43,0x38,0x8c, - 0x03,0x3a,0xfc,0x82,0x3b,0x84,0x43,0x3b,0x94,0xc3,0x94,0xe0,0x19,0x21,0x8d,0x81, - 0x3c,0xcc,0xc3,0x2f,0x94,0x03,0x3e,0xc0,0xc3,0x3b,0xc8,0x03,0x3d,0xfc,0x82,0x39, - 0xbc,0x83,0x3c,0x94,0x43,0x38,0x8c,0x03,0x3a,0x4c,0x09,0x22,0x00,0x00,0x00,0x00, - 0x79,0x18,0x00,0x00,0x0b,0x00,0x00,0x00,0x33,0x08,0x80,0x1c,0xc4,0xe1,0x1c,0x66, - 0x14,0x01,0x3d,0x88,0x43,0x38,0x84,0xc3,0x8c,0x42,0x80,0x07,0x79,0x78,0x07,0x73, - 0x98,0xb1,0x0c,0xe6,0x00,0x0f,0xe1,0x30,0x0e,0xe3,0x50,0x0f,0xf2,0x10,0x0e,0xe3, - 0x90,0x0f,0x00,0x00,0x71,0x20,0x00,0x00,0x13,0x00,0x00,0x00,0x06,0x40,0x18,0x62, - 0x33,0x99,0x40,0x61,0x6c,0x8e,0xb3,0xd8,0x00,0x11,0x39,0xce,0x64,0x04,0x51,0x24, - 0xb9,0xcd,0x03,0x08,0x0a,0xe7,0x2c,0x4e,0xc4,0xf3,0x3c,0x6f,0x05,0xcd,0x3f,0xdf, - 0x83,0x33,0x75,0xd5,0xfd,0x17,0xec,0x6f,0x01,0x86,0xf0,0x2d,0x0e,0x30,0x99,0x81, - 0xf6,0xcf,0xf5,0x1e,0x49,0x29,0x20,0x28,0x9c,0xb3,0x38,0x51,0xeb,0xf0,0x3c,0xcf, - 0x77,0xd5,0xfd,0x17,0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00,0x21,0x00,0x00,0x00, - 0x13,0x04,0x41,0x2c,0x10,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x46,0x00,0x68, - 0xcd,0x00,0x90,0x9b,0x01,0x18,0x6b,0x38,0xe9,0x52,0x4e,0x3f,0xb1,0x8d,0xd9,0xf8, - 0xab,0x4d,0x5f,0xf6,0x3d,0xa2,0x63,0x0d,0x40,0x20,0x8c,0x00,0x00,0x00,0x00,0x00, - 0xb4,0x8c,0x11,0x03,0x42,0x08,0x88,0x69,0x90,0x81,0x72,0xa2,0x11,0x83,0x42,0x08, - 0x8a,0x0a,0x9a,0x63,0x78,0xac,0x66,0x90,0xe1,0x7a,0xa4,0x11,0x03,0x42,0x08,0x0c, - 0x6c,0x30,0x82,0xc9,0x06,0x00,0xc3,0x81,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, - 0xb6,0x40,0x54,0x3f,0xd2,0x18,0x43,0x51,0xfd,0x0e,0x35,0x01,0x01,0x31,0x00,0x00, - 0x03,0x00,0x00,0x00,0x5b,0x06,0x20,0x98,0xb6,0x0c,0x47,0x30,0x01,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -}; - -ScriptC_mono::ScriptC_mono(RenderScript *rs, const char *cacheDir, size_t cacheDirLength) : - ScriptC(rs, __txt, sizeof(__txt), "mono.rs", 4, cacheDir, cacheDirLength) { -} - -ScriptC_mono::~ScriptC_mono() { -} - -void ScriptC_mono::forEach_root(const Allocation *ain, const Allocation *aout) const { - forEach(0, ain, aout, NULL, 0); -} - diff --git a/libs/rs/tests/ScriptC_mono.h b/libs/rs/tests/ScriptC_mono.h deleted file mode 100644 index 69c41ac..0000000 --- a/libs/rs/tests/ScriptC_mono.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - - -/* - * This file is auto-generated. DO NOT MODIFY! - * The source Renderscript file: mono.rs - */ - - -#include "ScriptC.h" - -class ScriptC_mono : protected ScriptC { -private: - int32_t __gInt; - bool __gBool; -public: - ScriptC_mono(RenderScript *rs, const char *cacheDir, size_t cacheDirLength); - virtual ~ScriptC_mono(); - - void set_gInt(int32_t v) { - setVar(0, v); - __gInt = v; - } - int32_t get_gInt() const { - return __gInt; - } - - float get_cFloat() const { - return 1.2f; - } - - void set_gBool(bool v) { - setVar(2, v); - __gBool = v; - } - bool get_gBool() const { - return __gBool; - } - - void forEach_root(const Allocation *ain, const Allocation *aout) const; -}; diff --git a/libs/rs/tests/compute.cpp b/libs/rs/tests/compute.cpp deleted file mode 100644 index 42eaa52..0000000 --- a/libs/rs/tests/compute.cpp +++ /dev/null @@ -1,58 +0,0 @@ - -#include "RenderScript.h" -#include "Element.h" -#include "Type.h" -#include "Allocation.h" - -#include "ScriptC_mono.h" - -int main(int argc, char** argv) -{ - - RenderScript *rs = new RenderScript(); - printf("New RS %p\n", rs); - - bool r = rs->init(16); - printf("Init returned %i\n", r); - - const Element *e = Element::RGBA_8888(rs); - printf("Element %p\n", e); - - Type::Builder tb(rs, e); - tb.setX(128); - tb.setY(128); - const Type *t = tb.create(); - printf("Type %p\n", t); - - - Allocation *a1 = Allocation::createSized(rs, e, 1000); - printf("Allocation %p\n", a1); - - Allocation *ain = Allocation::createTyped(rs, t); - Allocation *aout = Allocation::createTyped(rs, t); - printf("Allocation %p %p\n", ain, aout); - - ScriptC_mono * sc = new ScriptC_mono(rs, NULL, 0); - printf("new script\n"); - - uint32_t *buf = new uint32_t[t->getCount()]; - for (uint32_t ct=0; ct < t->getCount(); ct++) { - buf[ct] = ct | (ct << 16); - } - //ain->copy1DRangeFrom(0, 128*128, (int32_t *)buf, 128*128*4); - ain->copy1DRangeFromUnchecked(0, t->getCount(), buf, t->getCount()*4); - - - - sc->forEach_root(ain, aout); - printf("for each done\n"); - - - printf("Deleting stuff\n"); - delete sc; - delete t; - delete a1; - delete e; - delete rs; - printf("Delete OK\n"); -} |