blob: 1ec5659bce12fe65741b2536043cc1263033c564 [file] [log] [blame]
Cody Schuffelen134ff032019-11-22 00:25:32 -08001#pragma once
2/*
3 * Copyright (C) 2017 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include <errno.h>
19#include <cutils/native_handle.h>
20#include <hardware/gralloc.h>
21#include <log/log.h>
22
23struct vsoc_alloc_device_t {
24 alloc_device_t device;
25};
26
27struct vsoc_gralloc_module_t {
28 gralloc_module_t base;
29};
30
31static_assert(sizeof(int) >= 4, "At least 4 bytes are needed for offsets");
32
33struct vsoc_buffer_handle_t : public native_handle {
34 // File descriptors
35 int fd;
36 // ints
37 int magic;
38 int format;
39 int x_res;
40 int y_res;
41 int stride_in_pixels;
42 int size;
43 // buffer offset in bytes divided by PAGE_SIZE
44 int offset;
45
46 static inline int sNumInts() {
47 return ((sizeof(vsoc_buffer_handle_t) - sizeof(native_handle_t)) /
48 sizeof(int) -
49 sNumFds);
50 }
51 static const int sNumFds = 1;
52 static const int sMagic = 0xc63752f4;
53
54 vsoc_buffer_handle_t(int fd,
55 int offset,
56 int size,
57 int format,
58 int x_res,
59 int y_res,
60 int stride_in_pixels)
61 : fd(fd),
62 magic(sMagic),
63 format(format),
64 x_res(x_res),
65 y_res(y_res),
66 stride_in_pixels(stride_in_pixels),
67 size(size),
68 offset(offset) {
69 version = sizeof(native_handle);
70 numInts = sNumInts();
71 numFds = sNumFds;
72 }
73
74 ~vsoc_buffer_handle_t() {
75 magic = 0;
76 }
77
78 static int validate(const native_handle* handle) {
79 const vsoc_buffer_handle_t* hnd =
80 reinterpret_cast<const vsoc_buffer_handle_t*>(handle);
81 if (!hnd || hnd->version != sizeof(native_handle) ||
82 hnd->numInts != sNumInts() || hnd->numFds != sNumFds ||
83 hnd->magic != sMagic) {
84 ALOGE("Invalid gralloc handle (at %p)", handle);
85 return -EINVAL;
86 }
87 return 0;
88 }
89};
90
91// These functions are to be used to map/unmap gralloc buffers. They are thread
92// safe and ensure that the same buffer never gets mapped twice.
93void* reference_buffer(const vsoc_buffer_handle_t* hnd);
94int unreference_buffer(const vsoc_buffer_handle_t* hnd);
95
96// TODO(jemoreira): Move this to a place where it can be used by the gralloc
97// region as well.
98inline int align(int input, int alignment) {
99 return (input + alignment - 1) & -alignment;
100}