1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #include "rsdAllocation.h"
18*e1eccf28SAndroid Build Coastguard Worker #include "rsdCore.h"
19*e1eccf28SAndroid Build Coastguard Worker
20*e1eccf28SAndroid Build Coastguard Worker #include <android/native_window.h>
21*e1eccf28SAndroid Build Coastguard Worker
22*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_COMPATIBILITY_LIB
23*e1eccf28SAndroid Build Coastguard Worker #include "rsCompatibilityLib.h"
24*e1eccf28SAndroid Build Coastguard Worker #else
25*e1eccf28SAndroid Build Coastguard Worker #include "rsdFrameBufferObj.h"
26*e1eccf28SAndroid Build Coastguard Worker #include <vndk/window.h>
27*e1eccf28SAndroid Build Coastguard Worker
28*e1eccf28SAndroid Build Coastguard Worker #include <GLES/gl.h>
29*e1eccf28SAndroid Build Coastguard Worker #include <GLES2/gl2.h>
30*e1eccf28SAndroid Build Coastguard Worker #include <GLES/glext.h>
31*e1eccf28SAndroid Build Coastguard Worker #endif
32*e1eccf28SAndroid Build Coastguard Worker
33*e1eccf28SAndroid Build Coastguard Worker #include <malloc.h> // for memalign()
34*e1eccf28SAndroid Build Coastguard Worker #include <unistd.h> // for close()
35*e1eccf28SAndroid Build Coastguard Worker
36*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Allocation;
37*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Context;
38*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Element;
39*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Type;
40*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::rs_allocation;
41*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::rsBoxFilter565;
42*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::rsBoxFilter8888;
43*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::rsMax;
44*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::rsRound;
45*e1eccf28SAndroid Build Coastguard Worker
46*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
47*e1eccf28SAndroid Build Coastguard Worker const static GLenum gFaceOrder[] = {
48*e1eccf28SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_X,
49*e1eccf28SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
50*e1eccf28SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
51*e1eccf28SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
52*e1eccf28SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
53*e1eccf28SAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
54*e1eccf28SAndroid Build Coastguard Worker };
55*e1eccf28SAndroid Build Coastguard Worker
rsdTypeToGLType(RsDataType t)56*e1eccf28SAndroid Build Coastguard Worker GLenum rsdTypeToGLType(RsDataType t) {
57*e1eccf28SAndroid Build Coastguard Worker switch (t) {
58*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5;
59*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1;
60*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4;
61*e1eccf28SAndroid Build Coastguard Worker
62*e1eccf28SAndroid Build Coastguard Worker //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT;
63*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_FLOAT_32: return GL_FLOAT;
64*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE;
65*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT;
66*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_SIGNED_8: return GL_BYTE;
67*e1eccf28SAndroid Build Coastguard Worker case RS_TYPE_SIGNED_16: return GL_SHORT;
68*e1eccf28SAndroid Build Coastguard Worker default: break;
69*e1eccf28SAndroid Build Coastguard Worker }
70*e1eccf28SAndroid Build Coastguard Worker return 0;
71*e1eccf28SAndroid Build Coastguard Worker }
72*e1eccf28SAndroid Build Coastguard Worker
rsdKindToGLFormat(RsDataKind k)73*e1eccf28SAndroid Build Coastguard Worker GLenum rsdKindToGLFormat(RsDataKind k) {
74*e1eccf28SAndroid Build Coastguard Worker switch (k) {
75*e1eccf28SAndroid Build Coastguard Worker case RS_KIND_PIXEL_L: return GL_LUMINANCE;
76*e1eccf28SAndroid Build Coastguard Worker case RS_KIND_PIXEL_A: return GL_ALPHA;
77*e1eccf28SAndroid Build Coastguard Worker case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
78*e1eccf28SAndroid Build Coastguard Worker case RS_KIND_PIXEL_RGB: return GL_RGB;
79*e1eccf28SAndroid Build Coastguard Worker case RS_KIND_PIXEL_RGBA: return GL_RGBA;
80*e1eccf28SAndroid Build Coastguard Worker case RS_KIND_PIXEL_DEPTH: return GL_DEPTH_COMPONENT16;
81*e1eccf28SAndroid Build Coastguard Worker default: break;
82*e1eccf28SAndroid Build Coastguard Worker }
83*e1eccf28SAndroid Build Coastguard Worker return 0;
84*e1eccf28SAndroid Build Coastguard Worker }
85*e1eccf28SAndroid Build Coastguard Worker #endif
86*e1eccf28SAndroid Build Coastguard Worker
GetOffsetPtr(const android::renderscript::Allocation * alloc,uint32_t xoff,uint32_t yoff,uint32_t zoff,uint32_t lod,RsAllocationCubemapFace face)87*e1eccf28SAndroid Build Coastguard Worker uint8_t *GetOffsetPtr(const android::renderscript::Allocation *alloc,
88*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t yoff, uint32_t zoff,
89*e1eccf28SAndroid Build Coastguard Worker uint32_t lod, RsAllocationCubemapFace face) {
90*e1eccf28SAndroid Build Coastguard Worker uint8_t *ptr = (uint8_t *)alloc->mHal.drvState.lod[lod].mallocPtr;
91*e1eccf28SAndroid Build Coastguard Worker ptr += face * alloc->mHal.drvState.faceOffset;
92*e1eccf28SAndroid Build Coastguard Worker ptr += zoff * alloc->mHal.drvState.lod[lod].dimY * alloc->mHal.drvState.lod[lod].stride;
93*e1eccf28SAndroid Build Coastguard Worker ptr += yoff * alloc->mHal.drvState.lod[lod].stride;
94*e1eccf28SAndroid Build Coastguard Worker ptr += xoff * alloc->mHal.state.elementSizeBytes;
95*e1eccf28SAndroid Build Coastguard Worker return ptr;
96*e1eccf28SAndroid Build Coastguard Worker }
97*e1eccf28SAndroid Build Coastguard Worker
98*e1eccf28SAndroid Build Coastguard Worker
Update2DTexture(const Context * rsc,const Allocation * alloc,const void * ptr,uint32_t xoff,uint32_t yoff,uint32_t lod,RsAllocationCubemapFace face,uint32_t w,uint32_t h)99*e1eccf28SAndroid Build Coastguard Worker static void Update2DTexture(const Context *rsc, const Allocation *alloc, const void *ptr,
100*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t yoff, uint32_t lod,
101*e1eccf28SAndroid Build Coastguard Worker RsAllocationCubemapFace face, uint32_t w, uint32_t h) {
102*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
103*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
104*e1eccf28SAndroid Build Coastguard Worker
105*e1eccf28SAndroid Build Coastguard Worker rsAssert(drv->textureID);
106*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID);
107*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
108*e1eccf28SAndroid Build Coastguard Worker GLenum t = GL_TEXTURE_2D;
109*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasFaces) {
110*e1eccf28SAndroid Build Coastguard Worker t = gFaceOrder[face];
111*e1eccf28SAndroid Build Coastguard Worker }
112*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glTexSubImage2D, t, lod, xoff, yoff, w, h, drv->glFormat, drv->glType, ptr);
113*e1eccf28SAndroid Build Coastguard Worker #endif
114*e1eccf28SAndroid Build Coastguard Worker }
115*e1eccf28SAndroid Build Coastguard Worker
116*e1eccf28SAndroid Build Coastguard Worker
117*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
Upload2DTexture(const Context * rsc,const Allocation * alloc,bool isFirstUpload)118*e1eccf28SAndroid Build Coastguard Worker static void Upload2DTexture(const Context *rsc, const Allocation *alloc, bool isFirstUpload) {
119*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
120*e1eccf28SAndroid Build Coastguard Worker
121*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID);
122*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
123*e1eccf28SAndroid Build Coastguard Worker
124*e1eccf28SAndroid Build Coastguard Worker uint32_t faceCount = 1;
125*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasFaces) {
126*e1eccf28SAndroid Build Coastguard Worker faceCount = 6;
127*e1eccf28SAndroid Build Coastguard Worker }
128*e1eccf28SAndroid Build Coastguard Worker
129*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "Upload2DTexture 1 ");
130*e1eccf28SAndroid Build Coastguard Worker for (uint32_t face = 0; face < faceCount; face ++) {
131*e1eccf28SAndroid Build Coastguard Worker for (uint32_t lod = 0; lod < alloc->mHal.state.type->getLODCount(); lod++) {
132*e1eccf28SAndroid Build Coastguard Worker const uint8_t *p = GetOffsetPtr(alloc, 0, 0, 0, lod, (RsAllocationCubemapFace)face);
133*e1eccf28SAndroid Build Coastguard Worker
134*e1eccf28SAndroid Build Coastguard Worker GLenum t = GL_TEXTURE_2D;
135*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasFaces) {
136*e1eccf28SAndroid Build Coastguard Worker t = gFaceOrder[face];
137*e1eccf28SAndroid Build Coastguard Worker }
138*e1eccf28SAndroid Build Coastguard Worker
139*e1eccf28SAndroid Build Coastguard Worker if (isFirstUpload) {
140*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glTexImage2D, t, lod, drv->glFormat,
141*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.state.type->getLODDimX(lod),
142*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.state.type->getLODDimY(lod),
143*e1eccf28SAndroid Build Coastguard Worker 0, drv->glFormat, drv->glType, p);
144*e1eccf28SAndroid Build Coastguard Worker } else {
145*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glTexSubImage2D, t, lod, 0, 0,
146*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.state.type->getLODDimX(lod),
147*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.state.type->getLODDimY(lod),
148*e1eccf28SAndroid Build Coastguard Worker drv->glFormat, drv->glType, p);
149*e1eccf28SAndroid Build Coastguard Worker }
150*e1eccf28SAndroid Build Coastguard Worker }
151*e1eccf28SAndroid Build Coastguard Worker }
152*e1eccf28SAndroid Build Coastguard Worker
153*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.mipmapControl == RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE) {
154*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glGenerateMipmap, drv->glTarget);
155*e1eccf28SAndroid Build Coastguard Worker }
156*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "Upload2DTexture");
157*e1eccf28SAndroid Build Coastguard Worker }
158*e1eccf28SAndroid Build Coastguard Worker #endif
159*e1eccf28SAndroid Build Coastguard Worker
UploadToTexture(const Context * rsc,const Allocation * alloc)160*e1eccf28SAndroid Build Coastguard Worker static void UploadToTexture(const Context *rsc, const Allocation *alloc) {
161*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
162*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
163*e1eccf28SAndroid Build Coastguard Worker
164*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_INPUT) {
165*e1eccf28SAndroid Build Coastguard Worker if (!drv->textureID) {
166*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glGenTextures, 1, &drv->textureID);
167*e1eccf28SAndroid Build Coastguard Worker }
168*e1eccf28SAndroid Build Coastguard Worker return;
169*e1eccf28SAndroid Build Coastguard Worker }
170*e1eccf28SAndroid Build Coastguard Worker
171*e1eccf28SAndroid Build Coastguard Worker if (!drv->glType || !drv->glFormat) {
172*e1eccf28SAndroid Build Coastguard Worker return;
173*e1eccf28SAndroid Build Coastguard Worker }
174*e1eccf28SAndroid Build Coastguard Worker
175*e1eccf28SAndroid Build Coastguard Worker if (!alloc->mHal.drvState.lod[0].mallocPtr) {
176*e1eccf28SAndroid Build Coastguard Worker return;
177*e1eccf28SAndroid Build Coastguard Worker }
178*e1eccf28SAndroid Build Coastguard Worker
179*e1eccf28SAndroid Build Coastguard Worker bool isFirstUpload = false;
180*e1eccf28SAndroid Build Coastguard Worker
181*e1eccf28SAndroid Build Coastguard Worker if (!drv->textureID) {
182*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glGenTextures, 1, &drv->textureID);
183*e1eccf28SAndroid Build Coastguard Worker isFirstUpload = true;
184*e1eccf28SAndroid Build Coastguard Worker }
185*e1eccf28SAndroid Build Coastguard Worker
186*e1eccf28SAndroid Build Coastguard Worker Upload2DTexture(rsc, alloc, isFirstUpload);
187*e1eccf28SAndroid Build Coastguard Worker
188*e1eccf28SAndroid Build Coastguard Worker if (!(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT)) {
189*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.drvState.lod[0].mallocPtr) {
190*e1eccf28SAndroid Build Coastguard Worker free(alloc->mHal.drvState.lod[0].mallocPtr);
191*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].mallocPtr = nullptr;
192*e1eccf28SAndroid Build Coastguard Worker }
193*e1eccf28SAndroid Build Coastguard Worker }
194*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "UploadToTexture");
195*e1eccf28SAndroid Build Coastguard Worker #endif
196*e1eccf28SAndroid Build Coastguard Worker }
197*e1eccf28SAndroid Build Coastguard Worker
AllocateRenderTarget(const Context * rsc,const Allocation * alloc)198*e1eccf28SAndroid Build Coastguard Worker static void AllocateRenderTarget(const Context *rsc, const Allocation *alloc) {
199*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
200*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
201*e1eccf28SAndroid Build Coastguard Worker
202*e1eccf28SAndroid Build Coastguard Worker if (!drv->glFormat) {
203*e1eccf28SAndroid Build Coastguard Worker return;
204*e1eccf28SAndroid Build Coastguard Worker }
205*e1eccf28SAndroid Build Coastguard Worker
206*e1eccf28SAndroid Build Coastguard Worker if (!drv->renderTargetID) {
207*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glGenRenderbuffers, 1, &drv->renderTargetID);
208*e1eccf28SAndroid Build Coastguard Worker
209*e1eccf28SAndroid Build Coastguard Worker if (!drv->renderTargetID) {
210*e1eccf28SAndroid Build Coastguard Worker // This should generally not happen
211*e1eccf28SAndroid Build Coastguard Worker ALOGE("allocateRenderTarget failed to gen mRenderTargetID");
212*e1eccf28SAndroid Build Coastguard Worker rsc->dumpDebug();
213*e1eccf28SAndroid Build Coastguard Worker return;
214*e1eccf28SAndroid Build Coastguard Worker }
215*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glBindRenderbuffer, GL_RENDERBUFFER, drv->renderTargetID);
216*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glRenderbufferStorage, GL_RENDERBUFFER, drv->glFormat,
217*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].dimX, alloc->mHal.drvState.lod[0].dimY);
218*e1eccf28SAndroid Build Coastguard Worker }
219*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "AllocateRenderTarget");
220*e1eccf28SAndroid Build Coastguard Worker #endif
221*e1eccf28SAndroid Build Coastguard Worker }
222*e1eccf28SAndroid Build Coastguard Worker
UploadToBufferObject(const Context * rsc,const Allocation * alloc)223*e1eccf28SAndroid Build Coastguard Worker static void UploadToBufferObject(const Context *rsc, const Allocation *alloc) {
224*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
225*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
226*e1eccf28SAndroid Build Coastguard Worker
227*e1eccf28SAndroid Build Coastguard Worker rsAssert(!alloc->mHal.state.type->getDimY());
228*e1eccf28SAndroid Build Coastguard Worker rsAssert(!alloc->mHal.state.type->getDimZ());
229*e1eccf28SAndroid Build Coastguard Worker
230*e1eccf28SAndroid Build Coastguard Worker //alloc->mHal.state.usageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
231*e1eccf28SAndroid Build Coastguard Worker
232*e1eccf28SAndroid Build Coastguard Worker if (!drv->bufferID) {
233*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glGenBuffers, 1, &drv->bufferID);
234*e1eccf28SAndroid Build Coastguard Worker }
235*e1eccf28SAndroid Build Coastguard Worker if (!drv->bufferID) {
236*e1eccf28SAndroid Build Coastguard Worker ALOGE("Upload to buffer object failed");
237*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
238*e1eccf28SAndroid Build Coastguard Worker return;
239*e1eccf28SAndroid Build Coastguard Worker }
240*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glBindBuffer, drv->glTarget, drv->bufferID);
241*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glBufferData, drv->glTarget,
242*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.state.type->getPackedSizeBytes(),
243*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].mallocPtr, GL_DYNAMIC_DRAW);
244*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glBindBuffer, drv->glTarget, 0);
245*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "UploadToBufferObject");
246*e1eccf28SAndroid Build Coastguard Worker #endif
247*e1eccf28SAndroid Build Coastguard Worker }
248*e1eccf28SAndroid Build Coastguard Worker
249*e1eccf28SAndroid Build Coastguard Worker
DeriveYUVLayout(int yuv,Allocation::Hal::DrvState * state)250*e1eccf28SAndroid Build Coastguard Worker static size_t DeriveYUVLayout(int yuv, Allocation::Hal::DrvState *state) {
251*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
252*e1eccf28SAndroid Build Coastguard Worker // For the flexible YCbCr format, layout is initialized during call to
253*e1eccf28SAndroid Build Coastguard Worker // Allocation::ioReceive. Return early and avoid clobberring any
254*e1eccf28SAndroid Build Coastguard Worker // pre-existing layout.
255*e1eccf28SAndroid Build Coastguard Worker if (yuv == RS_YUV_420_888) {
256*e1eccf28SAndroid Build Coastguard Worker return 0;
257*e1eccf28SAndroid Build Coastguard Worker }
258*e1eccf28SAndroid Build Coastguard Worker #endif
259*e1eccf28SAndroid Build Coastguard Worker
260*e1eccf28SAndroid Build Coastguard Worker // YUV only supports basic 2d
261*e1eccf28SAndroid Build Coastguard Worker // so we can stash the plane pointers in the mipmap levels.
262*e1eccf28SAndroid Build Coastguard Worker size_t uvSize = 0;
263*e1eccf28SAndroid Build Coastguard Worker state->lod[1].dimX = state->lod[0].dimX / 2;
264*e1eccf28SAndroid Build Coastguard Worker state->lod[1].dimY = state->lod[0].dimY / 2;
265*e1eccf28SAndroid Build Coastguard Worker state->lod[2].dimX = state->lod[0].dimX / 2;
266*e1eccf28SAndroid Build Coastguard Worker state->lod[2].dimY = state->lod[0].dimY / 2;
267*e1eccf28SAndroid Build Coastguard Worker state->yuv.shift = 1;
268*e1eccf28SAndroid Build Coastguard Worker state->yuv.step = 1;
269*e1eccf28SAndroid Build Coastguard Worker state->lodCount = 3;
270*e1eccf28SAndroid Build Coastguard Worker
271*e1eccf28SAndroid Build Coastguard Worker switch(yuv) {
272*e1eccf28SAndroid Build Coastguard Worker case RS_YUV_YV12:
273*e1eccf28SAndroid Build Coastguard Worker state->lod[2].stride = rsRound(state->lod[0].stride >> 1, 16);
274*e1eccf28SAndroid Build Coastguard Worker state->lod[2].mallocPtr = ((uint8_t *)state->lod[0].mallocPtr) +
275*e1eccf28SAndroid Build Coastguard Worker (state->lod[0].stride * state->lod[0].dimY);
276*e1eccf28SAndroid Build Coastguard Worker uvSize += state->lod[2].stride * state->lod[2].dimY;
277*e1eccf28SAndroid Build Coastguard Worker
278*e1eccf28SAndroid Build Coastguard Worker state->lod[1].stride = state->lod[2].stride;
279*e1eccf28SAndroid Build Coastguard Worker state->lod[1].mallocPtr = ((uint8_t *)state->lod[2].mallocPtr) +
280*e1eccf28SAndroid Build Coastguard Worker (state->lod[2].stride * state->lod[2].dimY);
281*e1eccf28SAndroid Build Coastguard Worker uvSize += state->lod[1].stride * state->lod[2].dimY;
282*e1eccf28SAndroid Build Coastguard Worker break;
283*e1eccf28SAndroid Build Coastguard Worker case RS_YUV_NV21:
284*e1eccf28SAndroid Build Coastguard Worker //state->lod[1].dimX = state->lod[0].dimX;
285*e1eccf28SAndroid Build Coastguard Worker state->lod[1].stride = state->lod[0].stride;
286*e1eccf28SAndroid Build Coastguard Worker state->lod[2].stride = state->lod[0].stride;
287*e1eccf28SAndroid Build Coastguard Worker state->lod[2].mallocPtr = ((uint8_t *)state->lod[0].mallocPtr) +
288*e1eccf28SAndroid Build Coastguard Worker (state->lod[0].stride * state->lod[0].dimY);
289*e1eccf28SAndroid Build Coastguard Worker state->lod[1].mallocPtr = ((uint8_t *)state->lod[2].mallocPtr) + 1;
290*e1eccf28SAndroid Build Coastguard Worker uvSize += state->lod[1].stride * state->lod[1].dimY;
291*e1eccf28SAndroid Build Coastguard Worker state->yuv.step = 2;
292*e1eccf28SAndroid Build Coastguard Worker break;
293*e1eccf28SAndroid Build Coastguard Worker default:
294*e1eccf28SAndroid Build Coastguard Worker rsAssert(0);
295*e1eccf28SAndroid Build Coastguard Worker }
296*e1eccf28SAndroid Build Coastguard Worker return uvSize;
297*e1eccf28SAndroid Build Coastguard Worker }
298*e1eccf28SAndroid Build Coastguard Worker
AllocationBuildPointerTable(const Context * rsc,const Allocation * alloc,const Type * type,uint8_t * ptr,size_t requiredAlignment)299*e1eccf28SAndroid Build Coastguard Worker static size_t AllocationBuildPointerTable(const Context *rsc, const Allocation *alloc,
300*e1eccf28SAndroid Build Coastguard Worker const Type *type, uint8_t *ptr, size_t requiredAlignment) {
301*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].dimX = type->getDimX();
302*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].dimY = type->getDimY();
303*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].dimZ = type->getDimZ();
304*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].mallocPtr = 0;
305*e1eccf28SAndroid Build Coastguard Worker // Stride needs to be aligned to a boundary defined by requiredAlignment!
306*e1eccf28SAndroid Build Coastguard Worker size_t stride = alloc->mHal.drvState.lod[0].dimX * type->getElementSizeBytes();
307*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].stride = rsRound(stride, requiredAlignment);
308*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lodCount = type->getLODCount();
309*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.faceCount = type->getDimFaces();
310*e1eccf28SAndroid Build Coastguard Worker
311*e1eccf28SAndroid Build Coastguard Worker size_t offsets[Allocation::MAX_LOD];
312*e1eccf28SAndroid Build Coastguard Worker memset(offsets, 0, sizeof(offsets));
313*e1eccf28SAndroid Build Coastguard Worker
314*e1eccf28SAndroid Build Coastguard Worker size_t o = alloc->mHal.drvState.lod[0].stride * rsMax(alloc->mHal.drvState.lod[0].dimY, 1u) *
315*e1eccf28SAndroid Build Coastguard Worker rsMax(alloc->mHal.drvState.lod[0].dimZ, 1u);
316*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.yuv) {
317*e1eccf28SAndroid Build Coastguard Worker o += DeriveYUVLayout(alloc->mHal.state.yuv, &alloc->mHal.drvState);
318*e1eccf28SAndroid Build Coastguard Worker
319*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct = 1; ct < alloc->mHal.drvState.lodCount; ct++) {
320*e1eccf28SAndroid Build Coastguard Worker offsets[ct] = (size_t)alloc->mHal.drvState.lod[ct].mallocPtr;
321*e1eccf28SAndroid Build Coastguard Worker }
322*e1eccf28SAndroid Build Coastguard Worker } else if(alloc->mHal.drvState.lodCount > 1) {
323*e1eccf28SAndroid Build Coastguard Worker uint32_t tx = alloc->mHal.drvState.lod[0].dimX;
324*e1eccf28SAndroid Build Coastguard Worker uint32_t ty = alloc->mHal.drvState.lod[0].dimY;
325*e1eccf28SAndroid Build Coastguard Worker uint32_t tz = alloc->mHal.drvState.lod[0].dimZ;
326*e1eccf28SAndroid Build Coastguard Worker for (uint32_t lod=1; lod < alloc->mHal.drvState.lodCount; lod++) {
327*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[lod].dimX = tx;
328*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[lod].dimY = ty;
329*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[lod].dimZ = tz;
330*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[lod].stride =
331*e1eccf28SAndroid Build Coastguard Worker rsRound(tx * type->getElementSizeBytes(), requiredAlignment);
332*e1eccf28SAndroid Build Coastguard Worker offsets[lod] = o;
333*e1eccf28SAndroid Build Coastguard Worker o += alloc->mHal.drvState.lod[lod].stride * rsMax(ty, 1u) * rsMax(tz, 1u);
334*e1eccf28SAndroid Build Coastguard Worker if (tx > 1) tx >>= 1;
335*e1eccf28SAndroid Build Coastguard Worker if (ty > 1) ty >>= 1;
336*e1eccf28SAndroid Build Coastguard Worker if (tz > 1) tz >>= 1;
337*e1eccf28SAndroid Build Coastguard Worker }
338*e1eccf28SAndroid Build Coastguard Worker }
339*e1eccf28SAndroid Build Coastguard Worker
340*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.faceOffset = o;
341*e1eccf28SAndroid Build Coastguard Worker
342*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].mallocPtr = ptr;
343*e1eccf28SAndroid Build Coastguard Worker for (uint32_t lod=1; lod < alloc->mHal.drvState.lodCount; lod++) {
344*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[lod].mallocPtr = ptr + offsets[lod];
345*e1eccf28SAndroid Build Coastguard Worker }
346*e1eccf28SAndroid Build Coastguard Worker
347*e1eccf28SAndroid Build Coastguard Worker size_t allocSize = alloc->mHal.drvState.faceOffset;
348*e1eccf28SAndroid Build Coastguard Worker if(alloc->mHal.drvState.faceCount) {
349*e1eccf28SAndroid Build Coastguard Worker allocSize *= 6;
350*e1eccf28SAndroid Build Coastguard Worker }
351*e1eccf28SAndroid Build Coastguard Worker
352*e1eccf28SAndroid Build Coastguard Worker return allocSize;
353*e1eccf28SAndroid Build Coastguard Worker }
354*e1eccf28SAndroid Build Coastguard Worker
AllocationBuildPointerTable(const Context * rsc,const Allocation * alloc,const Type * type,uint8_t * ptr)355*e1eccf28SAndroid Build Coastguard Worker static size_t AllocationBuildPointerTable(const Context *rsc, const Allocation *alloc,
356*e1eccf28SAndroid Build Coastguard Worker const Type *type, uint8_t *ptr) {
357*e1eccf28SAndroid Build Coastguard Worker return AllocationBuildPointerTable(rsc, alloc, type, ptr, Allocation::kMinimumRSAlignment);
358*e1eccf28SAndroid Build Coastguard Worker }
359*e1eccf28SAndroid Build Coastguard Worker
allocAlignedMemory(size_t allocSize,bool forceZero,size_t requiredAlignment)360*e1eccf28SAndroid Build Coastguard Worker static uint8_t* allocAlignedMemory(size_t allocSize, bool forceZero, size_t requiredAlignment) {
361*e1eccf28SAndroid Build Coastguard Worker // We align all allocations to a boundary defined by requiredAlignment.
362*e1eccf28SAndroid Build Coastguard Worker uint8_t* ptr = (uint8_t *)memalign(requiredAlignment, allocSize);
363*e1eccf28SAndroid Build Coastguard Worker if (!ptr) {
364*e1eccf28SAndroid Build Coastguard Worker return nullptr;
365*e1eccf28SAndroid Build Coastguard Worker }
366*e1eccf28SAndroid Build Coastguard Worker if (forceZero) {
367*e1eccf28SAndroid Build Coastguard Worker memset(ptr, 0, allocSize);
368*e1eccf28SAndroid Build Coastguard Worker }
369*e1eccf28SAndroid Build Coastguard Worker return ptr;
370*e1eccf28SAndroid Build Coastguard Worker }
371*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationInitStrided(const Context * rsc,Allocation * alloc,bool forceZero,size_t requiredAlignment)372*e1eccf28SAndroid Build Coastguard Worker bool rsdAllocationInitStrided(const Context *rsc, Allocation *alloc, bool forceZero, size_t requiredAlignment) {
373*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)calloc(1, sizeof(DrvAllocation));
374*e1eccf28SAndroid Build Coastguard Worker if (!drv) {
375*e1eccf28SAndroid Build Coastguard Worker return false;
376*e1eccf28SAndroid Build Coastguard Worker }
377*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drv = drv;
378*e1eccf28SAndroid Build Coastguard Worker
379*e1eccf28SAndroid Build Coastguard Worker // Check if requiredAlignment is power of 2, also requiredAlignment should be larger or equal than kMinimumRSAlignment.
380*e1eccf28SAndroid Build Coastguard Worker if ((requiredAlignment & (requiredAlignment-1)) != 0 || requiredAlignment < Allocation::kMinimumRSAlignment) {
381*e1eccf28SAndroid Build Coastguard Worker ALOGE("requiredAlignment must be power of 2");
382*e1eccf28SAndroid Build Coastguard Worker return false;
383*e1eccf28SAndroid Build Coastguard Worker }
384*e1eccf28SAndroid Build Coastguard Worker // Calculate the object size.
385*e1eccf28SAndroid Build Coastguard Worker size_t allocSize = AllocationBuildPointerTable(rsc, alloc, alloc->getType(), nullptr, requiredAlignment);
386*e1eccf28SAndroid Build Coastguard Worker
387*e1eccf28SAndroid Build Coastguard Worker uint8_t * ptr = nullptr;
388*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT) {
389*e1eccf28SAndroid Build Coastguard Worker
390*e1eccf28SAndroid Build Coastguard Worker } else if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_INPUT) {
391*e1eccf28SAndroid Build Coastguard Worker // Allocation is allocated when the surface is created
392*e1eccf28SAndroid Build Coastguard Worker // in getSurface
393*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_COMPATIBILITY_LIB
394*e1eccf28SAndroid Build Coastguard Worker } else if (alloc->mHal.state.usageFlags == (RS_ALLOCATION_USAGE_INCREMENTAL_SUPPORT | RS_ALLOCATION_USAGE_SHARED)) {
395*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.userProvidedPtr == nullptr) {
396*e1eccf28SAndroid Build Coastguard Worker ALOGE("User-backed buffer pointer cannot be null");
397*e1eccf28SAndroid Build Coastguard Worker return false;
398*e1eccf28SAndroid Build Coastguard Worker }
399*e1eccf28SAndroid Build Coastguard Worker if (alloc->getType()->getDimLOD() || alloc->getType()->getDimFaces()) {
400*e1eccf28SAndroid Build Coastguard Worker ALOGE("User-allocated buffers must not have multiple faces or LODs");
401*e1eccf28SAndroid Build Coastguard Worker return false;
402*e1eccf28SAndroid Build Coastguard Worker }
403*e1eccf28SAndroid Build Coastguard Worker
404*e1eccf28SAndroid Build Coastguard Worker drv->useUserProvidedPtr = true;
405*e1eccf28SAndroid Build Coastguard Worker ptr = (uint8_t*)alloc->mHal.state.userProvidedPtr;
406*e1eccf28SAndroid Build Coastguard Worker #endif
407*e1eccf28SAndroid Build Coastguard Worker } else if (alloc->mHal.state.userProvidedPtr != nullptr) {
408*e1eccf28SAndroid Build Coastguard Worker // user-provided allocation
409*e1eccf28SAndroid Build Coastguard Worker // limitations: no faces, no LOD, USAGE_SCRIPT or SCRIPT+TEXTURE only
410*e1eccf28SAndroid Build Coastguard Worker if (!(alloc->mHal.state.usageFlags == (RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED) ||
411*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.state.usageFlags == (RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED | RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE))) {
412*e1eccf28SAndroid Build Coastguard Worker ALOGE("Can't use user-allocated buffers if usage is not USAGE_SCRIPT | USAGE_SHARED or USAGE_SCRIPT | USAGE_SHARED | USAGE_GRAPHICS_TEXTURE");
413*e1eccf28SAndroid Build Coastguard Worker return false;
414*e1eccf28SAndroid Build Coastguard Worker }
415*e1eccf28SAndroid Build Coastguard Worker if (alloc->getType()->getDimLOD() || alloc->getType()->getDimFaces()) {
416*e1eccf28SAndroid Build Coastguard Worker ALOGE("User-allocated buffers must not have multiple faces or LODs");
417*e1eccf28SAndroid Build Coastguard Worker return false;
418*e1eccf28SAndroid Build Coastguard Worker }
419*e1eccf28SAndroid Build Coastguard Worker
420*e1eccf28SAndroid Build Coastguard Worker // rows must be aligned based on requiredAlignment.
421*e1eccf28SAndroid Build Coastguard Worker // validate that here, otherwise fall back to not use the user-backed allocation
422*e1eccf28SAndroid Build Coastguard Worker if (((alloc->getType()->getDimX() * alloc->getType()->getElement()->getSizeBytes()) % requiredAlignment) != 0) {
423*e1eccf28SAndroid Build Coastguard Worker ALOGV("User-backed allocation failed stride requirement, falling back to separate allocation");
424*e1eccf28SAndroid Build Coastguard Worker drv->useUserProvidedPtr = false;
425*e1eccf28SAndroid Build Coastguard Worker
426*e1eccf28SAndroid Build Coastguard Worker ptr = allocAlignedMemory(allocSize, forceZero, requiredAlignment);
427*e1eccf28SAndroid Build Coastguard Worker if (!ptr) {
428*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drv = nullptr;
429*e1eccf28SAndroid Build Coastguard Worker free(drv);
430*e1eccf28SAndroid Build Coastguard Worker return false;
431*e1eccf28SAndroid Build Coastguard Worker }
432*e1eccf28SAndroid Build Coastguard Worker
433*e1eccf28SAndroid Build Coastguard Worker } else {
434*e1eccf28SAndroid Build Coastguard Worker drv->useUserProvidedPtr = true;
435*e1eccf28SAndroid Build Coastguard Worker ptr = (uint8_t*)alloc->mHal.state.userProvidedPtr;
436*e1eccf28SAndroid Build Coastguard Worker }
437*e1eccf28SAndroid Build Coastguard Worker } else {
438*e1eccf28SAndroid Build Coastguard Worker ptr = allocAlignedMemory(allocSize, forceZero, requiredAlignment);
439*e1eccf28SAndroid Build Coastguard Worker if (!ptr) {
440*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drv = nullptr;
441*e1eccf28SAndroid Build Coastguard Worker free(drv);
442*e1eccf28SAndroid Build Coastguard Worker return false;
443*e1eccf28SAndroid Build Coastguard Worker }
444*e1eccf28SAndroid Build Coastguard Worker }
445*e1eccf28SAndroid Build Coastguard Worker // Build the pointer tables
446*e1eccf28SAndroid Build Coastguard Worker size_t verifySize = AllocationBuildPointerTable(rsc, alloc, alloc->getType(), ptr, requiredAlignment);
447*e1eccf28SAndroid Build Coastguard Worker if(allocSize != verifySize) {
448*e1eccf28SAndroid Build Coastguard Worker rsAssert(!"Size mismatch");
449*e1eccf28SAndroid Build Coastguard Worker }
450*e1eccf28SAndroid Build Coastguard Worker
451*e1eccf28SAndroid Build Coastguard Worker drv->glTarget = GL_NONE;
452*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) {
453*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasFaces) {
454*e1eccf28SAndroid Build Coastguard Worker drv->glTarget = GL_TEXTURE_CUBE_MAP;
455*e1eccf28SAndroid Build Coastguard Worker } else {
456*e1eccf28SAndroid Build Coastguard Worker drv->glTarget = GL_TEXTURE_2D;
457*e1eccf28SAndroid Build Coastguard Worker }
458*e1eccf28SAndroid Build Coastguard Worker } else {
459*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) {
460*e1eccf28SAndroid Build Coastguard Worker drv->glTarget = GL_ARRAY_BUFFER;
461*e1eccf28SAndroid Build Coastguard Worker }
462*e1eccf28SAndroid Build Coastguard Worker }
463*e1eccf28SAndroid Build Coastguard Worker
464*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
465*e1eccf28SAndroid Build Coastguard Worker drv->glType = rsdTypeToGLType(alloc->mHal.state.type->getElement()->getComponent().getType());
466*e1eccf28SAndroid Build Coastguard Worker drv->glFormat = rsdKindToGLFormat(alloc->mHal.state.type->getElement()->getComponent().getKind());
467*e1eccf28SAndroid Build Coastguard Worker #else
468*e1eccf28SAndroid Build Coastguard Worker drv->glType = 0;
469*e1eccf28SAndroid Build Coastguard Worker drv->glFormat = 0;
470*e1eccf28SAndroid Build Coastguard Worker #endif
471*e1eccf28SAndroid Build Coastguard Worker
472*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & ~RS_ALLOCATION_USAGE_SCRIPT) {
473*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
474*e1eccf28SAndroid Build Coastguard Worker }
475*e1eccf28SAndroid Build Coastguard Worker
476*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
477*e1eccf28SAndroid Build Coastguard Worker drv->readBackFBO = nullptr;
478*e1eccf28SAndroid Build Coastguard Worker #endif
479*e1eccf28SAndroid Build Coastguard Worker
480*e1eccf28SAndroid Build Coastguard Worker // fill out the initial state of the buffer if we couldn't use the user-provided ptr and USAGE_SHARED was accepted
481*e1eccf28SAndroid Build Coastguard Worker if ((alloc->mHal.state.userProvidedPtr != 0) && (drv->useUserProvidedPtr == false)) {
482*e1eccf28SAndroid Build Coastguard Worker rsdAllocationData2D(rsc, alloc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, alloc->getType()->getDimX(), alloc->getType()->getDimY(), alloc->mHal.state.userProvidedPtr, allocSize, 0);
483*e1eccf28SAndroid Build Coastguard Worker }
484*e1eccf28SAndroid Build Coastguard Worker
485*e1eccf28SAndroid Build Coastguard Worker
486*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_FIND_OFFSETS
487*e1eccf28SAndroid Build Coastguard Worker ALOGE("pointer for allocation: %p", alloc);
488*e1eccf28SAndroid Build Coastguard Worker ALOGE("pointer for allocation.drv: %p", &alloc->mHal.drv);
489*e1eccf28SAndroid Build Coastguard Worker #endif
490*e1eccf28SAndroid Build Coastguard Worker
491*e1eccf28SAndroid Build Coastguard Worker
492*e1eccf28SAndroid Build Coastguard Worker return true;
493*e1eccf28SAndroid Build Coastguard Worker }
494*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationInit(const Context * rsc,Allocation * alloc,bool forceZero)495*e1eccf28SAndroid Build Coastguard Worker bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) {
496*e1eccf28SAndroid Build Coastguard Worker return rsdAllocationInitStrided(rsc, alloc, forceZero, Allocation::kMinimumRSAlignment);
497*e1eccf28SAndroid Build Coastguard Worker }
498*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationAdapterOffset(const Context * rsc,const Allocation * alloc)499*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationAdapterOffset(const Context *rsc, const Allocation *alloc) {
500*e1eccf28SAndroid Build Coastguard Worker //ALOGE("rsdAllocationAdapterOffset");
501*e1eccf28SAndroid Build Coastguard Worker
502*e1eccf28SAndroid Build Coastguard Worker // Get a base pointer to the new LOD
503*e1eccf28SAndroid Build Coastguard Worker const Allocation *base = alloc->mHal.state.baseAlloc;
504*e1eccf28SAndroid Build Coastguard Worker const Type *type = alloc->mHal.state.type;
505*e1eccf28SAndroid Build Coastguard Worker if (base == nullptr) {
506*e1eccf28SAndroid Build Coastguard Worker return;
507*e1eccf28SAndroid Build Coastguard Worker }
508*e1eccf28SAndroid Build Coastguard Worker
509*e1eccf28SAndroid Build Coastguard Worker //ALOGE("rsdAllocationAdapterOffset %p %p", ptrA, ptrB);
510*e1eccf28SAndroid Build Coastguard Worker //ALOGE("rsdAllocationAdapterOffset lodCount %i", alloc->mHal.drvState.lodCount);
511*e1eccf28SAndroid Build Coastguard Worker
512*e1eccf28SAndroid Build Coastguard Worker const int lodBias = alloc->mHal.state.originLOD;
513*e1eccf28SAndroid Build Coastguard Worker uint32_t lodCount = rsMax(alloc->mHal.drvState.lodCount, (uint32_t)1);
514*e1eccf28SAndroid Build Coastguard Worker for (uint32_t lod=0; lod < lodCount; lod++) {
515*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[lod] = base->mHal.drvState.lod[lod + lodBias];
516*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[lod].mallocPtr = GetOffsetPtr(alloc,
517*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.state.originX, alloc->mHal.state.originY, alloc->mHal.state.originZ,
518*e1eccf28SAndroid Build Coastguard Worker lodBias, (RsAllocationCubemapFace)alloc->mHal.state.originFace);
519*e1eccf28SAndroid Build Coastguard Worker }
520*e1eccf28SAndroid Build Coastguard Worker }
521*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationAdapterInit(const Context * rsc,Allocation * alloc)522*e1eccf28SAndroid Build Coastguard Worker bool rsdAllocationAdapterInit(const Context *rsc, Allocation *alloc) {
523*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)calloc(1, sizeof(DrvAllocation));
524*e1eccf28SAndroid Build Coastguard Worker if (!drv) {
525*e1eccf28SAndroid Build Coastguard Worker return false;
526*e1eccf28SAndroid Build Coastguard Worker }
527*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drv = drv;
528*e1eccf28SAndroid Build Coastguard Worker
529*e1eccf28SAndroid Build Coastguard Worker // We need to build an allocation that looks like a subset of the parent allocation
530*e1eccf28SAndroid Build Coastguard Worker rsdAllocationAdapterOffset(rsc, alloc);
531*e1eccf28SAndroid Build Coastguard Worker
532*e1eccf28SAndroid Build Coastguard Worker return true;
533*e1eccf28SAndroid Build Coastguard Worker }
534*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationDestroy(const Context * rsc,Allocation * alloc)535*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationDestroy(const Context *rsc, Allocation *alloc) {
536*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
537*e1eccf28SAndroid Build Coastguard Worker
538*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.baseAlloc == nullptr) {
539*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
540*e1eccf28SAndroid Build Coastguard Worker if (drv->bufferID) {
541*e1eccf28SAndroid Build Coastguard Worker // Causes a SW crash....
542*e1eccf28SAndroid Build Coastguard Worker //ALOGV(" mBufferID %i", mBufferID);
543*e1eccf28SAndroid Build Coastguard Worker //glDeleteBuffers(1, &mBufferID);
544*e1eccf28SAndroid Build Coastguard Worker //mBufferID = 0;
545*e1eccf28SAndroid Build Coastguard Worker }
546*e1eccf28SAndroid Build Coastguard Worker if (drv->textureID) {
547*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDeleteTextures, 1, &drv->textureID);
548*e1eccf28SAndroid Build Coastguard Worker drv->textureID = 0;
549*e1eccf28SAndroid Build Coastguard Worker }
550*e1eccf28SAndroid Build Coastguard Worker if (drv->renderTargetID) {
551*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glDeleteRenderbuffers, 1, &drv->renderTargetID);
552*e1eccf28SAndroid Build Coastguard Worker drv->renderTargetID = 0;
553*e1eccf28SAndroid Build Coastguard Worker }
554*e1eccf28SAndroid Build Coastguard Worker #endif
555*e1eccf28SAndroid Build Coastguard Worker
556*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.drvState.lod[0].mallocPtr) {
557*e1eccf28SAndroid Build Coastguard Worker // don't free user-allocated ptrs or IO_OUTPUT buffers
558*e1eccf28SAndroid Build Coastguard Worker if (!(drv->useUserProvidedPtr) &&
559*e1eccf28SAndroid Build Coastguard Worker !(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_INPUT) &&
560*e1eccf28SAndroid Build Coastguard Worker !(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT)) {
561*e1eccf28SAndroid Build Coastguard Worker free(alloc->mHal.drvState.lod[0].mallocPtr);
562*e1eccf28SAndroid Build Coastguard Worker }
563*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].mallocPtr = nullptr;
564*e1eccf28SAndroid Build Coastguard Worker }
565*e1eccf28SAndroid Build Coastguard Worker
566*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
567*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_VENDOR_LIB
568*e1eccf28SAndroid Build Coastguard Worker if (drv->readBackFBO != nullptr) {
569*e1eccf28SAndroid Build Coastguard Worker delete drv->readBackFBO;
570*e1eccf28SAndroid Build Coastguard Worker drv->readBackFBO = nullptr;
571*e1eccf28SAndroid Build Coastguard Worker }
572*e1eccf28SAndroid Build Coastguard Worker #endif
573*e1eccf28SAndroid Build Coastguard Worker if ((alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT) &&
574*e1eccf28SAndroid Build Coastguard Worker (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT)) {
575*e1eccf28SAndroid Build Coastguard Worker ANativeWindow *nw = drv->wndSurface;
576*e1eccf28SAndroid Build Coastguard Worker if (nw) {
577*e1eccf28SAndroid Build Coastguard Worker //If we have an attached surface, need to release it.
578*e1eccf28SAndroid Build Coastguard Worker AHardwareBuffer* ahwb = ANativeWindowBuffer_getHardwareBuffer(drv->wndBuffer);
579*e1eccf28SAndroid Build Coastguard Worker int fenceID = -1;
580*e1eccf28SAndroid Build Coastguard Worker AHardwareBuffer_unlock(ahwb, &fenceID);
581*e1eccf28SAndroid Build Coastguard Worker ANativeWindow_cancelBuffer(nw, drv->wndBuffer, fenceID);
582*e1eccf28SAndroid Build Coastguard Worker ANativeWindow_release(nw);
583*e1eccf28SAndroid Build Coastguard Worker drv->wndSurface = nullptr;
584*e1eccf28SAndroid Build Coastguard Worker drv->wndBuffer = nullptr;
585*e1eccf28SAndroid Build Coastguard Worker }
586*e1eccf28SAndroid Build Coastguard Worker }
587*e1eccf28SAndroid Build Coastguard Worker #endif
588*e1eccf28SAndroid Build Coastguard Worker }
589*e1eccf28SAndroid Build Coastguard Worker
590*e1eccf28SAndroid Build Coastguard Worker free(drv);
591*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drv = nullptr;
592*e1eccf28SAndroid Build Coastguard Worker }
593*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationResize(const Context * rsc,const Allocation * alloc,const Type * newType,bool zeroNew)594*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationResize(const Context *rsc, const Allocation *alloc,
595*e1eccf28SAndroid Build Coastguard Worker const Type *newType, bool zeroNew) {
596*e1eccf28SAndroid Build Coastguard Worker const uint32_t oldDimX = alloc->mHal.drvState.lod[0].dimX;
597*e1eccf28SAndroid Build Coastguard Worker const uint32_t dimX = newType->getDimX();
598*e1eccf28SAndroid Build Coastguard Worker
599*e1eccf28SAndroid Build Coastguard Worker // can't resize Allocations with user-allocated buffers
600*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SHARED) {
601*e1eccf28SAndroid Build Coastguard Worker ALOGE("Resize cannot be called on a USAGE_SHARED allocation");
602*e1eccf28SAndroid Build Coastguard Worker return;
603*e1eccf28SAndroid Build Coastguard Worker }
604*e1eccf28SAndroid Build Coastguard Worker void * oldPtr = alloc->mHal.drvState.lod[0].mallocPtr;
605*e1eccf28SAndroid Build Coastguard Worker // Calculate the object size
606*e1eccf28SAndroid Build Coastguard Worker size_t s = AllocationBuildPointerTable(rsc, alloc, newType, nullptr);
607*e1eccf28SAndroid Build Coastguard Worker uint8_t *ptr = (uint8_t *)realloc(oldPtr, s);
608*e1eccf28SAndroid Build Coastguard Worker // Build the relative pointer tables.
609*e1eccf28SAndroid Build Coastguard Worker size_t verifySize = AllocationBuildPointerTable(rsc, alloc, newType, ptr);
610*e1eccf28SAndroid Build Coastguard Worker if(s != verifySize) {
611*e1eccf28SAndroid Build Coastguard Worker rsAssert(!"Size mismatch");
612*e1eccf28SAndroid Build Coastguard Worker }
613*e1eccf28SAndroid Build Coastguard Worker
614*e1eccf28SAndroid Build Coastguard Worker
615*e1eccf28SAndroid Build Coastguard Worker if (dimX > oldDimX) {
616*e1eccf28SAndroid Build Coastguard Worker size_t stride = alloc->mHal.state.elementSizeBytes;
617*e1eccf28SAndroid Build Coastguard Worker memset(((uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr) + stride * oldDimX,
618*e1eccf28SAndroid Build Coastguard Worker 0, stride * (dimX - oldDimX));
619*e1eccf28SAndroid Build Coastguard Worker }
620*e1eccf28SAndroid Build Coastguard Worker }
621*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationSyncFromFBO(const Context * rsc,const Allocation * alloc)622*e1eccf28SAndroid Build Coastguard Worker static void rsdAllocationSyncFromFBO(const Context *rsc, const Allocation *alloc) {
623*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
624*e1eccf28SAndroid Build Coastguard Worker if (!alloc->getIsScript()) {
625*e1eccf28SAndroid Build Coastguard Worker return; // nothing to sync
626*e1eccf28SAndroid Build Coastguard Worker }
627*e1eccf28SAndroid Build Coastguard Worker
628*e1eccf28SAndroid Build Coastguard Worker RsdHal *dc = (RsdHal *)rsc->mHal.drv;
629*e1eccf28SAndroid Build Coastguard Worker RsdFrameBufferObj *lastFbo = dc->gl.currentFrameBuffer;
630*e1eccf28SAndroid Build Coastguard Worker
631*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
632*e1eccf28SAndroid Build Coastguard Worker if (!drv->textureID && !drv->renderTargetID) {
633*e1eccf28SAndroid Build Coastguard Worker return; // nothing was rendered here yet, so nothing to sync
634*e1eccf28SAndroid Build Coastguard Worker }
635*e1eccf28SAndroid Build Coastguard Worker if (drv->readBackFBO == nullptr) {
636*e1eccf28SAndroid Build Coastguard Worker drv->readBackFBO = new RsdFrameBufferObj();
637*e1eccf28SAndroid Build Coastguard Worker drv->readBackFBO->setColorTarget(drv, 0);
638*e1eccf28SAndroid Build Coastguard Worker drv->readBackFBO->setDimensions(alloc->getType()->getDimX(),
639*e1eccf28SAndroid Build Coastguard Worker alloc->getType()->getDimY());
640*e1eccf28SAndroid Build Coastguard Worker }
641*e1eccf28SAndroid Build Coastguard Worker
642*e1eccf28SAndroid Build Coastguard Worker // Bind the framebuffer object so we can read back from it
643*e1eccf28SAndroid Build Coastguard Worker drv->readBackFBO->setActive(rsc);
644*e1eccf28SAndroid Build Coastguard Worker
645*e1eccf28SAndroid Build Coastguard Worker // Do the readback
646*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(glReadPixels, 0, 0, alloc->mHal.drvState.lod[0].dimX,
647*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].dimY,
648*e1eccf28SAndroid Build Coastguard Worker drv->glFormat, drv->glType, alloc->mHal.drvState.lod[0].mallocPtr);
649*e1eccf28SAndroid Build Coastguard Worker
650*e1eccf28SAndroid Build Coastguard Worker // Revert framebuffer to its original
651*e1eccf28SAndroid Build Coastguard Worker lastFbo->setActive(rsc);
652*e1eccf28SAndroid Build Coastguard Worker #endif
653*e1eccf28SAndroid Build Coastguard Worker }
654*e1eccf28SAndroid Build Coastguard Worker
655*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationSyncAll(const Context * rsc,const Allocation * alloc,RsAllocationUsageType src)656*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationSyncAll(const Context *rsc, const Allocation *alloc,
657*e1eccf28SAndroid Build Coastguard Worker RsAllocationUsageType src) {
658*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
659*e1eccf28SAndroid Build Coastguard Worker
660*e1eccf28SAndroid Build Coastguard Worker if (src == RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
661*e1eccf28SAndroid Build Coastguard Worker if(!alloc->getIsRenderTarget()) {
662*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_FATAL_DRIVER,
663*e1eccf28SAndroid Build Coastguard Worker "Attempting to sync allocation from render target, "
664*e1eccf28SAndroid Build Coastguard Worker "for non-render target allocation");
665*e1eccf28SAndroid Build Coastguard Worker } else if (alloc->getType()->getElement()->getKind() != RS_KIND_PIXEL_RGBA) {
666*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_FATAL_DRIVER, "Cannot only sync from RGBA"
667*e1eccf28SAndroid Build Coastguard Worker "render target");
668*e1eccf28SAndroid Build Coastguard Worker } else {
669*e1eccf28SAndroid Build Coastguard Worker rsdAllocationSyncFromFBO(rsc, alloc);
670*e1eccf28SAndroid Build Coastguard Worker }
671*e1eccf28SAndroid Build Coastguard Worker return;
672*e1eccf28SAndroid Build Coastguard Worker }
673*e1eccf28SAndroid Build Coastguard Worker
674*e1eccf28SAndroid Build Coastguard Worker rsAssert(src == RS_ALLOCATION_USAGE_SCRIPT || src == RS_ALLOCATION_USAGE_SHARED);
675*e1eccf28SAndroid Build Coastguard Worker
676*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) {
677*e1eccf28SAndroid Build Coastguard Worker UploadToTexture(rsc, alloc);
678*e1eccf28SAndroid Build Coastguard Worker } else {
679*e1eccf28SAndroid Build Coastguard Worker if ((alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) &&
680*e1eccf28SAndroid Build Coastguard Worker !(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT)) {
681*e1eccf28SAndroid Build Coastguard Worker AllocateRenderTarget(rsc, alloc);
682*e1eccf28SAndroid Build Coastguard Worker }
683*e1eccf28SAndroid Build Coastguard Worker }
684*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) {
685*e1eccf28SAndroid Build Coastguard Worker UploadToBufferObject(rsc, alloc);
686*e1eccf28SAndroid Build Coastguard Worker }
687*e1eccf28SAndroid Build Coastguard Worker
688*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SHARED) {
689*e1eccf28SAndroid Build Coastguard Worker
690*e1eccf28SAndroid Build Coastguard Worker if (src == RS_ALLOCATION_USAGE_SHARED) {
691*e1eccf28SAndroid Build Coastguard Worker // just a memory fence for the CPU driver
692*e1eccf28SAndroid Build Coastguard Worker // vendor drivers probably want to flush any dirty cachelines for
693*e1eccf28SAndroid Build Coastguard Worker // this particular Allocation
694*e1eccf28SAndroid Build Coastguard Worker __sync_synchronize();
695*e1eccf28SAndroid Build Coastguard Worker }
696*e1eccf28SAndroid Build Coastguard Worker }
697*e1eccf28SAndroid Build Coastguard Worker
698*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = false;
699*e1eccf28SAndroid Build Coastguard Worker }
700*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationMarkDirty(const Context * rsc,const Allocation * alloc)701*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationMarkDirty(const Context *rsc, const Allocation *alloc) {
702*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
703*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
704*e1eccf28SAndroid Build Coastguard Worker }
705*e1eccf28SAndroid Build Coastguard Worker
706*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
IoGetBuffer(const Context * rsc,Allocation * alloc,ANativeWindow * nw)707*e1eccf28SAndroid Build Coastguard Worker static bool IoGetBuffer(const Context *rsc, Allocation *alloc, ANativeWindow *nw) {
708*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
709*e1eccf28SAndroid Build Coastguard Worker // Must lock the whole surface
710*e1eccf28SAndroid Build Coastguard Worker int fenceID = -1;
711*e1eccf28SAndroid Build Coastguard Worker int r = ANativeWindow_dequeueBuffer(nw, &drv->wndBuffer, &fenceID);
712*e1eccf28SAndroid Build Coastguard Worker if (r) {
713*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error dequeueing IO output buffer.");
714*e1eccf28SAndroid Build Coastguard Worker close(fenceID);
715*e1eccf28SAndroid Build Coastguard Worker return false;
716*e1eccf28SAndroid Build Coastguard Worker }
717*e1eccf28SAndroid Build Coastguard Worker
718*e1eccf28SAndroid Build Coastguard Worker void *dst = nullptr;
719*e1eccf28SAndroid Build Coastguard Worker AHardwareBuffer* ahwb = ANativeWindowBuffer_getHardwareBuffer(drv->wndBuffer);
720*e1eccf28SAndroid Build Coastguard Worker r = AHardwareBuffer_lock(ahwb, AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN,
721*e1eccf28SAndroid Build Coastguard Worker fenceID, NULL, &dst);
722*e1eccf28SAndroid Build Coastguard Worker if (r) {
723*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error Locking IO output buffer.");
724*e1eccf28SAndroid Build Coastguard Worker return false;
725*e1eccf28SAndroid Build Coastguard Worker }
726*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].mallocPtr = dst;
727*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].stride = drv->wndBuffer->stride * alloc->mHal.state.elementSizeBytes;
728*e1eccf28SAndroid Build Coastguard Worker rsAssert((alloc->mHal.drvState.lod[0].stride & 0xf) == 0);
729*e1eccf28SAndroid Build Coastguard Worker
730*e1eccf28SAndroid Build Coastguard Worker return true;
731*e1eccf28SAndroid Build Coastguard Worker }
732*e1eccf28SAndroid Build Coastguard Worker #endif
733*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationSetSurface(const Context * rsc,Allocation * alloc,ANativeWindow * nw)734*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationSetSurface(const Context *rsc, Allocation *alloc, ANativeWindow *nw) {
735*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
736*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
737*e1eccf28SAndroid Build Coastguard Worker
738*e1eccf28SAndroid Build Coastguard Worker // Cleanup old surface if there is one.
739*e1eccf28SAndroid Build Coastguard Worker if (drv->wndSurface) {
740*e1eccf28SAndroid Build Coastguard Worker ANativeWindow *old = drv->wndSurface;
741*e1eccf28SAndroid Build Coastguard Worker AHardwareBuffer* ahwb = ANativeWindowBuffer_getHardwareBuffer(drv->wndBuffer);
742*e1eccf28SAndroid Build Coastguard Worker int fenceID = -1;
743*e1eccf28SAndroid Build Coastguard Worker int32_t r = AHardwareBuffer_unlock(ahwb, &fenceID);
744*e1eccf28SAndroid Build Coastguard Worker if (r) {
745*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error unlocking output buffer.");
746*e1eccf28SAndroid Build Coastguard Worker close(fenceID);
747*e1eccf28SAndroid Build Coastguard Worker return;
748*e1eccf28SAndroid Build Coastguard Worker }
749*e1eccf28SAndroid Build Coastguard Worker r = ANativeWindow_cancelBuffer(old, drv->wndBuffer, fenceID);
750*e1eccf28SAndroid Build Coastguard Worker if (r) {
751*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error canceling output buffer.");
752*e1eccf28SAndroid Build Coastguard Worker return;
753*e1eccf28SAndroid Build Coastguard Worker }
754*e1eccf28SAndroid Build Coastguard Worker ANativeWindow_release(old);
755*e1eccf28SAndroid Build Coastguard Worker drv->wndSurface = nullptr;
756*e1eccf28SAndroid Build Coastguard Worker drv->wndBuffer = nullptr;
757*e1eccf28SAndroid Build Coastguard Worker }
758*e1eccf28SAndroid Build Coastguard Worker
759*e1eccf28SAndroid Build Coastguard Worker if (nw) {
760*e1eccf28SAndroid Build Coastguard Worker int32_t r = ANativeWindow_setBuffersGeometry(nw, alloc->mHal.drvState.lod[0].dimX,
761*e1eccf28SAndroid Build Coastguard Worker alloc->mHal.drvState.lod[0].dimY,
762*e1eccf28SAndroid Build Coastguard Worker WINDOW_FORMAT_RGBA_8888);
763*e1eccf28SAndroid Build Coastguard Worker if (r) {
764*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer geometry.");
765*e1eccf28SAndroid Build Coastguard Worker return;
766*e1eccf28SAndroid Build Coastguard Worker }
767*e1eccf28SAndroid Build Coastguard Worker
768*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) {
769*e1eccf28SAndroid Build Coastguard Worker r = ANativeWindow_setUsage(nw,
770*e1eccf28SAndroid Build Coastguard Worker AHARDWAREBUFFER_USAGE_CPU_READ_RARELY | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN);
771*e1eccf28SAndroid Build Coastguard Worker if (r) {
772*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer usage.");
773*e1eccf28SAndroid Build Coastguard Worker return;
774*e1eccf28SAndroid Build Coastguard Worker }
775*e1eccf28SAndroid Build Coastguard Worker }
776*e1eccf28SAndroid Build Coastguard Worker
777*e1eccf28SAndroid Build Coastguard Worker IoGetBuffer(rsc, alloc, nw);
778*e1eccf28SAndroid Build Coastguard Worker drv->wndSurface = nw;
779*e1eccf28SAndroid Build Coastguard Worker }
780*e1eccf28SAndroid Build Coastguard Worker
781*e1eccf28SAndroid Build Coastguard Worker return;
782*e1eccf28SAndroid Build Coastguard Worker #endif
783*e1eccf28SAndroid Build Coastguard Worker }
784*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationIoSend(const Context * rsc,Allocation * alloc)785*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationIoSend(const Context *rsc, Allocation *alloc) {
786*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
787*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
788*e1eccf28SAndroid Build Coastguard Worker ANativeWindow *nw = drv->wndSurface;
789*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_VENDOR_LIB
790*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
791*e1eccf28SAndroid Build Coastguard Worker RsdHal *dc = (RsdHal *)rsc->mHal.drv;
792*e1eccf28SAndroid Build Coastguard Worker RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface);
793*e1eccf28SAndroid Build Coastguard Worker return;
794*e1eccf28SAndroid Build Coastguard Worker }
795*e1eccf28SAndroid Build Coastguard Worker #endif
796*e1eccf28SAndroid Build Coastguard Worker if (nw) {
797*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) {
798*e1eccf28SAndroid Build Coastguard Worker AHardwareBuffer* ahwb = ANativeWindowBuffer_getHardwareBuffer(drv->wndBuffer);
799*e1eccf28SAndroid Build Coastguard Worker int fenceID = -1;
800*e1eccf28SAndroid Build Coastguard Worker int32_t r = AHardwareBuffer_unlock(ahwb, &fenceID);
801*e1eccf28SAndroid Build Coastguard Worker if (r) {
802*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error unlock output buffer.");
803*e1eccf28SAndroid Build Coastguard Worker close(fenceID);
804*e1eccf28SAndroid Build Coastguard Worker return;
805*e1eccf28SAndroid Build Coastguard Worker }
806*e1eccf28SAndroid Build Coastguard Worker r = ANativeWindow_queueBuffer(nw, drv->wndBuffer, fenceID);
807*e1eccf28SAndroid Build Coastguard Worker if (r) {
808*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Error sending IO output buffer.");
809*e1eccf28SAndroid Build Coastguard Worker return;
810*e1eccf28SAndroid Build Coastguard Worker }
811*e1eccf28SAndroid Build Coastguard Worker drv->wndBuffer = nullptr;
812*e1eccf28SAndroid Build Coastguard Worker IoGetBuffer(rsc, alloc, nw);
813*e1eccf28SAndroid Build Coastguard Worker }
814*e1eccf28SAndroid Build Coastguard Worker } else {
815*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_DRIVER, "Sent IO buffer with no attached surface.");
816*e1eccf28SAndroid Build Coastguard Worker return;
817*e1eccf28SAndroid Build Coastguard Worker }
818*e1eccf28SAndroid Build Coastguard Worker #endif
819*e1eccf28SAndroid Build Coastguard Worker }
820*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationIoReceive(const Context * rsc,Allocation * alloc)821*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationIoReceive(const Context *rsc, Allocation *alloc) {
822*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.yuv) {
823*e1eccf28SAndroid Build Coastguard Worker DeriveYUVLayout(alloc->mHal.state.yuv, &alloc->mHal.drvState);
824*e1eccf28SAndroid Build Coastguard Worker }
825*e1eccf28SAndroid Build Coastguard Worker }
826*e1eccf28SAndroid Build Coastguard Worker
827*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData1D(const Context * rsc,const Allocation * alloc,uint32_t xoff,uint32_t lod,size_t count,const void * data,size_t sizeBytes)828*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData1D(const Context *rsc, const Allocation *alloc,
829*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t lod, size_t count,
830*e1eccf28SAndroid Build Coastguard Worker const void *data, size_t sizeBytes) {
831*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
832*e1eccf28SAndroid Build Coastguard Worker
833*e1eccf28SAndroid Build Coastguard Worker const size_t eSize = alloc->mHal.state.type->getElementSizeBytes();
834*e1eccf28SAndroid Build Coastguard Worker uint8_t * ptr = GetOffsetPtr(alloc, xoff, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
835*e1eccf28SAndroid Build Coastguard Worker size_t size = count * eSize;
836*e1eccf28SAndroid Build Coastguard Worker if (ptr != data) {
837*e1eccf28SAndroid Build Coastguard Worker // Skip the copy if we are the same allocation. This can arise from
838*e1eccf28SAndroid Build Coastguard Worker // our Bitmap optimization, where we share the same storage.
839*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasReferences) {
840*e1eccf28SAndroid Build Coastguard Worker alloc->incRefs(data, count);
841*e1eccf28SAndroid Build Coastguard Worker alloc->decRefs(ptr, count);
842*e1eccf28SAndroid Build Coastguard Worker }
843*e1eccf28SAndroid Build Coastguard Worker memcpy(ptr, data, size);
844*e1eccf28SAndroid Build Coastguard Worker }
845*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
846*e1eccf28SAndroid Build Coastguard Worker }
847*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData2D(const Context * rsc,const Allocation * alloc,uint32_t xoff,uint32_t yoff,uint32_t lod,RsAllocationCubemapFace face,uint32_t w,uint32_t h,const void * data,size_t sizeBytes,size_t stride)848*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData2D(const Context *rsc, const Allocation *alloc,
849*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
850*e1eccf28SAndroid Build Coastguard Worker uint32_t w, uint32_t h, const void *data, size_t sizeBytes, size_t stride) {
851*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
852*e1eccf28SAndroid Build Coastguard Worker
853*e1eccf28SAndroid Build Coastguard Worker size_t eSize = alloc->mHal.state.elementSizeBytes;
854*e1eccf28SAndroid Build Coastguard Worker size_t lineSize = eSize * w;
855*e1eccf28SAndroid Build Coastguard Worker if (!stride) {
856*e1eccf28SAndroid Build Coastguard Worker stride = lineSize;
857*e1eccf28SAndroid Build Coastguard Worker }
858*e1eccf28SAndroid Build Coastguard Worker
859*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.drvState.lod[0].mallocPtr) {
860*e1eccf28SAndroid Build Coastguard Worker const uint8_t *src = static_cast<const uint8_t *>(data);
861*e1eccf28SAndroid Build Coastguard Worker uint8_t *dst = GetOffsetPtr(alloc, xoff, yoff, 0, lod, face);
862*e1eccf28SAndroid Build Coastguard Worker if (dst == src) {
863*e1eccf28SAndroid Build Coastguard Worker // Skip the copy if we are the same allocation. This can arise from
864*e1eccf28SAndroid Build Coastguard Worker // our Bitmap optimization, where we share the same storage.
865*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
866*e1eccf28SAndroid Build Coastguard Worker return;
867*e1eccf28SAndroid Build Coastguard Worker }
868*e1eccf28SAndroid Build Coastguard Worker
869*e1eccf28SAndroid Build Coastguard Worker for (uint32_t line=yoff; line < (yoff+h); line++) {
870*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasReferences) {
871*e1eccf28SAndroid Build Coastguard Worker alloc->incRefs(src, w);
872*e1eccf28SAndroid Build Coastguard Worker alloc->decRefs(dst, w);
873*e1eccf28SAndroid Build Coastguard Worker }
874*e1eccf28SAndroid Build Coastguard Worker memcpy(dst, src, lineSize);
875*e1eccf28SAndroid Build Coastguard Worker src += stride;
876*e1eccf28SAndroid Build Coastguard Worker dst += alloc->mHal.drvState.lod[lod].stride;
877*e1eccf28SAndroid Build Coastguard Worker }
878*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.yuv) {
879*e1eccf28SAndroid Build Coastguard Worker size_t clineSize = lineSize;
880*e1eccf28SAndroid Build Coastguard Worker int lod = 1;
881*e1eccf28SAndroid Build Coastguard Worker int maxLod = 2;
882*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.yuv == RS_YUV_YV12) {
883*e1eccf28SAndroid Build Coastguard Worker maxLod = 3;
884*e1eccf28SAndroid Build Coastguard Worker clineSize >>= 1;
885*e1eccf28SAndroid Build Coastguard Worker } else if (alloc->mHal.state.yuv == RS_YUV_NV21) {
886*e1eccf28SAndroid Build Coastguard Worker lod = 2;
887*e1eccf28SAndroid Build Coastguard Worker maxLod = 3;
888*e1eccf28SAndroid Build Coastguard Worker }
889*e1eccf28SAndroid Build Coastguard Worker
890*e1eccf28SAndroid Build Coastguard Worker while (lod < maxLod) {
891*e1eccf28SAndroid Build Coastguard Worker uint8_t *dst = GetOffsetPtr(alloc, xoff, yoff, 0, lod, face);
892*e1eccf28SAndroid Build Coastguard Worker
893*e1eccf28SAndroid Build Coastguard Worker for (uint32_t line=(yoff >> 1); line < ((yoff+h)>>1); line++) {
894*e1eccf28SAndroid Build Coastguard Worker memcpy(dst, src, clineSize);
895*e1eccf28SAndroid Build Coastguard Worker // When copying from an array to an Allocation, the src pointer
896*e1eccf28SAndroid Build Coastguard Worker // to the array should just move by the number of bytes copied.
897*e1eccf28SAndroid Build Coastguard Worker src += clineSize;
898*e1eccf28SAndroid Build Coastguard Worker dst += alloc->mHal.drvState.lod[lod].stride;
899*e1eccf28SAndroid Build Coastguard Worker }
900*e1eccf28SAndroid Build Coastguard Worker lod++;
901*e1eccf28SAndroid Build Coastguard Worker }
902*e1eccf28SAndroid Build Coastguard Worker
903*e1eccf28SAndroid Build Coastguard Worker }
904*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
905*e1eccf28SAndroid Build Coastguard Worker } else {
906*e1eccf28SAndroid Build Coastguard Worker Update2DTexture(rsc, alloc, data, xoff, yoff, lod, face, w, h);
907*e1eccf28SAndroid Build Coastguard Worker }
908*e1eccf28SAndroid Build Coastguard Worker }
909*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData3D(const Context * rsc,const Allocation * alloc,uint32_t xoff,uint32_t yoff,uint32_t zoff,uint32_t lod,uint32_t w,uint32_t h,uint32_t d,const void * data,size_t sizeBytes,size_t stride)910*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData3D(const Context *rsc, const Allocation *alloc,
911*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t yoff, uint32_t zoff,
912*e1eccf28SAndroid Build Coastguard Worker uint32_t lod,
913*e1eccf28SAndroid Build Coastguard Worker uint32_t w, uint32_t h, uint32_t d, const void *data,
914*e1eccf28SAndroid Build Coastguard Worker size_t sizeBytes, size_t stride) {
915*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
916*e1eccf28SAndroid Build Coastguard Worker
917*e1eccf28SAndroid Build Coastguard Worker uint32_t eSize = alloc->mHal.state.elementSizeBytes;
918*e1eccf28SAndroid Build Coastguard Worker uint32_t lineSize = eSize * w;
919*e1eccf28SAndroid Build Coastguard Worker if (!stride) {
920*e1eccf28SAndroid Build Coastguard Worker stride = lineSize;
921*e1eccf28SAndroid Build Coastguard Worker }
922*e1eccf28SAndroid Build Coastguard Worker
923*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.drvState.lod[0].mallocPtr) {
924*e1eccf28SAndroid Build Coastguard Worker const uint8_t *src = static_cast<const uint8_t *>(data);
925*e1eccf28SAndroid Build Coastguard Worker for (uint32_t z = zoff; z < (d + zoff); z++) {
926*e1eccf28SAndroid Build Coastguard Worker uint8_t *dst = GetOffsetPtr(alloc, xoff, yoff, z, lod,
927*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
928*e1eccf28SAndroid Build Coastguard Worker if (dst == src) {
929*e1eccf28SAndroid Build Coastguard Worker // Skip the copy if we are the same allocation. This can arise from
930*e1eccf28SAndroid Build Coastguard Worker // our Bitmap optimization, where we share the same storage.
931*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
932*e1eccf28SAndroid Build Coastguard Worker return;
933*e1eccf28SAndroid Build Coastguard Worker }
934*e1eccf28SAndroid Build Coastguard Worker
935*e1eccf28SAndroid Build Coastguard Worker for (uint32_t line=yoff; line < (yoff+h); line++) {
936*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasReferences) {
937*e1eccf28SAndroid Build Coastguard Worker alloc->incRefs(src, w);
938*e1eccf28SAndroid Build Coastguard Worker alloc->decRefs(dst, w);
939*e1eccf28SAndroid Build Coastguard Worker }
940*e1eccf28SAndroid Build Coastguard Worker memcpy(dst, src, lineSize);
941*e1eccf28SAndroid Build Coastguard Worker src += stride;
942*e1eccf28SAndroid Build Coastguard Worker dst += alloc->mHal.drvState.lod[lod].stride;
943*e1eccf28SAndroid Build Coastguard Worker }
944*e1eccf28SAndroid Build Coastguard Worker }
945*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
946*e1eccf28SAndroid Build Coastguard Worker }
947*e1eccf28SAndroid Build Coastguard Worker }
948*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationRead1D(const Context * rsc,const Allocation * alloc,uint32_t xoff,uint32_t lod,size_t count,void * data,size_t sizeBytes)949*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationRead1D(const Context *rsc, const Allocation *alloc,
950*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t lod, size_t count,
951*e1eccf28SAndroid Build Coastguard Worker void *data, size_t sizeBytes) {
952*e1eccf28SAndroid Build Coastguard Worker const size_t eSize = alloc->mHal.state.type->getElementSizeBytes();
953*e1eccf28SAndroid Build Coastguard Worker const uint8_t * ptr = GetOffsetPtr(alloc, xoff, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
954*e1eccf28SAndroid Build Coastguard Worker if (data != ptr) {
955*e1eccf28SAndroid Build Coastguard Worker // Skip the copy if we are the same allocation. This can arise from
956*e1eccf28SAndroid Build Coastguard Worker // our Bitmap optimization, where we share the same storage.
957*e1eccf28SAndroid Build Coastguard Worker memcpy(data, ptr, count * eSize);
958*e1eccf28SAndroid Build Coastguard Worker }
959*e1eccf28SAndroid Build Coastguard Worker }
960*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationRead2D(const Context * rsc,const Allocation * alloc,uint32_t xoff,uint32_t yoff,uint32_t lod,RsAllocationCubemapFace face,uint32_t w,uint32_t h,void * data,size_t sizeBytes,size_t stride)961*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationRead2D(const Context *rsc, const Allocation *alloc,
962*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
963*e1eccf28SAndroid Build Coastguard Worker uint32_t w, uint32_t h, void *data, size_t sizeBytes, size_t stride) {
964*e1eccf28SAndroid Build Coastguard Worker size_t eSize = alloc->mHal.state.elementSizeBytes;
965*e1eccf28SAndroid Build Coastguard Worker size_t lineSize = eSize * w;
966*e1eccf28SAndroid Build Coastguard Worker if (!stride) {
967*e1eccf28SAndroid Build Coastguard Worker stride = lineSize;
968*e1eccf28SAndroid Build Coastguard Worker }
969*e1eccf28SAndroid Build Coastguard Worker
970*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.drvState.lod[0].mallocPtr) {
971*e1eccf28SAndroid Build Coastguard Worker uint8_t *dst = static_cast<uint8_t *>(data);
972*e1eccf28SAndroid Build Coastguard Worker const uint8_t *src = GetOffsetPtr(alloc, xoff, yoff, 0, lod, face);
973*e1eccf28SAndroid Build Coastguard Worker if (dst == src) {
974*e1eccf28SAndroid Build Coastguard Worker // Skip the copy if we are the same allocation. This can arise from
975*e1eccf28SAndroid Build Coastguard Worker // our Bitmap optimization, where we share the same storage.
976*e1eccf28SAndroid Build Coastguard Worker return;
977*e1eccf28SAndroid Build Coastguard Worker }
978*e1eccf28SAndroid Build Coastguard Worker
979*e1eccf28SAndroid Build Coastguard Worker for (uint32_t line=yoff; line < (yoff+h); line++) {
980*e1eccf28SAndroid Build Coastguard Worker memcpy(dst, src, lineSize);
981*e1eccf28SAndroid Build Coastguard Worker dst += stride;
982*e1eccf28SAndroid Build Coastguard Worker src += alloc->mHal.drvState.lod[lod].stride;
983*e1eccf28SAndroid Build Coastguard Worker }
984*e1eccf28SAndroid Build Coastguard Worker } else {
985*e1eccf28SAndroid Build Coastguard Worker ALOGE("Add code to readback from non-script memory");
986*e1eccf28SAndroid Build Coastguard Worker }
987*e1eccf28SAndroid Build Coastguard Worker }
988*e1eccf28SAndroid Build Coastguard Worker
989*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationRead3D(const Context * rsc,const Allocation * alloc,uint32_t xoff,uint32_t yoff,uint32_t zoff,uint32_t lod,uint32_t w,uint32_t h,uint32_t d,void * data,size_t sizeBytes,size_t stride)990*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationRead3D(const Context *rsc, const Allocation *alloc,
991*e1eccf28SAndroid Build Coastguard Worker uint32_t xoff, uint32_t yoff, uint32_t zoff,
992*e1eccf28SAndroid Build Coastguard Worker uint32_t lod,
993*e1eccf28SAndroid Build Coastguard Worker uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes, size_t stride) {
994*e1eccf28SAndroid Build Coastguard Worker uint32_t eSize = alloc->mHal.state.elementSizeBytes;
995*e1eccf28SAndroid Build Coastguard Worker uint32_t lineSize = eSize * w;
996*e1eccf28SAndroid Build Coastguard Worker if (!stride) {
997*e1eccf28SAndroid Build Coastguard Worker stride = lineSize;
998*e1eccf28SAndroid Build Coastguard Worker }
999*e1eccf28SAndroid Build Coastguard Worker
1000*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.drvState.lod[0].mallocPtr) {
1001*e1eccf28SAndroid Build Coastguard Worker uint8_t *dst = static_cast<uint8_t *>(data);
1002*e1eccf28SAndroid Build Coastguard Worker for (uint32_t z = zoff; z < (d + zoff); z++) {
1003*e1eccf28SAndroid Build Coastguard Worker const uint8_t *src = GetOffsetPtr(alloc, xoff, yoff, z, lod,
1004*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
1005*e1eccf28SAndroid Build Coastguard Worker if (dst == src) {
1006*e1eccf28SAndroid Build Coastguard Worker // Skip the copy if we are the same allocation. This can arise from
1007*e1eccf28SAndroid Build Coastguard Worker // our Bitmap optimization, where we share the same storage.
1008*e1eccf28SAndroid Build Coastguard Worker return;
1009*e1eccf28SAndroid Build Coastguard Worker }
1010*e1eccf28SAndroid Build Coastguard Worker
1011*e1eccf28SAndroid Build Coastguard Worker for (uint32_t line=yoff; line < (yoff+h); line++) {
1012*e1eccf28SAndroid Build Coastguard Worker memcpy(dst, src, lineSize);
1013*e1eccf28SAndroid Build Coastguard Worker dst += stride;
1014*e1eccf28SAndroid Build Coastguard Worker src += alloc->mHal.drvState.lod[lod].stride;
1015*e1eccf28SAndroid Build Coastguard Worker }
1016*e1eccf28SAndroid Build Coastguard Worker }
1017*e1eccf28SAndroid Build Coastguard Worker }
1018*e1eccf28SAndroid Build Coastguard Worker }
1019*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationLock1D(const android::renderscript::Context * rsc,const android::renderscript::Allocation * alloc)1020*e1eccf28SAndroid Build Coastguard Worker void * rsdAllocationLock1D(const android::renderscript::Context *rsc,
1021*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *alloc) {
1022*e1eccf28SAndroid Build Coastguard Worker return alloc->mHal.drvState.lod[0].mallocPtr;
1023*e1eccf28SAndroid Build Coastguard Worker }
1024*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationUnlock1D(const android::renderscript::Context * rsc,const android::renderscript::Allocation * alloc)1025*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationUnlock1D(const android::renderscript::Context *rsc,
1026*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *alloc) {
1027*e1eccf28SAndroid Build Coastguard Worker
1028*e1eccf28SAndroid Build Coastguard Worker }
1029*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData1D_alloc(const android::renderscript::Context * rsc,const android::renderscript::Allocation * dstAlloc,uint32_t dstXoff,uint32_t dstLod,size_t count,const android::renderscript::Allocation * srcAlloc,uint32_t srcXoff,uint32_t srcLod)1030*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData1D_alloc(const android::renderscript::Context *rsc,
1031*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *dstAlloc,
1032*e1eccf28SAndroid Build Coastguard Worker uint32_t dstXoff, uint32_t dstLod, size_t count,
1033*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *srcAlloc,
1034*e1eccf28SAndroid Build Coastguard Worker uint32_t srcXoff, uint32_t srcLod) {
1035*e1eccf28SAndroid Build Coastguard Worker }
1036*e1eccf28SAndroid Build Coastguard Worker
1037*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData2D_alloc_script(const android::renderscript::Context * rsc,const android::renderscript::Allocation * dstAlloc,uint32_t dstXoff,uint32_t dstYoff,uint32_t dstLod,RsAllocationCubemapFace dstFace,uint32_t w,uint32_t h,const android::renderscript::Allocation * srcAlloc,uint32_t srcXoff,uint32_t srcYoff,uint32_t srcLod,RsAllocationCubemapFace srcFace)1038*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData2D_alloc_script(const android::renderscript::Context *rsc,
1039*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *dstAlloc,
1040*e1eccf28SAndroid Build Coastguard Worker uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
1041*e1eccf28SAndroid Build Coastguard Worker RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
1042*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *srcAlloc,
1043*e1eccf28SAndroid Build Coastguard Worker uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
1044*e1eccf28SAndroid Build Coastguard Worker RsAllocationCubemapFace srcFace) {
1045*e1eccf28SAndroid Build Coastguard Worker size_t elementSize = dstAlloc->getType()->getElementSizeBytes();
1046*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < h; i ++) {
1047*e1eccf28SAndroid Build Coastguard Worker uint8_t *dstPtr = GetOffsetPtr(dstAlloc, dstXoff, dstYoff + i, 0, dstLod, dstFace);
1048*e1eccf28SAndroid Build Coastguard Worker uint8_t *srcPtr = GetOffsetPtr(srcAlloc, srcXoff, srcYoff + i, 0, srcLod, srcFace);
1049*e1eccf28SAndroid Build Coastguard Worker memcpy(dstPtr, srcPtr, w * elementSize);
1050*e1eccf28SAndroid Build Coastguard Worker
1051*e1eccf28SAndroid Build Coastguard Worker //ALOGE("COPIED dstXoff(%u), dstYoff(%u), dstLod(%u), dstFace(%u), w(%u), h(%u), srcXoff(%u), srcYoff(%u), srcLod(%u), srcFace(%u)",
1052*e1eccf28SAndroid Build Coastguard Worker // dstXoff, dstYoff, dstLod, dstFace, w, h, srcXoff, srcYoff, srcLod, srcFace);
1053*e1eccf28SAndroid Build Coastguard Worker }
1054*e1eccf28SAndroid Build Coastguard Worker }
1055*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData3D_alloc_script(const android::renderscript::Context * rsc,const android::renderscript::Allocation * dstAlloc,uint32_t dstXoff,uint32_t dstYoff,uint32_t dstZoff,uint32_t dstLod,uint32_t w,uint32_t h,uint32_t d,const android::renderscript::Allocation * srcAlloc,uint32_t srcXoff,uint32_t srcYoff,uint32_t srcZoff,uint32_t srcLod)1056*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData3D_alloc_script(const android::renderscript::Context *rsc,
1057*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *dstAlloc,
1058*e1eccf28SAndroid Build Coastguard Worker uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, uint32_t dstLod,
1059*e1eccf28SAndroid Build Coastguard Worker uint32_t w, uint32_t h, uint32_t d,
1060*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *srcAlloc,
1061*e1eccf28SAndroid Build Coastguard Worker uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, uint32_t srcLod) {
1062*e1eccf28SAndroid Build Coastguard Worker uint32_t elementSize = dstAlloc->getType()->getElementSizeBytes();
1063*e1eccf28SAndroid Build Coastguard Worker for (uint32_t j = 0; j < d; j++) {
1064*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < h; i ++) {
1065*e1eccf28SAndroid Build Coastguard Worker uint8_t *dstPtr = GetOffsetPtr(dstAlloc, dstXoff, dstYoff + i, dstZoff + j,
1066*e1eccf28SAndroid Build Coastguard Worker dstLod, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
1067*e1eccf28SAndroid Build Coastguard Worker uint8_t *srcPtr = GetOffsetPtr(srcAlloc, srcXoff, srcYoff + i, srcZoff + j,
1068*e1eccf28SAndroid Build Coastguard Worker srcLod, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
1069*e1eccf28SAndroid Build Coastguard Worker memcpy(dstPtr, srcPtr, w * elementSize);
1070*e1eccf28SAndroid Build Coastguard Worker
1071*e1eccf28SAndroid Build Coastguard Worker //ALOGE("COPIED dstXoff(%u), dstYoff(%u), dstLod(%u), dstFace(%u), w(%u), h(%u), srcXoff(%u), srcYoff(%u), srcLod(%u), srcFace(%u)",
1072*e1eccf28SAndroid Build Coastguard Worker // dstXoff, dstYoff, dstLod, dstFace, w, h, srcXoff, srcYoff, srcLod, srcFace);
1073*e1eccf28SAndroid Build Coastguard Worker }
1074*e1eccf28SAndroid Build Coastguard Worker }
1075*e1eccf28SAndroid Build Coastguard Worker }
1076*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData2D_alloc(const android::renderscript::Context * rsc,const android::renderscript::Allocation * dstAlloc,uint32_t dstXoff,uint32_t dstYoff,uint32_t dstLod,RsAllocationCubemapFace dstFace,uint32_t w,uint32_t h,const android::renderscript::Allocation * srcAlloc,uint32_t srcXoff,uint32_t srcYoff,uint32_t srcLod,RsAllocationCubemapFace srcFace)1077*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData2D_alloc(const android::renderscript::Context *rsc,
1078*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *dstAlloc,
1079*e1eccf28SAndroid Build Coastguard Worker uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
1080*e1eccf28SAndroid Build Coastguard Worker RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
1081*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *srcAlloc,
1082*e1eccf28SAndroid Build Coastguard Worker uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
1083*e1eccf28SAndroid Build Coastguard Worker RsAllocationCubemapFace srcFace) {
1084*e1eccf28SAndroid Build Coastguard Worker if (!dstAlloc->getIsScript() && !srcAlloc->getIsScript()) {
1085*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_FATAL_DRIVER, "Non-script allocation copies not "
1086*e1eccf28SAndroid Build Coastguard Worker "yet implemented.");
1087*e1eccf28SAndroid Build Coastguard Worker return;
1088*e1eccf28SAndroid Build Coastguard Worker }
1089*e1eccf28SAndroid Build Coastguard Worker rsdAllocationData2D_alloc_script(rsc, dstAlloc, dstXoff, dstYoff,
1090*e1eccf28SAndroid Build Coastguard Worker dstLod, dstFace, w, h, srcAlloc,
1091*e1eccf28SAndroid Build Coastguard Worker srcXoff, srcYoff, srcLod, srcFace);
1092*e1eccf28SAndroid Build Coastguard Worker }
1093*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationData3D_alloc(const android::renderscript::Context * rsc,const android::renderscript::Allocation * dstAlloc,uint32_t dstXoff,uint32_t dstYoff,uint32_t dstZoff,uint32_t dstLod,uint32_t w,uint32_t h,uint32_t d,const android::renderscript::Allocation * srcAlloc,uint32_t srcXoff,uint32_t srcYoff,uint32_t srcZoff,uint32_t srcLod)1094*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationData3D_alloc(const android::renderscript::Context *rsc,
1095*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *dstAlloc,
1096*e1eccf28SAndroid Build Coastguard Worker uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
1097*e1eccf28SAndroid Build Coastguard Worker uint32_t dstLod,
1098*e1eccf28SAndroid Build Coastguard Worker uint32_t w, uint32_t h, uint32_t d,
1099*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *srcAlloc,
1100*e1eccf28SAndroid Build Coastguard Worker uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
1101*e1eccf28SAndroid Build Coastguard Worker uint32_t srcLod) {
1102*e1eccf28SAndroid Build Coastguard Worker if (!dstAlloc->getIsScript() && !srcAlloc->getIsScript()) {
1103*e1eccf28SAndroid Build Coastguard Worker rsc->setError(RS_ERROR_FATAL_DRIVER, "Non-script allocation copies not "
1104*e1eccf28SAndroid Build Coastguard Worker "yet implemented.");
1105*e1eccf28SAndroid Build Coastguard Worker return;
1106*e1eccf28SAndroid Build Coastguard Worker }
1107*e1eccf28SAndroid Build Coastguard Worker rsdAllocationData3D_alloc_script(rsc, dstAlloc, dstXoff, dstYoff, dstZoff,
1108*e1eccf28SAndroid Build Coastguard Worker dstLod, w, h, d, srcAlloc,
1109*e1eccf28SAndroid Build Coastguard Worker srcXoff, srcYoff, srcZoff, srcLod);
1110*e1eccf28SAndroid Build Coastguard Worker }
1111*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationElementData(const Context * rsc,const Allocation * alloc,uint32_t x,uint32_t y,uint32_t z,const void * data,uint32_t cIdx,size_t sizeBytes)1112*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationElementData(const Context *rsc, const Allocation *alloc,
1113*e1eccf28SAndroid Build Coastguard Worker uint32_t x, uint32_t y, uint32_t z,
1114*e1eccf28SAndroid Build Coastguard Worker const void *data, uint32_t cIdx, size_t sizeBytes) {
1115*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
1116*e1eccf28SAndroid Build Coastguard Worker
1117*e1eccf28SAndroid Build Coastguard Worker uint8_t * ptr = GetOffsetPtr(alloc, x, y, z, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
1118*e1eccf28SAndroid Build Coastguard Worker
1119*e1eccf28SAndroid Build Coastguard Worker const Element * e = alloc->mHal.state.type->getElement()->getField(cIdx);
1120*e1eccf28SAndroid Build Coastguard Worker ptr += alloc->mHal.state.type->getElement()->getFieldOffsetBytes(cIdx);
1121*e1eccf28SAndroid Build Coastguard Worker
1122*e1eccf28SAndroid Build Coastguard Worker if (alloc->mHal.state.hasReferences) {
1123*e1eccf28SAndroid Build Coastguard Worker e->incRefs(data);
1124*e1eccf28SAndroid Build Coastguard Worker e->decRefs(ptr);
1125*e1eccf28SAndroid Build Coastguard Worker }
1126*e1eccf28SAndroid Build Coastguard Worker
1127*e1eccf28SAndroid Build Coastguard Worker memcpy(ptr, data, sizeBytes);
1128*e1eccf28SAndroid Build Coastguard Worker drv->uploadDeferred = true;
1129*e1eccf28SAndroid Build Coastguard Worker }
1130*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationElementRead(const Context * rsc,const Allocation * alloc,uint32_t x,uint32_t y,uint32_t z,void * data,uint32_t cIdx,size_t sizeBytes)1131*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationElementRead(const Context *rsc, const Allocation *alloc,
1132*e1eccf28SAndroid Build Coastguard Worker uint32_t x, uint32_t y, uint32_t z,
1133*e1eccf28SAndroid Build Coastguard Worker void *data, uint32_t cIdx, size_t sizeBytes) {
1134*e1eccf28SAndroid Build Coastguard Worker DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
1135*e1eccf28SAndroid Build Coastguard Worker
1136*e1eccf28SAndroid Build Coastguard Worker uint8_t * ptr = GetOffsetPtr(alloc, x, y, z, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
1137*e1eccf28SAndroid Build Coastguard Worker
1138*e1eccf28SAndroid Build Coastguard Worker const Element * e = alloc->mHal.state.type->getElement()->getField(cIdx);
1139*e1eccf28SAndroid Build Coastguard Worker ptr += alloc->mHal.state.type->getElement()->getFieldOffsetBytes(cIdx);
1140*e1eccf28SAndroid Build Coastguard Worker
1141*e1eccf28SAndroid Build Coastguard Worker memcpy(data, ptr, sizeBytes);
1142*e1eccf28SAndroid Build Coastguard Worker }
1143*e1eccf28SAndroid Build Coastguard Worker
mip565(const Allocation * alloc,int lod,RsAllocationCubemapFace face)1144*e1eccf28SAndroid Build Coastguard Worker static void mip565(const Allocation *alloc, int lod, RsAllocationCubemapFace face) {
1145*e1eccf28SAndroid Build Coastguard Worker uint32_t w = alloc->mHal.drvState.lod[lod + 1].dimX;
1146*e1eccf28SAndroid Build Coastguard Worker uint32_t h = alloc->mHal.drvState.lod[lod + 1].dimY;
1147*e1eccf28SAndroid Build Coastguard Worker
1148*e1eccf28SAndroid Build Coastguard Worker for (uint32_t y=0; y < h; y++) {
1149*e1eccf28SAndroid Build Coastguard Worker uint16_t *oPtr = (uint16_t *)GetOffsetPtr(alloc, 0, y, 0, lod + 1, face);
1150*e1eccf28SAndroid Build Coastguard Worker const uint16_t *i1 = (uint16_t *)GetOffsetPtr(alloc, 0, 0, y*2, lod, face);
1151*e1eccf28SAndroid Build Coastguard Worker const uint16_t *i2 = (uint16_t *)GetOffsetPtr(alloc, 0, 0, y*2+1, lod, face);
1152*e1eccf28SAndroid Build Coastguard Worker
1153*e1eccf28SAndroid Build Coastguard Worker for (uint32_t x=0; x < w; x++) {
1154*e1eccf28SAndroid Build Coastguard Worker *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]);
1155*e1eccf28SAndroid Build Coastguard Worker oPtr ++;
1156*e1eccf28SAndroid Build Coastguard Worker i1 += 2;
1157*e1eccf28SAndroid Build Coastguard Worker i2 += 2;
1158*e1eccf28SAndroid Build Coastguard Worker }
1159*e1eccf28SAndroid Build Coastguard Worker }
1160*e1eccf28SAndroid Build Coastguard Worker }
1161*e1eccf28SAndroid Build Coastguard Worker
mip8888(const Allocation * alloc,int lod,RsAllocationCubemapFace face)1162*e1eccf28SAndroid Build Coastguard Worker static void mip8888(const Allocation *alloc, int lod, RsAllocationCubemapFace face) {
1163*e1eccf28SAndroid Build Coastguard Worker uint32_t w = alloc->mHal.drvState.lod[lod + 1].dimX;
1164*e1eccf28SAndroid Build Coastguard Worker uint32_t h = alloc->mHal.drvState.lod[lod + 1].dimY;
1165*e1eccf28SAndroid Build Coastguard Worker
1166*e1eccf28SAndroid Build Coastguard Worker for (uint32_t y=0; y < h; y++) {
1167*e1eccf28SAndroid Build Coastguard Worker uint32_t *oPtr = (uint32_t *)GetOffsetPtr(alloc, 0, y, 0, lod + 1, face);
1168*e1eccf28SAndroid Build Coastguard Worker const uint32_t *i1 = (uint32_t *)GetOffsetPtr(alloc, 0, y*2, 0, lod, face);
1169*e1eccf28SAndroid Build Coastguard Worker const uint32_t *i2 = (uint32_t *)GetOffsetPtr(alloc, 0, y*2+1, 0, lod, face);
1170*e1eccf28SAndroid Build Coastguard Worker
1171*e1eccf28SAndroid Build Coastguard Worker for (uint32_t x=0; x < w; x++) {
1172*e1eccf28SAndroid Build Coastguard Worker *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]);
1173*e1eccf28SAndroid Build Coastguard Worker oPtr ++;
1174*e1eccf28SAndroid Build Coastguard Worker i1 += 2;
1175*e1eccf28SAndroid Build Coastguard Worker i2 += 2;
1176*e1eccf28SAndroid Build Coastguard Worker }
1177*e1eccf28SAndroid Build Coastguard Worker }
1178*e1eccf28SAndroid Build Coastguard Worker }
1179*e1eccf28SAndroid Build Coastguard Worker
mip8(const Allocation * alloc,int lod,RsAllocationCubemapFace face)1180*e1eccf28SAndroid Build Coastguard Worker static void mip8(const Allocation *alloc, int lod, RsAllocationCubemapFace face) {
1181*e1eccf28SAndroid Build Coastguard Worker uint32_t w = alloc->mHal.drvState.lod[lod + 1].dimX;
1182*e1eccf28SAndroid Build Coastguard Worker uint32_t h = alloc->mHal.drvState.lod[lod + 1].dimY;
1183*e1eccf28SAndroid Build Coastguard Worker
1184*e1eccf28SAndroid Build Coastguard Worker for (uint32_t y=0; y < h; y++) {
1185*e1eccf28SAndroid Build Coastguard Worker uint8_t *oPtr = GetOffsetPtr(alloc, 0, y, 0, lod + 1, face);
1186*e1eccf28SAndroid Build Coastguard Worker const uint8_t *i1 = GetOffsetPtr(alloc, 0, y*2, 0, lod, face);
1187*e1eccf28SAndroid Build Coastguard Worker const uint8_t *i2 = GetOffsetPtr(alloc, 0, y*2+1, 0, lod, face);
1188*e1eccf28SAndroid Build Coastguard Worker
1189*e1eccf28SAndroid Build Coastguard Worker for (uint32_t x=0; x < w; x++) {
1190*e1eccf28SAndroid Build Coastguard Worker *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f);
1191*e1eccf28SAndroid Build Coastguard Worker oPtr ++;
1192*e1eccf28SAndroid Build Coastguard Worker i1 += 2;
1193*e1eccf28SAndroid Build Coastguard Worker i2 += 2;
1194*e1eccf28SAndroid Build Coastguard Worker }
1195*e1eccf28SAndroid Build Coastguard Worker }
1196*e1eccf28SAndroid Build Coastguard Worker }
1197*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationGenerateMipmaps(const Context * rsc,const Allocation * alloc)1198*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationGenerateMipmaps(const Context *rsc, const Allocation *alloc) {
1199*e1eccf28SAndroid Build Coastguard Worker if(!alloc->mHal.drvState.lod[0].mallocPtr) {
1200*e1eccf28SAndroid Build Coastguard Worker return;
1201*e1eccf28SAndroid Build Coastguard Worker }
1202*e1eccf28SAndroid Build Coastguard Worker uint32_t numFaces = alloc->getType()->getDimFaces() ? 6 : 1;
1203*e1eccf28SAndroid Build Coastguard Worker for (uint32_t face = 0; face < numFaces; face ++) {
1204*e1eccf28SAndroid Build Coastguard Worker for (uint32_t lod=0; lod < (alloc->getType()->getLODCount() -1); lod++) {
1205*e1eccf28SAndroid Build Coastguard Worker switch (alloc->getType()->getElement()->getSizeBits()) {
1206*e1eccf28SAndroid Build Coastguard Worker case 32:
1207*e1eccf28SAndroid Build Coastguard Worker mip8888(alloc, lod, (RsAllocationCubemapFace)face);
1208*e1eccf28SAndroid Build Coastguard Worker break;
1209*e1eccf28SAndroid Build Coastguard Worker case 16:
1210*e1eccf28SAndroid Build Coastguard Worker mip565(alloc, lod, (RsAllocationCubemapFace)face);
1211*e1eccf28SAndroid Build Coastguard Worker break;
1212*e1eccf28SAndroid Build Coastguard Worker case 8:
1213*e1eccf28SAndroid Build Coastguard Worker mip8(alloc, lod, (RsAllocationCubemapFace)face);
1214*e1eccf28SAndroid Build Coastguard Worker break;
1215*e1eccf28SAndroid Build Coastguard Worker }
1216*e1eccf28SAndroid Build Coastguard Worker }
1217*e1eccf28SAndroid Build Coastguard Worker }
1218*e1eccf28SAndroid Build Coastguard Worker }
1219*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationGrallocBits(const android::renderscript::Context * rsc,android::renderscript::Allocation * alloc)1220*e1eccf28SAndroid Build Coastguard Worker uint32_t rsdAllocationGrallocBits(const android::renderscript::Context *rsc,
1221*e1eccf28SAndroid Build Coastguard Worker android::renderscript::Allocation *alloc)
1222*e1eccf28SAndroid Build Coastguard Worker {
1223*e1eccf28SAndroid Build Coastguard Worker return 0;
1224*e1eccf28SAndroid Build Coastguard Worker }
1225*e1eccf28SAndroid Build Coastguard Worker
rsdAllocationUpdateCachedObject(const Context * rsc,const Allocation * alloc,rs_allocation * obj)1226*e1eccf28SAndroid Build Coastguard Worker void rsdAllocationUpdateCachedObject(const Context *rsc,
1227*e1eccf28SAndroid Build Coastguard Worker const Allocation *alloc,
1228*e1eccf28SAndroid Build Coastguard Worker rs_allocation *obj)
1229*e1eccf28SAndroid Build Coastguard Worker {
1230*e1eccf28SAndroid Build Coastguard Worker obj->p = alloc;
1231*e1eccf28SAndroid Build Coastguard Worker #ifdef __LP64__
1232*e1eccf28SAndroid Build Coastguard Worker obj->unused1 = nullptr;
1233*e1eccf28SAndroid Build Coastguard Worker obj->unused2 = nullptr;
1234*e1eccf28SAndroid Build Coastguard Worker obj->unused3 = nullptr;
1235*e1eccf28SAndroid Build Coastguard Worker #endif
1236*e1eccf28SAndroid Build Coastguard Worker }
1237