You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.2 KiB
156 lines
5.2 KiB
/* |
|
* Copyright 2016 The Android Open Source Project |
|
* * Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
#define LOG_TAG "Gralloc0Mapper" |
|
|
|
#include "Gralloc0Mapper.h" |
|
|
|
#include <log/log.h> |
|
|
|
namespace android { |
|
namespace hardware { |
|
namespace graphics { |
|
namespace mapper { |
|
namespace V2_0 { |
|
namespace implementation { |
|
|
|
Gralloc0Mapper::Gralloc0Mapper(const hw_module_t* module) |
|
: mModule(reinterpret_cast<const gralloc_module_t*>(module)), |
|
mMinor(module->module_api_version & 0xff) { |
|
mCapabilities.highUsageBits = false; |
|
mCapabilities.layeredBuffers = false; |
|
mCapabilities.unregisterImplyDelete = false; |
|
} |
|
|
|
Error Gralloc0Mapper::registerBuffer(buffer_handle_t bufferHandle) { |
|
int result = mModule->registerBuffer(mModule, bufferHandle); |
|
return result ? Error::BAD_BUFFER : Error::NONE; |
|
} |
|
|
|
void Gralloc0Mapper::unregisterBuffer(buffer_handle_t bufferHandle) { |
|
mModule->unregisterBuffer(mModule, bufferHandle); |
|
} |
|
|
|
Error Gralloc0Mapper::lockBuffer(buffer_handle_t bufferHandle, |
|
uint64_t cpuUsage, |
|
const IMapper::Rect& accessRegion, int fenceFd, |
|
void** outData) { |
|
int result; |
|
void* data = nullptr; |
|
if (mMinor >= 3 && mModule->lockAsync) { |
|
// Dup fenceFd as it is going to be owned by gralloc. Note that it is |
|
// gralloc's responsibility to close it, even on locking errors. |
|
if (fenceFd >= 0) { |
|
fenceFd = dup(fenceFd); |
|
if (fenceFd < 0) { |
|
return Error::NO_RESOURCES; |
|
} |
|
} |
|
|
|
result = mModule->lockAsync(mModule, bufferHandle, cpuUsage, |
|
accessRegion.left, accessRegion.top, |
|
accessRegion.width, accessRegion.height, |
|
&data, fenceFd); |
|
} else { |
|
waitFenceFd(fenceFd, "Gralloc0Mapper::lock"); |
|
|
|
result = mModule->lock(mModule, bufferHandle, cpuUsage, |
|
accessRegion.left, accessRegion.top, |
|
accessRegion.width, accessRegion.height, &data); |
|
} |
|
|
|
if (result) { |
|
return Error::BAD_VALUE; |
|
} else { |
|
*outData = data; |
|
return Error::NONE; |
|
} |
|
} |
|
|
|
Error Gralloc0Mapper::lockBuffer(buffer_handle_t bufferHandle, |
|
uint64_t cpuUsage, |
|
const IMapper::Rect& accessRegion, int fenceFd, |
|
YCbCrLayout* outLayout) { |
|
int result; |
|
android_ycbcr ycbcr = {}; |
|
if (mMinor >= 3 && mModule->lockAsync_ycbcr) { |
|
// Dup fenceFd as it is going to be owned by gralloc. Note that it is |
|
// gralloc's responsibility to close it, even on locking errors. |
|
if (fenceFd >= 0) { |
|
fenceFd = dup(fenceFd); |
|
if (fenceFd < 0) { |
|
return Error::NO_RESOURCES; |
|
} |
|
} |
|
|
|
result = mModule->lockAsync_ycbcr(mModule, bufferHandle, cpuUsage, |
|
accessRegion.left, accessRegion.top, |
|
accessRegion.width, |
|
accessRegion.height, &ycbcr, fenceFd); |
|
} else { |
|
waitFenceFd(fenceFd, "Gralloc0Mapper::lockYCbCr"); |
|
|
|
if (mModule->lock_ycbcr) { |
|
result = mModule->lock_ycbcr(mModule, bufferHandle, cpuUsage, |
|
accessRegion.left, accessRegion.top, |
|
accessRegion.width, |
|
accessRegion.height, &ycbcr); |
|
} else { |
|
result = -EINVAL; |
|
} |
|
} |
|
|
|
if (result) { |
|
return Error::BAD_VALUE; |
|
} else { |
|
outLayout->y = ycbcr.y; |
|
outLayout->cb = ycbcr.cb; |
|
outLayout->cr = ycbcr.cr; |
|
outLayout->yStride = ycbcr.ystride; |
|
outLayout->cStride = ycbcr.cstride; |
|
outLayout->chromaStep = ycbcr.chroma_step; |
|
return Error::NONE; |
|
} |
|
} |
|
|
|
Error Gralloc0Mapper::unlockBuffer(buffer_handle_t bufferHandle, |
|
int* outFenceFd) { |
|
int result; |
|
int fenceFd = -1; |
|
if (mMinor >= 3 && mModule->unlockAsync) { |
|
result = mModule->unlockAsync(mModule, bufferHandle, &fenceFd); |
|
} else { |
|
result = mModule->unlock(mModule, bufferHandle); |
|
} |
|
|
|
if (result) { |
|
// we always own the fenceFd even when unlock failed |
|
if (fenceFd >= 0) { |
|
close(fenceFd); |
|
} |
|
|
|
return Error::BAD_VALUE; |
|
} else { |
|
*outFenceFd = fenceFd; |
|
return Error::NONE; |
|
} |
|
} |
|
|
|
} // namespace implementation |
|
} // namespace V2_0 |
|
} // namespace mapper |
|
} // namespace graphics |
|
} // namespace hardware |
|
} // namespace android
|
|
|