blob: d20e91015fb3ef57a6bb90a79b19e13e17c17f93 [file] [log] [blame]
Jason Sams326e0dd2009-05-22 14:03:28 -07001
2/*
3 * Copyright (C) 2009 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include "rsContext.h"
19
20using namespace android;
21using namespace android::renderscript;
22
23
24Adapter1D::Adapter1D()
25{
26 reset();
27}
28
29Adapter1D::Adapter1D(Allocation *a)
30{
31 reset();
32 setAllocation(a);
33}
34
35void Adapter1D::reset()
36{
37 mY = 0;
38 mZ = 0;
39 mLOD = 0;
40 mFace = 0;
41}
42
43void * Adapter1D::getElement(uint32_t x)
44{
45 rsAssert(mAllocation.get());
46 rsAssert(mAllocation->getPtr());
47 rsAssert(mAllocation->getType());
48 uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr());
49 ptr += mAllocation->getType()->getLODOffset(mLOD, x, mY);
50 return ptr;
51}
52
53void Adapter1D::subData(uint32_t xoff, uint32_t count, const void *data)
54{
55 if (mAllocation.get() && mAllocation.get()->getType()) {
56 void *ptr = getElement(xoff);
57 count *= mAllocation.get()->getType()->getElementSizeBytes();
58 memcpy(ptr, data, count);
59 }
60}
61
62void Adapter1D::data(const void *data)
63{
Jason Samsd3c8de22009-08-03 16:03:08 -070064 memcpy(getElement(0),
65 data,
Jason Sams326e0dd2009-05-22 14:03:28 -070066 mAllocation.get()->getType()->getSizeBytes());
67}
68
69namespace android {
70namespace renderscript {
71
72RsAdapter1D rsi_Adapter1DCreate(Context *rsc)
73{
Jason Samsd3c8de22009-08-03 16:03:08 -070074 Adapter1D *a = new Adapter1D();
Jason Sams9397e302009-08-27 20:23:34 -070075 a->incUserRef();
Jason Samsd3c8de22009-08-03 16:03:08 -070076 return a;
Jason Sams326e0dd2009-05-22 14:03:28 -070077}
78
Jason Sams326e0dd2009-05-22 14:03:28 -070079void rsi_Adapter1DBindAllocation(Context *rsc, RsAdapter1D va, RsAllocation valloc)
80{
81 Adapter1D * a = static_cast<Adapter1D *>(va);
82 Allocation * alloc = static_cast<Allocation *>(valloc);
83 a->setAllocation(alloc);
84}
85
86void rsi_Adapter1DSetConstraint(Context *rsc, RsAdapter1D va, RsDimension dim, uint32_t value)
87{
88 Adapter1D * a = static_cast<Adapter1D *>(va);
89 switch(dim) {
90 case RS_DIMENSION_X:
91 rsAssert(!"Cannot contrain X in an 1D adapter");
92 return;
93 case RS_DIMENSION_Y:
94 a->setY(value);
95 break;
96 case RS_DIMENSION_Z:
97 a->setZ(value);
98 break;
99 case RS_DIMENSION_LOD:
100 a->setLOD(value);
101 break;
102 case RS_DIMENSION_FACE:
103 a->setFace(value);
104 break;
105 default:
106 rsAssert(!"Unimplemented constraint");
107 return;
108 }
109}
110
111void rsi_Adapter1DSubData(Context *rsc, RsAdapter1D va, uint32_t xoff, uint32_t count, const void *data)
112{
113 Adapter1D * a = static_cast<Adapter1D *>(va);
114 a->subData(xoff, count, data);
115}
116
117void rsi_Adapter1DData(Context *rsc, RsAdapter1D va, const void *data)
118{
119 Adapter1D * a = static_cast<Adapter1D *>(va);
120 a->data(data);
121}
122
123}
124}
125
126//////////////////////////
127
128Adapter2D::Adapter2D()
129{
130 reset();
131}
132
133Adapter2D::Adapter2D(Allocation *a)
134{
135 reset();
136 setAllocation(a);
137}
138
139void Adapter2D::reset()
140{
141 mZ = 0;
142 mLOD = 0;
143 mFace = 0;
144}
145
146void * Adapter2D::getElement(uint32_t x, uint32_t y) const
147{
148 rsAssert(mAllocation.get());
149 rsAssert(mAllocation->getPtr());
150 rsAssert(mAllocation->getType());
151 uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr());
152 ptr += mAllocation->getType()->getLODOffset(mLOD, x, y);
153 return ptr;
154}
155
156void Adapter2D::subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data)
157{
158 rsAssert(mAllocation.get());
159 rsAssert(mAllocation->getPtr());
160 rsAssert(mAllocation->getType());
161
162 uint32_t eSize = mAllocation.get()->getType()->getElementSizeBytes();
163 uint32_t lineSize = eSize * w;
164 uint32_t destW = getDimX();
165
166 const uint8_t *src = static_cast<const uint8_t *>(data);
167 for (uint32_t line=yoff; line < (yoff+h); line++) {
168 memcpy(getElement(xoff, line), src, lineSize);
169 src += lineSize;
170 }
171}
172
173void Adapter2D::data(const void *data)
174{
Jason Samsd3c8de22009-08-03 16:03:08 -0700175 memcpy(getElement(0,0),
176 data,
Jason Sams326e0dd2009-05-22 14:03:28 -0700177 mAllocation.get()->getType()->getSizeBytes());
178}
179
180
181
182namespace android {
183namespace renderscript {
184
185RsAdapter2D rsi_Adapter2DCreate(Context *rsc)
186{
Jason Samsd3c8de22009-08-03 16:03:08 -0700187 Adapter2D *a = new Adapter2D();
Jason Sams9397e302009-08-27 20:23:34 -0700188 a->incUserRef();
Jason Samsd3c8de22009-08-03 16:03:08 -0700189 return a;
Jason Sams326e0dd2009-05-22 14:03:28 -0700190}
191
Jason Sams326e0dd2009-05-22 14:03:28 -0700192void rsi_Adapter2DBindAllocation(Context *rsc, RsAdapter2D va, RsAllocation valloc)
193{
194 Adapter2D * a = static_cast<Adapter2D *>(va);
195 Allocation * alloc = static_cast<Allocation *>(valloc);
196 a->setAllocation(alloc);
197}
198
199void rsi_Adapter2DSetConstraint(Context *rsc, RsAdapter2D va, RsDimension dim, uint32_t value)
200{
201 Adapter2D * a = static_cast<Adapter2D *>(va);
202 switch(dim) {
203 case RS_DIMENSION_X:
204 rsAssert(!"Cannot contrain X in an 2D adapter");
205 return;
206 case RS_DIMENSION_Y:
207 rsAssert(!"Cannot contrain Y in an 2D adapter");
208 break;
209 case RS_DIMENSION_Z:
210 a->setZ(value);
211 break;
212 case RS_DIMENSION_LOD:
213 a->setLOD(value);
214 break;
215 case RS_DIMENSION_FACE:
216 a->setFace(value);
217 break;
218 default:
219 rsAssert(!"Unimplemented constraint");
220 return;
221 }
222}
223
224void rsi_Adapter2DData(Context *rsc, RsAdapter2D va, const void *data)
225{
226 Adapter2D * a = static_cast<Adapter2D *>(va);
227 a->data(data);
228}
229
230void rsi_Adapter2DSubData(Context *rsc, RsAdapter2D va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data)
231{
232 Adapter2D * a = static_cast<Adapter2D *>(va);
233 a->subData(xoff, yoff, w, h, data);
234}
235
236}
237}