blob: 28f50161c7dc0b3803f368e215dcbe403ba09aff [file] [log] [blame]
/*
* 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