Merge "BoxedHandleManager: fix corner case where there is no replay handles" into main
diff --git a/.gitignore b/.gitignore
index d01643a..712259b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+/bazel-*
 /build*/
 /.vscode/*
 /objs/*
diff --git a/Android.bp b/Android.bp
index 2b0da1b..385351f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -163,7 +163,9 @@
         "-DVK_GFXSTREAM_STRUCTURE_TYPE_EXT",
         "-DGFXSTREAM_ENABLE_HOST_GLES=1",
         "-Wall",
+        "-Werror",
         "-Wextra",
+        "-Wformat",
         "-Wshadow",
         "-Wthread-safety",
         "-Wno-unused-function",
diff --git a/BUILD.bazel b/BUILD.bazel
index 5bb24fd..698fded 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -69,12 +69,11 @@
     name = "gfxstream-gl-host-common-headers",
     hdrs = glob([
         "include/**/*.h",
-        "include/**/*.hpp",
     ]),
     includes = ["include"],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/aemu/base:aemu-base-headers",
-        "//hardware/google/aemu/host-common:aemu-host-common-headers",
+        "@aemu//base:aemu-base-headers",
+        "@aemu//host-common:aemu-host-common-headers",
     ],
 )
diff --git a/MODULE.bazel b/MODULE.bazel
new file mode 100644
index 0000000..44a81d1
--- /dev/null
+++ b/MODULE.bazel
@@ -0,0 +1,10 @@
+module(
+    name = "gfxstream",
+    version = "0.0.1",
+)
+
+bazel_dep(name = "aemu", version = "0.0.1")
+bazel_dep(name = "googletest", version = "1.15.2", repo_name = "com_google_googletest")
+bazel_dep(name = "platforms", version = "0.0.11")
+bazel_dep(name = "rules_cc", version = "0.0.14")
+bazel_dep(name = "rules_license", version = "1.0.0")
diff --git a/common/etc/BUILD.bazel b/common/etc/BUILD.bazel
index 3d723be..3b1f82c 100644
--- a/common/etc/BUILD.bazel
+++ b/common/etc/BUILD.bazel
@@ -1,9 +1,10 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 # Header Library
 cc_library(
     name = "gfxstream_etc_headers",
     hdrs = glob([
         "include/**/*.h",
-        "include/**/*.hpp",
     ]),
     includes = ["include"],
     visibility = ["//visibility:public"],
diff --git a/host/BUILD.bazel b/host/BUILD.bazel
index d2bfd20..dd8e636 100644
--- a/host/BUILD.bazel
+++ b/host/BUILD.bazel
@@ -14,7 +14,6 @@
         "compressedTextureFormats/AstcCpuDecompressor.h",
     ] + glob([
         "*.h",
-        "gl/*.h",
     ]),
     copts = ["-fno-exceptions"],
     includes = ["."],
@@ -31,7 +30,7 @@
     includes = ["."],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/gfxstream/common/etc:gfxstream_etc",
+        "//common/etc:gfxstream_etc",
     ],
 )
 
@@ -41,8 +40,8 @@
     copts = ["-fno-exceptions"],
     deps = [
         ":gfxstream-compressedTextures",
-        "//hardware/google/aemu/base:aemu-base",
-        "//hardware/google/aemu/host-common:logging",
+        "@aemu//base:aemu-base",
+        "@aemu//host-common:logging",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -67,10 +66,13 @@
         "QuartzCore",
         "IOSurface",
     ],
+    target_compatible_with = [
+        "@platforms//os:macos",
+    ],
     deps = [
         ":gfxstream_backend_headers",
-        "//external/angle:angle-headers",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
+        "//:gfxstream-gl-host-common-headers",
+        "//common/opengl:gfxstream_opengl_headers",
     ],
 )
 
@@ -138,29 +140,29 @@
     visibility = ["//visibility:public"],
     deps = [
         ":gfxstream_backend_headers",
-        "//hardware/google/aemu/base:aemu-base",
-        "//hardware/google/aemu/base:aemu-base-metrics",
-        "//hardware/google/aemu/host-common:aemu-host-common",
-        "//hardware/google/aemu/host-common:logging",
-        "//hardware/google/aemu/snapshot:aemu-snapshot",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
-        "//hardware/google/gfxstream/host/backend:gfxstream_backend",
-        "//hardware/google/gfxstream/host/features:gfxstream_features",
-        "//hardware/google/gfxstream/host/gl:EGL_translator_static",
-        "//hardware/google/gfxstream/host/gl:OpenGLESDispatch",
-        "//hardware/google/gfxstream/host/gl:gfxstream-gl-host-common",
-        "//hardware/google/gfxstream/host/gl:gfxstream-gl-server",
-        "//hardware/google/gfxstream/host/gl:gl-common-headers",
-        "//hardware/google/gfxstream/host/gl:gl_headers",
-        "//hardware/google/gfxstream/host/gl:gles1_dec",
-        "//hardware/google/gfxstream/host/gl:gles2_dec",
-        "//hardware/google/gfxstream/host/gl/glestranslator/GLES_CM:GLES_CM_translator_static",
-        "//hardware/google/gfxstream/host/magma:gfxstream-magma-server",
-        "//hardware/google/gfxstream/host/magma:magma-headers",
-        "//hardware/google/gfxstream/host/renderControl_dec",
-        "//hardware/google/gfxstream/host/tracing:gfxstream_host_tracing",
-        "//hardware/google/gfxstream/host/vulkan:gfxstream-vulkan-server",
+        "//:gfxstream-gl-host-common-headers",
+        "//host/apigen-codec-common",
+        "//host/backend:gfxstream_backend",
+        "//host/features:gfxstream_features",
+        "//host/gl:EGL_translator_static",
+        "//host/gl:OpenGLESDispatch",
+        "//host/gl:gfxstream-gl-host-common",
+        "//host/gl:gfxstream-gl-server",
+        "//host/gl:gl-common-headers",
+        "//host/gl:gl_headers",
+        "//host/gl:gles1_dec",
+        "//host/gl:gles2_dec",
+        "//host/gl/glestranslator/GLES_CM:GLES_CM_translator_static",
+        "//host/magma:gfxstream-magma-server",
+        "//host/magma:magma-headers",
+        "//host/renderControl_dec",
+        "//host/tracing:gfxstream_host_tracing",
+        "//host/vulkan:gfxstream-vulkan-server",
+        "@aemu//base:aemu-base",
+        "@aemu//base:aemu-base-metrics",
+        "@aemu//host-common:aemu-host-common",
+        "@aemu//host-common:logging",
+        "@aemu//snapshot:aemu-snapshot",
     ] + select({
         "@platforms//os:macos": [
             ":gfxstream_backend_static-darwin",
@@ -189,12 +191,12 @@
     visibility = ["//visibility:public"],
     deps = [
         ":gfxstream_backend_static",
-        "//hardware/google/aemu/base:aemu-base",
-        "//hardware/google/aemu/base:aemu-base-metrics",
-        "//hardware/google/aemu/host-common:aemu-host-common-product-feature-override",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/common/utils:gfxstream_common_utils",
-        "//hardware/google/gfxstream/host/gl:gfxstream-gl-host-common",
+        "//:gfxstream-gl-host-common-headers",
+        "//common/utils:gfxstream_common_utils",
+        "//host/gl:gfxstream-gl-host-common",
+        "@aemu//base:aemu-base",
+        "@aemu//base:aemu-base-metrics",
+        "@aemu//host-common:aemu-host-common-product-feature-override",
     ],
 )
 
@@ -209,12 +211,12 @@
     visibility = ["//visibility:public"],
     deps = [
         ":gfxstream_backend_static",
-        "//hardware/google/aemu/base:aemu-base",
-        "//hardware/google/aemu/base:aemu-base-metrics",
-        "//hardware/google/aemu/host-common:aemu-host-common-product-feature-override",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/common/utils:gfxstream_common_utils",
-        "//hardware/google/gfxstream/host/gl:gfxstream-gl-host-common",
+        "//:gfxstream-gl-host-common-headers",
+        "//common/utils:gfxstream_common_utils",
+        "//host/gl:gfxstream-gl-host-common",
+        "@aemu//base:aemu-base",
+        "@aemu//base:aemu-base-metrics",
+        "@aemu//host-common:aemu-host-common-product-feature-override",
     ],
 )
 
diff --git a/host/ColorBuffer.cpp b/host/ColorBuffer.cpp
index 345b74b..0ec2e5c 100644
--- a/host/ColorBuffer.cpp
+++ b/host/ColorBuffer.cpp
@@ -54,7 +54,7 @@
                                                  vk::VkEmulation* emulationVk, uint32_t width,
                                                  uint32_t height, GLenum format,
                                                  FrameworkFormat frameworkFormat, HandleType handle,
-                                                 android::base::Stream* stream, bool linear) {
+                                                 android::base::Stream* stream) {
     std::shared_ptr<ColorBuffer> colorBuffer(
         new ColorBuffer(handle, width, height, format, frameworkFormat));
 
@@ -82,10 +82,7 @@
 
     if (emulationVk) {
         const bool vulkanOnly = colorBuffer->mColorBufferGl == nullptr;
-        uint32_t memoryProperty = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
-        if (vulkanOnly && linear) {
-            memoryProperty |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
-        }
+        const uint32_t memoryProperty = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
         colorBuffer->mColorBufferVk =
             vk::ColorBufferVk::create(*emulationVk, handle, width, height, format, frameworkFormat,
                                       vulkanOnly, memoryProperty, stream);
diff --git a/host/ColorBuffer.h b/host/ColorBuffer.h
index ea6a025..51edfe4 100644
--- a/host/ColorBuffer.h
+++ b/host/ColorBuffer.h
@@ -52,8 +52,7 @@
                                                vk::VkEmulation* emulationVk, uint32_t width,
                                                uint32_t height, GLenum format,
                                                FrameworkFormat frameworkFormat, HandleType handle,
-                                               android::base::Stream* stream = nullptr,
-                                               bool linear = false);
+                                               android::base::Stream* stream = nullptr);
 
     static std::shared_ptr<ColorBuffer> onLoad(gl::EmulationGl* emulationGl,
                                                vk::VkEmulation* emulationVk,
diff --git a/host/FrameBuffer.cpp b/host/FrameBuffer.cpp
index 789c8b7..4dc0898 100644
--- a/host/FrameBuffer.cpp
+++ b/host/FrameBuffer.cpp
@@ -1172,7 +1172,7 @@
 void FrameBuffer::createColorBufferWithResourceHandle(int p_width, int p_height,
                                                       GLenum p_internalFormat,
                                                       FrameworkFormat p_frameworkFormat,
-                                                      HandleType handle, bool p_linear) {
+                                                      HandleType handle) {
     {
         AutoLock mutex(m_lock);
         sweepColorBuffersLocked();
@@ -1188,18 +1188,17 @@
         }
 
         createColorBufferWithResourceHandleLocked(p_width, p_height, p_internalFormat,
-                                                  p_frameworkFormat, handle, p_linear);
+                                                  p_frameworkFormat, handle);
     }
 }
 
 HandleType FrameBuffer::createColorBufferWithResourceHandleLocked(int p_width, int p_height,
                                                                   GLenum p_internalFormat,
                                                                   FrameworkFormat p_frameworkFormat,
-                                                                  HandleType handle,
-                                                                  bool p_linear) {
-    ColorBufferPtr cb = ColorBuffer::create(m_emulationGl.get(), m_emulationVk.get(), p_width,
-                                            p_height, p_internalFormat, p_frameworkFormat, handle,
-                                            nullptr /*stream*/, p_linear);
+                                                                  HandleType handle) {
+    ColorBufferPtr cb =
+        ColorBuffer::create(m_emulationGl.get(), m_emulationVk.get(), p_width, p_height,
+                            p_internalFormat, p_frameworkFormat, handle, nullptr /*stream*/);
     if (cb.get() == nullptr) {
         GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
             << "Failed to create ColorBuffer:" << handle << " format:" << p_internalFormat
diff --git a/host/FrameBuffer.h b/host/FrameBuffer.h
index 65b502a..3f40aba 100644
--- a/host/FrameBuffer.h
+++ b/host/FrameBuffer.h
@@ -208,8 +208,7 @@
     // handle already assigned. This is for use with
     // virtio-gpu's RESOURCE_CREATE ioctl.
     void createColorBufferWithResourceHandle(int p_width, int p_height, GLenum p_internalFormat,
-                                             FrameworkFormat p_frameworkFormat, HandleType handle,
-                                             bool linear = false);
+                                             FrameworkFormat p_frameworkFormat, HandleType handle);
 
     // Create a new data Buffer instance from this display instance.
     // The buffer will be backed by a VkBuffer and VkDeviceMemory (if Vulkan
@@ -722,7 +721,7 @@
     HandleType createColorBufferWithResourceHandleLocked(int p_width, int p_height,
                                                          GLenum p_internalFormat,
                                                          FrameworkFormat p_frameworkFormat,
-                                                         HandleType handle, bool linear = false);
+                                                         HandleType handle);
     HandleType createBufferWithResourceHandleLocked(int p_size, HandleType handle,
                                                     uint32_t memoryProperty);
 
diff --git a/host/RendererImpl.cpp b/host/RendererImpl.cpp
index 14bbbff..2bfc710 100644
--- a/host/RendererImpl.cpp
+++ b/host/RendererImpl.cpp
@@ -572,10 +572,9 @@
             FrameBuffer::getFB()->createBufferWithResourceHandle(size, handle);
         },
     .create_color_buffer_with_handle =
-        [](uint32_t width, uint32_t height, uint32_t format, uint32_t fwkFormat, uint32_t handle,
-           bool linear) {
+        [](uint32_t width, uint32_t height, uint32_t format, uint32_t fwkFormat, uint32_t handle) {
             FrameBuffer::getFB()->createColorBufferWithResourceHandle(
-                width, height, (GLenum)format, (FrameworkFormat)fwkFormat, handle, linear);
+                width, height, (GLenum)format, (FrameworkFormat)fwkFormat, handle);
         },
     .open_color_buffer = [](uint32_t handle) { FrameBuffer::getFB()->openColorBuffer(handle); },
     .close_buffer = [](uint32_t handle) { FrameBuffer::getFB()->closeBuffer(handle); },
diff --git a/host/VirtioGpuResource.cpp b/host/VirtioGpuResource.cpp
index 5577188..5681d98 100644
--- a/host/VirtioGpuResource.cpp
+++ b/host/VirtioGpuResource.cpp
@@ -147,14 +147,8 @@
     } else if (resourceType == VirtioGpuResourceType::COLOR_BUFFER) {
         const uint32_t glformat = virgl_format_to_gl(args->format);
         const auto fwkformat = (gfxstream::FrameworkFormat)virgl_format_to_fwk_format(args->format);
-        const bool linear =
-#ifdef GFXSTREAM_ENABLE_GUEST_VIRTIO_RESOURCE_TILING_CONTROL
-            !!(args->bind & VIRGL_BIND_LINEAR);
-#else
-            false;
-#endif
         FrameBuffer::getFB()->createColorBufferWithResourceHandle(
-            args->width, args->height, glformat, fwkformat, args->handle, linear);
+            args->width, args->height, glformat, fwkformat, args->handle);
         FrameBuffer::getFB()->setGuestManagedColorBufferLifetime(true /* guest manages lifetime */);
         FrameBuffer::getFB()->openColorBuffer(args->handle);
     } else {
@@ -225,15 +219,9 @@
     const uint32_t glformat = virgl_format_to_gl(internal_create_args.format);
     const auto fwkformat =
         (gfxstream::FrameworkFormat)virgl_format_to_fwk_format(internal_create_args.format);
-    const bool linear =
-#ifdef GFXSTREAM_ENABLE_GUEST_VIRTIO_RESOURCE_TILING_CONTROL
-        !!(internal_create_args.bind & VIRGL_BIND_LINEAR);
-#else
-        false;
-#endif
     FrameBuffer::getFB()->createColorBufferWithResourceHandle(
         internal_create_args.width, internal_create_args.height, glformat, fwkformat,
-        internal_create_args.handle, linear);
+        internal_create_args.handle);
     FrameBuffer::getFB()->setGuestManagedColorBufferLifetime(true /* guest manages lifetime */);
     FrameBuffer::getFB()->openColorBuffer(internal_create_args.handle);
 
diff --git a/host/apigen-codec-common/BUILD.bazel b/host/apigen-codec-common/BUILD.bazel
index 1172ba7..ccdc867 100644
--- a/host/apigen-codec-common/BUILD.bazel
+++ b/host/apigen-codec-common/BUILD.bazel
@@ -1,5 +1,7 @@
 # File: project_root/src/apigen-codec-common/BUILD
 
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "apigen-codec-common",
     srcs = [
@@ -32,8 +34,8 @@
     includes = ["."],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/aemu/base:aemu-base-headers",
-        "//hardware/google/aemu/host-common:aemu-host-common",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
+        "//:gfxstream-gl-host-common-headers",
+        "@aemu//base:aemu-base-headers",
+        "@aemu//host-common:aemu-host-common",
     ],
 )
diff --git a/host/backend/BUILD.bazel b/host/backend/BUILD.bazel
index 5de9100..8c0823a 100644
--- a/host/backend/BUILD.bazel
+++ b/host/backend/BUILD.bazel
@@ -1,9 +1,11 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "gfxstream_backend",
     srcs = glob(["include/**/*.h"]),
     includes = ["include"],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/gfxstream/common/utils:gfxstream_common_utils",
+        "//common/utils:gfxstream_common_utils",
     ],
-)
\ No newline at end of file
+)
diff --git a/host/features/Features.cpp b/host/features/Features.cpp
index 0e126aa..1249204 100644
--- a/host/features/Features.cpp
+++ b/host/features/Features.cpp
@@ -22,23 +22,6 @@
     *this = rhs;
 }
 
-FeatureResult FeatureDependencyHandler::checkAllDependentFeaturesAreEnabled() {
-    // Only check for direct dependencies. Since we're verifying all enabled features, this should cover the whole span.
-    bool allDependenciesAreEnabled = true;
-    std::stringstream ss;
-    for (auto const&[feature, dependentFeatures] : VK_FEATURE_DEPENDENCY_MAP) {
-        if (feature->enabled && !dependentFeatures.empty()) {
-            for (auto const& dep : dependentFeatures) {
-                if (!dep->enabled) {
-                    ss << "Feature: " << feature->name << " requests missing dependency: " << dep->name << "\n";
-                    allDependenciesAreEnabled = false;
-                }
-            }
-        }
-    }
-    return {allDependenciesAreEnabled, ss.str()};
-};
-
 FeatureSet& FeatureSet::operator=(const FeatureSet& rhs) {
     for (const auto& [featureName, featureInfo] : rhs.map) {
         *map[featureName] = *featureInfo;
diff --git a/host/features/include/gfxstream/host/Features.h b/host/features/include/gfxstream/host/Features.h
index 6c03a70..1b9e6b6 100644
--- a/host/features/include/gfxstream/host/Features.h
+++ b/host/features/include/gfxstream/host/Features.h
@@ -221,8 +221,10 @@
     };
     FeatureInfo BypassVulkanDeviceFeatureOverrides = {
         "BypassVulkanDeviceFeatureOverrides",
-        "We are force disabling (overriding) some vulkan features (private data, uniform inline block etc) which the device may naturally support."
-        "If toggled ON, this flag will cause the host side to not force disable anything and let the device fully advertise supported features.",
+        "We are force disabling (overriding) some vulkan features (private data, uniform inline "
+        "block etc) which the device may naturally support."
+        "If toggled ON, this flag will cause the host side to not force disable anything and let "
+        "the device fully advertise supported features.",
         &map,
     };
     FeatureInfo VulkanAllocateDeviceMemoryOnly = {
@@ -321,17 +323,12 @@
         "device properties for the guest queries.",
         &map,
     };
-};
-struct FeatureDependencyHandler {
-    FeatureDependencyHandler(const FeatureSet& set) : featureSetView(set){}
-    const FeatureSet& featureSetView;
-    const std::map<const FeatureInfo*, std::vector<const FeatureInfo*>> VK_FEATURE_DEPENDENCY_MAP= {
-        // List other dependencies here in the shape of:
-        // {FEATURE_X, {DEPENDENT_FEATURE_A, DEPENDENT_FEATURE_B}}
-        {&featureSetView.VulkanSnapshots, {&featureSetView.VulkanBatchedDescriptorSetUpdate, &featureSetView.Vulkan}},
+    FeatureInfo VulkanRobustness = {
+        "VulkanRobustness",
+        "If enabled, robustness extensions with all supported features will be enabled on "
+        "all created devices. (e.g. VK_EXT_robustness2)",
+        &map,
     };
-
-    FeatureResult checkAllDependentFeaturesAreEnabled();
 };
 
 #define GFXSTREAM_SET_FEATURE_ON_CONDITION(set, feature, condition) \
diff --git a/host/gl/BUILD.bazel b/host/gl/BUILD.bazel
index 0b6ee9f..3825631 100644
--- a/host/gl/BUILD.bazel
+++ b/host/gl/BUILD.bazel
@@ -1,3 +1,5 @@
+load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library")
+
 cc_library(
     name = "gles1_dec",
     srcs = [
@@ -10,8 +12,8 @@
     visibility = ["//visibility:public"],
     deps = [
         ":GLSnapshot",
-        "//hardware/google/gfxstream/common/opengl:gfxstream_opengl_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
+        "//common/opengl:gfxstream_opengl_headers",
+        "//host/apigen-codec-common",
     ],
 )
 
@@ -23,8 +25,11 @@
     hdrs = ["gl-host-common/include/host-common/opengl/macTouchOpenGL.h"],
     defines = ["EMUGL_BUILD"],
     includes = ["gl-host-common/include"],
+    target_compatible_with = [
+        "@platforms//os:macos",
+    ],
     deps = [
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
+        "//:gfxstream-gl-host-common-headers",
     ],
 )
 
@@ -34,7 +39,7 @@
     copts = ["-fno-exceptions"],
     includes = ["glestranslator/GLcommon/include"],
     visibility = ["//visibility:public"],
-    deps = ["//hardware/google/gfxstream/host/apigen-codec-common"],
+    deps = ["//host/apigen-codec-common"],
 )
 
 objc_library(
@@ -51,9 +56,12 @@
         "CoreGraphics",
         "OpenGL",
     ],
+    target_compatible_with = [
+        "@platforms//os:macos",
+    ],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
+        "//:gfxstream-gl-host-common-headers",
     ],
     alwayslink = True,
 )
@@ -103,16 +111,16 @@
     deps =
         [
             ":gl-common-headers",
-            "//hardware/google/aemu/host-common:aemu-host-common-headers",
-            "//hardware/google/aemu/snapshot:aemu-snapshot",
-            "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-            "//hardware/google/gfxstream/common/etc:gfxstream_etc",
-            "//hardware/google/gfxstream/common/opengl:gfxstream_opengl_headers",
-            "//hardware/google/gfxstream/host:gfxstream_host_headers",
-            "//hardware/google/gfxstream/host/apigen-codec-common",
-            "//hardware/google/gfxstream/host/gl:gfxstream-gl-host-common",
-            "//hardware/google/gfxstream/host/gl/glestranslator/GLES_CM:GLES_CM_translator_static",
-            "//hardware/google/gfxstream/host/gl/glestranslator/GLES_V2:GLES_V2_translator_static",
+            "//:gfxstream-gl-host-common-headers",
+            "//common/etc:gfxstream_etc",
+            "//common/opengl:gfxstream_opengl_headers",
+            "//host:gfxstream_host_headers",
+            "//host/apigen-codec-common",
+            "//host/gl:gfxstream-gl-host-common",
+            "//host/gl/glestranslator/GLES_CM:GLES_CM_translator_static",
+            "//host/gl/glestranslator/GLES_V2:GLES_V2_translator_static",
+            "@aemu//host-common:aemu-host-common-headers",
+            "@aemu//snapshot:aemu-snapshot",
         ] + select({
             "@platforms//os:macos": [":egl_translator-darwin"],
             "//conditions:default": [],
@@ -155,10 +163,10 @@
     deps = [
         ":gl-common-headers",
         # "//external/angle:angle-headers",
-        "//hardware/google/gfxstream/common/opengl:gfxstream_opengl_headers",
-        "//hardware/google/aemu/snapshot:aemu-snapshot",
-        "//hardware/google/gfxstream/common/etc:gfxstream_etc",
-        "//hardware/google/gfxstream/host:gfxstream-compressedTextures",
+        "//common/opengl:gfxstream_opengl_headers",
+        "@aemu//snapshot:aemu-snapshot",
+        "//common/etc:gfxstream_etc",
+        "//host:gfxstream-compressedTextures",
     ],
 )
 
@@ -197,10 +205,10 @@
     }),
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/aemu/snapshot:aemu-snapshot",
-        "//hardware/google/gfxstream/common/opengl:gfxstream_opengl_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
-        "//hardware/google/gfxstream/host/features:gfxstream_features",
+        "//common/opengl:gfxstream_opengl_headers",
+        "//host/apigen-codec-common",
+        "//host/features:gfxstream_features",
+        "@aemu//snapshot:aemu-snapshot",
     ] + select({
         "@platforms//os:macos": ["gfxstream-gl-host-common-darwin"],
         "//conditions:default": [],
@@ -219,9 +227,9 @@
     visibility = ["//visibility:public"],
     deps = [
         ":GLSnapshot",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/common/opengl:gfxstream_opengl_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
+        "//:gfxstream-gl-host-common-headers",
+        "//common/opengl:gfxstream_opengl_headers",
+        "//host/apigen-codec-common",
     ],
 )
 
@@ -236,7 +244,7 @@
     defines = ["EMUGL_BUILD"],
     includes = ["glsnapshot"],
     visibility = ["//visibility:public"],
-    deps = ["//hardware/google/gfxstream/host/apigen-codec-common"],
+    deps = ["//host/apigen-codec-common"],
 )
 
 cc_library(
@@ -249,7 +257,7 @@
         "OpenGLESDispatch/StaticDispatch.cpp",
         "OpenGLESDispatch/gles1_stubbed_in_translator_namespace.cpp",
         "OpenGLESDispatch/gles2_stubbed_in_translator_namespace.cpp",
-    ] + glob(["OpenGLESDispatch/*.h"]),
+    ],
     copts = [
         "-fno-exceptions",
         "-Wno-extern-c-compat",
@@ -260,9 +268,9 @@
         ":EGL_translator_static",
         ":gles1_dec",
         ":gles2_dec",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/common/opengl:gfxstream_opengl_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
+        "//:gfxstream-gl-host-common-headers",
+        "//common/opengl:gfxstream_opengl_headers",
+        "//host/apigen-codec-common",
     ],
 )
 
@@ -288,7 +296,6 @@
         "YUVConverter.cpp",
     ] + glob([
         "*.h",
-        "glestranslator/include/**/*.h",
     ]),
     hdrs = [],
     copts = [
@@ -305,10 +312,10 @@
         ":gfxstream-gl-host-common",
         ":gles1_dec",
         ":gles2_dec",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/host:gfxstream_host_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
-        "//hardware/google/gfxstream/host/gl:GLSnapshot",
+        "//:gfxstream-gl-host-common-headers",
+        "//host:gfxstream_host_headers",
+        "//host/apigen-codec-common",
+        "//host/gl:GLSnapshot",
     ],
 )
 
diff --git a/host/gl/gles1_dec/meson.build b/host/gl/gles1_dec/meson.build
index e151213..aa33366 100644
--- a/host/gl/gles1_dec/meson.build
+++ b/host/gl/gles1_dec/meson.build
@@ -11,6 +11,6 @@
   'gles1_dec',
   files_lib_gles1_dec,
   cpp_args: gfxstream_host_args,
-  include_directories: [inc_gfxstream_include, inc_include, inc_apigen_codec, inc_gles_translator],
+  include_directories: [inc_gfxstream_include, inc_include, inc_apigen_codec],
   dependencies: [aemu_base_dep, aemu_logging_dep]
 )
diff --git a/host/gl/gles2_dec/meson.build b/host/gl/gles2_dec/meson.build
index 91f0e16..fe75aad 100644
--- a/host/gl/gles2_dec/meson.build
+++ b/host/gl/gles2_dec/meson.build
@@ -11,7 +11,7 @@
   'gles2_dec',
   files_lib_gles2_dec,
   cpp_args: gfxstream_host_args,
-  include_directories: [inc_gfxstream_include, inc_include, inc_apigen_codec, inc_gles_translator,
+  include_directories: [inc_gfxstream_include, inc_include, inc_apigen_codec,
                         inc_gl_snapshot],
   link_with: lib_gl_snapshot,
   dependencies: [aemu_base_dep, aemu_logging_dep]
diff --git a/host/gl/glestranslator/EGL/meson.build b/host/gl/glestranslator/EGL/meson.build
index 0758656..513aa3b 100644
--- a/host/gl/glestranslator/EGL/meson.build
+++ b/host/gl/glestranslator/EGL/meson.build
@@ -52,7 +52,7 @@
   'egl_translator',
   files_lib_egl_translator,
   cpp_args: egl_cpp_args + gfxstream_host_args,
-  include_directories: [inc_gfxstream_include, inc_include, inc_gles_translator, inc_apigen_codec,
+  include_directories: [inc_gfxstream_include, inc_include, inc_gl_common, inc_apigen_codec,
                         inc_gl_host_common, inc_stream_servers, inc_etc],
   link_with: [lib_gl_common, lib_apigen_codec, lib_gl_host_common],
   dependencies: [aemu_base_dep, aemu_common_dep, aemu_snapshot_dep,
diff --git a/host/gl/glestranslator/GLES_CM/BUILD.bazel b/host/gl/glestranslator/GLES_CM/BUILD.bazel
index 500df40..6ffc875 100644
--- a/host/gl/glestranslator/GLES_CM/BUILD.bazel
+++ b/host/gl/glestranslator/GLES_CM/BUILD.bazel
@@ -1,3 +1,5 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "GLES_CM_translator_static",
     srcs = [
@@ -12,11 +14,10 @@
     ],
     visibility = ["//visibility:public"],
     deps = [
-        "//external/angle:angle-headers",
-        "//hardware/google/aemu/snapshot:aemu-snapshot",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
-        "//hardware/google/gfxstream/host/gl:gl_common",
-        "//hardware/google/gfxstream/third-party/glm",
+        "//:gfxstream-gl-host-common-headers",
+        "//host/apigen-codec-common",
+        "//host/gl:gl_common",
+        "//third-party/glm",
+        "@aemu//snapshot:aemu-snapshot",
     ],
 )
diff --git a/host/gl/glestranslator/GLES_CM/meson.build b/host/gl/glestranslator/GLES_CM/meson.build
index b8666b5..dccafd7 100644
--- a/host/gl/glestranslator/GLES_CM/meson.build
+++ b/host/gl/glestranslator/GLES_CM/meson.build
@@ -13,7 +13,7 @@
   'glescm_translator',
   files_lib_glescm_translator,
   cpp_args: gfxstream_host_args,
-  include_directories: [inc_gfxstream_include, inc_include, inc_gles_translator, inc_glm,
+  include_directories: [inc_gfxstream_include, inc_include, inc_gl_common, inc_glm,
                         inc_etc],
   dependencies: [aemu_base_dep, aemu_logging_dep, aemu_snapshot_dep]
 )
diff --git a/host/gl/glestranslator/GLES_V2/BUILD.bazel b/host/gl/glestranslator/GLES_V2/BUILD.bazel
index bb38bbe..839d9e3 100644
--- a/host/gl/glestranslator/GLES_V2/BUILD.bazel
+++ b/host/gl/glestranslator/GLES_V2/BUILD.bazel
@@ -1,3 +1,5 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "GLES_V2_translator_static",
     srcs = [
@@ -27,9 +29,9 @@
     includes = ["."],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
-        "//hardware/google/gfxstream/host/gl:gl_common",
+        "//:gfxstream-gl-host-common-headers",
+        "//host/apigen-codec-common",
+        "//host/gl:gl_common",
     ],
     alwayslink = True,
 )
diff --git a/host/gl/glestranslator/GLES_V2/meson.build b/host/gl/glestranslator/GLES_V2/meson.build
index 28137ab..cff02f9 100644
--- a/host/gl/glestranslator/GLES_V2/meson.build
+++ b/host/gl/glestranslator/GLES_V2/meson.build
@@ -17,7 +17,7 @@
   'glesv2_translator',
   files_lib_glesv2_translator,
   cpp_args: gfxstream_host_args,
-  include_directories: [inc_gfxstream_include, inc_include, inc_gles_translator, inc_stream_servers,
+  include_directories: [inc_gfxstream_include, inc_include, inc_gl_common, inc_stream_servers,
                         inc_etc],
   dependencies: [aemu_base_dep, aemu_logging_dep, aemu_snapshot_dep]
 )
diff --git a/host/gl/glestranslator/GLcommon/meson.build b/host/gl/glestranslator/GLcommon/meson.build
index 686d94b..d1bf29c 100644
--- a/host/gl/glestranslator/GLcommon/meson.build
+++ b/host/gl/glestranslator/GLcommon/meson.build
@@ -27,7 +27,7 @@
   'gl_common',
   files_lib_gl_common,
   cpp_args: gfxstream_host_args,
-  include_directories: [inc_etc, inc_gfxstream_include, inc_include, inc_stream_servers, inc_gles_translator],
+  include_directories: [inc_etc, inc_gfxstream_include, inc_include, inc_stream_servers, inc_gl_common],
   link_with: [lib_compressed_textures, lib_etc],
   dependencies: [aemu_base_dep, aemu_logging_dep, aemu_snapshot_dep]
 )
diff --git a/host/gl/meson.build b/host/gl/meson.build
index 11f9732..f3247fa 100644
--- a/host/gl/meson.build
+++ b/host/gl/meson.build
@@ -2,7 +2,6 @@
 # SPDX-License-Identifier: MIT
 
 inc_gl_server = include_directories('.')
-inc_gles_translator = include_directories('glestranslator/include')
 inc_gl_snapshot = include_directories('glsnapshot')
 
 # snapshot
@@ -43,7 +42,7 @@
   files_lib_gl_server,
   cpp_args: gfxstream_host_args,
   include_directories: [inc_gfxstream_include, inc_include, inc_stream_servers, inc_apigen_codec,
-                        inc_gl_snapshot, inc_gl_host_common, inc_host_features],
+                        inc_gl_snapshot, inc_gl_host_common, inc_host_features, inc_gl_common],
   link_with: [lib_gles1_dec, lib_gles2_dec, lib_apigen_codec, lib_gl_dispatch,
               lib_apigen_codec, lib_host_features],
   dependencies: [aemu_base_dep, aemu_common_dep, aemu_snapshot_dep]
diff --git a/host/magma/BUILD.bazel b/host/magma/BUILD.bazel
index 746150c..3b21245 100644
--- a/host/magma/BUILD.bazel
+++ b/host/magma/BUILD.bazel
@@ -1,3 +1,5 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "gfxstream-magma-server",
     srcs = [
@@ -8,9 +10,9 @@
     includes = ["magma_dec"],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/gfxstream/host:gfxstream_host_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
-        "//hardware/google/gfxstream/third-party/fuchsia/magma:magma-headers",
+        "//host:gfxstream_host_headers",
+        "//host/apigen-codec-common",
+        "//third-party/fuchsia/magma:magma-headers",
     ],
 )
 
diff --git a/host/meson.build b/host/meson.build
index b13ccef..362af0a 100644
--- a/host/meson.build
+++ b/host/meson.build
@@ -6,7 +6,6 @@
 #===============#
 gfxstream_host_args = [
   '-D_FILE_OFFSET_BITS=64',
-  '-DGFXSTREAM_ENABLE_GUEST_VIRTIO_RESOURCE_TILING_CONTROL=1',
   '-Wno-unused-parameter',
   '-Wno-unused-function',
   '-Wno-unused-variable',
@@ -152,6 +151,8 @@
 inc_stream_servers = include_directories('.')
 inc_host_include = include_directories('include')
 
+inc_gl_common = include_directories('gl/glestranslator/GLcommon/include')
+
 subdir('features')
 subdir('tracing')
 
@@ -208,7 +209,7 @@
   files_lib_gfxstream_backend += files('RenderThreadInfoGl.cpp')
   files_lib_gfxstream_backend += files('RenderControl.cpp')
 
-  inc_gfxstream_backend += [inc_gl_server, inc_gl_snapshot, inc_gles_translator]
+  inc_gfxstream_backend += [inc_gl_server, inc_gl_snapshot, inc_gl_common]
   link_gfxstream_backend += lib_gl_server
 endif
 
@@ -242,7 +243,6 @@
 elif host_machine.system() == 'qnx'
   files_lib_gfxstream_backend += files(
     'NativeSubWindow_qnx.cpp',
-    '../qnx/host/platform_qnx.cpp',
   )
 endif
 
diff --git a/host/renderControl_dec/BUILD.bazel b/host/renderControl_dec/BUILD.bazel
index b91b510..bd36a87 100644
--- a/host/renderControl_dec/BUILD.bazel
+++ b/host/renderControl_dec/BUILD.bazel
@@ -1,3 +1,5 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "renderControl_dec",
     srcs = [
@@ -7,7 +9,7 @@
     hdrs = [],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/gfxstream/common/opengl:gfxstream_opengl_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
+        "//common/opengl:gfxstream_opengl_headers",
+        "//host/apigen-codec-common",
     ],
 )
diff --git a/host/vulkan/BUILD.bazel b/host/vulkan/BUILD.bazel
index 39860de..75b1a6b 100644
--- a/host/vulkan/BUILD.bazel
+++ b/host/vulkan/BUILD.bazel
@@ -1,3 +1,5 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "gfxstream-vulkan-server",
     srcs = [
@@ -62,18 +64,18 @@
     visibility = ["//visibility:public"],
     deps = [
         # "//external/angle:angle-headers",
-        "//hardware/google/aemu/snapshot:aemu-snapshot",
-        "//hardware/google/gfxstream/common/vulkan:gfxstream_vulkan_headers",
-        "//hardware/google/gfxstream/host:gfxstream-compressedTextures",
-        "//hardware/google/gfxstream/host:gfxstream_host_headers",
-        "//hardware/google/gfxstream/host/apigen-codec-common",
-        "//hardware/google/gfxstream/host/gl:gfxstream-gl-host-common",
-        "//hardware/google/gfxstream/host/gl:gl_headers",
-        "//hardware/google/gfxstream/host/vulkan:OpenglRender_vulkan_cereal",
-        "//hardware/google/gfxstream/host/vulkan:emulated_textures",
-        "//hardware/google/gfxstream/third-party/glm",
-        "//hardware/google/gfxstream/third-party/renderdoc",
-        "//hardware/google/gfxstream/utils:gfxstream_utils",
+        "@aemu//snapshot:aemu-snapshot",
+        "//common/vulkan:gfxstream_vulkan_headers",
+        "//host:gfxstream-compressedTextures",
+        "//host:gfxstream_host_headers",
+        "//host/apigen-codec-common",
+        "//host/gl:gfxstream-gl-host-common",
+        "//host/gl:gl_headers",
+        "//host/vulkan:OpenglRender_vulkan_cereal",
+        "//host/vulkan:emulated_textures",
+        "//third-party/glm",
+        "//third-party/renderdoc",
+        "//utils:gfxstream_utils",
     ],
 )
 
@@ -109,15 +111,15 @@
         "cereal/common",
     ],
     deps = [
-        "//hardware/google/aemu/base:aemu-base-headers",
-        "//hardware/google/aemu/host-common:aemu-host-common-headers",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/common/vulkan:gfxstream_vulkan_headers",
-        "//hardware/google/gfxstream/host:gfxstream_host_headers",
-        "//hardware/google/gfxstream/host/backend:gfxstream_backend",
-        "//hardware/google/gfxstream/host/features:gfxstream_features",
-        "//hardware/google/gfxstream/host/tracing:gfxstream_host_tracing",
-        "//hardware/google/gfxstream/utils:gfxstream_utils",
+        "//:gfxstream-gl-host-common-headers",
+        "//common/vulkan:gfxstream_vulkan_headers",
+        "//host:gfxstream_host_headers",
+        "//host/backend:gfxstream_backend",
+        "//host/features:gfxstream_features",
+        "//host/tracing:gfxstream_host_tracing",
+        "//utils:gfxstream_utils",
+        "@aemu//base:aemu-base-headers",
+        "@aemu//host-common:aemu-host-common-headers",
     ],
 )
 
@@ -150,10 +152,10 @@
         "cereal/common",
     ],
     deps = [
-        "//hardware/google/aemu/host-common:aemu-host-common-headers",
-        "//hardware/google/gfxstream:gfxstream-gl-host-common-headers",
-        "//hardware/google/gfxstream/common/vulkan:gfxstream_vulkan_headers",
-        "//hardware/google/gfxstream/host:gfxstream_host_headers",
-        "//hardware/google/gfxstream/utils:gfxstream_utils",
+        "//:gfxstream-gl-host-common-headers",
+        "//common/vulkan:gfxstream_vulkan_headers",
+        "//host:gfxstream_host_headers",
+        "//utils:gfxstream_utils",
+        "@aemu//host-common:aemu-host-common-headers",
     ],
 )
diff --git a/host/vulkan/VkAndroidNativeBuffer.cpp b/host/vulkan/VkAndroidNativeBuffer.cpp
index 9cf9596..54d53c4 100644
--- a/host/vulkan/VkAndroidNativeBuffer.cpp
+++ b/host/vulkan/VkAndroidNativeBuffer.cpp
@@ -201,6 +201,10 @@
                 importedColorBufferInfo.height);
             return nullptr;
         }
+
+        // Update create flags to match the color buffer imported
+        createImageCi.flags = importedColorBufferInfo.imageCreateInfoShallow.flags;
+
         const auto& importedColorBufferMemoryInfo = importedColorBufferInfo.memory;
 
         // VkBindImageMemorySwapchainInfoKHR may be included from the guest but
@@ -235,6 +239,18 @@
 
         vk->vkGetImageMemoryRequirements(out->mDevice, out->mImage, &out->mImageMemoryRequirements);
 
+        if (out->mImageMemoryRequirements.size > importedColorBufferMemoryInfo.size) {
+            VK_ANB_ERR(
+                "Failed to prepare ANB image: attempted to import memory that is not large enough "
+                "for the VkImage: image memory requirements size:%llu vs actual memory size:%llu, "
+                "CB: %u, %s, %ux%u",
+                out->mImageMemoryRequirements.size, importedColorBufferMemoryInfo.size,
+                importedColorBufferHandle, string_VkFormat(createImageCi.format),
+                createImageCi.extent.width, createImageCi.extent.height);
+
+            return nullptr;
+        }
+
         if (out->mImageMemoryRequirements.size < importedColorBufferMemoryInfo.size) {
             out->mImageMemoryRequirements.size = importedColorBufferMemoryInfo.size;
         }
diff --git a/host/vulkan/VkCommonOperations.cpp b/host/vulkan/VkCommonOperations.cpp
index 3fc4f0b..5f8abc0 100644
--- a/host/vulkan/VkCommonOperations.cpp
+++ b/host/vulkan/VkCommonOperations.cpp
@@ -571,6 +571,11 @@
         {VK_FORMAT_B8G8R8A8_UNORM,
          VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
 
+        {VK_FORMAT_B4G4R4A4_UNORM_PACK16,
+         VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
+        {VK_FORMAT_R4G4B4A4_UNORM_PACK16,
+         VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
+
         {VK_FORMAT_R8_UNORM,
          VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
         {VK_FORMAT_R16_UNORM,
@@ -1220,6 +1225,15 @@
                 vk_append_struct(&features2Chain, &privateDataFeatures);
             }
 
+            VkPhysicalDeviceRobustness2FeaturesEXT robustness2Features = {
+                .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT};
+            const bool robustnessRequested = emulation->mFeatures.VulkanRobustness.enabled;
+            const bool robustnessSupported =
+                extensionsSupported(deviceExts, {VK_EXT_ROBUSTNESS_2_EXTENSION_NAME});
+            if (robustnessRequested && robustnessSupported) {
+                vk_append_struct(&features2Chain, &robustness2Features);
+            }
+
             emulation->mGetPhysicalDeviceFeatures2Func(physicalDevices[i], &features2);
 
             deviceInfos[i].supportsSamplerYcbcrConversion =
@@ -1230,6 +1244,15 @@
 
             deviceInfos[i].supportsPrivateData = (privateDataFeatures.privateData == VK_TRUE);
 
+            // Enable robustness only when requested
+            if (robustnessRequested && robustnessSupported) {
+                deviceInfos[i].robustness2Features = vk_make_orphan_copy(robustness2Features);
+            } else if (robustnessRequested) {
+                WARN(
+                    "VulkanRobustness was requested but the "
+                    "VK_EXT_robustness2 extension is not supported.");
+            }
+
 #if defined(__QNX__)
             deviceInfos[i].supportsExternalMemoryImport =
                 extMemScreenBufferFeatures.screenBufferImport == VK_TRUE;
@@ -1358,6 +1381,10 @@
     }
 #endif
 
+    if (emulation->mDeviceInfo.robustness2Features) {
+        selectedDeviceExtensionNames_.emplace(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+    }
+
     std::vector<const char*> selectedDeviceExtensionNames(selectedDeviceExtensionNames_.begin(),
                                                           selectedDeviceExtensionNames_.end());
 
@@ -1422,6 +1449,20 @@
             "VK_NV_device_diagnostic_checkpoints extension is not supported.");
     }
 
+    VkPhysicalDeviceRobustness2FeaturesEXT r2features = {};
+    if (emulation->mDeviceInfo.robustness2Features) {
+        r2features = *emulation->mDeviceInfo.robustness2Features;
+        INFO("Enabling VK_EXT_robustness2 (%d %d %d).", r2features.robustBufferAccess2,
+             r2features.robustImageAccess2, r2features.nullDescriptor);
+        vk_append_struct(&deviceCiChain, &r2features);
+
+        // vkCreateDevice() - VUID-04000: If robustBufferAccess2 is enabled then robustBufferAccess
+        // must be enabled.
+        if (r2features.robustBufferAccess2) {
+            physicalDeviceFeatures.features.robustBufferAccess = VK_TRUE;
+        }
+    }
+
     ivk->vkCreateDevice(emulation->mPhysicalDevice, &dCi, nullptr, &emulation->mDevice);
 
     if (res != VK_SUCCESS) {
@@ -1757,6 +1798,10 @@
     return mDeviceInfo.supportsExternalMemoryHostProps;
 }
 
+std::optional<VkPhysicalDeviceRobustness2FeaturesEXT> VkEmulation::getRobustness2Features() const {
+    return mDeviceInfo.robustness2Features;
+}
+
 VkPhysicalDeviceExternalMemoryHostPropertiesEXT VkEmulation::externalMemoryHostProperties() const {
     return mDeviceInfo.externalMemoryHostProps;
 }
@@ -1957,8 +2002,8 @@
         VkResult allocRes = vk->vkAllocateMemory(mDevice, &allocInfo, nullptr, &info->memory);
 
         if (allocRes != VK_SUCCESS) {
-            VERBOSE("allocExternalMemory: failed in vkAllocateMemory: %s",
-                    string_VkResult(allocRes));
+            VERBOSE("%s: failed in vkAllocateMemory: %s",
+                    __func__, string_VkResult(allocRes));
             break;
         }
 
@@ -1967,7 +2012,7 @@
             VkResult mapRes =
                 vk->vkMapMemory(mDevice, info->memory, 0, info->size, 0, &info->mappedPtr);
             if (mapRes != VK_SUCCESS) {
-                VERBOSE("allocExternalMemory: failed in vkMapMemory: %s", string_VkResult(mapRes));
+                VERBOSE("%s: failed in vkMapMemory: %s", __func__, string_VkResult(mapRes));
                 break;
             }
         }
@@ -1992,14 +2037,14 @@
         } else {
             allocationAttempts.push_back(info->memory);
 
-            VERBOSE("allocExternalMemory: attempt #%zu failed; deviceAlignment: %" PRIu64
+            VERBOSE("%s: attempt #%zu failed; deviceAlignment: %" PRIu64
                     ", mappedPtrPageOffset: %" PRIu64,
-                    allocationAttempts.size(), deviceAlignment.valueOr(0), mappedPtrPageOffset);
+                    __func__, allocationAttempts.size(), deviceAlignment.valueOr(0), mappedPtrPageOffset);
 
             if (allocationAttempts.size() >= kMaxAllocationAttempts) {
                 VERBOSE(
-                    "allocExternalMemory: unable to allocate memory with CPU mapped ptr aligned to "
-                    "page");
+                    "%s: unable to allocate memory with CPU mapped ptr aligned to "
+                    "page", __func__);
                 break;
             }
         }
@@ -2078,8 +2123,8 @@
 #endif
 
     if (exportRes != VK_SUCCESS || !validHandle) {
-        WARN("allocExternalMemory: Failed to get external memory, result: %s",
-             string_VkResult(exportRes));
+        WARN("%s: Failed to get external memory, result: %s",
+             __func__, string_VkResult(exportRes));
         return false;
     }
 
@@ -2228,7 +2273,7 @@
             // b/281550953
             // RGB8 is not supported on many vulkan drivers.
             // Try RGBA8 instead.
-            // Note: copyImageData() performs channel conversion for this case.
+            // Note: updateColorBufferFromBytesLocked() performs channel conversion for this case.
             return VK_FORMAT_R8G8B8A8_UNORM;
         case GL_RGB565:
             return VK_FORMAT_R5G6B5_UNORM_PACK16;
@@ -2239,8 +2284,19 @@
             return VK_FORMAT_R8G8B8A8_UNORM;
         case GL_RGB5_A1_OES:
             return VK_FORMAT_A1R5G5B5_UNORM_PACK16;
-        case GL_RGBA4_OES:
+        case GL_RGBA4_OES: {
+            // TODO: add R4G4B4A4 support to lavapipe, and check support programmatically
+            const bool lavapipe =
+                (android::base::getEnvironmentVariable("ANDROID_EMU_VK_ICD").compare("lavapipe") ==
+                 0);
+            if (lavapipe) {
+                // RGBA4 is not supported on lavapipe, use more widely available BGRA4 instead.
+                // Note: updateColorBufferFromBytesLocked() performs channel conversion for this
+                // case.
+                return VK_FORMAT_B4G4R4A4_UNORM_PACK16;
+            }
             return VK_FORMAT_R4G4B4A4_UNORM_PACK16;
+        }
         case GL_RGB10_A2:
         case GL_UNSIGNED_INT_10_10_10_2_OES:
             return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
@@ -2653,10 +2709,8 @@
 
     const VkFormat imageVkFormat = infoPtr->imageCreateInfoShallow.format;
     VERBOSE(
-        "ColorBuffer %d, dimensions: %dx%d, format: %s, "
-        "allocation size and type index: %lu, %d, "
-        "allocated memory property: %d, "
-        "requested memory property: %d",
+        "ColorBuffer %u, %ux%u, %s, "
+        "Memory [size: %llu, type: %d, props: %u / %u]",
         colorBufferHandle, infoPtr->width, infoPtr->height, string_VkFormat(imageVkFormat),
         infoPtr->memory.size, infoPtr->memory.typeIndex,
         mDeviceInfo.memProps.memoryTypes[infoPtr->memory.typeIndex].propertyFlags,
@@ -3035,13 +3089,13 @@
     mDebugUtilsHelper.cmdBeginDebugLabel(mCommandBuffer, "readColorBufferToBytes(ColorBuffer:%d)",
                                          colorBufferHandle);
 
-    VkImageLayout currentLayout = colorBufferInfo->currentLayout;
-    VkImageLayout transferSrcLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+    const VkImageLayout currentLayout = colorBufferInfo->currentLayout;
+    const VkImageLayout transferSrcLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
 
     const VkImageMemoryBarrier toTransferSrcImageBarrier = {
         .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
         .pNext = nullptr,
-        .srcAccessMask = 0,
+        .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
         .dstAccessMask = VK_ACCESS_HOST_READ_BIT,
         .oldLayout = currentLayout,
         .newLayout = transferSrcLayout,
@@ -3063,7 +3117,7 @@
                              &toTransferSrcImageBarrier);
 
     vk->vkCmdCopyImageToBuffer(mCommandBuffer, colorBufferInfo->image,
-                               VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, mStaging.buffer,
+                               transferSrcLayout, mStaging.buffer,
                                bufferImageCopies.size(), bufferImageCopies.data());
 
     // Change back to original layout
@@ -3072,7 +3126,7 @@
         const VkImageMemoryBarrier toCurrentLayoutImageBarrier = {
             .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
             .pNext = nullptr,
-            .srcAccessMask = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
+            .srcAccessMask = VK_ACCESS_HOST_READ_BIT,
             .dstAccessMask = VK_ACCESS_NONE_KHR,
             .oldLayout = transferSrcLayout,
             .newLayout = colorBufferInfo->currentLayout,
@@ -3187,6 +3241,20 @@
     }
 }
 
+static void convertRgba4ToBGRA4Pixels(void* dst, const void* src, uint32_t w, uint32_t h) {
+    const size_t pixelCount = w * h;
+    const uint16_t* srcPixels = reinterpret_cast<const uint16_t*>(src);
+    uint16_t* dstPixels = reinterpret_cast<uint16_t*>(dst);
+    for (size_t i = 0; i < pixelCount; ++i) {
+        const uint16_t rgba4_pixel = srcPixels[i];
+        const uint8_t red = (rgba4_pixel >> 12) & 0xF;
+        const uint8_t green = (rgba4_pixel >> 8) & 0xF;
+        const uint8_t blue = (rgba4_pixel >> 4) & 0xF;
+        const uint8_t alpha = rgba4_pixel & 0xF;
+        dstPixels[i] = (blue << 12) | (green << 8) | (red << 4) | alpha;
+    }
+}
+
 bool VkEmulation::updateColorBufferFromBytesLocked(uint32_t colorBufferHandle, uint32_t x,
                                                    uint32_t y, uint32_t w, uint32_t h,
                                                    const void* pixels, size_t inputPixelsSize) {
@@ -3209,9 +3277,10 @@
         return false;
     }
 
+    const VkFormat creationFormat = colorBufferInfo->imageCreateInfoShallow.format;
     VkDeviceSize dstBufferSize = 0;
     std::vector<VkBufferImageCopy> bufferImageCopies;
-    if (!getFormatTransferInfo(colorBufferInfo->imageCreateInfoShallow.format,
+    if (!getFormatTransferInfo(creationFormat,
                                colorBufferInfo->imageCreateInfoShallow.extent.width,
                                colorBufferInfo->imageCreateInfoShallow.extent.height,
                                &dstBufferSize, &bufferImageCopies)) {
@@ -3226,10 +3295,11 @@
             colorBufferHandle, dstBufferSize, stagingBufferSize);
         return false;
     }
-
-    bool isThreeByteRgb =
+    const bool isRGBA4onBGRA4 = (colorBufferInfo->internalFormat == GL_RGBA4_OES) &&
+                          (creationFormat == VK_FORMAT_B4G4R4A4_UNORM_PACK16);
+    const bool isThreeByteRgb =
         (colorBufferInfo->internalFormat == GL_RGB || colorBufferInfo->internalFormat == GL_RGB8);
-    size_t expectedInputSize = (isThreeByteRgb ? dstBufferSize / 4 * 3 : dstBufferSize);
+    const size_t expectedInputSize = (isThreeByteRgb ? dstBufferSize / 4 * 3 : dstBufferSize);
 
     if (inputPixelsSize != 0 && inputPixelsSize != expectedInputSize) {
         ERR("Unexpected contents size when trying to update ColorBuffer:%d, "
@@ -3245,6 +3315,8 @@
         // an incompatible choice of 4-byte backing VK_FORMAT_R8G8B8A8_UNORM.
         // b/281550953
         convertRgbToRgbaPixels(stagingBufferPtr, pixels, w, h);
+    } else if(isRGBA4onBGRA4) {
+        convertRgba4ToBGRA4Pixels(stagingBufferPtr, pixels, w, h);
     } else {
         std::memcpy(stagingBufferPtr, pixels, dstBufferSize);
     }
diff --git a/host/vulkan/VkCommonOperations.h b/host/vulkan/VkCommonOperations.h
index bb50ca3..9e14b4d 100644
--- a/host/vulkan/VkCommonOperations.h
+++ b/host/vulkan/VkCommonOperations.h
@@ -126,6 +126,8 @@
 
     bool supportsExternalMemoryHostProperties() const;
 
+    std::optional<VkPhysicalDeviceRobustness2FeaturesEXT> getRobustness2Features() const;
+
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT externalMemoryHostProperties() const;
 
     bool isGuestVulkanOnly() const;
@@ -472,6 +474,9 @@
 #else
         PFN_vkGetMemoryFdKHR getMemoryHandleFunc = nullptr;
 #endif
+
+        // Set only if requested and supported
+        std::optional<VkPhysicalDeviceRobustness2FeaturesEXT> robustness2Features;
     };
 
     uint32_t getValidMemoryTypeIndex(uint32_t requiredMemoryTypeBits,
diff --git a/host/vulkan/VkDecoderGlobalState.cpp b/host/vulkan/VkDecoderGlobalState.cpp
index 6bca012..f79a06d 100644
--- a/host/vulkan/VkDecoderGlobalState.cpp
+++ b/host/vulkan/VkDecoderGlobalState.cpp
@@ -1822,6 +1822,19 @@
             }
         }
 
+        const auto r2features = m_vkEmulation->getRobustness2Features();
+        const bool forceEnableRobustness =
+            r2features &&
+            (vk_find_struct<VkPhysicalDeviceRobustness2FeaturesEXT>(&createInfoFiltered) == nullptr);
+        VkPhysicalDeviceRobustness2FeaturesEXT modifiedRobustness2features;
+        if (forceEnableRobustness) {
+            VERBOSE("Force-enabling VK_EXT_robustness2 on device creation.");
+            updatedDeviceExtensions.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+            modifiedRobustness2features = *r2features;
+            modifiedRobustness2features.pNext = const_cast<void*>(createInfoFiltered.pNext);
+            createInfoFiltered.pNext = &modifiedRobustness2features;
+        }
+
         if (VkPhysicalDeviceFeatures2* features2 =
                 vk_find_struct<VkPhysicalDeviceFeatures2>(&createInfoFiltered)) {
             featuresToFilter.emplace_back(&features2->features);
@@ -1864,6 +1877,12 @@
             if (emulateTextureAstc) {
                 feature->textureCompressionASTC_LDR = VK_FALSE;
             }
+
+            // vkCreateDevice() - VUID-04000: If robustBufferAccess2 is enabled then
+            // robustBufferAccess must be enabled.
+            if (forceEnableRobustness && modifiedRobustness2features.robustBufferAccess2) {
+                feature->robustBufferAccess = VK_TRUE;
+            }
         }
 
         if (auto* ycbcrFeatures = vk_find_struct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(
@@ -5302,7 +5321,7 @@
                     return VK_ERROR_OUT_OF_DEVICE_MEMORY;
                 }
 
-                importInfoMetalHandle.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT;
+                importInfoMetalHandle.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLHEAP_BIT_EXT;
                 importInfoMetalHandle.handle = bufferMetalMemoryHandle;
 
                 vk_append_struct(&structChainIter, &importInfoMetalHandle);
@@ -5482,7 +5501,7 @@
 #if defined(__APPLE__)
                 if (m_vkEmulation->supportsMoltenVk()) {
                     // Using a different handle type when in MoltenVK mode
-                    handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLTEXTURE_BIT_EXT;
+                    handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLHEAP_BIT_EXT;
                 } else {
                     handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
                 }
diff --git a/host/vulkan/cereal/common/vk_struct_id.h b/host/vulkan/cereal/common/vk_struct_id.h
index 0a9fb23..65f428b 100644
--- a/host/vulkan/cereal/common/vk_struct_id.h
+++ b/host/vulkan/cereal/common/vk_struct_id.h
@@ -105,6 +105,8 @@
                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES);
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceInlineUniformBlockFeatures,
                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES);
+REGISTER_VK_STRUCT_ID(VkPhysicalDeviceRobustness2FeaturesEXT,
+                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT);
 
 #if defined(VK_USE_PLATFORM_SCREEN_QNX)
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX,
diff --git a/include/render-utils/virtio_gpu_ops.h b/include/render-utils/virtio_gpu_ops.h
index fedfa86..e066671 100644
--- a/include/render-utils/virtio_gpu_ops.h
+++ b/include/render-utils/virtio_gpu_ops.h
@@ -25,7 +25,7 @@
 /* virtio-gpu interface for color buffers
  * (triggered by minigbm/egl calling virtio-gpu ioctls) */
 typedef void (*create_color_buffer_with_handle_t)(uint32_t width, uint32_t height, uint32_t format,
-                                                  uint32_t fwkFormat, uint32_t handle, bool linear);
+                                                  uint32_t fwkFormat, uint32_t handle);
 
 /* create YUV textures with given width and height
    type: FRAMEWORK_FORMAT_NV12 or FRAMEWORK_FORMAT_YUV_420_888
diff --git a/qnx/host/platform_qnx.cpp b/qnx/host/platform_qnx.cpp
deleted file mode 100644
index 37c369b..0000000
--- a/qnx/host/platform_qnx.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2023 The Android Open Source Project
-// Copyright (C) 2023 BlackBerry Limited
-//
-// 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 <EGL/egl.h>
-#include <GLES2/gl2.h>
-
-// without this the build fails to properly link to the qnx EGL and GLESv2 libs:
-//   SharedLibrary.cpp:266] SharedLibrary::open for [libGLESv2.so] failed (posix). dlerror:
-//   [Unresolved symbols] EglOsApi_egl.cpp:208] EglOsGlLibrary: Could not open GL library
-//   libGLESv2.so [Unresolved symbols]
-void link_EGL_GLES2(void) {
-    eglGetDisplay(EGL_DEFAULT_DISPLAY);
-    glViewport(0, 0, 0, 0);
-}
diff --git a/third-party/fuchsia/magma/BUILD.bazel b/third-party/fuchsia/magma/BUILD.bazel
index e6f9804..8355af0 100644
--- a/third-party/fuchsia/magma/BUILD.bazel
+++ b/third-party/fuchsia/magma/BUILD.bazel
@@ -1,9 +1,9 @@
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 cc_library(
     name = "magma-headers",
     hdrs = glob([
         "include/**/*.h",
-        "include/**/*.hpp",
-        "include/**/*.inl",
     ]),
     includes = ["include"],
     visibility = ["//visibility:public"],
diff --git a/utils/BUILD.bazel b/utils/BUILD.bazel
index f042524..245f9ca 100644
--- a/utils/BUILD.bazel
+++ b/utils/BUILD.bazel
@@ -1,5 +1,7 @@
 # File: BUILD
 
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+
 # Interface Library
 cc_library(
     name = "gfxstream_utils_headers",
@@ -7,10 +9,10 @@
     includes = ["include"],
     visibility = ["//visibility:public"],
     deps = [
-        "//hardware/google/aemu/base:aemu-base-headers",
-        "//hardware/google/aemu/host-common:aemu-host-common-headers",
-        "//hardware/google/gfxstream/common/vulkan:gfxstream_vulkan_headers",
-        "//hardware/google/gfxstream/third-party/renderdoc",
+        "//common/vulkan:gfxstream_vulkan_headers",
+        "//third-party/renderdoc",
+        "@aemu//base:aemu-base-headers",
+        "@aemu//host-common:aemu-host-common-headers",
     ],
 )
 
@@ -31,6 +33,7 @@
     ],
     deps = [
         ":gfxstream_utils",
+        "@aemu//base:aemu-base",
         "@com_google_googletest//:gtest_main",
     ],
 )