graphics: HIDLize IMapper
Test: builds and boots
Change-Id: I37503ae4826c3e864d7457fd688c2d5f5dd652a3
diff --git a/graphics/mapper/2.0/Android.bp b/graphics/mapper/2.0/Android.bp
index 19b1388..9ac6d50 100644
--- a/graphics/mapper/2.0/Android.bp
+++ b/graphics/mapper/2.0/Android.bp
@@ -1,4 +1,60 @@
-cc_library_static {
+// This file is autogenerated by hidl-gen. Do not edit manually.
+
+genrule {
+ name: "android.hardware.graphics.mapper@2.0_genc++",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.graphics.mapper@2.0",
+ srcs: [
+ "types.hal",
+ "IMapper.hal",
+ ],
+ out: [
+ "android/hardware/graphics/mapper/2.0/types.cpp",
+ "android/hardware/graphics/mapper/2.0/MapperAll.cpp",
+ ],
+}
+
+genrule {
+ name: "android.hardware.graphics.mapper@2.0_genc++_headers",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.graphics.mapper@2.0",
+ srcs: [
+ "types.hal",
+ "IMapper.hal",
+ ],
+ out: [
+ "android/hardware/graphics/mapper/2.0/types.h",
+ "android/hardware/graphics/mapper/2.0/IMapper.h",
+ "android/hardware/graphics/mapper/2.0/IHwMapper.h",
+ "android/hardware/graphics/mapper/2.0/BnMapper.h",
+ "android/hardware/graphics/mapper/2.0/BpMapper.h",
+ "android/hardware/graphics/mapper/2.0/BsMapper.h",
+ ],
+}
+
+cc_library_shared {
name: "android.hardware.graphics.mapper@2.0",
- export_include_dirs: ["include"],
+ generated_sources: ["android.hardware.graphics.mapper@2.0_genc++"],
+ generated_headers: ["android.hardware.graphics.mapper@2.0_genc++_headers"],
+ export_generated_headers: ["android.hardware.graphics.mapper@2.0_genc++_headers"],
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libutils",
+ "libcutils",
+ "android.hardware.graphics.allocator@2.0",
+ "android.hardware.graphics.common@1.0",
+ "android.hidl.base@1.0",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "android.hardware.graphics.allocator@2.0",
+ "android.hardware.graphics.common@1.0",
+ "android.hidl.base@1.0",
+ ],
}
diff --git a/graphics/mapper/2.0/include/android/hardware/graphics/mapper/2.0/IMapper.h b/graphics/mapper/2.0/IMapper.hal
similarity index 62%
rename from graphics/mapper/2.0/include/android/hardware/graphics/mapper/2.0/IMapper.h
rename to graphics/mapper/2.0/IMapper.hal
index ac8ec45..21a6dfa 100644
--- a/graphics/mapper/2.0/include/android/hardware/graphics/mapper/2.0/IMapper.h
+++ b/graphics/mapper/2.0/IMapper.hal
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 The Android Open Source Project
+ * Copyright (C) 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.
@@ -14,165 +14,135 @@
* limitations under the License.
*/
-#ifndef ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_IMAPPER_H
-#define ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_IMAPPER_H
+package android.hardware.graphics.mapper@2.0;
-#include <type_traits>
+import android.hardware.graphics.common@1.0::PixelFormat;
+import android.hardware.graphics.allocator@2.0;
-#include <android/hardware/graphics/mapper/2.0/types.h>
-
-extern "C" {
-
-namespace android {
-namespace hardware {
-namespace graphics {
-namespace mapper {
-namespace V2_0 {
-
-struct Device {
+interface IMapper {
struct Rect {
int32_t left;
int32_t top;
int32_t width;
int32_t height;
};
- static_assert(std::is_pod<Rect>::value, "Device::Rect is not POD");
-
- /*
- * Create a mapper device.
- *
- * @return error is NONE upon success. Otherwise,
- * NOT_SUPPORTED when creation will never succeed.
- * BAD_RESOURCES when creation failed at this time.
- * @return device is the newly created mapper device.
- */
- typedef Error (*createDevice)(Device** outDevice);
-
- /*
- * Destroy a mapper device.
- *
- * @return error is always NONE.
- * @param device is the mapper device to destroy.
- */
- typedef Error (*destroyDevice)(Device* device);
/*
* Adds a reference to the given buffer handle.
*
* A buffer handle received from a remote process or exported by
- * IAllocator::exportHandle is unknown to this client-side library. There
- * is also no guarantee that the buffer's backing store will stay alive.
- * This function must be called at least once in both cases to intrdouce
- * the buffer handle to this client-side library and to secure the backing
- * store. It may also be called more than once to increase the reference
- * count if two components in the same process want to interact with the
- * buffer independently.
+ * IAllocator::exportHandle is unknown to the mapper. There is also no
+ * guarantee that the buffer's backing store will stay alive. This
+ * function must be called at least once in both cases to intrdouce the
+ * buffer handle to the mapper and to secure the backing store. It may
+ * also be called more than once to increase the reference count if two
+ * components in the same process want to interact with the buffer
+ * independently.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer to which a reference must be added.
* @return error is NONE upon success. Otherwise,
* BAD_BUFFER when the buffer handle is invalid
* NO_RESOURCES when it is not possible to add a
* reference to this buffer at this time
*/
- typedef Error (*retain)(Device* device,
- const native_handle_t* bufferHandle);
+ @entry
+ @callflow(next="*")
+ retain(handle bufferHandle) generates (Error error);
/*
* Removes a reference from the given buffer buffer.
*
- * If no references remain, the buffer handle should be freed with
- * native_handle_close/native_handle_delete. When the last buffer handle
- * referring to a particular backing store is freed, that backing store
- * should also be freed.
+ * If no references remain, the buffer handle must be freed with
+ * native_handle_close/native_handle_delete by the mapper. When the last
+ * buffer handle referring to a particular backing store is freed, that
+ * backing store must also be freed.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer from which a reference must be
* removed.
* @return error is NONE upon success. Otherwise,
* BAD_BUFFER when the buffer handle is invalid.
*/
- typedef Error (*release)(Device* device,
- const native_handle_t* bufferHandle);
+ @exit
+ release(handle bufferHandle) generates (Error error);
/*
* Gets the width and height of the buffer in pixels.
*
* See IAllocator::BufferDescriptorInfo for more information.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer from which to get the dimensions.
* @return error is NONE upon success. Otherwise,
* BAD_BUFFER when the buffer handle is invalid.
* @return width is the width of the buffer in pixels.
* @return height is the height of the buffer in pixels.
*/
- typedef Error (*getDimensions)(Device* device,
- const native_handle_t* bufferHandle,
- uint32_t* outWidth,
- uint32_t* outHeight);
+ @callflow(next="*")
+ getDimensions(handle bufferHandle)
+ generates (Error error,
+ uint32_t width,
+ uint32_t height);
/*
* Gets the format of the buffer.
*
* See IAllocator::BufferDescriptorInfo for more information.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer from which to get format.
* @return error is NONE upon success. Otherwise,
* BAD_BUFFER when the buffer handle is invalid.
* @return format is the format of the buffer.
*/
- typedef Error (*getFormat)(Device* device,
- const native_handle_t* bufferHandle,
- PixelFormat* outFormat);
+ @callflow(next="*")
+ getFormat(handle bufferHandle)
+ generates (Error error,
+ PixelFormat format);
/*
* Gets the number of layers of the buffer.
*
* See IAllocator::BufferDescriptorInfo for more information.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer from which to get format.
* @return error is NONE upon success. Otherwise,
* BAD_BUFFER when the buffer handle is invalid.
* @return layerCount is the number of layers of the buffer.
*/
- typedef Error (*getLayerCount)(Device* device,
- const native_handle_t* bufferHandle,
- uint32_t* outLayerCount);
+ @callflow(next="*")
+ getLayerCount(handle bufferHandle)
+ generates (Error error,
+ uint32_t layerCount);
/*
* Gets the producer usage flags which were used to allocate this buffer.
*
* See IAllocator::BufferDescriptorInfo for more information.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer from which to get the producer usage
* flags.
* @return error is NONE upon success. Otherwise,
* BAD_BUFFER when the buffer handle is invalid.
* @return usageMask contains the producer usage flags of the buffer.
*/
- typedef Error (*getProducerUsageMask)(Device* device,
- const native_handle_t* bufferHandle,
- uint64_t* outUsageMask);
+ @callflow(next="*")
+ getProducerUsageMask(handle bufferHandle)
+ generates (Error error,
+ uint64_t usageMask);
/*
* Gets the consumer usage flags which were used to allocate this buffer.
*
* See IAllocator::BufferDescriptorInfo for more information.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer from which to get the consumer usage
* flags.
* @return error is NONE upon success. Otherwise,
* BAD_BUFFER when the buffer handle is invalid.
* @return usageMask contains the consumer usage flags of the buffer.
*/
- typedef Error (*getConsumerUsageMask)(Device* device,
- const native_handle_t* bufferHandle,
- uint64_t* outUsageMask);
+ @callflow(next="*")
+ getConsumerUsageMask(handle bufferHandle)
+ generates (Error error,
+ uint64_t usageMask);
/*
* Gets a value that uniquely identifies the backing store of the given
@@ -190,9 +160,10 @@
* BAD_BUFFER when the buffer handle is invalid.
* @return store is the backing store identifier for this buffer.
*/
- typedef Error (*getBackingStore)(Device* device,
- const native_handle_t* bufferHandle,
- BackingStore* outStore);
+ @callflow(next="*")
+ getBackingStore(handle bufferHandle)
+ generates (Error error,
+ BackingStore store);
/*
* Gets the stride of the buffer in pixels.
@@ -209,31 +180,10 @@
* meaningful for the buffer format.
* @return store is the stride in pixels.
*/
- typedef Error (*getStride)(Device* device,
- const native_handle_t* bufferHandle,
- uint32_t* outStride);
-
- /*
- * Returns the number of flex layout planes which are needed to represent
- * the given buffer. This may be used to efficiently allocate only as many
- * plane structures as necessary before calling into lockFlex.
- *
- * If the given buffer cannot be locked as a flex format, this function
- * may return UNSUPPORTED (as lockFlex would).
- *
- * @param device is the mapper device.
- * @param bufferHandle is the buffer for which the number of planes should
- * be queried.
- * @return error is NONE upon success. Otherwise,
- * BAD_BUFFER when the buffer handle is invalid.
- * UNSUPPORTED when the buffer's format cannot be
- * represented in a flex layout.
- * @return numPlanes is the number of flex planes required to describe the
- * given buffer.
- */
- typedef Error (*getNumFlexPlanes)(Device* device,
- const native_handle_t* bufferHandle,
- uint32_t* outNumPlanes);
+ @callflow(next="*")
+ getStride(handle bufferHandle)
+ generates (Error error,
+ uint32_t stride);
/*
* Locks the given buffer for the specified CPU usage.
@@ -264,7 +214,6 @@
* the contents of the buffer (prior to locking). If it is already safe to
* access the buffer contents, -1 may be passed instead.
*
- * @param device is the mapper device.
* @param bufferHandle is the buffer to lock.
* @param producerUsageMask contains the producer usage flags to request;
* either this or consumerUsagemask must be 0, and the other must
@@ -289,13 +238,14 @@
* @return data will be filled with a CPU-accessible pointer to the buffer
* data.
*/
- typedef Error (*lock)(Device* device,
- const native_handle_t* bufferHandle,
- uint64_t producerUsageMask,
- uint64_t consumerUsageMask,
- const Rect* accessRegion,
- int32_t acquireFence,
- void** outData);
+ @callflow(next="unlock")
+ lock(handle bufferHandle,
+ uint64_t producerUsageMask,
+ uint64_t consumerUsageMask,
+ Rect accessRegion,
+ handle acquireFence)
+ generates (Error error,
+ pointer data);
/*
* This is largely the same as lock(), except that instead of returning a
@@ -337,13 +287,14 @@
* @return flexLayout will be filled with the description of the planes in
* the buffer.
*/
- typedef Error (*lockFlex)(Device* device,
- const native_handle_t* bufferHandle,
- uint64_t producerUsageMask,
- uint64_t consumerUsageMask,
- const Rect* accessRegion,
- int32_t acquireFence,
- FlexLayout* outFlexLayout);
+ @callflow(next="unlock")
+ lockFlex(handle bufferHandle,
+ uint64_t producerUsageMask,
+ uint64_t consumerUsageMask,
+ Rect accessRegion,
+ handle acquireFence)
+ generates (Error error,
+ FlexLayout layout);
/*
* This function indicates to the device that the client will be done with
@@ -365,40 +316,8 @@
* @return releaseFence is a sync fence file descriptor as described
* above.
*/
- typedef Error (*unlock)(Device* device,
- const native_handle_t* bufferHandle,
- int32_t* outReleaseFence);
+ @callflow(next="*")
+ unlock(handle bufferHandle)
+ generates (Error error,
+ handle releaseFence);
};
-static_assert(std::is_pod<Device>::value, "Device is not POD");
-
-struct IMapper {
- Device::createDevice createDevice;
- Device::destroyDevice destroyDevice;
-
- Device::retain retain;
- Device::release release;
- Device::getDimensions getDimensions;
- Device::getFormat getFormat;
- Device::getLayerCount getLayerCount;
- Device::getProducerUsageMask getProducerUsageMask;
- Device::getConsumerUsageMask getConsumerUsageMask;
- Device::getBackingStore getBackingStore;
- Device::getStride getStride;
- Device::getNumFlexPlanes getNumFlexPlanes;
- Device::lock lock;
- Device::lockFlex lockFlex;
- Device::unlock unlock;
-};
-static_assert(std::is_pod<IMapper>::value, "IMapper is not POD");
-
-} // namespace V2_0
-} // namespace mapper
-} // namespace graphics
-} // namespace hardware
-} // namespace android
-
-const void* HALLIB_FETCH_Interface(const char* name);
-
-} // extern "C"
-
-#endif /* ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_IMAPPER_H */
diff --git a/graphics/mapper/2.0/default/Android.bp b/graphics/mapper/2.0/default/Android.bp
index 7da6eb1..02ed877 100644
--- a/graphics/mapper/2.0/default/Android.bp
+++ b/graphics/mapper/2.0/default/Android.bp
@@ -1,3 +1,4 @@
+//
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,17 +14,19 @@
// limitations under the License.
cc_library_shared {
- name: "android.hardware.graphics.mapper.hallib",
+ name: "android.hardware.graphics.mapper@2.0-impl",
relative_install_path: "hw",
srcs: ["GrallocMapper.cpp"],
cppflags: ["-Wall", "-Wextra"],
- static_libs: ["android.hardware.graphics.mapper@2.0"],
shared_libs: [
- "android.hardware.graphics.allocator@2.0",
+ "android.hardware.graphics.mapper@2.0",
+ "libbase",
+ "libcutils",
"libhardware",
"libhidlbase",
"libhidltransport",
"libhwbinder",
"liblog",
+ "libutils",
],
}
diff --git a/graphics/mapper/2.0/default/GrallocMapper.cpp b/graphics/mapper/2.0/default/GrallocMapper.cpp
index 2af1d2c..cd9db38 100644
--- a/graphics/mapper/2.0/default/GrallocMapper.cpp
+++ b/graphics/mapper/2.0/default/GrallocMapper.cpp
@@ -15,13 +15,15 @@
#define LOG_TAG "GrallocMapperPassthrough"
-#include <android/hardware/graphics/allocator/2.0/IAllocator.h>
-#include <android/hardware/graphics/mapper/2.0/IMapper.h>
+#include "GrallocMapper.h"
+
+#include <vector>
+
+#include <string.h>
+
#include <hardware/gralloc1.h>
#include <log/log.h>
-#include <unordered_set>
-
namespace android {
namespace hardware {
namespace graphics {
@@ -29,50 +31,59 @@
namespace V2_0 {
namespace implementation {
-using Capability = allocator::V2_0::IAllocator::Capability;
+namespace {
-class GrallocDevice : public Device {
+using android::hardware::graphics::allocator::V2_0::Error;
+using android::hardware::graphics::common::V1_0::PixelFormat;
+
+class GrallocMapperHal : public IMapper {
public:
- GrallocDevice();
- ~GrallocDevice();
+ GrallocMapperHal(const hw_module_t* module);
+ ~GrallocMapperHal();
// IMapper interface
- Error retain(const native_handle_t* bufferHandle);
- Error release(const native_handle_t* bufferHandle);
- Error getDimensions(const native_handle_t* bufferHandle,
- uint32_t* outWidth, uint32_t* outHeight);
- Error getFormat(const native_handle_t* bufferHandle,
- PixelFormat* outFormat);
- Error getLayerCount(const native_handle_t* bufferHandle,
- uint32_t* outLayerCount);
- Error getProducerUsageMask(const native_handle_t* bufferHandle,
- uint64_t* outUsageMask);
- Error getConsumerUsageMask(const native_handle_t* bufferHandle,
- uint64_t* outUsageMask);
- Error getBackingStore(const native_handle_t* bufferHandle,
- BackingStore* outStore);
- Error getStride(const native_handle_t* bufferHandle, uint32_t* outStride);
- Error getNumFlexPlanes(const native_handle_t* bufferHandle,
- uint32_t* outNumPlanes);
- Error lock(const native_handle_t* bufferHandle,
+ Return<Error> retain(const hidl_handle& bufferHandle) override;
+ Return<Error> release(const hidl_handle& bufferHandle) override;
+ Return<void> getDimensions(const hidl_handle& bufferHandle,
+ getDimensions_cb hidl_cb) override;
+ Return<void> getFormat(const hidl_handle& bufferHandle,
+ getFormat_cb hidl_cb) override;
+ Return<void> getLayerCount(const hidl_handle& bufferHandle,
+ getLayerCount_cb hidl_cb) override;
+ Return<void> getProducerUsageMask(const hidl_handle& bufferHandle,
+ getProducerUsageMask_cb hidl_cb) override;
+ Return<void> getConsumerUsageMask(const hidl_handle& bufferHandle,
+ getConsumerUsageMask_cb hidl_cb) override;
+ Return<void> getBackingStore(const hidl_handle& bufferHandle,
+ getBackingStore_cb hidl_cb) override;
+ Return<void> getStride(const hidl_handle& bufferHandle,
+ getStride_cb hidl_cb) override;
+ Return<void> lock(const hidl_handle& bufferHandle,
uint64_t producerUsageMask, uint64_t consumerUsageMask,
- const Rect* accessRegion, int32_t acquireFence, void** outData);
- Error lockFlex(const native_handle_t* bufferHandle,
+ const IMapper::Rect& accessRegion, const hidl_handle& acquireFence,
+ lock_cb hidl_cb) override;
+ Return<void> lockFlex(const hidl_handle& bufferHandle,
uint64_t producerUsageMask, uint64_t consumerUsageMask,
- const Rect* accessRegion, int32_t acquireFence,
- FlexLayout* outFlexLayout);
- Error unlock(const native_handle_t* bufferHandle,
- int32_t* outReleaseFence);
+ const IMapper::Rect& accessRegion, const hidl_handle& acquireFence,
+ lockFlex_cb hidl_cb) override;
+ Return<void> unlock(const hidl_handle& bufferHandle,
+ unlock_cb hidl_cb) override;
private:
void initCapabilities();
+ template<typename T>
+ void initDispatch(gralloc1_function_descriptor_t desc, T* outPfn);
void initDispatch();
- bool hasCapability(Capability capability) const;
+
+ static gralloc1_rect_t asGralloc1Rect(const IMapper::Rect& rect);
+ static bool dupFence(const hidl_handle& fenceHandle, int* outFd);
gralloc1_device_t* mDevice;
- std::unordered_set<Capability> mCapabilities;
+ struct {
+ bool layeredBuffers;
+ } mCapabilities;
struct {
GRALLOC1_PFN_RETAIN retain;
@@ -91,333 +102,293 @@
} mDispatch;
};
-GrallocDevice::GrallocDevice()
+GrallocMapperHal::GrallocMapperHal(const hw_module_t* module)
+ : mDevice(nullptr), mCapabilities(), mDispatch()
{
- const hw_module_t* module;
- int status = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
+ int status = gralloc1_open(module, &mDevice);
if (status) {
- LOG_ALWAYS_FATAL("failed to get gralloc module");
- }
-
- uint8_t major = (module->module_api_version >> 8) & 0xff;
- if (major != 1) {
- LOG_ALWAYS_FATAL("unknown gralloc module major version %d", major);
- }
-
- status = gralloc1_open(module, &mDevice);
- if (status) {
- LOG_ALWAYS_FATAL("failed to open gralloc1 device");
+ LOG_ALWAYS_FATAL("failed to open gralloc1 device: %s",
+ strerror(-status));
}
initCapabilities();
initDispatch();
}
-GrallocDevice::~GrallocDevice()
+GrallocMapperHal::~GrallocMapperHal()
{
gralloc1_close(mDevice);
}
-void GrallocDevice::initCapabilities()
+void GrallocMapperHal::initCapabilities()
{
uint32_t count;
mDevice->getCapabilities(mDevice, &count, nullptr);
- std::vector<Capability> caps(count);
- mDevice->getCapabilities(mDevice, &count, reinterpret_cast<
- std::underlying_type<Capability>::type*>(caps.data()));
+ std::vector<int32_t> caps(count);
+ mDevice->getCapabilities(mDevice, &count, caps.data());
caps.resize(count);
- mCapabilities.insert(caps.cbegin(), caps.cend());
-}
-
-void GrallocDevice::initDispatch()
-{
-#define CHECK_FUNC(func, desc) do { \
- mDispatch.func = reinterpret_cast<decltype(mDispatch.func)>( \
- mDevice->getFunction(mDevice, desc)); \
- if (!mDispatch.func) { \
- LOG_ALWAYS_FATAL("failed to get gralloc1 function %d", desc); \
- } \
-} while (0)
-
- CHECK_FUNC(retain, GRALLOC1_FUNCTION_RETAIN);
- CHECK_FUNC(release, GRALLOC1_FUNCTION_RELEASE);
- CHECK_FUNC(getDimensions, GRALLOC1_FUNCTION_GET_DIMENSIONS);
- CHECK_FUNC(getFormat, GRALLOC1_FUNCTION_GET_FORMAT);
- if (hasCapability(Capability::LAYERED_BUFFERS)) {
- CHECK_FUNC(getLayerCount, GRALLOC1_FUNCTION_GET_LAYER_COUNT);
+ for (auto cap : caps) {
+ switch (cap) {
+ case GRALLOC1_CAPABILITY_LAYERED_BUFFERS:
+ mCapabilities.layeredBuffers = true;
+ break;
+ default:
+ break;
+ }
}
- CHECK_FUNC(getProducerUsage, GRALLOC1_FUNCTION_GET_PRODUCER_USAGE);
- CHECK_FUNC(getConsumerUsage, GRALLOC1_FUNCTION_GET_CONSUMER_USAGE);
- CHECK_FUNC(getBackingStore, GRALLOC1_FUNCTION_GET_BACKING_STORE);
- CHECK_FUNC(getStride, GRALLOC1_FUNCTION_GET_STRIDE);
- CHECK_FUNC(getNumFlexPlanes, GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES);
- CHECK_FUNC(lock, GRALLOC1_FUNCTION_LOCK);
- CHECK_FUNC(lockFlex, GRALLOC1_FUNCTION_LOCK_FLEX);
- CHECK_FUNC(unlock, GRALLOC1_FUNCTION_UNLOCK);
-
-#undef CHECK_FUNC
}
-bool GrallocDevice::hasCapability(Capability capability) const
+template<typename T>
+void GrallocMapperHal::initDispatch(gralloc1_function_descriptor_t desc,
+ T* outPfn)
{
- return (mCapabilities.count(capability) > 0);
+ auto pfn = mDevice->getFunction(mDevice, desc);
+ if (!pfn) {
+ LOG_ALWAYS_FATAL("failed to get gralloc1 function %d", desc);
+ }
+
+ *outPfn = reinterpret_cast<T>(pfn);
}
-Error GrallocDevice::retain(const native_handle_t* bufferHandle)
+void GrallocMapperHal::initDispatch()
{
- int32_t error = mDispatch.retain(mDevice, bufferHandle);
- return static_cast<Error>(error);
+ initDispatch(GRALLOC1_FUNCTION_RETAIN, &mDispatch.retain);
+ initDispatch(GRALLOC1_FUNCTION_RELEASE, &mDispatch.release);
+ initDispatch(GRALLOC1_FUNCTION_GET_DIMENSIONS, &mDispatch.getDimensions);
+ initDispatch(GRALLOC1_FUNCTION_GET_FORMAT, &mDispatch.getFormat);
+ if (mCapabilities.layeredBuffers) {
+ initDispatch(GRALLOC1_FUNCTION_GET_LAYER_COUNT,
+ &mDispatch.getLayerCount);
+ }
+ initDispatch(GRALLOC1_FUNCTION_GET_PRODUCER_USAGE,
+ &mDispatch.getProducerUsage);
+ initDispatch(GRALLOC1_FUNCTION_GET_CONSUMER_USAGE,
+ &mDispatch.getConsumerUsage);
+ initDispatch(GRALLOC1_FUNCTION_GET_BACKING_STORE,
+ &mDispatch.getBackingStore);
+ initDispatch(GRALLOC1_FUNCTION_GET_STRIDE, &mDispatch.getStride);
+ initDispatch(GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES,
+ &mDispatch.getNumFlexPlanes);
+ initDispatch(GRALLOC1_FUNCTION_LOCK, &mDispatch.lock);
+ initDispatch(GRALLOC1_FUNCTION_LOCK_FLEX, &mDispatch.lockFlex);
+ initDispatch(GRALLOC1_FUNCTION_UNLOCK, &mDispatch.unlock);
}
-Error GrallocDevice::release(const native_handle_t* bufferHandle)
+gralloc1_rect_t GrallocMapperHal::asGralloc1Rect(const IMapper::Rect& rect)
{
- int32_t error = mDispatch.release(mDevice, bufferHandle);
- return static_cast<Error>(error);
+ return gralloc1_rect_t{rect.left, rect.top, rect.width, rect.height};
}
-Error GrallocDevice::getDimensions(const native_handle_t* bufferHandle,
- uint32_t* outWidth, uint32_t* outHeight)
+bool GrallocMapperHal::dupFence(const hidl_handle& fenceHandle, int* outFd)
{
- int32_t error = mDispatch.getDimensions(mDevice, bufferHandle,
- outWidth, outHeight);
- return static_cast<Error>(error);
+ auto handle = fenceHandle.getNativeHandle();
+ if (!handle || handle->numFds == 0) {
+ *outFd = -1;
+ return true;
+ }
+
+ if (handle->numFds > 1) {
+ ALOGE("invalid fence handle with %d fds", handle->numFds);
+ return false;
+ }
+
+ *outFd = dup(handle->data[0]);
+ return (*outFd >= 0);
}
-Error GrallocDevice::getFormat(const native_handle_t* bufferHandle,
- PixelFormat* outFormat)
+Return<Error> GrallocMapperHal::retain(const hidl_handle& bufferHandle)
{
- int32_t error = mDispatch.getFormat(mDevice, bufferHandle,
- reinterpret_cast<int32_t*>(outFormat));
- return static_cast<Error>(error);
+ int32_t err = mDispatch.retain(mDevice, bufferHandle);
+ return static_cast<Error>(err);
}
-Error GrallocDevice::getLayerCount(const native_handle_t* bufferHandle,
- uint32_t* outLayerCount)
+Return<Error> GrallocMapperHal::release(const hidl_handle& bufferHandle)
{
- if (hasCapability(Capability::LAYERED_BUFFERS)) {
- int32_t error = mDispatch.getLayerCount(mDevice, bufferHandle,
- outLayerCount);
- return static_cast<Error>(error);
+ int32_t err = mDispatch.release(mDevice, bufferHandle);
+ return static_cast<Error>(err);
+}
+
+Return<void> GrallocMapperHal::getDimensions(const hidl_handle& bufferHandle,
+ getDimensions_cb hidl_cb)
+{
+ uint32_t width = 0;
+ uint32_t height = 0;
+ int32_t err = mDispatch.getDimensions(mDevice, bufferHandle,
+ &width, &height);
+
+ hidl_cb(static_cast<Error>(err), width, height);
+ return Void();
+}
+
+Return<void> GrallocMapperHal::getFormat(const hidl_handle& bufferHandle,
+ getFormat_cb hidl_cb)
+{
+ int32_t format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
+ int32_t err = mDispatch.getFormat(mDevice, bufferHandle, &format);
+
+ hidl_cb(static_cast<Error>(err), static_cast<PixelFormat>(format));
+ return Void();
+}
+
+Return<void> GrallocMapperHal::getLayerCount(const hidl_handle& bufferHandle,
+ getLayerCount_cb hidl_cb)
+{
+ int32_t err = GRALLOC1_ERROR_NONE;
+ uint32_t count = 1;
+ if (mCapabilities.layeredBuffers) {
+ err = mDispatch.getLayerCount(mDevice, bufferHandle, &count);
+ }
+
+ hidl_cb(static_cast<Error>(err), count);
+ return Void();
+}
+
+Return<void> GrallocMapperHal::getProducerUsageMask(
+ const hidl_handle& bufferHandle, getProducerUsageMask_cb hidl_cb)
+{
+ uint64_t mask = 0x0;
+ int32_t err = mDispatch.getProducerUsage(mDevice, bufferHandle, &mask);
+
+ hidl_cb(static_cast<Error>(err), mask);
+ return Void();
+}
+
+Return<void> GrallocMapperHal::getConsumerUsageMask(
+ const hidl_handle& bufferHandle, getConsumerUsageMask_cb hidl_cb)
+{
+ uint64_t mask = 0x0;
+ int32_t err = mDispatch.getConsumerUsage(mDevice, bufferHandle, &mask);
+
+ hidl_cb(static_cast<Error>(err), mask);
+ return Void();
+}
+
+Return<void> GrallocMapperHal::getBackingStore(
+ const hidl_handle& bufferHandle, getBackingStore_cb hidl_cb)
+{
+ uint64_t store = 0;
+ int32_t err = mDispatch.getBackingStore(mDevice, bufferHandle, &store);
+
+ hidl_cb(static_cast<Error>(err), store);
+ return Void();
+}
+
+Return<void> GrallocMapperHal::getStride(const hidl_handle& bufferHandle,
+ getStride_cb hidl_cb)
+{
+ uint32_t stride = 0;
+ int32_t err = mDispatch.getStride(mDevice, bufferHandle, &stride);
+
+ hidl_cb(static_cast<Error>(err), stride);
+ return Void();
+}
+
+Return<void> GrallocMapperHal::lock(const hidl_handle& bufferHandle,
+ uint64_t producerUsageMask, uint64_t consumerUsageMask,
+ const IMapper::Rect& accessRegion, const hidl_handle& acquireFence,
+ lock_cb hidl_cb)
+{
+ gralloc1_rect_t rect = asGralloc1Rect(accessRegion);
+
+ int fence = -1;
+ if (!dupFence(acquireFence, &fence)) {
+ hidl_cb(Error::NO_RESOURCES, nullptr);
+ return Void();
+ }
+
+ void* data = nullptr;
+ int32_t err = mDispatch.lock(mDevice, bufferHandle, producerUsageMask,
+ consumerUsageMask, &rect, &data, fence);
+ if (err != GRALLOC1_ERROR_NONE) {
+ close(fence);
+ }
+
+ hidl_cb(static_cast<Error>(err), data);
+ return Void();
+}
+
+Return<void> GrallocMapperHal::lockFlex(const hidl_handle& bufferHandle,
+ uint64_t producerUsageMask, uint64_t consumerUsageMask,
+ const IMapper::Rect& accessRegion, const hidl_handle& acquireFence,
+ lockFlex_cb hidl_cb)
+{
+ FlexLayout layout_reply{};
+
+ uint32_t planeCount = 0;
+ int32_t err = mDispatch.getNumFlexPlanes(mDevice, bufferHandle,
+ &planeCount);
+ if (err != GRALLOC1_ERROR_NONE) {
+ hidl_cb(static_cast<Error>(err), layout_reply);
+ return Void();
+ }
+
+ gralloc1_rect_t rect = asGralloc1Rect(accessRegion);
+
+ int fence = -1;
+ if (!dupFence(acquireFence, &fence)) {
+ hidl_cb(Error::NO_RESOURCES, layout_reply);
+ return Void();
+ }
+
+ std::vector<android_flex_plane_t> planes(planeCount);
+ android_flex_layout_t layout{};
+ layout.num_planes = planes.size();
+ layout.planes = planes.data();
+
+ err = mDispatch.lockFlex(mDevice, bufferHandle, producerUsageMask,
+ consumerUsageMask, &rect, &layout, fence);
+ if (err == GRALLOC1_ERROR_NONE) {
+ layout_reply.format = static_cast<FlexFormat>(layout.format);
+
+ planes.resize(layout.num_planes);
+ layout_reply.planes.setToExternal(
+ reinterpret_cast<FlexPlane*>(planes.data()), planes.size());
} else {
- *outLayerCount = 1;
- return Error::NONE;
+ close(fence);
}
+
+ hidl_cb(static_cast<Error>(err), layout_reply);
+ return Void();
}
-Error GrallocDevice::getProducerUsageMask(const native_handle_t* bufferHandle,
- uint64_t* outUsageMask)
+Return<void> GrallocMapperHal::unlock(const hidl_handle& bufferHandle,
+ unlock_cb hidl_cb)
{
- int32_t error = mDispatch.getProducerUsage(mDevice, bufferHandle,
- outUsageMask);
- return static_cast<Error>(error);
+ int32_t fence = -1;
+ int32_t err = mDispatch.unlock(mDevice, bufferHandle, &fence);
+
+ NATIVE_HANDLE_DECLARE_STORAGE(fenceStorage, 1, 0);
+ hidl_handle fenceHandle;
+ if (err == GRALLOC1_ERROR_NONE && fence >= 0) {
+ auto nativeHandle = native_handle_init(fenceStorage, 1, 0);
+ nativeHandle->data[0] = fence;
+
+ fenceHandle = nativeHandle;
+ }
+
+ hidl_cb(static_cast<Error>(err), fenceHandle);
+ return Void();
}
-Error GrallocDevice::getConsumerUsageMask(const native_handle_t* bufferHandle,
- uint64_t* outUsageMask)
-{
- int32_t error = mDispatch.getConsumerUsage(mDevice, bufferHandle,
- outUsageMask);
- return static_cast<Error>(error);
-}
+} // anonymous namespace
-Error GrallocDevice::getBackingStore(const native_handle_t* bufferHandle,
- BackingStore* outStore)
-{
- int32_t error = mDispatch.getBackingStore(mDevice, bufferHandle,
- outStore);
- return static_cast<Error>(error);
-}
-
-Error GrallocDevice::getStride(const native_handle_t* bufferHandle,
- uint32_t* outStride)
-{
- int32_t error = mDispatch.getStride(mDevice, bufferHandle, outStride);
- return static_cast<Error>(error);
-}
-
-Error GrallocDevice::getNumFlexPlanes(const native_handle_t* bufferHandle,
- uint32_t* outNumPlanes)
-{
- int32_t error = mDispatch.getNumFlexPlanes(mDevice, bufferHandle,
- outNumPlanes);
- return static_cast<Error>(error);
-}
-
-Error GrallocDevice::lock(const native_handle_t* bufferHandle,
- uint64_t producerUsageMask, uint64_t consumerUsageMask,
- const Rect* accessRegion, int32_t acquireFence,
- void** outData)
-{
- int32_t error = mDispatch.lock(mDevice, bufferHandle,
- producerUsageMask, consumerUsageMask,
- reinterpret_cast<const gralloc1_rect_t*>(accessRegion),
- outData, acquireFence);
- return static_cast<Error>(error);
-}
-
-Error GrallocDevice::lockFlex(const native_handle_t* bufferHandle,
- uint64_t producerUsageMask, uint64_t consumerUsageMask,
- const Rect* accessRegion, int32_t acquireFence,
- FlexLayout* outFlexLayout)
-{
- int32_t error = mDispatch.lockFlex(mDevice, bufferHandle,
- producerUsageMask, consumerUsageMask,
- reinterpret_cast<const gralloc1_rect_t*>(accessRegion),
- reinterpret_cast<android_flex_layout_t*>(outFlexLayout),
- acquireFence);
- return static_cast<Error>(error);
-}
-
-Error GrallocDevice::unlock(const native_handle_t* bufferHandle,
- int32_t* outReleaseFence)
-{
- int32_t error = mDispatch.unlock(mDevice, bufferHandle, outReleaseFence);
- return static_cast<Error>(error);
-}
-
-class GrallocMapper : public IMapper {
-public:
- GrallocMapper() : IMapper{
- .createDevice = createDevice,
- .destroyDevice = destroyDevice,
- .retain = retain,
- .release = release,
- .getDimensions = getDimensions,
- .getFormat = getFormat,
- .getLayerCount = getLayerCount,
- .getProducerUsageMask = getProducerUsageMask,
- .getConsumerUsageMask = getConsumerUsageMask,
- .getBackingStore = getBackingStore,
- .getStride = getStride,
- .getNumFlexPlanes = getNumFlexPlanes,
- .lock = lock,
- .lockFlex = lockFlex,
- .unlock = unlock,
- } {}
-
- const IMapper* getInterface() const
- {
- return static_cast<const IMapper*>(this);
+IMapper* HIDL_FETCH_IMapper(const char* /* name */) {
+ const hw_module_t* module = nullptr;
+ int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
+ if (err) {
+ ALOGE("failed to get gralloc module");
+ return nullptr;
}
-private:
- static GrallocDevice* cast(Device* device)
- {
- return reinterpret_cast<GrallocDevice*>(device);
+ uint8_t major = (module->module_api_version >> 8) & 0xff;
+ if (major != 1) {
+ ALOGE("unknown gralloc module major version %d", major);
+ return nullptr;
}
- static Error createDevice(Device** outDevice)
- {
- *outDevice = new GrallocDevice;
- return Error::NONE;
- }
-
- static Error destroyDevice(Device* device)
- {
- delete cast(device);
- return Error::NONE;
- }
-
- static Error retain(Device* device,
- const native_handle_t* bufferHandle)
- {
- return cast(device)->retain(bufferHandle);
- }
-
- static Error release(Device* device,
- const native_handle_t* bufferHandle)
- {
- return cast(device)->release(bufferHandle);
- }
-
- static Error getDimensions(Device* device,
- const native_handle_t* bufferHandle,
- uint32_t* outWidth, uint32_t* outHeight)
- {
- return cast(device)->getDimensions(bufferHandle, outWidth, outHeight);
- }
-
- static Error getFormat(Device* device,
- const native_handle_t* bufferHandle, PixelFormat* outFormat)
- {
- return cast(device)->getFormat(bufferHandle, outFormat);
- }
-
- static Error getLayerCount(Device* device,
- const native_handle_t* bufferHandle, uint32_t* outLayerCount)
- {
- return cast(device)->getLayerCount(bufferHandle, outLayerCount);
- }
-
- static Error getProducerUsageMask(Device* device,
- const native_handle_t* bufferHandle, uint64_t* outUsageMask)
- {
- return cast(device)->getProducerUsageMask(bufferHandle, outUsageMask);
- }
-
- static Error getConsumerUsageMask(Device* device,
- const native_handle_t* bufferHandle, uint64_t* outUsageMask)
- {
- return cast(device)->getConsumerUsageMask(bufferHandle, outUsageMask);
- }
-
- static Error getBackingStore(Device* device,
- const native_handle_t* bufferHandle, BackingStore* outStore)
- {
- return cast(device)->getBackingStore(bufferHandle, outStore);
- }
-
- static Error getStride(Device* device,
- const native_handle_t* bufferHandle, uint32_t* outStride)
- {
- return cast(device)->getStride(bufferHandle, outStride);
- }
-
- static Error getNumFlexPlanes(Device* device,
- const native_handle_t* bufferHandle, uint32_t* outNumPlanes)
- {
- return cast(device)->getNumFlexPlanes(bufferHandle, outNumPlanes);
- }
-
- static Error lock(Device* device,
- const native_handle_t* bufferHandle,
- uint64_t producerUsageMask, uint64_t consumerUsageMask,
- const Device::Rect* accessRegion, int32_t acquireFence,
- void** outData)
- {
- return cast(device)->lock(bufferHandle,
- producerUsageMask, consumerUsageMask,
- accessRegion, acquireFence, outData);
- }
-
- static Error lockFlex(Device* device,
- const native_handle_t* bufferHandle,
- uint64_t producerUsageMask, uint64_t consumerUsageMask,
- const Device::Rect* accessRegion, int32_t acquireFence,
- FlexLayout* outFlexLayout)
- {
- return cast(device)->lockFlex(bufferHandle,
- producerUsageMask, consumerUsageMask,
- accessRegion, acquireFence, outFlexLayout);
- }
-
- static Error unlock(Device* device,
- const native_handle_t* bufferHandle, int32_t* outReleaseFence)
- {
- return cast(device)->unlock(bufferHandle, outReleaseFence);
- }
-};
-
-extern "C" const void* HALLIB_FETCH_Interface(const char* name)
-{
- if (strcmp(name, "android.hardware.graphics.mapper@2.0::IMapper") == 0) {
- static GrallocMapper sGrallocMapper;
- return sGrallocMapper.getInterface();
- }
-
- return nullptr;
+ return new GrallocMapperHal(module);
}
} // namespace implementation
diff --git a/graphics/mapper/2.0/default/GrallocMapper.h b/graphics/mapper/2.0/default/GrallocMapper.h
new file mode 100644
index 0000000..a2f89d1
--- /dev/null
+++ b/graphics/mapper/2.0/default/GrallocMapper.h
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+#ifndef ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_GRALLOC_MAPPER_H
+#define ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_GRALLOC_MAPPER_H
+
+#include <android/hardware/graphics/mapper/2.0/IMapper.h>
+
+namespace android {
+namespace hardware {
+namespace graphics {
+namespace mapper {
+namespace V2_0 {
+namespace implementation {
+
+extern "C" IMapper* HIDL_FETCH_IMapper(const char* name);
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace mapper
+} // namespace graphics
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_GRALLOC_MAPPER_H
diff --git a/graphics/mapper/2.0/include/android/hardware/graphics/mapper/2.0/types.h b/graphics/mapper/2.0/include/android/hardware/graphics/mapper/2.0/types.h
deleted file mode 100644
index 4054b82..0000000
--- a/graphics/mapper/2.0/include/android/hardware/graphics/mapper/2.0/types.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_TYPES_H
-#define ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_TYPES_H
-
-#include <type_traits>
-
-#include <android/hardware/graphics/allocator/2.0/types.h>
-#include <android/hardware/graphics/common/1.0/types.h>
-
-namespace android {
-namespace hardware {
-namespace graphics {
-namespace mapper {
-namespace V2_0 {
-
-using android::hardware::graphics::allocator::V2_0::Error;
-using android::hardware::graphics::allocator::V2_0::ProducerUsage;
-using android::hardware::graphics::allocator::V2_0::ConsumerUsage;
-using android::hardware::graphics::common::V1_0::PixelFormat;
-
-/*
- * Structures for describing flexible YUVA/RGBA formats for consumption by
- * applications. Such flexible formats contain a plane for each component
- * (e.g. red, green, blue), where each plane is laid out in a grid-like
- * pattern occupying unique byte addresses and with consistent byte offsets
- * between neighboring pixels.
- *
- * The FlexLayout structure is used with any pixel format that can be
- * represented by it, such as:
- *
- * - PixelFormat::YCbCr_*_888
- * - PixelFormat::FLEX_RGB*_888
- * - PixelFormat::RGB[AX]_888[8],BGRA_8888,RGB_888
- * - PixelFormat::YV12,Y8,Y16,YCbCr_422_SP/I,YCrCb_420_SP
- * - even implementation defined formats that can be represented by the
- * structures
- *
- * Vertical increment (aka. row increment or stride) describes the distance in
- * bytes from the first pixel of one row to the first pixel of the next row
- * (below) for the component plane. This can be negative.
- *
- * Horizontal increment (aka. column or pixel increment) describes the
- * distance in bytes from one pixel to the next pixel (to the right) on the
- * same row for the component plane. This can be negative.
- *
- * Each plane can be subsampled either vertically or horizontally by a
- * power-of-two factor.
- *
- * The bit-depth of each component can be arbitrary, as long as the pixels are
- * laid out on whole bytes, in native byte-order, using the most significant
- * bits of each unit.
- */
-
-enum class FlexComponent : int32_t {
- Y = 1 << 0, /* luma */
- Cb = 1 << 1, /* chroma blue */
- Cr = 1 << 2, /* chroma red */
-
- R = 1 << 10, /* red */
- G = 1 << 11, /* green */
- B = 1 << 12, /* blue */
-
- A = 1 << 30, /* alpha */
-};
-
-inline FlexComponent operator|(FlexComponent lhs, FlexComponent rhs)
-{
- return static_cast<FlexComponent>(static_cast<int32_t>(lhs) |
- static_cast<int32_t>(rhs));
-}
-
-inline FlexComponent& operator|=(FlexComponent &lhs, FlexComponent rhs)
-{
- lhs = static_cast<FlexComponent>(static_cast<int32_t>(lhs) |
- static_cast<int32_t>(rhs));
- return lhs;
-}
-
-enum class FlexFormat : int32_t {
- /* not a flexible format */
- INVALID = 0x0,
-
- Y = static_cast<int32_t>(FlexComponent::Y),
- YCbCr = static_cast<int32_t>(FlexComponent::Y) |
- static_cast<int32_t>(FlexComponent::Cb) |
- static_cast<int32_t>(FlexComponent::Cr),
- YCbCrA = static_cast<int32_t>(YCbCr) |
- static_cast<int32_t>(FlexComponent::A),
- RGB = static_cast<int32_t>(FlexComponent::R) |
- static_cast<int32_t>(FlexComponent::G) |
- static_cast<int32_t>(FlexComponent::B),
- RGBA = static_cast<int32_t>(RGB) |
- static_cast<int32_t>(FlexComponent::A),
-};
-
-struct FlexPlane {
- /* pointer to the first byte of the top-left pixel of the plane. */
- uint8_t *topLeft;
-
- FlexComponent component;
-
- /*
- * bits allocated for the component in each pixel. Must be a positive
- * multiple of 8.
- */
- int32_t bitsPerComponent;
-
- /*
- * number of the most significant bits used in the format for this
- * component. Must be between 1 and bits_per_component, inclusive.
- */
- int32_t bitsUsed;
-
- /* horizontal increment */
- int32_t hIncrement;
- /* vertical increment */
- int32_t vIncrement;
-
- /* horizontal subsampling. Must be a positive power of 2. */
- int32_t hSubsampling;
- /* vertical subsampling. Must be a positive power of 2. */
- int32_t vSubsampling;
-};
-static_assert(std::is_pod<FlexPlane>::value, "FlexPlane is not POD");
-
-struct FlexLayout {
- /* the kind of flexible format */
- FlexFormat format;
-
- /* number of planes; 0 for FLEX_FORMAT_INVALID */
- uint32_t numPlanes;
-
- /*
- * a plane for each component; ordered in increasing component value order.
- * E.g. FLEX_FORMAT_RGBA maps 0 -> R, 1 -> G, etc.
- * Can be NULL for FLEX_FORMAT_INVALID
- */
- FlexPlane* planes;
-};
-static_assert(std::is_pod<FlexLayout>::value, "FlexLayout is not POD");
-
-typedef uint64_t BackingStore;
-
-} // namespace V2_0
-} // namespace mapper
-} // namespace graphics
-} // namespace hardware
-} // namespace android
-
-#endif /* ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_TYPES_H */
diff --git a/graphics/mapper/2.0/types.hal b/graphics/mapper/2.0/types.hal
new file mode 100644
index 0000000..aa33141
--- /dev/null
+++ b/graphics/mapper/2.0/types.hal
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package android.hardware.graphics.mapper@2.0;
+
+/*
+ * Structures for describing flexible YUVA/RGBA formats for consumption by
+ * applications. Such flexible formats contain a plane for each component (e.g.
+ * red, green, blue), where each plane is laid out in a grid-like pattern
+ * occupying unique byte addresses and with consistent byte offsets between
+ * neighboring pixels.
+ *
+ * The FlexLayout structure is used with any pixel format that can be
+ * represented by it, such as:
+ * - PixelFormat::YCBCR_*_888
+ * - PixelFormat::FLEX_RGB*_888
+ * - PixelFormat::RGB[AX]_888[8],BGRA_8888,RGB_888
+ * - PixelFormat::YV12,Y8,Y16,YCBCR_422_SP/I,YCRCB_420_SP
+ * - even implementation defined formats that can be represented by
+ * the structures
+ *
+ * Vertical increment (aka. row increment or stride) describes the distance in
+ * bytes from the first pixel of one row to the first pixel of the next row
+ * (below) for the component plane. This can be negative.
+ *
+ * Horizontal increment (aka. column or pixel increment) describes the distance
+ * in bytes from one pixel to the next pixel (to the right) on the same row for
+ * the component plane. This can be negative.
+ *
+ * Each plane can be subsampled either vertically or horizontally by
+ * a power-of-two factor.
+ *
+ * The bit-depth of each component can be arbitrary, as long as the pixels are
+ * laid out on whole bytes, in native byte-order, using the most significant
+ * bits of each unit.
+ */
+
+enum FlexComponent : int32_t {
+ Y = 1 << 0, /* luma */
+ CB = 1 << 1, /* chroma blue */
+ CR = 1 << 2, /* chroma red */
+
+ R = 1 << 10, /* red */
+ G = 1 << 11, /* green */
+ B = 1 << 12, /* blue */
+
+ A = 1 << 30, /* alpha */
+};
+
+enum FlexFormat : int32_t {
+ /* not a flexible format */
+ INVALID = 0x0,
+
+ Y = FlexComponent:Y,
+ YCBCR = Y | FlexComponent:CB | FlexComponent:CR,
+ YCBCRA = YCBCR | FlexComponent:A,
+
+ RGB = FlexComponent:R | FlexComponent:G | FlexComponent:B,
+ RGBA = RGB | FlexComponent:A,
+};
+
+struct FlexPlane {
+ /* Pointer to the first byte of the top-left pixel of the plane. */
+ pointer topLeft;
+
+ FlexComponent component;
+
+ /*
+ * Bits allocated for the component in each pixel. Must be a positive
+ * multiple of 8.
+ */
+ int32_t bitsPerComponent;
+
+ /*
+ * Number of the most significant bits used in the format for this
+ * component. Must be between 1 and bitsPerComponent, inclusive.
+ */
+ int32_t bitsUsed;
+
+ /* Horizontal increment. */
+ int32_t hIncrement;
+ /* Vertical increment. */
+ int32_t vIncrement;
+ /* Horizontal subsampling. Must be a positive power of 2. */
+ int32_t hSubsampling;
+ /* Vertical subsampling. Must be a positive power of 2. */
+ int32_t vSubsampling;
+};
+
+struct FlexLayout {
+ /* The kind of flexible format. */
+ FlexFormat format;
+
+ /*
+ * A plane for each component; ordered in increasing component value
+ * order. E.g. FlexFormat::RGBA maps 0 -> R, 1 -> G, etc. Can have size 0
+ * for FlexFormat::INVALID.
+ */
+ vec<FlexPlane> planes;
+};
+
+/* Backing store ID of a buffer. See IMapper::getBackingStore. */
+typedef uint64_t BackingStore;