Added host side gralloc region class.

Host and guest side gralloc regions are different because on the
guest it needs to meet security constraints, talk to the vsoc
driver, while in host those are irrelevant. Also, by design, there
is no support for gralloc buffer allocation host side.

Bug: 64158954
Change-Id: I776f9df17110e1c373a1c2bddadc72476ab85c73
diff --git a/BUILD b/BUILD
index a35860b..799583b 100644
--- a/BUILD
+++ b/BUILD
@@ -51,6 +51,22 @@
     deps = ["//:libvsoc_framebuffer"],
 )
 
+cc_library(
+    name = "libvsoc_gralloc",
+    srcs = [
+        "common/vsoc/lib/gralloc_layout.cpp",
+        "host/vsoc/gralloc/gralloc_buffer_region.cpp",
+    ],
+    hdrs = [
+        "host/vsoc/gralloc/gralloc_buffer_region.h",
+    ],
+    copts = ["-Wno-unused-private-field"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//:vsoc_lib",
+    ],
+)
+
 cc_test(
     name = "circqueue_test",
     srcs = [
diff --git a/host/vsoc/gralloc/gralloc_buffer_region.cpp b/host/vsoc/gralloc/gralloc_buffer_region.cpp
new file mode 100644
index 0000000..14b02e3
--- /dev/null
+++ b/host/vsoc/gralloc/gralloc_buffer_region.cpp
@@ -0,0 +1,44 @@
+/*
+ * 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 "host/vsoc/gralloc/gralloc_buffer_region.h"
+#include "glog/logging.h"
+
+using vsoc::gralloc::GrallocBufferRegion;
+
+// static
+GrallocBufferRegion* GrallocBufferRegion::GetInstance() {
+  // TODO(jemoreira): Get the domain from somewhere
+  static GrallocBufferRegion instance(nullptr);
+  if (!instance.is_open_)
+    return nullptr;
+  return &instance;
+}
+
+uint8_t* GrallocBufferRegion::OffsetToBufferPtr(vsoc_reg_off_t offset) {
+  if (offset <= control_->region_desc().offset_of_region_data ||
+      offset >= control_->region_size()) {
+    LOG(FATAL)
+        << "Attempted to access a gralloc buffer outside region data, offset: "
+        << offset;
+    return nullptr;
+  }
+  return region_offset_to_pointer<uint8_t>(offset);
+}
+
+GrallocBufferRegion::GrallocBufferRegion(char* domain) {
+  is_open_ = Open(domain);
+}
diff --git a/host/vsoc/gralloc/gralloc_buffer_region.h b/host/vsoc/gralloc/gralloc_buffer_region.h
new file mode 100644
index 0000000..f339d3f
--- /dev/null
+++ b/host/vsoc/gralloc/gralloc_buffer_region.h
@@ -0,0 +1,47 @@
+#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 "common/vsoc/lib/typed_region_view.h"
+#include "common/vsoc/shm/gralloc_layout.h"
+#include "uapi/vsoc_shm.h"
+
+#include <string>
+
+namespace vsoc {
+namespace gralloc {
+
+// Allows access to the gralloc buffer region from host side. It needs to be a
+// different class than the one on guest side because of the required
+// interactions with the kernel on the guest.
+// Initially this class only returns a pointer to a buffer in memory given a
+// region offset, which is enough for now since it's only used by the hwcomposer
+// (which gets all other information from the guest side hwcomposer) and by the
+// VNC server (which uses only the frame buffer and gets the information it
+// needs from the framebuffer region).
+class GrallocBufferRegion
+    : vsoc::TypedRegionView<vsoc::layout::gralloc::GrallocBufferLayout> {
+ public:
+  static GrallocBufferRegion* GetInstance();
+
+  uint8_t* OffsetToBufferPtr(vsoc_reg_off_t offset);
+ protected:
+  GrallocBufferRegion(char* domain);
+  bool is_open_{};
+};
+
+}
+}