C++程序  |  101行  |  2.79 KB

#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;
}