From eeeaccc89971268a0cc63ac0ae0868b5c003c9a9 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Fri, 25 Jun 2010 12:45:41 -0700 Subject: [PATCH] Add support for non-VBO drawing in Meshes. Change-Id: Ic4dd88cbe591091ebe740babe30213c15ad60cb3 --- libs/rs/java/Fountain/res/raw/fountain.rs | 12 ++++-------- libs/rs/java/Fountain/res/raw/fountain_bc.bc | Bin 2996 -> 2920 bytes .../android/fountain/ScriptC_Fountain.java | 17 ++--------------- libs/rs/rsAllocation.h | 3 +++ libs/rs/rsSimpleMesh.cpp | 6 +++++- libs/rs/rsVertexArray.cpp | 10 +++++++--- libs/rs/rsVertexArray.h | 12 +++++++++++- 7 files changed, 32 insertions(+), 28 deletions(-) diff --git a/libs/rs/java/Fountain/res/raw/fountain.rs b/libs/rs/java/Fountain/res/raw/fountain.rs index 4b56b1b925f3c..6ff4c5bbea90e 100644 --- a/libs/rs/java/Fountain/res/raw/fountain.rs +++ b/libs/rs/java/Fountain/res/raw/fountain.rs @@ -8,7 +8,6 @@ #include "../../../../scriptc/rs_graphics.rsh" static int newPart = 0; - static float4 partColor; rs_mesh partMesh; @@ -19,13 +18,13 @@ typedef struct __attribute__((packed, aligned(4))) Point { } Point_t; Point_t *point; -#pragma rs export_var(point, partColor, partMesh) +#pragma rs export_var(point, partMesh) +#pragma rs export_func(addParticles) int root() { rsgClearColor(0.f, 0.f, 0.f, 1.f); - float height = rsgGetHeight(); - rs_allocation alloc = rsGetAllocation(point); - int size = rsAllocationGetDimX(alloc); + const float height = rsgGetHeight(); + const int size = rsAllocationGetDimX(rsGetAllocation(point)); Point_t * p = point; for (int ct=0; ct < size; ct++) { @@ -37,13 +36,10 @@ int root() { p++; } - rsgUploadToBufferObject(alloc); rsgDrawSimpleMesh(partMesh); return 1; } -#pragma rs export_func(addParticles) - void addParticles(int rate, float x, float y, int newColor) { if (newColor) { diff --git a/libs/rs/java/Fountain/res/raw/fountain_bc.bc b/libs/rs/java/Fountain/res/raw/fountain_bc.bc index 66d50b35a7bee71c04b15263160fe0227650c4b5..b2006873ff18afd7a59b5c1b3a4542735488e453 100644 GIT binary patch delta 2248 zcmXw4eN`ZXoET`5*yArg7fz83bJtJ`58vK=i;7w;Q8KJ3%bguXg5= zgoG+!FqGkR8&bDpyQ4$-5Nq8MKtKfx=#;fqNu@1z^;E^G>#6JB3od{B?(aPJxxeRm zpZAyd?OHgqAjpvEyQ{(hxZM==;rcE-2J=gN6h}Okx|+aa2%(r~N?*-*j7uVSnKFOQ zZ#Lz|o#ss#WB=eRd_!P2ZttLhiPI+8LGbiKCK_xPgAcIf8xJnTIBmF|kf^YO9xsMG zut^&K<%}_}yuwC&+RAxD5SLUN&PFSBisHjMZFI&zy(0J00Ulz6K}J^ zPr@-3;pAf(PDjRA=F;Z=jJAG`K6Hxas0hQ^HpacjDA?2H=DS|=^`)P5q>uGu+wf_N z;=l>nBSdjmub2re{8lBKw$uVVoQIU?E+8wKx#_;lwBi2cPHviqtDaL{QO`|>;`Mt6 zb&9V73$G$kQvsWNx<+xpFZ;$XAGBmw4E zz3zQR!G5EAPnA2!WkT(d*r@LjID;AL7Q=v0N=o1|&h^bFtYUd{$(Z3ko0)Ryc zz<#fVr?xfmb-XOebwH%UEd#(R_vcDlwr;Wt{ki0Aeh%ne_vzWXsaS$)t(fcstrb%P zfINide?d9|XhPix-J*)W$^dGO5;ubaS}?HJ5qVsnG(e-jF@*|R+dtjH{!ilmZ)r?(=QKXq*cTX3}jrWk=SpTyDvlC$sdI>V_=(Up11`-S&;LuoTVuHU*tM!II*d;ZQNbq&VNMbljbU-YPVAci3tIN(jSyp(U`(OD4;(+A&Rb`3=!V|P!4*6BQYBqgKhxK zW9O=2m$cXtI!3qn<4Y~n<~qRIk;cukznQu?1@CzLRheotO|~OLcX80d7g>p9fkq?BKUUy3 zg*1M~a@*gfh469x*bOChIC;@05>*35*dHo&5`;`B{fd>Iykt=dEjzD&k+nge<;yC* z<})2S%3AGw_A+ClSvQ?JkX-Uh6}Z-ZY>h^Z8JnjVcj4gGir-^`G-C%%D`78+bRT_Eau`{Nibt z@MzGg95o^1{CR)2=4&*E*KTBSlQcx7UAuL;Ybt5|Z#U+_$RCffcqXc5vwYa_q9&2v zumu*HI=?a^e0HYidvf&t4bA=?(Sy^x#!m9)c*d%Sf`N$GIp5E8mGFMIiPy@Hz`O5! z)Ih){;@FAL#(B*_D{W0%OLDHjI}rZXzn02u@PBjoCxIs5DCA%rH7JI3{I;u+L(hYhkT}M^QXX3_Me|R z*W&zP83uVcPp^ij3t+EIUb9Zz3~#{u!u65@bWr-?aJ#TR)jXapCwH8Ru3tsnLXJDz zcPdC)OR)I@6EP~WKmvf*8@v)p@Qw#dZ9N@7b}Dk0j^WuBWSE=f%{96a$zey5SC!Gk z3-k7<8$n*(jaCj9&kW8Ak5)Uk@Ylvh-Z232*XsN&oGaX{aF&RMesRwp6VWpEvij2M zBjef3<>--4B2FcLJN6~6lHY1$xG>7!2Sl2m;L<6zsXF8Oo){||%&9SHyc delta 2303 zcmXw4dsGuw8ozl>hA<=p1RNkh0+G@-v=b5_EV1SV1d9?LS}Jur$V2D~q`se!b?u&>-JMZ8=gfD%^WA%Y-|v3k zZ|=-R_ACj~XuY>Z2mn8}2K{yQ0Fns%_+FeII+Br#8nT=!xemp1%`W{LQCke!w~q5& znx!2*Vfw^Yd(lU1t6`&;00z2;-+(gJA?5^76bgFbx62MJf$1JZjq*kC0goG|&6^@x zq8k${SALt{E!r>R02Ba#&rRp9k8 zH40{>n#OzN;yzUIf{`?H<90oJyT=iF4IAoL{;J6gFq99YuiXpw#DxH(bmpe6Q7d0dXNLdaWO2>!v$TUg*eQStskaDNVP z?{*~^k}zwclHOx>IgB31rc(T*Eo-FT3b^)}3 zb{BisbJngQ_Ksvngr;|;&|Uy+EXT4#Hl<(tyGyn#2|Pm#NTCHGZ`#OxfO6lYH&{hZ ziwdImc!Z8k1bY|kU^TtsG~{DyafSt9*3js@M>ua@rR2>oa3A76bVQ|R(AFB9{aGaa zp?>;_xItPhRTaWs2)$y~wH~#lDi~zPK)DcrJ?=E7#MH?$Gxhvy0L^+aQ4#CQu+OB9^sR!5o%{*YQ2wVrg@GgK#jt<# zqv|5q-+c#4&G%Qt*-7rx?l8z;>R>|Mhz5r$B7AvxY%aaMBAJouf)bfBU_QGqAdYTf z;+M_P22V&1Tnj)&s4q`02qId_Lv9c;PILl*>L7bJ{cq_Dc3^A}J}A{0!`K3Ux?L>* z-689RY%diV61d2=o887Ai5432R&C2P7q7eEYxA0jBh%OuGf*+Gf)U%Y_N7AT4N&W1 zRd{9sHc_OLqVQ=0)vLh}N;frsjLm6v=x@%|i|U+S_Z>usSY3><(*hJMC;%4Tu? zB9wE;ED@{JF;1+p1ehN~%UwM_c(s=Su!aRjZH%*&l?6bw`K%Q(S$+FDBLJcF@p`74 z)_555_A30qdzcdw14@<{BZ4jApHY>>*Wgpa;7H7$Dj1Lu3bdLOM@~t;fAha1E6Bdz zxG;**yChrd)0=?g-Qlv9)J)4=$+I(y+cuZj&GMlwbg1aLPF7k-ws_TKq0bQ95>rIA z`5Ip^8t#Qa^Y`K~Ma>N*Gf9@wFLUwOZ%ZwO{ob4j$)| z$xmG{?>>MVZL zOY(N#9i*)3{s#Pg_Br&MfZP@jtQrI=U&$DQp-M9GRPSMw)NHkeR7?zqWLf|Ez<}~1 zD~im$z5Y$o|N1PsVBuzkaM(Z_WeN1t1?r~K?70b-g{~ivJ56`SD&cQhV{1m zuUpA8K20hjzr1;9)5|(0<-M5NS{H8*$PXXJtmA1VX?3r^iqof)NJIdND+*GZ=rIJbh=&ThQ5 z1j4w~PuHE#$){zwJ2)|>BgX8u>30q?kkj3T*=k*l3+=0<4KZ}?JiS9I`QNGBF^*hY zh^Zbc^s?`L;dw%7?bR9BYgaU<;9mTsN-pZt=+}(s+I%TYl+sm_OR17m4)pP_iz$kt za?Y*g-|ZGhtz(u-`jo-tVPj`=$F8Ge<=lUf@jUStW{;6veY$^9d1v+W4=4H`Uq5e` yH;VFGPo^A91mQDsp>!)8UdH?(e&7i@%0sjqU3h}TUKw&_`A@Aq^kKuxBK#i~G&-vQ diff --git a/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java b/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java index 66b5b98b89b41..2653f6b298b7f 100644 --- a/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java +++ b/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java @@ -26,20 +26,7 @@ public class ScriptC_Fountain extends ScriptC { super(rs, resources, id, isRoot); } - private final static int mExportVarIdx_partColor = 0; - private Float4 mExportVar_partColor; - public void set_partColor(Float4 v) { - mExportVar_partColor = v; - FieldPacker fp = new FieldPacker(16); - fp.addF32(v); - setVar(mExportVarIdx_partColor, fp); - } - - public Float4 get_partColor() { - return mExportVar_partColor; - } - - private final static int mExportVarIdx_partMesh = 1; + private final static int mExportVarIdx_partMesh = 0; private SimpleMesh mExportVar_partMesh; public void set_partMesh(SimpleMesh v) { mExportVar_partMesh = v; @@ -50,7 +37,7 @@ public class ScriptC_Fountain extends ScriptC { return mExportVar_partMesh; } - private final static int mExportVarIdx_point = 2; + private final static int mExportVarIdx_point = 1; private ScriptField_Point mExportVar_point; public void bind_point(ScriptField_Point v) { mExportVar_point = v; diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h index a408a57b61a2b..8273165c4d862 100644 --- a/libs/rs/rsAllocation.h +++ b/libs/rs/rsAllocation.h @@ -78,6 +78,9 @@ public: virtual void uploadCheck(const Context *rsc); + bool getIsTexture() const {return mIsTexture;} + bool getIsBufferObject() const {return mIsVertexBuffer;} + protected: void sendDirty() const; diff --git a/libs/rs/rsSimpleMesh.cpp b/libs/rs/rsSimpleMesh.cpp index 6ec1a3b77f53b..e5c2eb5afa194 100644 --- a/libs/rs/rsSimpleMesh.cpp +++ b/libs/rs/rsSimpleMesh.cpp @@ -70,7 +70,11 @@ void SimpleMesh::renderRange(Context *rsc, uint32_t start, uint32_t len) const VertexArray va; for (uint32_t ct=0; ct < mVertexTypeCount; ct++) { mVertexBuffers[ct]->uploadCheck(rsc); - va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID()); + if (mVertexBuffers[ct]->getIsBufferObject()) { + va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID()); + } else { + va.setActiveBuffer(mVertexBuffers[ct]->getPtr()); + } mVertexTypes[ct]->enableGLVertexBuffer(&va); } va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); diff --git a/libs/rs/rsVertexArray.cpp b/libs/rs/rsVertexArray.cpp index a13371abaddf1..ef892a51d7a5c 100644 --- a/libs/rs/rsVertexArray.cpp +++ b/libs/rs/rsVertexArray.cpp @@ -84,6 +84,7 @@ void VertexArray::add(const Attrib &a, uint32_t stride) rsAssert(mCount < RS_MAX_ATTRIBS); mAttribs[mCount].set(a); mAttribs[mCount].buffer = mActiveBuffer; + mAttribs[mCount].ptr = mActivePointer; mAttribs[mCount].stride = stride; mCount ++; } @@ -96,16 +97,19 @@ void VertexArray::add(uint32_t type, uint32_t size, uint32_t stride, bool normal mAttribs[mCount].size = size; mAttribs[mCount].offset = offset; mAttribs[mCount].normalized = normalized; - mAttribs[mCount].buffer = mActiveBuffer; mAttribs[mCount].stride = stride; mAttribs[mCount].name.setTo(name); + + mAttribs[mCount].buffer = mActiveBuffer; + mAttribs[mCount].ptr = mActivePointer; mCount ++; } void VertexArray::logAttrib(uint32_t idx, uint32_t slot) const { - LOGE("va %i: slot=%i name=%s buf=%i size=%i type=0x%x stride=0x%x norm=%i offset=0x%x", idx, slot, + LOGE("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, @@ -154,7 +158,7 @@ void VertexArray::setupGL2(const Context *rsc, class VertexArrayState *state, Sh mAttribs[ct].type, mAttribs[ct].normalized, mAttribs[ct].stride, - (void *)mAttribs[ct].offset); + mAttribs[ct].ptr + mAttribs[ct].offset); } state->mLastEnableCount = mCount; rsc->checkError("VertexArray::setupGL2 done"); diff --git a/libs/rs/rsVertexArray.h b/libs/rs/rsVertexArray.h index e5b51d7f72e84..7c609b2658349 100644 --- a/libs/rs/rsVertexArray.h +++ b/libs/rs/rsVertexArray.h @@ -37,6 +37,7 @@ public: class Attrib { public: uint32_t buffer; + const uint8_t * ptr; uint32_t offset; uint32_t type; uint32_t size; @@ -51,7 +52,15 @@ public: void clearAll(); - void setActiveBuffer(uint32_t id) {mActiveBuffer = id;} + void setActiveBuffer(uint32_t id) { + mActiveBuffer = id; + mActivePointer = NULL; + } + void setActiveBuffer(const void *ptr) { + mActiveBuffer = 0; + mActivePointer = (const uint8_t *)ptr; + } + void add(const Attrib &, uint32_t stride); //void addLegacy(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset); void add(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset, const char *name); @@ -63,6 +72,7 @@ public: protected: void clear(uint32_t index); uint32_t mActiveBuffer; + const uint8_t * mActivePointer; uint32_t mCount; Attrib mAttribs[RS_MAX_ATTRIBS];