#pragma once
/*
* Copyright (C) 2017 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.
*/
#include <errno.h>
#include <cutils/native_handle.h>
#include <hardware/gralloc.h>
#include <log/log.h>
struct vsoc_alloc_device_t {
alloc_device_t device;
};
struct vsoc_gralloc_module_t {
gralloc_module_t base;
};
static_assert(sizeof(int) >= 4, "At least 4 bytes are needed for offsets");
struct vsoc_buffer_handle_t : public native_handle {
// File descriptors
int fd;
// ints
int magic;
int format;
int x_res;
int y_res;
int stride_in_pixels;
int size;
// buffer offset in bytes divided by PAGE_SIZE
int offset;
static inline int sNumInts() {
return ((sizeof(vsoc_buffer_handle_t) - sizeof(native_handle_t)) /
sizeof(int) -
sNumFds);
}
static const int sNumFds = 1;
static const int sMagic = 0xc63752f4;
vsoc_buffer_handle_t(int fd,
int offset,
int size,
int format,
int x_res,
int y_res,
int stride_in_pixels)
: fd(fd),
magic(sMagic),
format(format),
x_res(x_res),
y_res(y_res),
stride_in_pixels(stride_in_pixels),
size(size),
offset(offset) {
version = sizeof(native_handle);
numInts = sNumInts();
numFds = sNumFds;
}
~vsoc_buffer_handle_t() {
magic = 0;
}
static int validate(const native_handle* handle) {
const vsoc_buffer_handle_t* hnd =
reinterpret_cast<const vsoc_buffer_handle_t*>(handle);
if (!hnd || hnd->version != sizeof(native_handle) ||
hnd->numInts != sNumInts() || hnd->numFds != sNumFds ||
hnd->magic != sMagic) {
ALOGE("Invalid gralloc handle (at %p)", handle);
return -EINVAL;
}
return 0;
}
};
// These functions are to be used to map/unmap gralloc buffers. They are thread
// safe and ensure that the same buffer never gets mapped twice.
void* reference_buffer(const vsoc_buffer_handle_t* hnd);
int unreference_buffer(const vsoc_buffer_handle_t* hnd);
// TODO(jemoreira): Move this to a place where it can be used by the gralloc
// region as well.
inline int align(int input, int alignment) {
return (input + alignment - 1) & -alignment;
}