• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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 #include "rsScriptC.h"
19 #include "rsMatrix4x4.h"
20 #include "rsMatrix3x3.h"
21 #include "rsMatrix2x2.h"
22 #include "rsMesh.h"
23 #include "rsgApiStructs.h"
24 
25 #include "utils/Timers.h"
26 #include "driver/rsdVertexArray.h"
27 #include "driver/rsdShaderCache.h"
28 #include "driver/rsdCore.h"
29 
30 #define GL_GLEXT_PROTOTYPES
31 
32 #include <GLES/gl.h>
33 #include <GLES/glext.h>
34 #include <GLES2/gl2.h>
35 #include <GLES2/gl2ext.h>
36 
37 #include <time.h>
38 
39 using namespace android;
40 using namespace android::renderscript;
41 
42 namespace android {
43 namespace renderscript {
44 
45 //////////////////////////////////////////////////////////////////////////////
46 // Context
47 //////////////////////////////////////////////////////////////////////////////
48 
rsrBindTexture(Context * rsc,ProgramFragment * pf,uint32_t slot,Allocation * a)49 void rsrBindTexture(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
50     CHECK_OBJ_OR_NULL(a);
51     CHECK_OBJ(pf);
52     pf->bindTexture(rsc, slot, a);
53 }
54 
rsrBindConstant(Context * rsc,ProgramFragment * pf,uint32_t slot,Allocation * a)55 void rsrBindConstant(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
56     CHECK_OBJ_OR_NULL(a);
57     CHECK_OBJ(pf);
58     pf->bindAllocation(rsc, a, slot);
59 }
60 
rsrBindConstant(Context * rsc,ProgramVertex * pv,uint32_t slot,Allocation * a)61 void rsrBindConstant(Context *rsc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
62     CHECK_OBJ_OR_NULL(a);
63     CHECK_OBJ(pv);
64     pv->bindAllocation(rsc, a, slot);
65 }
66 
rsrBindSampler(Context * rsc,ProgramFragment * pf,uint32_t slot,Sampler * s)67 void rsrBindSampler(Context *rsc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
68     CHECK_OBJ_OR_NULL(vs);
69     CHECK_OBJ(vpf);
70     pf->bindSampler(rsc, slot, s);
71 }
72 
rsrBindProgramStore(Context * rsc,ProgramStore * ps)73 void rsrBindProgramStore(Context *rsc, ProgramStore *ps) {
74     CHECK_OBJ_OR_NULL(ps);
75     rsc->setProgramStore(ps);
76 }
77 
rsrBindProgramFragment(Context * rsc,ProgramFragment * pf)78 void rsrBindProgramFragment(Context *rsc, ProgramFragment *pf) {
79     CHECK_OBJ_OR_NULL(pf);
80     rsc->setProgramFragment(pf);
81 }
82 
rsrBindProgramVertex(Context * rsc,ProgramVertex * pv)83 void rsrBindProgramVertex(Context *rsc, ProgramVertex *pv) {
84     CHECK_OBJ_OR_NULL(pv);
85     rsc->setProgramVertex(pv);
86 }
87 
rsrBindProgramRaster(Context * rsc,ProgramRaster * pr)88 void rsrBindProgramRaster(Context *rsc, ProgramRaster *pr) {
89     CHECK_OBJ_OR_NULL(pr);
90     rsc->setProgramRaster(pr);
91 }
92 
rsrBindFrameBufferObjectColorTarget(Context * rsc,Allocation * a,uint32_t slot)93 void rsrBindFrameBufferObjectColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
94     CHECK_OBJ(va);
95     rsc->mFBOCache.bindColorTarget(rsc, a, slot);
96     rsc->mStateVertex.updateSize(rsc);
97 }
98 
rsrBindFrameBufferObjectDepthTarget(Context * rsc,Allocation * a)99 void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Allocation *a) {
100     CHECK_OBJ(va);
101     rsc->mFBOCache.bindDepthTarget(rsc, a);
102     rsc->mStateVertex.updateSize(rsc);
103 }
104 
rsrClearFrameBufferObjectColorTarget(Context * rsc,uint32_t slot)105 void rsrClearFrameBufferObjectColorTarget(Context *rsc, uint32_t slot) {
106     rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
107     rsc->mStateVertex.updateSize(rsc);
108 }
109 
rsrClearFrameBufferObjectDepthTarget(Context * rsc)110 void rsrClearFrameBufferObjectDepthTarget(Context *rsc) {
111     rsc->mFBOCache.bindDepthTarget(rsc, NULL);
112     rsc->mStateVertex.updateSize(rsc);
113 }
114 
rsrClearFrameBufferObjectTargets(Context * rsc)115 void rsrClearFrameBufferObjectTargets(Context *rsc) {
116     rsc->mFBOCache.resetAll(rsc);
117     rsc->mStateVertex.updateSize(rsc);
118 }
119 
120 //////////////////////////////////////////////////////////////////////////////
121 // VP
122 //////////////////////////////////////////////////////////////////////////////
123 
rsrVpLoadProjectionMatrix(Context * rsc,const rsc_Matrix * m)124 void rsrVpLoadProjectionMatrix(Context *rsc, const rsc_Matrix *m) {
125     rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
126 }
127 
rsrVpLoadModelMatrix(Context * rsc,const rsc_Matrix * m)128 void rsrVpLoadModelMatrix(Context *rsc, const rsc_Matrix *m) {
129     rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
130 }
131 
rsrVpLoadTextureMatrix(Context * rsc,const rsc_Matrix * m)132 void rsrVpLoadTextureMatrix(Context *rsc, const rsc_Matrix *m) {
133     rsc->getProgramVertex()->setTextureMatrix(rsc, m);
134 }
135 
rsrPfConstantColor(Context * rsc,ProgramFragment * pf,float r,float g,float b,float a)136 void rsrPfConstantColor(Context *rsc, ProgramFragment *pf,
137                         float r, float g, float b, float a) {
138     CHECK_OBJ(pf);
139     pf->setConstantColor(rsc, r, g, b, a);
140 }
141 
rsrVpGetProjectionMatrix(Context * rsc,rsc_Matrix * m)142 void rsrVpGetProjectionMatrix(Context *rsc, rsc_Matrix *m) {
143     rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
144 }
145 
146 //////////////////////////////////////////////////////////////////////////////
147 // Drawing
148 //////////////////////////////////////////////////////////////////////////////
149 
150 
rsrDrawPath(Context * rsc,Path * sm)151 void rsrDrawPath(Context *rsc, Path *sm) {
152     CHECK_OBJ(sm);
153     if (!rsc->setupCheck()) {
154         return;
155     }
156     sm->render(rsc);
157 }
158 
rsrDrawMesh(Context * rsc,Mesh * sm)159 void rsrDrawMesh(Context *rsc, Mesh *sm) {
160     CHECK_OBJ(sm);
161     if (!rsc->setupCheck()) {
162         return;
163     }
164     sm->render(rsc);
165 }
166 
rsrDrawMeshPrimitive(Context * rsc,Mesh * sm,uint32_t primIndex)167 void rsrDrawMeshPrimitive(Context *rsc, Mesh *sm, uint32_t primIndex) {
168     CHECK_OBJ(sm);
169     if (!rsc->setupCheck()) {
170         return;
171     }
172     sm->renderPrimitive(rsc, primIndex);
173 }
174 
rsrDrawMeshPrimitiveRange(Context * rsc,Mesh * sm,uint32_t primIndex,uint32_t start,uint32_t len)175 void rsrDrawMeshPrimitiveRange(Context *rsc, Mesh *sm, uint32_t primIndex,
176                                uint32_t start, uint32_t len) {
177     CHECK_OBJ(sm);
178     if (!rsc->setupCheck()) {
179         return;
180     }
181     sm->renderPrimitiveRange(rsc, primIndex, start, len);
182 }
183 
rsrMeshComputeBoundingBox(Context * rsc,Mesh * sm,float * minX,float * minY,float * minZ,float * maxX,float * maxY,float * maxZ)184 void rsrMeshComputeBoundingBox(Context *rsc, Mesh *sm,
185                                float *minX, float *minY, float *minZ,
186                                float *maxX, float *maxY, float *maxZ) {
187     CHECK_OBJ(sm);
188     sm->computeBBox(rsc);
189     *minX = sm->mBBoxMin[0];
190     *minY = sm->mBBoxMin[1];
191     *minZ = sm->mBBoxMin[2];
192     *maxX = sm->mBBoxMax[0];
193     *maxY = sm->mBBoxMax[1];
194     *maxZ = sm->mBBoxMax[2];
195 }
196 
197 
198 //////////////////////////////////////////////////////////////////////////////
199 //
200 //////////////////////////////////////////////////////////////////////////////
201 
202 
rsrColor(Context * rsc,float r,float g,float b,float a)203 void rsrColor(Context *rsc, float r, float g, float b, float a) {
204     ProgramFragment *pf = rsc->getProgramFragment();
205     pf->setConstantColor(rsc, r, g, b, a);
206 }
207 
rsrPrepareClear(Context * rsc)208 void rsrPrepareClear(Context *rsc) {
209     rsc->mFBOCache.setup(rsc);
210     rsc->setupProgramStore();
211 }
212 
rsrGetWidth(Context * rsc)213 uint32_t rsrGetWidth(Context *rsc) {
214     return rsc->getWidth();
215 }
216 
rsrGetHeight(Context * rsc)217 uint32_t rsrGetHeight(Context *rsc) {
218     return rsc->getHeight();
219 }
220 
rsrDrawTextAlloc(Context * rsc,Allocation * a,int x,int y)221 void rsrDrawTextAlloc(Context *rsc, Allocation *a, int x, int y) {
222     const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
223     size_t allocSize = a->getType()->getPackedSizeBytes();
224     rsc->mStateFont.renderText(text, allocSize, x, y);
225     rsc->mHal.funcs.allocation.unlock1D(rsc, a);
226 }
227 
rsrDrawText(Context * rsc,const char * text,int x,int y)228 void rsrDrawText(Context *rsc, const char *text, int x, int y) {
229     size_t textLen = strlen(text);
230     rsc->mStateFont.renderText(text, textLen, x, y);
231 }
232 
SetMetrics(Font::Rect * metrics,int32_t * left,int32_t * right,int32_t * top,int32_t * bottom)233 static void SetMetrics(Font::Rect *metrics,
234                        int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
235     if (left) {
236         *left = metrics->left;
237     }
238     if (right) {
239         *right = metrics->right;
240     }
241     if (top) {
242         *top = metrics->top;
243     }
244     if (bottom) {
245         *bottom = metrics->bottom;
246     }
247 }
248 
rsrMeasureTextAlloc(Context * rsc,Allocation * a,int32_t * left,int32_t * right,int32_t * top,int32_t * bottom)249 void rsrMeasureTextAlloc(Context *rsc, Allocation *a,
250                          int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
251     CHECK_OBJ(a);
252     const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
253     size_t textLen = a->getType()->getPackedSizeBytes();
254     Font::Rect metrics;
255     rsc->mStateFont.measureText(text, textLen, &metrics);
256     SetMetrics(&metrics, left, right, top, bottom);
257     rsc->mHal.funcs.allocation.unlock1D(rsc, a);
258 }
259 
rsrMeasureText(Context * rsc,const char * text,int32_t * left,int32_t * right,int32_t * top,int32_t * bottom)260 void rsrMeasureText(Context *rsc, const char *text,
261                     int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
262     size_t textLen = strlen(text);
263     Font::Rect metrics;
264     rsc->mStateFont.measureText(text, textLen, &metrics);
265     SetMetrics(&metrics, left, right, top, bottom);
266 }
267 
rsrBindFont(Context * rsc,Font * font)268 void rsrBindFont(Context *rsc, Font *font) {
269     CHECK_OBJ(font);
270     rsi_ContextBindFont(rsc, font);
271 }
272 
rsrFontColor(Context * rsc,float r,float g,float b,float a)273 void rsrFontColor(Context *rsc, float r, float g, float b, float a) {
274     rsc->mStateFont.setFontColor(r, g, b, a);
275 }
276 
277 }
278 }
279