156 lines
5.2 KiB
C++
156 lines
5.2 KiB
C++
/*
|
|
* 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
|