1 /*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "rsContext.h"
18
19 using namespace android;
20 using namespace android::renderscript;
21
22 #include <GLES/gl.h>
23 #include <GLES/glext.h>
24
SimpleMesh(Context * rsc)25 SimpleMesh::SimpleMesh(Context *rsc) : ObjectBase(rsc)
26 {
27 mAllocFile = __FILE__;
28 mAllocLine = __LINE__;
29 }
30
~SimpleMesh()31 SimpleMesh::~SimpleMesh()
32 {
33 delete[] mVertexTypes;
34 delete[] mVertexBuffers;
35 }
36
render(Context * rsc) const37 void SimpleMesh::render(Context *rsc) const
38 {
39 if (mPrimitiveType.get()) {
40 renderRange(rsc, 0, mPrimitiveType->getDimX());
41 return;
42 }
43
44 if (mIndexType.get()) {
45 renderRange(rsc, 0, mIndexType->getDimX());
46 return;
47 }
48
49 renderRange(rsc, 0, mVertexTypes[0]->getDimX());
50 }
51
renderRange(Context * rsc,uint32_t start,uint32_t len) const52 void SimpleMesh::renderRange(Context *rsc, uint32_t start, uint32_t len) const
53 {
54 if (len < 1) {
55 return;
56 }
57
58 rsc->checkError("SimpleMesh::renderRange 1");
59 VertexArray va;
60 if (rsc->checkVersion2_0()) {
61 for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
62 mVertexBuffers[ct]->uploadCheck(rsc);
63 va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID());
64 mVertexTypes[ct]->enableGLVertexBuffer2(&va);
65 }
66 va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
67 } else {
68 for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
69 mVertexBuffers[ct]->uploadCheck(rsc);
70 va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID());
71 mVertexTypes[ct]->enableGLVertexBuffer(&va);
72 }
73 va.setupGL(rsc, 0);
74 }
75
76 rsc->checkError("SimpleMesh::renderRange 2");
77 if (mIndexType.get()) {
78 mIndexBuffer->uploadCheck(rsc);
79 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID());
80 glDrawElements(mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2));
81 } else {
82 glDrawArrays(mGLPrimitive, start, len);
83 }
84
85 rsc->checkError("SimpleMesh::renderRange");
86 }
87
uploadAll(Context * rsc)88 void SimpleMesh::uploadAll(Context *rsc)
89 {
90 for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
91 if (mVertexBuffers[ct].get()) {
92 mVertexBuffers[ct]->deferedUploadToBufferObject(rsc);
93 }
94 }
95 if (mIndexBuffer.get()) {
96 mIndexBuffer->deferedUploadToBufferObject(rsc);
97 }
98 if (mPrimitiveBuffer.get()) {
99 mPrimitiveBuffer->deferedUploadToBufferObject(rsc);
100 }
101 rsc->checkError("SimpleMesh::uploadAll");
102 }
103
104
SimpleMeshContext()105 SimpleMeshContext::SimpleMeshContext()
106 {
107 }
108
~SimpleMeshContext()109 SimpleMeshContext::~SimpleMeshContext()
110 {
111 }
112
113
114 namespace android {
115 namespace renderscript {
116
117
rsi_SimpleMeshCreate(Context * rsc,RsType prim,RsType idx,RsType * vtx,uint32_t vtxCount,uint32_t primType)118 RsSimpleMesh rsi_SimpleMeshCreate(Context *rsc, RsType prim, RsType idx, RsType *vtx, uint32_t vtxCount, uint32_t primType)
119 {
120 SimpleMesh *sm = new SimpleMesh(rsc);
121 sm->incUserRef();
122
123 sm->mIndexType.set((const Type *)idx);
124 sm->mPrimitiveType.set((const Type *)prim);
125
126 sm->mVertexTypeCount = vtxCount;
127 sm->mVertexTypes = new ObjectBaseRef<const Type>[vtxCount];
128 sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount];
129 for (uint32_t ct=0; ct < vtxCount; ct++) {
130 sm->mVertexTypes[ct].set((const Type *)vtx[ct]);
131 }
132
133 sm->mPrimitive = (RsPrimitive)primType;
134 switch(sm->mPrimitive) {
135 case RS_PRIMITIVE_POINT: sm->mGLPrimitive = GL_POINTS; break;
136 case RS_PRIMITIVE_LINE: sm->mGLPrimitive = GL_LINES; break;
137 case RS_PRIMITIVE_LINE_STRIP: sm->mGLPrimitive = GL_LINE_STRIP; break;
138 case RS_PRIMITIVE_TRIANGLE: sm->mGLPrimitive = GL_TRIANGLES; break;
139 case RS_PRIMITIVE_TRIANGLE_STRIP: sm->mGLPrimitive = GL_TRIANGLE_STRIP; break;
140 case RS_PRIMITIVE_TRIANGLE_FAN: sm->mGLPrimitive = GL_TRIANGLE_FAN; break;
141 }
142 return sm;
143 }
144
rsi_SimpleMeshBindVertex(Context * rsc,RsSimpleMesh mv,RsAllocation va,uint32_t slot)145 void rsi_SimpleMeshBindVertex(Context *rsc, RsSimpleMesh mv, RsAllocation va, uint32_t slot)
146 {
147 SimpleMesh *sm = static_cast<SimpleMesh *>(mv);
148 rsAssert(slot < sm->mVertexTypeCount);
149
150 sm->mVertexBuffers[slot].set((Allocation *)va);
151 }
152
rsi_SimpleMeshBindIndex(Context * rsc,RsSimpleMesh mv,RsAllocation va)153 void rsi_SimpleMeshBindIndex(Context *rsc, RsSimpleMesh mv, RsAllocation va)
154 {
155 SimpleMesh *sm = static_cast<SimpleMesh *>(mv);
156 sm->mIndexBuffer.set((Allocation *)va);
157 }
158
rsi_SimpleMeshBindPrimitive(Context * rsc,RsSimpleMesh mv,RsAllocation va)159 void rsi_SimpleMeshBindPrimitive(Context *rsc, RsSimpleMesh mv, RsAllocation va)
160 {
161 SimpleMesh *sm = static_cast<SimpleMesh *>(mv);
162 sm->mPrimitiveBuffer.set((Allocation *)va);
163 }
164
165
166
167
168 }}
169
170