summaryrefslogtreecommitdiff
path: root/merrifield/include/pvr/hal/img_gralloc1.h
diff options
context:
space:
mode:
Diffstat (limited to 'merrifield/include/pvr/hal/img_gralloc1.h')
-rw-r--r--merrifield/include/pvr/hal/img_gralloc1.h303
1 files changed, 303 insertions, 0 deletions
diff --git a/merrifield/include/pvr/hal/img_gralloc1.h b/merrifield/include/pvr/hal/img_gralloc1.h
new file mode 100644
index 0000000..f9f69a2
--- /dev/null
+++ b/merrifield/include/pvr/hal/img_gralloc1.h
@@ -0,0 +1,303 @@
+/* Copyright (c) Imagination Technologies Ltd.
+ *
+ * The contents of this file are subject to the MIT license as set out below.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef IMG_GRALLOC1_H
+#define IMG_GRALLOC1_H
+
+#include <hardware/gralloc1.h>
+
+#include <stdlib.h>
+
+#define GRALLOC1_FUNCTION_IMG_EXT_OFF 1000
+
+enum
+{
+ GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG =
+ (GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG),
+ GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG =
+ (GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG),
+ GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG =
+ (GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG),
+ GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG =
+ (GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_DEVICE_IMG),
+ GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG =
+ (GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_STATUS_IMG),
+};
+
+static inline int gralloc1_register_img
+ (gralloc1_device_t *g, buffer_handle_t handle)
+{
+ GRALLOC1_PFN_RETAIN f =
+ (GRALLOC1_PFN_RETAIN)
+ g->getFunction(g, GRALLOC1_FUNCTION_RETAIN);
+ int32_t err;
+
+ err = f(g, handle);
+ switch (err)
+ {
+ case GRALLOC1_ERROR_NO_RESOURCES:
+ return -EAGAIN;
+ case GRALLOC1_ERROR_NONE:
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
+static inline int gralloc1_unregister_img
+ (gralloc1_device_t *g, buffer_handle_t handle)
+{
+ GRALLOC1_PFN_RELEASE f =
+ (GRALLOC1_PFN_RELEASE)
+ g->getFunction(g, GRALLOC1_FUNCTION_RELEASE);
+ int32_t err;
+
+ err = f(g, handle);
+ switch (err)
+ {
+ case GRALLOC1_ERROR_NONE:
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
+static inline int gralloc1_device_alloc_img
+ (gralloc1_device_t *d, int w, int h, int format, int usage,
+ buffer_handle_t *handle, int *stride)
+{
+ GRALLOC1_PFN_ALLOCATE allocate =
+ (GRALLOC1_PFN_ALLOCATE)
+ d->getFunction(d, GRALLOC1_FUNCTION_ALLOCATE);
+ GRALLOC1_PFN_CREATE_DESCRIPTOR createDescriptor =
+ (GRALLOC1_PFN_CREATE_DESCRIPTOR)
+ d->getFunction(d, GRALLOC1_FUNCTION_CREATE_DESCRIPTOR);
+ GRALLOC1_PFN_DESTROY_DESCRIPTOR destroyDescriptor =
+ (GRALLOC1_PFN_DESTROY_DESCRIPTOR)
+ d->getFunction(d, GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR);
+ GRALLOC1_PFN_SET_CONSUMER_USAGE setConsumerUsage =
+ (GRALLOC1_PFN_SET_CONSUMER_USAGE)
+ d->getFunction(d, GRALLOC1_FUNCTION_SET_CONSUMER_USAGE);
+ GRALLOC1_PFN_SET_DIMENSIONS setDimensions =
+ (GRALLOC1_PFN_SET_DIMENSIONS)
+ d->getFunction(d, GRALLOC1_FUNCTION_SET_DIMENSIONS);
+ GRALLOC1_PFN_SET_FORMAT setFormat =
+ (GRALLOC1_PFN_SET_FORMAT)
+ d->getFunction(d, GRALLOC1_FUNCTION_SET_FORMAT);
+ GRALLOC1_PFN_SET_PRODUCER_USAGE setProducerUsage =
+ (GRALLOC1_PFN_SET_PRODUCER_USAGE)
+ d->getFunction(d, GRALLOC1_FUNCTION_SET_PRODUCER_USAGE);
+ GRALLOC1_PFN_GET_STRIDE getStride =
+ (GRALLOC1_PFN_GET_STRIDE)
+ d->getFunction(d, GRALLOC1_FUNCTION_GET_STRIDE);
+ uint64_t producerUsage =
+ (usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN |
+ GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN |
+ GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET |
+ GRALLOC1_PRODUCER_USAGE_PROTECTED |
+ GRALLOC1_PRODUCER_USAGE_CAMERA |
+ GRALLOC1_PRODUCER_USAGE_VIDEO_DECODER));
+ uint64_t consumerUsage =
+ (usage & (GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN |
+ GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE |
+ GRALLOC1_CONSUMER_USAGE_HWCOMPOSER |
+ GRALLOC1_CONSUMER_USAGE_CLIENT_TARGET |
+ GRALLOC1_CONSUMER_USAGE_CURSOR |
+ GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER |
+ GRALLOC1_CONSUMER_USAGE_CAMERA |
+ GRALLOC1_CONSUMER_USAGE_RENDERSCRIPT));
+ gralloc1_buffer_descriptor_t descriptor;
+ uint32_t stride32;
+ int err = -EINVAL;
+ int32_t err32;
+
+ err32 = createDescriptor(d, &descriptor);
+ if (err32 != GRALLOC1_ERROR_NONE)
+ goto err_out;
+
+ err32 = setDimensions(d, descriptor, w, h);
+ if (err32 != GRALLOC1_ERROR_NONE)
+ goto err_destroy_descriptor;
+
+ err32 = setFormat(d, descriptor, format);
+ if (err32 != GRALLOC1_ERROR_NONE)
+ goto err_destroy_descriptor;
+
+ err32 = setConsumerUsage(d, descriptor, consumerUsage);
+ if (err32 != GRALLOC1_ERROR_NONE)
+ goto err_destroy_descriptor;
+
+ err32 = setProducerUsage(d, descriptor, producerUsage);
+ if (err32 != GRALLOC1_ERROR_NONE)
+ goto err_destroy_descriptor;
+
+ err32 = allocate(d, 1, &descriptor, handle);
+ switch (err32)
+ {
+ case GRALLOC1_ERROR_NOT_SHARED:
+ case GRALLOC1_ERROR_NONE:
+ break;
+ case GRALLOC1_ERROR_NO_RESOURCES:
+ err = -EAGAIN;
+ default:
+ goto err_destroy_descriptor;
+ }
+
+ err32 = getStride(d, *handle, &stride32);
+ if (err32 != GRALLOC1_ERROR_NONE)
+ {
+ gralloc1_unregister_img(d, *handle);
+ goto err_destroy_descriptor;
+ }
+
+ *stride = (int)stride32;
+ err = 0;
+err_destroy_descriptor:
+ destroyDescriptor(d, descriptor);
+err_out:
+ return err;
+}
+
+static inline int gralloc1_device_free_img
+ (gralloc1_device_t *d, buffer_handle_t handle)
+{
+ return gralloc1_unregister_img(d, handle);
+}
+
+static inline int gralloc1_lock_async_img
+ (gralloc1_device_t *g, buffer_handle_t handle, int usage,
+ const gralloc1_rect_t *r, void **vaddr, int acquireFence)
+{
+ GRALLOC1_PFN_LOCK f =
+ (GRALLOC1_PFN_LOCK)
+ g->getFunction(g, GRALLOC1_FUNCTION_LOCK);
+ uint64_t producerUsage =
+ (usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN |
+ GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN));
+ uint64_t consumerUsage =
+ (usage & GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN);
+ int32_t err;
+
+ err = f(g, handle, producerUsage, consumerUsage, r, vaddr, acquireFence);
+ switch (err)
+ {
+ case GRALLOC1_ERROR_NONE:
+ return 0;
+ case GRALLOC1_ERROR_NO_RESOURCES:
+ return -EAGAIN;
+ default:
+ return -EINVAL;
+ }
+}
+
+static inline int gralloc1_unlock_async_img
+ (gralloc1_device_t *g, buffer_handle_t handle, int *releaseFence)
+{
+ GRALLOC1_PFN_UNLOCK f =
+ (GRALLOC1_PFN_UNLOCK)
+ g->getFunction(g, GRALLOC1_FUNCTION_UNLOCK);
+ int32_t err, releaseFence32;
+
+ err = f(g, handle, &releaseFence32);
+ switch (err)
+ {
+ case GRALLOC1_ERROR_NONE:
+ *releaseFence = releaseFence32;
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
+typedef int (*GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
+ (gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
+ int w, int h, int x, int y, int transform, int input_fence,
+ int *output_fence);
+
+static inline int gralloc1_blit_handle_to_handle_img
+ (gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
+ int w, int h, int x, int y, int transform, int input_fence,
+ int *output_fence)
+{
+ GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG f =
+ (GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
+ g->getFunction(g, GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG);
+
+ return f(g, src, dest, w, h, x, y, transform, input_fence, output_fence);
+}
+
+typedef int (*GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
+ (gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
+ size_t *sizes);
+
+static inline int gralloc1_get_buffer_cpu_addresses_img
+ (gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
+ size_t *sizes)
+{
+ GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG f =
+ (GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
+ g->getFunction(g, GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG);
+
+ return f(g, handle, vaddrs, sizes);
+}
+
+typedef int (*GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
+ (gralloc1_device_t *g, buffer_handle_t handle);
+
+static inline int gralloc1_put_buffer_cpu_addresses_img
+ (gralloc1_device_t *g, buffer_handle_t handle)
+{
+ GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG f =
+ (GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
+ g->getFunction(g, GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG);
+
+ return f(g, handle);
+}
+
+typedef int (*GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
+ (gralloc1_device_t *g, void **ppvDispDev);
+
+static inline int gralloc1_get_display_device_img
+ (gralloc1_device_t *g, void **ppvDispDev)
+{
+ GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG f =
+ (GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
+ g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG);
+
+ return f(g, ppvDispDev);
+}
+
+typedef int (*GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
+ (gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status);
+
+static inline int gralloc1_get_display_status_img
+ (gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status)
+{
+ GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG f =
+ (GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
+ g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG);
+
+ return f(g, handle, pui32Status);
+}
+
+#endif /* IMG_GRALLOC1_H */