diff options
-rw-r--r-- | Android.mk | 3 | ||||
-rw-r--r-- | RenderScriptDefines.h | 26 | ||||
-rw-r--r-- | driver/rsdAllocation.cpp | 11 | ||||
-rw-r--r-- | driver/rsdCore.cpp | 8 | ||||
-rw-r--r-- | driver/rsdMesh.cpp | 2 | ||||
-rw-r--r-- | driver/rsdMeshObj.cpp | 36 | ||||
-rw-r--r-- | driver/rsdMeshObj.h | 7 | ||||
-rw-r--r-- | driver/rsdPath.cpp | 185 | ||||
-rw-r--r-- | driver/rsdPath.h | 35 | ||||
-rw-r--r-- | driver/rsdProgramRaster.cpp | 3 | ||||
-rw-r--r-- | driver/rsdProgramStore.cpp | 4 | ||||
-rw-r--r-- | driver/rsdRuntimeStubs.cpp | 13 | ||||
-rw-r--r-- | driver/rsdShader.cpp | 97 | ||||
-rw-r--r-- | rs.spec | 11 | ||||
-rw-r--r-- | rsAllocation.cpp | 15 | ||||
-rw-r--r-- | rsAllocation.h | 7 | ||||
-rw-r--r-- | rsComponent.cpp | 4 | ||||
-rw-r--r-- | rsContext.h | 1 | ||||
-rw-r--r-- | rsElement.cpp | 42 | ||||
-rw-r--r-- | rsElement.h | 30 | ||||
-rw-r--r-- | rsMesh.h | 27 | ||||
-rw-r--r-- | rsPath.cpp | 78 | ||||
-rw-r--r-- | rsPath.h | 69 | ||||
-rw-r--r-- | rsRuntime.h | 1 | ||||
-rw-r--r-- | rsScriptC_LibGL.cpp | 8 | ||||
-rw-r--r-- | rsType.cpp | 63 | ||||
-rw-r--r-- | rsType.h | 52 | ||||
-rw-r--r-- | rs_hal.h | 8 | ||||
-rw-r--r-- | scriptc/rs_allocation.rsh | 130 | ||||
-rw-r--r-- | scriptc/rs_graphics.rsh | 208 | ||||
-rw-r--r-- | scriptc/rs_object.rsh | 15 | ||||
-rw-r--r-- | scriptc/rs_types.rsh | 98 |
32 files changed, 1137 insertions, 160 deletions
@@ -96,6 +96,7 @@ LOCAL_SRC_FILES:= \ rsMatrix4x4.cpp \ rsMesh.cpp \ rsMutex.cpp \ + rsPath.cpp \ rsProgram.cpp \ rsProgramFragment.cpp \ rsProgramStore.cpp \ @@ -118,6 +119,7 @@ LOCAL_SRC_FILES:= \ driver/rsdGL.cpp \ driver/rsdMesh.cpp \ driver/rsdMeshObj.cpp \ + driver/rsdPath.cpp \ driver/rsdProgram.cpp \ driver/rsdProgramRaster.cpp \ driver/rsdProgramStore.cpp \ @@ -203,6 +205,7 @@ LOCAL_SRC_FILES:= \ rsMatrix4x4.cpp \ rsMesh.cpp \ rsMutex.cpp \ + rsPath.cpp \ rsProgram.cpp \ rsProgramFragment.cpp \ rsProgramStore.cpp \ diff --git a/RenderScriptDefines.h b/RenderScriptDefines.h index d092520f..49c75c5d 100644 --- a/RenderScriptDefines.h +++ b/RenderScriptDefines.h @@ -41,6 +41,7 @@ typedef void * RsFont; typedef void * RsSampler; typedef void * RsScript; typedef void * RsMesh; +typedef void * RsPath; typedef void * RsType; typedef void * RsObjectBase; @@ -152,6 +153,8 @@ enum RsDataType { RS_TYPE_PROGRAM_VERTEX, RS_TYPE_PROGRAM_RASTER, RS_TYPE_PROGRAM_STORE, + + RS_TYPE_INVALID = 10000, }; enum RsDataKind { @@ -163,6 +166,8 @@ enum RsDataKind { RS_KIND_PIXEL_RGB, RS_KIND_PIXEL_RGBA, RS_KIND_PIXEL_DEPTH, + + RS_KIND_INVALID = 100, }; enum RsSamplerParam { @@ -181,6 +186,8 @@ enum RsSamplerValue { RS_SAMPLER_WRAP, RS_SAMPLER_CLAMP, RS_SAMPLER_LINEAR_MIP_NEAREST, + + RS_SAMPLER_INVALID = 100, }; enum RsTextureTarget { @@ -221,7 +228,8 @@ enum RsBlendSrcFunc { 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_SRC_ALPHA_SATURATE, // 8 + RS_BLEND_SRC_INVALID = 100, }; enum RsBlendDstFunc { @@ -232,7 +240,9 @@ enum RsBlendDstFunc { 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_ONE_MINUS_DST_ALPHA, // 7 + + RS_BLEND_DST_INVALID = 100, }; enum RsTexEnvMode { @@ -255,7 +265,14 @@ enum RsPrimitive { RS_PRIMITIVE_LINE_STRIP, RS_PRIMITIVE_TRIANGLE, RS_PRIMITIVE_TRIANGLE_STRIP, - RS_PRIMITIVE_TRIANGLE_FAN + RS_PRIMITIVE_TRIANGLE_FAN, + + RS_PRIMITIVE_INVALID = 100, +}; + +enum RsPathPrimitive { + RS_PATH_PRIMITIVE_QUADRATIC_BEZIER, + RS_PATH_PRIMITIVE_CUBIC_BEZIER }; enum RsError { @@ -309,7 +326,8 @@ enum RsA3DClassID { enum RsCullMode { RS_CULL_BACK, RS_CULL_FRONT, - RS_CULL_NONE + RS_CULL_NONE, + RS_CULL_INVALID = 100, }; typedef struct { diff --git a/driver/rsdAllocation.cpp b/driver/rsdAllocation.cpp index 1f70e660..cc793668 100644 --- a/driver/rsdAllocation.cpp +++ b/driver/rsdAllocation.cpp @@ -212,10 +212,13 @@ bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) { return false; } - void * ptr = malloc(alloc->mHal.state.type->getSizeBytes()); + void * ptr = alloc->mHal.state.usrPtr; if (!ptr) { - free(drv); - return false; + ptr = malloc(alloc->mHal.state.type->getSizeBytes()); + if (!ptr) { + free(drv); + return false; + } } drv->glTarget = GL_NONE; @@ -269,7 +272,7 @@ void rsdAllocationDestroy(const Context *rsc, Allocation *alloc) { drv->renderTargetID = 0; } - if (drv->mallocPtr) { + if (drv->mallocPtr && !alloc->mHal.state.usrPtr) { free(drv->mallocPtr); drv->mallocPtr = NULL; } diff --git a/driver/rsdCore.cpp b/driver/rsdCore.cpp index b514e218..b9348950 100644 --- a/driver/rsdCore.cpp +++ b/driver/rsdCore.cpp @@ -18,6 +18,7 @@ #include "rsdAllocation.h" #include "rsdBcc.h" #include "rsdGL.h" +#include "rsdPath.h" #include "rsdProgramStore.h" #include "rsdProgramRaster.h" #include "rsdProgramVertex.h" @@ -115,6 +116,13 @@ static RsdHalFunctions FunctionTable = { }, { + rsdPathInitStatic, + rsdPathInitDynamic, + rsdPathDraw, + rsdPathDestroy + }, + + { rsdSamplerInit, rsdSamplerDestroy }, diff --git a/driver/rsdMesh.cpp b/driver/rsdMesh.cpp index eb62ddb6..50daf3ee 100644 --- a/driver/rsdMesh.cpp +++ b/driver/rsdMesh.cpp @@ -35,7 +35,7 @@ bool rsdMeshInit(const Context *rsc, const Mesh *m) { } drv = new RsdMeshObj(rsc, m); m->mHal.drv = drv; - return drv->init(); + return drv->init(rsc); } void rsdMeshDraw(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) { diff --git a/driver/rsdMeshObj.cpp b/driver/rsdMeshObj.cpp index 99d79dce..893f046f 100644 --- a/driver/rsdMeshObj.cpp +++ b/driver/rsdMeshObj.cpp @@ -50,14 +50,9 @@ RsdMeshObj::~RsdMeshObj() { } bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { - // Do not create attribs for padding - if (elem->getFieldName(fieldIdx)[0] == '#') { - return false; - } - // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. // Filter rs types accordingly - RsDataType dt = elem->getField(fieldIdx)->getComponent().getType(); + 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) { @@ -65,7 +60,7 @@ bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { } // Now make sure they are not arrays - uint32_t arraySize = elem->getFieldArraySize(fieldIdx); + uint32_t arraySize = elem->mHal.state.fieldArraySizes[fieldIdx]; if (arraySize != 1) { return false; } @@ -73,15 +68,15 @@ bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { return true; } -bool RsdMeshObj::init() { +bool RsdMeshObj::init(const Context *rsc) { - updateGLPrimitives(); + 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->getFieldCount(); ct++) { + for (uint32_t ct=0; ct < elem->mHal.state.fieldsCount; ct++) { if (isValidGLComponent(elem, ct)) { mAttribCount ++; } @@ -104,21 +99,21 @@ bool RsdMeshObj::init() { 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->getSizeBytes(); - for (uint32_t fieldI=0; fieldI < elem->getFieldCount(); fieldI++) { - const Component &c = elem->getField(fieldI)->getComponent(); + 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 = c.getVectorSize(); - mAttribs[userNum].offset = elem->getFieldOffsetBytes(fieldI); - mAttribs[userNum].type = rsdTypeToGLType(c.getType()); - mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); + 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->getFieldName(fieldI)); + tmp.append(elem->mHal.state.fieldNames[fieldI]); mAttribs[userNum].name.setTo(tmp.string()); // Remember which allocation this attribute came from @@ -133,7 +128,7 @@ bool RsdMeshObj::init() { 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) { - ALOGE("Invalid mesh or parameters"); + rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid mesh or parameters"); return; } @@ -186,7 +181,7 @@ void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex, rsdGLCheckError(rsc, "Mesh::renderPrimitiveRange"); } -void RsdMeshObj::updateGLPrimitives() { +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]) { @@ -196,6 +191,7 @@ void RsdMeshObj::updateGLPrimitives() { 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/driver/rsdMeshObj.h b/driver/rsdMeshObj.h index 8b1271ba..1370f010 100644 --- a/driver/rsdMeshObj.h +++ b/driver/rsdMeshObj.h @@ -37,15 +37,16 @@ public: const android::renderscript::Mesh *); ~RsdMeshObj(); - void renderPrimitiveRange(const android::renderscript::Context *, uint32_t primIndex, uint32_t start, uint32_t len) const; + void renderPrimitiveRange(const android::renderscript::Context *, + uint32_t primIndex, uint32_t start, uint32_t len) const; - bool init(); + bool init(const android::renderscript::Context *rsc); protected: const android::renderscript::Mesh *mRSMesh; uint32_t *mGLPrimitives; - void updateGLPrimitives(); + 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 diff --git a/driver/rsdPath.cpp b/driver/rsdPath.cpp new file mode 100644 index 00000000..d475beb5 --- /dev/null +++ b/driver/rsdPath.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <GLES/gl.h> +#include <GLES2/gl2.h> +#include <GLES/glext.h> + +#include <rs_hal.h> +#include <rsContext.h> +#include <rsPath.h> + +#include "rsdCore.h" +#include "rsdPath.h" +#include "rsdAllocation.h" +#include "rsdGL.h" +#include "rsdVertexArray.h" +#include "rsdShaderCache.h" + +using namespace android; +using namespace android::renderscript; + +class DrvPath { +protected: + DrvPath(); +public: + virtual ~DrvPath(); + virtual void draw(Context *) = 0; +}; + +class DrvPathStatic : public DrvPath { +public: + typedef struct { + float x1, xc, x2; + float y1, yc, y2; + } segment_t; + + segment_t *mSegments; + uint32_t mSegmentCount; + + DrvPathStatic(const Allocation *vtx, const Allocation *loops); + virtual ~DrvPathStatic(); + + virtual void draw(Context *); +}; + +class DrvPathDynamic : public DrvPath { +public: + DrvPathDynamic(); + virtual ~DrvPathDynamic(); +}; + +static void cleanup(const Context *rsc, const Path *m) { + DrvPath *dp = (DrvPath *)m->mHal.drv; + if (dp) { + delete dp; + } +} + +bool rsdPathInitStatic(const Context *rsc, const Path *m, + const Allocation *vtx, const Allocation *loops) { + DrvPathStatic *drv = NULL; + cleanup(rsc, m); + + DrvPathStatic *dps = new DrvPathStatic(vtx, loops); + LOGE("init path m %p, %p", m, dps); + m->mHal.drv = dps; + return dps != NULL; +} + +bool rsdPathInitDynamic(const Context *rsc, const Path *m) { + return false; +} + + +void rsdPathDraw(const Context *rsc, const Path *m) { + LOGE("render m=%p", m); + + DrvPath *drv = (DrvPath *)m->mHal.drv; + if(drv) { + LOGE("render 2 drv=%p", drv); + drv->draw((Context *)rsc); + } +} + +void rsdPathDestroy(const Context *rsc, const Path *m) { + cleanup(rsc, m); + m->mHal.drv = NULL; +} + + + + +DrvPath::DrvPath() { +} + +DrvPath::~DrvPath() { +} + +DrvPathStatic::DrvPathStatic(const Allocation *vtx, const Allocation *loops) { + mSegmentCount = vtx->getType()->getDimX() / 3; + mSegments = new segment_t[mSegmentCount]; + + const float *fin = (const float *)vtx->getPtr(); + for (uint32_t ct=0; ct < mSegmentCount; ct++) { + segment_t *s = &mSegments[ct]; + s->x1 = fin[0]; + s->y1 = fin[1]; + + s->xc = fin[2]; + s->yc = fin[3]; + + s->x2 = fin[4]; + s->y2 = fin[5]; + fin += 6; + } +} + +DrvPathStatic::~DrvPathStatic() { +} + +void DrvPathStatic::draw(Context *rsc) { + const static float color[24] = { + 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, + 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, + 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; + float vtx[12]; + + LOGE("draw"); + if (!rsc->setupCheck()) { + return; + } + + RsdHal *dc = (RsdHal *)rsc->mHal.drv; + if (!dc->gl.shaderCache->setup(rsc)) { + return; + } + + RsdVertexArray::Attrib attribs[2]; + attribs[0].set(GL_FLOAT, 2, 8, false, (uint32_t)vtx, "ATTRIB_position"); + attribs[1].set(GL_FLOAT, 4, 16, false, (uint32_t)color, "ATTRIB_color"); + RsdVertexArray va(attribs, 2); + va.setup(rsc); + + LOGE("mSegmentCount %i", mSegmentCount); + for (uint32_t ct=0; ct < mSegmentCount; ct++) { + segment_t *s = &mSegments[ct]; + + vtx[0] = s->x1; + vtx[1] = s->y1; + vtx[2] = s->xc; + vtx[3] = s->yc; + + vtx[4] = s->x2; + vtx[5] = s->y2; + vtx[6] = s->xc; + vtx[7] = s->yc; + + vtx[8] = s->x1; + vtx[9] = s->y1; + vtx[10] = s->x2; + vtx[11] = s->y2; + + RSD_CALL_GL(glDrawArrays, GL_LINES, 0, 6); + } + +} + +DrvPathDynamic::DrvPathDynamic() { +} + +DrvPathDynamic::~DrvPathDynamic() { +} diff --git a/driver/rsdPath.h b/driver/rsdPath.h new file mode 100644 index 00000000..fa009724 --- /dev/null +++ b/driver/rsdPath.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RSD_PATH_H +#define RSD_PATH_H + +#include <rs_hal.h> + + +bool rsdPathInitStatic(const android::renderscript::Context *rsc, + const android::renderscript::Path *m, + const android::renderscript::Allocation *vertex, + const android::renderscript::Allocation *loops); +bool rsdPathInitDynamic(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); +void rsdPathDraw(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); +void rsdPathDestroy(const android::renderscript::Context *rsc, + const android::renderscript::Path *m); + + +#endif diff --git a/driver/rsdProgramRaster.cpp b/driver/rsdProgramRaster.cpp index b4937594..e5a02913 100644 --- a/driver/rsdProgramRaster.cpp +++ b/driver/rsdProgramRaster.cpp @@ -45,6 +45,9 @@ void rsdProgramRasterSetActive(const Context *rsc, const ProgramRaster *pr) { case RS_CULL_NONE: RSD_CALL_GL(glDisable, GL_CULL_FACE); break; + default: + rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid cull type"); + break; } } diff --git a/driver/rsdProgramStore.cpp b/driver/rsdProgramStore.cpp index fca9ba9e..c1295e8b 100644 --- a/driver/rsdProgramStore.cpp +++ b/driver/rsdProgramStore.cpp @@ -111,7 +111,7 @@ bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) { drv->blendSrc = GL_SRC_ALPHA_SATURATE; break; default: - ALOGE("Unknown blend src mode."); + rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend src mode."); goto error; } @@ -141,7 +141,7 @@ bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) { drv->blendDst = GL_ONE_MINUS_DST_ALPHA; break; default: - ALOGE("Unknown blend dst mode."); + rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend dst mode."); goto error; } diff --git a/driver/rsdRuntimeStubs.cpp b/driver/rsdRuntimeStubs.cpp index 14c29700..506308ff 100644 --- a/driver/rsdRuntimeStubs.cpp +++ b/driver/rsdRuntimeStubs.cpp @@ -25,6 +25,7 @@ #include "rsdCore.h" #include "rsdRuntime.h" +#include "rsdPath.h" #include <time.h> @@ -204,6 +205,12 @@ static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) { rsrDrawRect(rsc, sc, x1, y1, x2, y2, z); } +static void SC_DrawPath(Path *p) { + GET_TLS(); + //rsrDrawPath(rsc, sc, p); + rsdPathDraw(rsc, p); +} + static void SC_DrawMesh(Mesh *m) { GET_TLS(); rsrDrawMesh(rsc, sc, m); @@ -533,6 +540,10 @@ static RsdSymbolTable gSyms[] = { { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true }, { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true }, + { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true }, + { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true }, + { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true }, + { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true }, { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true }, { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true }, @@ -603,6 +614,8 @@ static RsdSymbolTable gSyms[] = { { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false }, { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false }, + { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false }, + { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false }, { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false }, diff --git a/driver/rsdShader.cpp b/driver/rsdShader.cpp index a10deb41..8bf32077 100644 --- a/driver/rsdShader.cpp +++ b/driver/rsdShader.cpp @@ -90,12 +90,12 @@ 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->getFieldCount(); field++) { - const Element *f = e->getField(field); + for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) { + const Element *f = e->mHal.state.fields[field]; // Cannot be complex - rsAssert(!f->getFieldCount()); - switch (f->getComponent().getVectorSize()) { + 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; @@ -104,7 +104,7 @@ String8 RsdShader::getGLSLInputString() const { rsAssert(0); } - s.append(e->getFieldName(field)); + s.append(e->mHal.state.fieldNames[field]); s.append(";\n"); } } @@ -114,17 +114,13 @@ String8 RsdShader::getGLSLInputString() const { 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->getFieldCount(); field++) { - const Element *f = e->getField(field); - const char *fn = e->getFieldName(field); - - if (fn[0] == '#') { - continue; - } + 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->getFieldCount()); - switch (f->getComponent().getVectorSize()) { + 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; @@ -211,24 +207,20 @@ bool RsdShader::loadShader(const Context *rsc) { 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->getFieldCount(); field++) { - const Element *f = e->getField(field); - const char *fn = e->getFieldName(field); - - if (fn[0] == '#') { - continue; - } + 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->getFieldCount()); - if (f->getType() == RS_TYPE_MATRIX_4X4) { + rsAssert(!f->mHal.state.fieldsCount); + if (f->mHal.state.dataType == RS_TYPE_MATRIX_4X4) { mShader.append("uniform mat4 UNI_"); - } else if (f->getType() == RS_TYPE_MATRIX_3X3) { + } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_3X3) { mShader.append("uniform mat3 UNI_"); - } else if (f->getType() == RS_TYPE_MATRIX_2X2) { + } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_2X2) { mShader.append("uniform mat2 UNI_"); } else { - switch (f->getComponent().getVectorSize()) { + 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; @@ -239,8 +231,8 @@ void RsdShader::appendUserConstants() { } mShader.append(fn); - if (e->getFieldArraySize(field) > 1) { - mShader.appendFormat("[%d]", e->getFieldArraySize(field)); + if (e->mHal.state.fieldArraySizes[field] > 1) { + mShader.appendFormat("[%d]", e->mHal.state.fieldArraySizes[field]); } mShader.append(";\n"); } @@ -248,8 +240,8 @@ void RsdShader::appendUserConstants() { } void RsdShader::logUniform(const Element *field, const float *fd, uint32_t arraySize ) { - RsDataType dataType = field->getType(); - uint32_t elementSize = field->getSizeBytes() / sizeof(float); + 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); @@ -270,7 +262,7 @@ void RsdShader::logUniform(const Element *field, const float *fd, uint32_t array ALOGV("{%f, %f", fd[0], fd[2]); ALOGV(" %f, %f}", fd[1], fd[3]); } else { - switch (field->getComponent().getVectorSize()) { + switch (field->mHal.state.vectorSize) { case 1: ALOGV("Uniform 1 = %f", fd[0]); break; @@ -295,7 +287,7 @@ void RsdShader::logUniform(const Element *field, const float *fd, uint32_t array void RsdShader::setUniform(const Context *rsc, const Element *field, const float *fd, int32_t slot, uint32_t arraySize ) { - RsDataType dataType = field->getType(); + 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) { @@ -303,7 +295,7 @@ void RsdShader::setUniform(const Context *rsc, const Element *field, const float } else if (dataType == RS_TYPE_MATRIX_2X2) { RSD_CALL_GL(glUniformMatrix2fv, slot, arraySize, GL_FALSE, fd); } else { - switch (field->getComponent().getVectorSize()) { + switch (field->mHal.state.vectorSize) { case 1: RSD_CALL_GL(glUniform1fv, slot, arraySize, fd); break; @@ -458,15 +450,11 @@ void RsdShader::setupUserConstants(const Context *rsc, RsdShaderCache *sc, bool 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->getFieldCount(); field++) { - const Element *f = e->getField(field); - const char *fieldName = e->getFieldName(field); - // If this field is padding, skip it - if (fieldName[0] == '#') { - continue; - } + 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->getFieldOffsetBytes(field); + uint32_t offset = e->mHal.state.fieldOffsetBytes[field]; const float *fd = reinterpret_cast<const float *>(&data[offset]); int32_t slot = -1; @@ -505,22 +493,13 @@ void RsdShader::initAttribAndUniformArray() { mAttribCount = 0; for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) { const Element *elem = mRSProgram->mHal.state.inputElements[ct]; - for (uint32_t field=0; field < elem->getFieldCount(); field++) { - if (elem->getFieldName(field)[0] != '#') { - mAttribCount ++; - } - } + 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(); - - for (uint32_t field=0; field < elem->getFieldCount(); field++) { - if (elem->getFieldName(field)[0] != '#') { - mUniformCount ++; - } - } + mUniformCount += elem->mHal.state.fieldsCount; } mUniformCount += mRSProgram->mHal.state.texturesCount; @@ -540,17 +519,17 @@ void RsdShader::initAttribAndUniformArray() { void RsdShader::initAddUserElement(const Element *e, String8 *names, uint32_t *arrayLengths, uint32_t *count, const char *prefix) { - rsAssert(e->getFieldCount()); - for (uint32_t ct=0; ct < e->getFieldCount(); ct++) { - const Element *ce = e->getField(ct); - if (ce->getFieldCount()) { + 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 if (e->getFieldName(ct)[0] != '#') { + } else { String8 tmp(prefix); - tmp.append(e->getFieldName(ct)); + tmp.append(e->mHal.state.fieldNames[ct]); names[*count].setTo(tmp.string()); if (arrayLengths) { - arrayLengths[*count] = e->getFieldArraySize(ct); + arrayLengths[*count] = e->mHal.state.fieldArraySizes[ct]; } (*count)++; } @@ -42,6 +42,7 @@ AllocationCreateTyped { param RsType vtype param RsAllocationMipmapControl mips param uint32_t usages + param uint32_t ptr ret RsAllocation } @@ -388,3 +389,13 @@ MeshCreate { param uint32_t *primType ret RsMesh } + +PathCreate { + param RsPathPrimitive pp + param bool isStatic + param RsAllocation vertex + param RsAllocation loops + param float quality + ret RsPath + } + diff --git a/rsAllocation.cpp b/rsAllocation.cpp index 2773d5c6..d7e89333 100644 --- a/rsAllocation.cpp +++ b/rsAllocation.cpp @@ -22,21 +22,22 @@ using namespace android; using namespace android::renderscript; Allocation::Allocation(Context *rsc, const Type *type, uint32_t usages, - RsAllocationMipmapControl mc) + RsAllocationMipmapControl mc, void * ptr) : ObjectBase(rsc) { memset(&mHal, 0, sizeof(mHal)); mHal.state.mipmapControl = RS_ALLOCATION_MIPMAP_NONE; mHal.state.usageFlags = usages; mHal.state.mipmapControl = mc; + mHal.state.usrPtr = ptr; setType(type); updateCache(); } Allocation * Allocation::createAllocation(Context *rsc, const Type *type, uint32_t usages, - RsAllocationMipmapControl mc) { - Allocation *a = new Allocation(rsc, type, usages, mc); + RsAllocationMipmapControl mc, void * ptr) { + Allocation *a = new Allocation(rsc, type, usages, mc, ptr); if (!rsc->mHal.funcs.allocation.init(rsc, a, type->getElement()->getHasReferences())) { rsc->setError(RS_ERROR_FATAL_DRIVER, "Allocation::Allocation, alloc failure"); @@ -570,8 +571,8 @@ static void AllocationGenerateScriptMips(RsContext con, RsAllocation va) { RsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype, RsAllocationMipmapControl mips, - uint32_t usages) { - Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips); + uint32_t usages, uint32_t ptr) { + Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips, (void *)ptr); if (!alloc) { return NULL; } @@ -584,7 +585,7 @@ RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype, const void *data, size_t data_length, uint32_t usages) { Type *t = static_cast<Type *>(vtype); - RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages); + RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); if (texAlloc == NULL) { ALOGE("Memory allocation failure"); @@ -608,7 +609,7 @@ RsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype, // Cubemap allocation's faces should be Width by Width each. // Source data should have 6 * Width by Width pixels // Error checking is done in the java layer - RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages); + RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); if (texAlloc == NULL) { ALOGE("Memory allocation failure"); diff --git a/rsAllocation.h b/rsAllocation.h index 4ce863ab..0f7ed428 100644 --- a/rsAllocation.h +++ b/rsAllocation.h @@ -55,6 +55,8 @@ public: bool hasMipmaps; bool hasFaces; bool hasReferences; + + void * usrPtr; }; State state; @@ -66,7 +68,8 @@ public: Hal mHal; static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages, - RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE); + RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE, + void *ptr = 0); virtual ~Allocation(); void updateCache(); @@ -134,7 +137,7 @@ protected: private: void freeChildrenUnlocked(); - Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc); + Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc, void *ptr); uint32_t getPackedSize() const; static void writePackedData(const Type *type, uint8_t *dst, const uint8_t *src, bool dstPadded); diff --git a/rsComponent.cpp b/rsComponent.cpp index 21b98f61..9c2c2005 100644 --- a/rsComponent.cpp +++ b/rsComponent.cpp @@ -62,6 +62,7 @@ void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) { rsAssert(mNormalized == true); break; default: + rsAssert(mKind != RS_KIND_INVALID); break; } @@ -167,6 +168,9 @@ void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) { case RS_TYPE_BOOLEAN: mTypeBits = 8; break; + default: + rsAssert(mType != RS_TYPE_INVALID); + break; } mBitsUnpadded = mTypeBits * mVectorSize; diff --git a/rsContext.h b/rsContext.h index 61c29f95..2989c53a 100644 --- a/rsContext.h +++ b/rsContext.h @@ -32,6 +32,7 @@ #include "rsAdapter.h" #include "rsSampler.h" #include "rsFont.h" +#include "rsPath.h" #include "rsProgramFragment.h" #include "rsProgramStore.h" #include "rsProgramRaster.h" diff --git a/rsElement.cpp b/rsElement.cpp index dff95853..fb2892ce 100644 --- a/rsElement.cpp +++ b/rsElement.cpp @@ -27,6 +27,7 @@ Element::Element(Context *rsc) : ObjectBase(rsc) { mFields = NULL; mFieldCount = 0; mHasReference = false; + memset(&mHal, 0, sizeof(mHal)); } Element::~Element() { @@ -47,6 +48,12 @@ void Element::clear() { 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 { @@ -157,16 +164,36 @@ Element *Element::createFromStream(Context *rsc, IStream *stream) { } 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; ct < mFieldCount; ct++) { + 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; @@ -175,8 +202,21 @@ void Element::compute() { 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, diff --git a/rsElement.h b/rsElement.h index 04010faa..4b6b4601 100644 --- a/rsElement.h +++ b/rsElement.h @@ -24,10 +24,38 @@ // --------------------------------------------------------------------------- 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(); @@ -23,20 +23,18 @@ // --------------------------------------------------------------------------- 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: - 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(); - struct Hal { mutable void *drv; @@ -57,6 +55,15 @@ public: }; 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; diff --git a/rsPath.cpp b/rsPath.cpp new file mode 100644 index 00000000..89a07707 --- /dev/null +++ b/rsPath.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "rsContext.h" + +using namespace android; +using namespace android::renderscript; + + +Path::Path(Context *rsc) : ObjectBase(rsc) { +} + +Path::Path(Context *rsc, RsPathPrimitive pp, bool isStatic, + Allocation *vtx, Allocation *loops, float quality) +: ObjectBase(rsc) { + + memset(&mHal, 0, sizeof(mHal)); + mHal.state.quality = quality; + mHal.state.primitive = pp; + + LOGE("i1"); + rsc->mHal.funcs.path.initStatic(rsc, this, vtx, loops); + + LOGE("i2"); +} + +Path::Path(Context *rsc, uint32_t vertexBuffersCount, uint32_t primitivesCount) +: ObjectBase(rsc) { + +} + +Path::~Path() { + +} + + +void Path::rasterize(const BezierSegment_t *s, uint32_t num, Allocation *alloc) { + + for (uint32_t i=0; i < num; i++) { + + } + +} + +void Path::render(Context *rsc) { +} + +void Path::serialize(OStream *stream) const { + +} + +RsA3DClassID Path::getClassId() const { + return RS_A3D_CLASS_ID_UNKNOWN; +} + +namespace android { +namespace renderscript { + +RsPath rsi_PathCreate(Context *rsc, RsPathPrimitive pp, bool isStatic, + RsAllocation vtx, RsAllocation loops, float quality) { + return new Path(rsc, pp, isStatic, (Allocation *)vtx, (Allocation *)loops, quality); +} + +} +} diff --git a/rsPath.h b/rsPath.h new file mode 100644 index 00000000..dac795ef --- /dev/null +++ b/rsPath.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_RS_PATH_H +#define ANDROID_RS_PATH_H + + +#include "RenderScript.h" + +// --------------------------------------------------------------------------- +namespace android { +namespace renderscript { + +class Path : public ObjectBase { +public: + struct { + mutable void * drv; + + struct State { + RsPathPrimitive primitive; + float quality; + }; + State state; + } mHal; + + Path(Context *); + Path(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount); + Path(Context *, RsPathPrimitive pp, bool isStatic, Allocation *vtx, Allocation *loop, float q); + + ~Path(); + + void render(Context *); + virtual void serialize(OStream *stream) const; + virtual RsA3DClassID getClassId() const; + +private: + + + typedef struct { + float x[4]; + float y[4]; + } BezierSegment_t; + + bool subdivideCheck(const BezierSegment_t *s, float u1, float u2); + + void rasterize(const BezierSegment_t *s, uint32_t num, Allocation *alloc); + + +}; + +} +} +#endif //ANDROID_RS_PATH_H + + + diff --git a/rsRuntime.h b/rsRuntime.h index cb962a81..b0869f6e 100644 --- a/rsRuntime.h +++ b/rsRuntime.h @@ -68,6 +68,7 @@ void rsrDrawQuad(Context *, Script *, void rsrDrawSpriteScreenspace(Context *, Script *, float x, float y, float z, float w, float h); void rsrDrawRect(Context *, Script *, float x1, float y1, float x2, float y2, float z); +void rsrDrawPath(Context *, Script *, Path *); void rsrDrawMesh(Context *, Script *, Mesh *); void rsrDrawMeshPrimitive(Context *, Script *, Mesh *, uint32_t primIndex); void rsrDrawMeshPrimitiveRange(Context *, Script *, Mesh *, diff --git a/rsScriptC_LibGL.cpp b/rsScriptC_LibGL.cpp index 79647922..742da96b 100644 --- a/rsScriptC_LibGL.cpp +++ b/rsScriptC_LibGL.cpp @@ -200,6 +200,14 @@ void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z); } +void rsrDrawPath(Context *rsc, Script *sc, Path *sm) { + CHECK_OBJ(sm); + if (!rsc->setupCheck()) { + return; + } + sm->render(rsc); +} + void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) { CHECK_OBJ(sm); if (!rsc->setupCheck()) { @@ -46,12 +46,8 @@ void Type::clear() { delete [] mLODs; mLODs = NULL; } - mDimX = 0; - mDimY = 0; - mDimZ = 0; - mDimLOD = 0; - mFaces = false; mElement.clear(); + memset(&mHal, 0, sizeof(mHal)); } TypeState::TypeState() { @@ -62,16 +58,16 @@ TypeState::~TypeState() { } size_t Type::getOffsetForFace(uint32_t face) const { - rsAssert(mFaces); + rsAssert(mHal.state.faces); return 0; } void Type::compute() { uint32_t oldLODCount = mLODCount; - if (mDimLOD) { - uint32_t l2x = rsFindHighBit(mDimX) + 1; - uint32_t l2y = rsFindHighBit(mDimY) + 1; - uint32_t l2z = rsFindHighBit(mDimZ) + 1; + if (mHal.state.dimLOD) { + uint32_t l2x = rsFindHighBit(mHal.state.dimX) + 1; + uint32_t l2y = rsFindHighBit(mHal.state.dimY) + 1; + uint32_t l2z = rsFindHighBit(mHal.state.dimZ) + 1; mLODCount = rsMax(l2x, l2y); mLODCount = rsMax(mLODCount, l2z); @@ -85,9 +81,9 @@ void Type::compute() { mLODs = new LOD[mLODCount]; } - uint32_t tx = mDimX; - uint32_t ty = mDimY; - uint32_t tz = mDimZ; + 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 < mLODCount; lod++) { mLODs[lod].mX = tx; @@ -103,10 +99,11 @@ void Type::compute() { // At this point the offset is the size of a mipmap chain; mMipChainSizeBytes = offset; - if (mFaces) { + if (mHal.state.faces) { offset *= 6; } mTotalSizeBytes = offset; + mHal.state.element = mElement.get(); } uint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const { @@ -127,7 +124,8 @@ uint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) co return offset; } -uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint32_t x, uint32_t y) const { +uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, + uint32_t x, uint32_t y) const { uint32_t offset = mLODs[lod].mOffset; offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes(); @@ -141,7 +139,12 @@ uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, uint void Type::dumpLOGV(const char *prefix) const { char buf[1024]; ObjectBase::dumpLOGV(prefix); - ALOGV("%s Type: x=%zu y=%zu z=%zu mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces); + 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.dimLOD, + mHal.state.faces); snprintf(buf, sizeof(buf), "%s element: ", prefix); mElement->dumpLOGV(buf); } @@ -155,12 +158,12 @@ void Type::serialize(OStream *stream) const { mElement->serialize(stream); - stream->addU32(mDimX); - stream->addU32(mDimY); - stream->addU32(mDimZ); + stream->addU32(mHal.state.dimX); + stream->addU32(mHal.state.dimY); + stream->addU32(mHal.state.dimZ); - stream->addU8((uint8_t)(mDimLOD ? 1 : 0)); - stream->addU8((uint8_t)(mFaces ? 1 : 0)); + stream->addU8((uint8_t)(mHal.state.dimLOD ? 1 : 0)); + stream->addU8((uint8_t)(mHal.state.faces ? 1 : 0)); } Type *Type::createFromStream(Context *rsc, IStream *stream) { @@ -232,11 +235,11 @@ ObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, Type *nt = new Type(rsc); returnRef.set(nt); nt->mElement.set(e); - nt->mDimX = dimX; - nt->mDimY = dimY; - nt->mDimZ = dimZ; - nt->mDimLOD = dimLOD; - nt->mFaces = dimFaces; + nt->mHal.state.dimX = dimX; + nt->mHal.state.dimY = dimY; + nt->mHal.state.dimZ = dimZ; + nt->mHal.state.dimLOD = dimLOD; + nt->mHal.state.faces = dimFaces; nt->compute(); ObjectBase::asyncLock(); @@ -248,14 +251,14 @@ ObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e, ObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const { return getTypeRef(rsc, mElement.get(), dimX, - mDimY, mDimZ, mDimLOD, mFaces); + mHal.state.dimY, mHal.state.dimZ, mHal.state.dimLOD, mHal.state.faces); } ObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const { return getTypeRef(rsc, mElement.get(), dimX, dimY, - mDimZ, mDimLOD, mFaces); + mHal.state.dimZ, mHal.state.dimLOD, mHal.state.faces); } @@ -276,8 +279,8 @@ RsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX, void rsaTypeGetNativeData(RsContext con, RsType type, uint32_t *typeData, uint32_t typeDataSize) { rsAssert(typeDataSize == 6); - // Pack the data in the follofing way mDimX; mDimY; mDimZ; - // mDimLOD; mDimFaces; mElement; into typeData + // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ; + // mHal.state.dimLOD; mHal.state.faces; mElement; into typeData Type *t = static_cast<Type *>(type); (*typeData++) = t->getDimX(); @@ -22,10 +22,35 @@ // --------------------------------------------------------------------------- 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; + bool dimLOD; + 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; @@ -34,22 +59,25 @@ public: size_t getElementSizeBytes() const {return mElement->getSizeBytes();} const Element * getElement() const {return mElement.get();} - uint32_t getDimX() const {return mDimX;} - uint32_t getDimY() const {return mDimY;} - uint32_t getDimZ() const {return mDimZ;} - uint32_t getDimLOD() const {return mDimLOD;} - bool getDimFaces() const {return mFaces;} + uint32_t getDimX() const {return mHal.state.dimX;} + uint32_t getDimY() const {return mHal.state.dimY;} + uint32_t getDimZ() const {return mHal.state.dimZ;} + uint32_t getDimLOD() const {return mHal.state.dimLOD;} + bool getDimFaces() const {return mHal.state.faces;} uint32_t getLODDimX(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mX;} uint32_t getLODDimY(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mY;} uint32_t getLODDimZ(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mZ;} - uint32_t getLODOffset(uint32_t lod) const {rsAssert(lod < mLODCount); return mLODs[lod].mOffset;} + uint32_t getLODOffset(uint32_t lod) const { + rsAssert(lod < mLODCount); return mLODs[lod].mOffset; + } 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 getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face, + uint32_t x, uint32_t y) const; uint32_t getLODCount() const {return mLODCount;} bool getIsNp2() const; @@ -95,14 +123,6 @@ protected: ObjectBaseRef<const Element> mElement; - // Size of the structure in the various dimensions. A missing Dimension is - // specified as a 0 and not a 1. - size_t mDimX; - size_t mDimY; - size_t mDimZ; - bool mDimLOD; - bool mFaces; - // count of mipmap levels, 0 indicates no mipmapping size_t mMipChainSizeBytes; @@ -29,6 +29,7 @@ class Type; class Allocation; class Script; class ScriptC; +class Path; class Program; class ProgramStore; class ProgramRaster; @@ -189,6 +190,13 @@ typedef struct { } mesh; struct { + bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops); + bool (*initDynamic)(const Context *rsc, const Path *m); + void (*draw)(const Context *rsc, const Path *m); + void (*destroy)(const Context *rsc, const Path *m); + } path; + + struct { bool (*init)(const Context *rsc, const Sampler *m); void (*destroy)(const Context *rsc, const Sampler *m); } sampler; diff --git a/scriptc/rs_allocation.rsh b/scriptc/rs_allocation.rsh index 1cb3a99a..661d3e35 100644 --- a/scriptc/rs_allocation.rsh +++ b/scriptc/rs_allocation.rsh @@ -168,5 +168,135 @@ extern const void * __attribute__((overloadable)) extern const void * __attribute__((overloadable)) rsGetElementAt(rs_allocation, uint32_t x, uint32_t y, uint32_t z); +/** + * @param a allocation to get data from + * @return element describing allocation layout + */ +extern rs_element __attribute__((overloadable)) + rsAllocationGetElement(rs_allocation a); + +/** + * @param m mesh to get data from + * @return number of allocations in the mesh that contain vertex + * data + */ +extern uint32_t __attribute__((overloadable)) + rsMeshGetVertexAllocationCount(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)) + rsMeshGetPrimitiveCount(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)) + rsMeshGetVertexAllocation(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)) + rsMeshGetIndexAllocation(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)) + rsMeshGetPrimitive(rs_mesh m, uint32_t index); + +/** + * @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 diff --git a/scriptc/rs_graphics.rsh b/scriptc/rs_graphics.rsh index 25819537..64fcd23c 100644 --- a/scriptc/rs_graphics.rsh +++ b/scriptc/rs_graphics.rsh @@ -22,6 +22,66 @@ */ #ifndef __RS_GRAPHICS_RSH__ #define __RS_GRAPHICS_RSH__ + +// These are API 15 once it get official +typedef enum { + RS_DEPTH_FUNC_ALWAYS, + RS_DEPTH_FUNC_LESS, + RS_DEPTH_FUNC_LEQUAL, + RS_DEPTH_FUNC_GREATER, + RS_DEPTH_FUNC_GEQUAL, + RS_DEPTH_FUNC_EQUAL, + RS_DEPTH_FUNC_NOTEQUAL, + + RS_DEPTH_FUNC_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, + RS_CULL_FRONT, + RS_CULL_NONE, + + RS_CULL_INVALID = 100, +} rs_cull_mode; + +typedef enum { + RS_SAMPLER_NEAREST, + RS_SAMPLER_LINEAR, + RS_SAMPLER_LINEAR_MIP_LINEAR, + RS_SAMPLER_WRAP, + RS_SAMPLER_CLAMP, + RS_SAMPLER_LINEAR_MIP_NEAREST, + + RS_SAMPLER_INVALID = 100, +} rs_sampler_value; + #if (defined(RS_VERSION) && (RS_VERSION >= 14)) /** * Set the color target used for all subsequent rendering calls @@ -82,6 +142,88 @@ extern void __attribute__((overloadable)) extern void __attribute__((overloadable)) rsgBindProgramStore(rs_program_store ps); + +/** + * @hide + * Get program store depth function + * + * @param ps + */ +extern rs_depth_func __attribute__((overloadable)) + rsgProgramStoreGetDepthFunc(rs_program_store ps); + +/** + * @hide + * Get program store depth mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetDepthMask(rs_program_store ps); +/** + * @hide + * Get program store red component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskR(rs_program_store ps); + +/** + * @hide + * Get program store green component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskG(rs_program_store ps); + +/** + * @hide + * Get program store blur component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskB(rs_program_store ps); + +/** + * @hide + * Get program store alpha component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetColorMaskA(rs_program_store ps); + +/** + * @hide + * Get program store blend source function + * + * @param ps + */ +extern rs_blend_src_func __attribute__((overloadable)) + rsgProgramStoreGetBlendSrcFunc(rs_program_store ps); + +/** + * @hide + * Get program store blend destination function + * + * @param ps + */ +extern rs_blend_dst_func __attribute__((overloadable)) + rsgProgramStoreGetBlendDstFunc(rs_program_store ps); + +/** + * @hide + * Get program store dither state + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsgProgramStoreGetDitherEnabled(rs_program_store ps); + + /** * Bind a new ProgramVertex to the rendering context. * @@ -99,6 +241,24 @@ extern void __attribute__((overloadable)) rsgBindProgramRaster(rs_program_raster pr); /** + * @hide + * Get program raster point sprite state + * + * @param pr + */ +extern bool __attribute__((overloadable)) + rsgProgramRasterGetPointSpriteEnabled(rs_program_raster pr); + +/** + * @hide + * Get program raster cull mode + * + * @param pr + */ +extern rs_cull_mode __attribute__((overloadable)) + rsgProgramRasterGetCullMode(rs_program_raster pr); + +/** * Bind a new Sampler object to a ProgramFragment. The sampler will * operate on the texture bound at the matching slot. * @@ -108,6 +268,51 @@ extern void __attribute__((overloadable)) rsgBindSampler(rs_program_fragment, uint slot, rs_sampler); /** + * @hide + * Get sampler minification value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetMinification(rs_sampler s); + +/** + * @hide + * Get sampler magnification value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetMagnification(rs_sampler s); + +/** + * @hide + * Get sampler wrap S value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetWrapS(rs_sampler s); + +/** + * @hide + * Get sampler wrap T value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsgSamplerGetWrapT(rs_sampler s); + +/** + * @hide + * Get sampler anisotropy + * + * @param pr + */ +extern float __attribute__((overloadable)) + rsgSamplerGetAnisotropy(rs_sampler s); + +/** * Bind a new Allocation object to a ProgramFragment. The * Allocation must be a valid texture for the Program. The sampling * of the texture will be controled by the Sampler bound at the @@ -288,6 +493,9 @@ extern void __attribute__((overloadable)) extern void __attribute__((overloadable)) rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h); +extern void __attribute__((overloadable)) + rsgDrawPath(rs_path p); + /** * Draw a mesh using the current context state. The whole mesh is * rendered. diff --git a/scriptc/rs_object.rsh b/scriptc/rs_object.rsh index a4312193..1fc3f83b 100644 --- a/scriptc/rs_object.rsh +++ b/scriptc/rs_object.rsh @@ -56,6 +56,11 @@ extern void __attribute__((overloadable)) * \overload */ extern void __attribute__((overloadable)) + rsSetObject(rs_path *dst, rs_path src); +/** + * \overload + */ +extern void __attribute__((overloadable)) rsSetObject(rs_mesh *dst, rs_mesh src); /** * \overload @@ -114,6 +119,11 @@ extern void __attribute__((overloadable)) * \overload */ extern void __attribute__((overloadable)) + rsClearObject(rs_path *dst); +/** + * \overload + */ +extern void __attribute__((overloadable)) rsClearObject(rs_mesh *dst); /** * \overload @@ -175,6 +185,11 @@ extern bool __attribute__((overloadable)) * \overload */ extern bool __attribute__((overloadable)) + rsIsObject(rs_path); +/** + * \overload + */ +extern bool __attribute__((overloadable)) rsIsObject(rs_mesh); /** * \overload diff --git a/scriptc/rs_types.rsh b/scriptc/rs_types.rsh index 84bca9c8..5345a48e 100644 --- a/scriptc/rs_types.rsh +++ b/scriptc/rs_types.rsh @@ -138,6 +138,12 @@ typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_sc */ typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_mesh; /** + * \brief Opaque handle to a Renderscript Path object. + * + * See: android.renderscript.Path + */ +typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_path; +/** * \brief Opaque handle to a Renderscript ProgramFragment object. * * See: android.renderscript.ProgramFragment @@ -396,4 +402,96 @@ typedef enum { #endif //defined(RS_VERSION) && (RS_VERSION >= 14) +/** + * Describes the way mesh vertex data is interpreted when rendering + * + **/ +typedef enum { + 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, +} 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, + //RS_TYPE_FLOAT_16, + RS_TYPE_FLOAT_32 = 2, + 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, +} 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, + + 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, +} rs_data_kind; + #endif |