1 /* 2 * Copyright 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef __GRALLOC_CB_H__ 18 #define __GRALLOC_CB_H__ 19 20 #include <hardware/hardware.h> 21 #include <hardware/gralloc.h> 22 #include <cutils/native_handle.h> 23 24 #include "qemu_pipe.h" 25 26 #define BUFFER_HANDLE_MAGIC ((int)0xabfabfab) 27 #define CB_HANDLE_NUM_INTS(nfds) (int)((sizeof(cb_handle_t) - (nfds)*sizeof(int)) / sizeof(int)) 28 29 // Tell the emulator which gralloc formats 30 // need special handling. 31 enum EmulatorFrameworkFormat { 32 FRAMEWORK_FORMAT_GL_COMPATIBLE = 0, 33 FRAMEWORK_FORMAT_YV12 = 1, 34 FRAMEWORK_FORMAT_YUV_420_888 = 2, // (Y+)(U+)(V+) 35 }; 36 37 // 38 // Our buffer handle structure 39 // 40 struct cb_handle_t : public native_handle { 41 cb_handle_tcb_handle_t42 cb_handle_t(int p_fd, int p_ashmemSize, int p_usage, 43 int p_width, int p_height, int p_frameworkFormat, 44 int p_format, int p_glFormat, int p_glType, 45 EmulatorFrameworkFormat p_emuFrameworkFormat) : 46 fd(p_fd), 47 magic(BUFFER_HANDLE_MAGIC), 48 usage(p_usage), 49 width(p_width), 50 height(p_height), 51 frameworkFormat(p_frameworkFormat), 52 format(p_format), 53 glFormat(p_glFormat), 54 glType(p_glType), 55 ashmemSize(p_ashmemSize), 56 ashmemBase(0), 57 ashmemBasePid(0), 58 mappedPid(0), 59 lockedLeft(0), 60 lockedTop(0), 61 lockedWidth(0), 62 lockedHeight(0), 63 hostHandle(0), 64 emuFrameworkFormat(p_emuFrameworkFormat) 65 { 66 refcount_pipe_fd = QEMU_PIPE_INVALID_HANDLE; 67 version = sizeof(native_handle); 68 numFds = 0; 69 numInts = CB_HANDLE_NUM_INTS(numFds); 70 } 71 ~cb_handle_tcb_handle_t72 ~cb_handle_t() { 73 magic = 0; 74 } 75 setFdcb_handle_t76 void setFd(int p_fd) { 77 if (p_fd >= 0) { 78 numFds++; 79 } 80 fd = p_fd; 81 numInts = CB_HANDLE_NUM_INTS(numFds); 82 } 83 hasRefcountPipecb_handle_t84 bool hasRefcountPipe() { 85 return qemu_pipe_valid(refcount_pipe_fd); 86 } 87 setRefcountPipeFdcb_handle_t88 void setRefcountPipeFd(QEMU_PIPE_HANDLE fd) { 89 if (qemu_pipe_valid(fd)) { 90 numFds++; 91 } 92 refcount_pipe_fd = fd; 93 numInts = CB_HANDLE_NUM_INTS(numFds); 94 } 95 validatecb_handle_t96 static bool validate(const cb_handle_t* hnd) { 97 return (hnd && 98 hnd->version == sizeof(native_handle) && 99 hnd->magic == BUFFER_HANDLE_MAGIC && 100 hnd->numInts == CB_HANDLE_NUM_INTS(hnd->numFds)); 101 } 102 canBePostedcb_handle_t103 bool canBePosted() { 104 return (0 != (usage & GRALLOC_USAGE_HW_FB)); 105 } 106 107 // file-descriptors 108 int fd; // ashmem fd (-1 of ashmem region did not allocated, i.e. no SW access needed) 109 QEMU_PIPE_HANDLE refcount_pipe_fd; // goldfish pipe service for gralloc refcounting fd. 110 111 // ints 112 int magic; // magic number in order to validate a pointer to be a cb_handle_t 113 int usage; // usage bits the buffer was created with 114 int width; // buffer width 115 int height; // buffer height 116 int frameworkFormat; // format requested by the Android framework 117 int format; // real internal pixel format format 118 int glFormat; // OpenGL format enum used for host h/w color buffer 119 int glType; // OpenGL type enum used when uploading to host 120 int ashmemSize; // ashmem region size for the buffer (0 unless is HW_FB buffer or 121 // s/w access is needed) 122 union { 123 intptr_t ashmemBase; // CPU address of the mapped ashmem region 124 uint64_t padding; // enforce same size on 32-bit/64-bit 125 } __attribute__((aligned(8))); 126 127 int ashmemBasePid; // process id which mapped the ashmem region 128 int mappedPid; // process id which succeeded gralloc_register call 129 int lockedLeft; // region of buffer locked for s/w write 130 int lockedTop; 131 int lockedWidth; 132 int lockedHeight; 133 uint32_t hostHandle; 134 135 EmulatorFrameworkFormat emuFrameworkFormat; 136 }; 137 138 139 #endif //__GRALLOC_CB_H__ 140