1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/ion_buffer.h> 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 34fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko#include <log/log.h> 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ATRACE_TAG ATRACE_TAG_GRAPHICS 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <utils/Trace.h> 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <mutex> 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 9cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakanamespace { 10cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka 11cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaconstexpr uint32_t kDefaultGraphicBufferLayerCount = 1; 12cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka 13cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka} // anonymous namespace 14cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka 15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android { 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr { 17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 18108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik WagenaarIonBuffer::IonBuffer() : IonBuffer(nullptr, 0, 0, 0, 0, 0, 0) {} 19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 20cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey TabakaIonBuffer::IonBuffer(uint32_t width, uint32_t height, uint32_t format, 21044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint64_t usage) 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : IonBuffer() { 23108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar Alloc(width, height, kDefaultGraphicBufferLayerCount, format, usage); 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 26cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey TabakaIonBuffer::IonBuffer(buffer_handle_t handle, uint32_t width, uint32_t height, 27044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai uint32_t stride, uint32_t format, uint64_t usage) 28108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar : IonBuffer(handle, width, height, kDefaultGraphicBufferLayerCount, stride, 29108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar format, usage) {} 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 31cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey TabakaIonBuffer::IonBuffer(buffer_handle_t handle, uint32_t width, uint32_t height, 32108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint32_t layer_count, uint32_t stride, uint32_t format, 33108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint64_t usage) 348a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus : buffer_(nullptr) { 35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 36cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka "IonBuffer::IonBuffer: handle=%p width=%u height=%u layer_count=%u " 37108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "stride=%u format=%u usage=%" PRIx64, 38108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar handle, width, height, layer_count, stride, format, usage); 398a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus if (handle != 0) { 40108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar Import(handle, width, height, layer_count, stride, format, usage); 418a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus } 42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIonBuffer::~IonBuffer() { 45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 46cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka "IonBuffer::~IonBuffer: handle=%p width=%u height=%u stride=%u " 47108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "format=%u usage=%" PRIx64, 48cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka handle(), width(), height(), stride(), format(), usage()); 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko FreeHandle(); 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIonBuffer::IonBuffer(IonBuffer&& other) : IonBuffer() { 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *this = std::move(other); 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIonBuffer& IonBuffer::operator=(IonBuffer&& other) { 578a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus ALOGD_IF(TRACE, "IonBuffer::operator=: handle_=%p other.handle_=%p", handle(), 588a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus other.handle()); 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (this != &other) { 618a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus buffer_ = other.buffer_; 62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko other.FreeHandle(); 63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return *this; 65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid IonBuffer::FreeHandle() { 688a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus if (buffer_.get()) { 698a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus // GraphicBuffer unregisters and cleans up the handle if needed 708a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus buffer_ = nullptr; 71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 74108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaarint IonBuffer::Alloc(uint32_t width, uint32_t height, uint32_t layer_count, 75108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint32_t format, uint64_t usage) { 76044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai ALOGD_IF(TRACE, 77108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "IonBuffer::Alloc: width=%u height=%u layer_count=%u format=%u " 78108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "usage=%" PRIx64, width, height, layer_count, format, usage); 79cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka 80108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar sp<GraphicBuffer> buffer = 81108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar new GraphicBuffer(width, height, format, layer_count, usage); 82cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka if (buffer->initCheck() != OK) { 83b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu ALOGE("IonBuffer::Aloc: Failed to allocate buffer"); 84cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka return -EINVAL; 85cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka } else { 86cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka buffer_ = buffer; 87cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka return 0; 88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 91cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakavoid IonBuffer::Reset(buffer_handle_t handle, uint32_t width, uint32_t height, 92108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint32_t layer_count, uint32_t stride, uint32_t format, 93108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint64_t usage) { 94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 95108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "IonBuffer::Reset: handle=%p width=%u height=%u layer_count=%u " 96108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "stride=%u format=%u usage=%" PRIx64, 97108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar handle, width, height, layer_count, stride, format, usage); 98108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar Import(handle, width, height, layer_count, stride, format, usage); 99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 101cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaint IonBuffer::Import(buffer_handle_t handle, uint32_t width, uint32_t height, 102108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint32_t layer_count, uint32_t stride, uint32_t format, 103108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint64_t usage) { 104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("IonBuffer::Import1"); 105108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ALOGD_IF(TRACE, 106108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "IonBuffer::Import: handle=%p width=%u height=%u layer_count=%u " 107108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "stride=%u format=%u usage=%" PRIx64, 108108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar handle, width, height, layer_count, stride, format, usage); 1098a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus FreeHandle(); 110108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar sp<GraphicBuffer> buffer = 111108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar new GraphicBuffer(handle, GraphicBuffer::TAKE_UNREGISTERED_HANDLE, width, 112108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar height, format, layer_count, usage, stride); 113cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka if (buffer->initCheck() != OK) { 114b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu ALOGE("IonBuffer::Import: Failed to import buffer"); 1158a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus return -EINVAL; 116cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka } else { 117cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka buffer_ = buffer; 118cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka return 0; 119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint IonBuffer::Import(const int* fd_array, int fd_count, const int* int_array, 123cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka int int_count, uint32_t width, uint32_t height, 124108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint32_t layer_count, uint32_t stride, uint32_t format, 125108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar uint64_t usage) { 126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("IonBuffer::Import2"); 127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 128cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka "IonBuffer::Import: fd_count=%d int_count=%d width=%u height=%u " 129108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar "layer_count=%u stride=%u format=%u usage=%" PRIx64, 130108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar fd_count, int_count, width, height, layer_count, stride, format, 131108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar usage); 132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (fd_count < 0 || int_count < 0) { 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("IonBuffer::Import: invalid arguments."); 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -EINVAL; 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko native_handle_t* handle = native_handle_create(fd_count, int_count); 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!handle) { 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("IonBuffer::Import: failed to create new native handle."); 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -ENOMEM; 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Copy fd_array into the first part of handle->data and int_array right 145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // after it. 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko memcpy(handle->data, fd_array, sizeof(int) * fd_count); 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko memcpy(handle->data + fd_count, int_array, sizeof(int) * int_count); 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 149108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar const int ret = 150108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar Import(handle, width, height, layer_count, stride, format, usage); 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("IonBuffer::Import: failed to import raw native handle: %s", 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko strerror(-ret)); 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko native_handle_close(handle); 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko native_handle_delete(handle); 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ret; 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint IonBuffer::Duplicate(const IonBuffer* other) { 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!other->handle()) 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -EINVAL; 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int fd_count = other->handle()->numFds; 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int int_count = other->handle()->numInts; 167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (fd_count < 0 || int_count < 0) 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -EINVAL; 170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko native_handle_t* handle = native_handle_create(fd_count, int_count); 172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!handle) { 173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("IonBuffer::Duplicate: Failed to create new native handle."); 174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -ENOMEM; 175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Duplicate the file descriptors from the other native handle. 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (int i = 0; i < fd_count; i++) 179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko handle->data[i] = dup(other->handle()->data[i]); 180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // Copy the ints after the file descriptors. 182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko memcpy(handle->data + fd_count, other->handle()->data + fd_count, 183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko sizeof(int) * int_count); 184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 185cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka const int ret = 186108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar Import(handle, other->width(), other->height(), other->layer_count(), 187108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar other->stride(), other->format(), other->usage()); 188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("IonBuffer::Duplicate: Failed to import duplicate native handle: %s", 190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko strerror(-ret)); 191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko native_handle_close(handle); 192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko native_handle_delete(handle); 193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ret; 196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 198cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaint IonBuffer::Lock(uint32_t usage, int x, int y, int width, int height, 199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko void** address) { 200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("IonBuffer::Lock"); 201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "IonBuffer::Lock: handle=%p usage=%d x=%d y=%d width=%d height=%d " 203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "address=%p", 2048a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus handle(), usage, x, y, width, height, address); 205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 206cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka status_t err = 207cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka buffer_->lock(usage, Rect(x, y, x + width, y + height), address); 2088a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus if (err != NO_ERROR) 2098a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus return -EINVAL; 2108a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus else 2118a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus return 0; 212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 214cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaint IonBuffer::LockYUV(uint32_t usage, int x, int y, int width, int height, 215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko struct android_ycbcr* yuv) { 216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("IonBuffer::LockYUV"); 217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "IonBuffer::Lock: handle=%p usage=%d x=%d y=%d width=%d height=%d", 2198a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus handle(), usage, x, y, width, height); 220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 221cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka status_t err = 222cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka buffer_->lockYCbCr(usage, Rect(x, y, x + width, y + height), yuv); 2238a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus if (err != NO_ERROR) 2248a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus return -EINVAL; 2258a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus else 2268a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus return 0; 227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 229e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint IonBuffer::Unlock() { 230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("IonBuffer::Unlock"); 2318a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus ALOGD_IF(TRACE, "IonBuffer::Unlock: handle=%p", handle()); 232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 2338a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus status_t err = buffer_->unlock(); 2348a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus if (err != NO_ERROR) 2358a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus return -EINVAL; 2368a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus else 2378a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus return 0; 238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 239cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka} // namespace dvr 240cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka} // namespace android 241