Reland: Support host decoding with update_color_buffer on minigbm

minigbm creates an NV12 image when the guest wanted yuv_420_888. our
host decoder outputs yuv_420_888, but this isn't compatible with nv21,
and resulted in garbled images when fed to YUVConverter.

but gfxstream never created a yuv_420_888 gpu image on the host anyway. All
we need to do is explicitly tell YUVConverter to convert from yuv_420_888.

Bug: 162770284
Change-Id: I3788183e7c94adfd0d52caafbbe67a1ed0d23c77
diff --git a/stream-servers/RendererImpl.cpp b/stream-servers/RendererImpl.cpp
index 9916eea..7c3dbf9 100644
--- a/stream-servers/RendererImpl.cpp
+++ b/stream-servers/RendererImpl.cpp
@@ -523,170 +523,118 @@
 }
 
 static struct AndroidVirtioGpuOps sVirtioGpuOps = {
-        .create_buffer_with_handle =
-                [](uint64_t size, uint32_t handle) {
-                    FrameBuffer::getFB()->createBufferWithHandle(size, handle);
-                },
-        .create_color_buffer_with_handle =
-                [](uint32_t width,
-                   uint32_t height,
-                   uint32_t format,
-                   uint32_t fwkFormat,
-                   uint32_t handle) {
-                    FrameBuffer::getFB()->createColorBufferWithHandle(
-                            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);
-                },
-        .close_color_buffer =
-                [](uint32_t handle) {
-                    FrameBuffer::getFB()->closeColorBuffer(handle);
-                },
-        .update_buffer =
-                [](uint32_t handle,
-                   uint64_t offset,
-                   uint64_t size,
-                   void* bytes) {
-                    FrameBuffer::getFB()->updateBuffer(
-                            handle, offset, size, bytes);
-                },
-        .update_color_buffer =
-                [](uint32_t handle,
-                   int x,
-                   int y,
-                   int width,
-                   int height,
-                   uint32_t format,
-                   uint32_t type,
-                   void* pixels) {
-                    FrameBuffer::getFB()->updateColorBuffer(
-                            handle, x, y, width, height, format, type, pixels);
-                },
-        .read_buffer =
-                [](uint32_t handle,
-                   uint64_t offset,
-                   uint64_t size,
-                   void* bytes) {
-                    FrameBuffer::getFB()->readBuffer(
-                            handle, offset, size, bytes);
-                },
-        .read_color_buffer =
-                [](uint32_t handle,
-                   int x,
-                   int y,
-                   int width,
-                   int height,
-                   uint32_t format,
-                   uint32_t type,
-                   void* pixels) {
-                    FrameBuffer::getFB()->readColorBuffer(
-                            handle, x, y, width, height, format, type, pixels);
-                },
-        .read_color_buffer_yuv =
-                [](uint32_t handle,
-                   int x,
-                   int y,
-                   int width,
-                   int height,
-                   void* pixels,
-                   uint32_t pixels_size) {
-                    FrameBuffer::getFB()->readColorBufferYUV(
-                            handle, x, y, width, height, pixels, pixels_size);
-                },
-        .post_color_buffer =
-                [](uint32_t handle) { FrameBuffer::getFB()->post(handle); },
-        .async_post_color_buffer =
-                [](uint32_t handle, CpuCompletionCallback cb) {
-                    FrameBuffer::getFB()->postWithCallback(handle, cb); },
-        .repost = []() { FrameBuffer::getFB()->repost(); },
-        .create_yuv_textures =
-                [](uint32_t type,
-                   uint32_t count,
-                   int width,
-                   int height,
-                   uint32_t* output) {
-                    FrameBuffer::getFB()->createYUVTextures(type, count, width,
-                                                            height, output);
-                },
-        .destroy_yuv_textures =
-                [](uint32_t type, uint32_t count, uint32_t* textures) {
-                    FrameBuffer::getFB()->destroyYUVTextures(type, count,
-                                                             textures);
-                },
-        .update_yuv_textures =
-                [](uint32_t type,
-                   uint32_t* textures,
-                   void* privData,
-                   void* func) {
-                    FrameBuffer::getFB()->updateYUVTextures(type, textures,
-                                                            privData, func);
-                },
-        .swap_textures_and_update_color_buffer =
-                [](uint32_t colorbufferhandle,
-                   int x,
-                   int y,
-                   int width,
-                   int height,
-                   uint32_t format,
-                   uint32_t type,
-                   uint32_t texture_type,
-                   uint32_t* textures,
-                   void* metadata) {
-                    (void)metadata;
-                    // TODO(joshuaduong): CP go/oag/2170490
-                    FrameBuffer::getFB()->swapTexturesAndUpdateColorBuffer(
-                            colorbufferhandle, x, y, width, height, format,
-                            type, texture_type, textures);
-                },
-        .get_last_posted_color_buffer = []() {
-            return FrameBuffer::getFB()->getLastPostedColorBuffer();
+    .create_buffer_with_handle =
+        [](uint64_t size, uint32_t handle) {
+            FrameBuffer::getFB()->createBufferWithHandle(size, handle);
         },
-        .bind_color_buffer_to_texture = [](uint32_t handle) {
-            FrameBuffer::getFB()->bindColorBufferToTexture2(handle);
+    .create_color_buffer_with_handle =
+        [](uint32_t width, uint32_t height, uint32_t format, uint32_t fwkFormat, uint32_t handle) {
+            FrameBuffer::getFB()->createColorBufferWithHandle(width, height, (GLenum)format,
+                                                              (FrameworkFormat)fwkFormat, handle);
         },
-        .get_global_egl_context = []() {
-            return FrameBuffer::getFB()->getGlobalEGLContext();
+    .open_color_buffer = [](uint32_t handle) { FrameBuffer::getFB()->openColorBuffer(handle); },
+    .close_buffer = [](uint32_t handle) { FrameBuffer::getFB()->closeBuffer(handle); },
+    .close_color_buffer = [](uint32_t handle) { FrameBuffer::getFB()->closeColorBuffer(handle); },
+    .update_buffer =
+        [](uint32_t handle, uint64_t offset, uint64_t size, void* bytes) {
+            FrameBuffer::getFB()->updateBuffer(handle, offset, size, bytes);
         },
-        .wait_for_gpu = [](uint64_t eglsync) {
-            FrameBuffer::getFB()->waitForGpu(eglsync);
+    .update_color_buffer =
+        [](uint32_t handle, int x, int y, int width, int height, uint32_t format, uint32_t type,
+           void* pixels) {
+            FrameBuffer::getFB()->updateColorBuffer(handle, x, y, width, height, format, type,
+                                                    pixels);
         },
-        .wait_for_gpu_vulkan = [](uint64_t device, uint64_t fence) {
+    .read_buffer =
+        [](uint32_t handle, uint64_t offset, uint64_t size, void* bytes) {
+            FrameBuffer::getFB()->readBuffer(handle, offset, size, bytes);
+        },
+    .read_color_buffer =
+        [](uint32_t handle, int x, int y, int width, int height, uint32_t format, uint32_t type,
+           void* pixels) {
+            FrameBuffer::getFB()->readColorBuffer(handle, x, y, width, height, format, type,
+                                                  pixels);
+        },
+    .read_color_buffer_yuv =
+        [](uint32_t handle, int x, int y, int width, int height, void* pixels,
+           uint32_t pixels_size) {
+            FrameBuffer::getFB()->readColorBufferYUV(handle, x, y, width, height, pixels,
+                                                     pixels_size);
+        },
+    .post_color_buffer = [](uint32_t handle) { FrameBuffer::getFB()->post(handle); },
+    .async_post_color_buffer =
+        [](uint32_t handle, CpuCompletionCallback cb) {
+            FrameBuffer::getFB()->postWithCallback(handle, cb);
+        },
+    .repost = []() { FrameBuffer::getFB()->repost(); },
+    .create_yuv_textures =
+        [](uint32_t type, uint32_t count, int width, int height, uint32_t* output) {
+            FrameBuffer::getFB()->createYUVTextures(type, count, width, height, output);
+        },
+    .destroy_yuv_textures =
+        [](uint32_t type, uint32_t count, uint32_t* textures) {
+            FrameBuffer::getFB()->destroyYUVTextures(type, count, textures);
+        },
+    .update_yuv_textures =
+        [](uint32_t type, uint32_t* textures, void* privData, void* func) {
+            FrameBuffer::getFB()->updateYUVTextures(type, textures, privData, func);
+        },
+    .swap_textures_and_update_color_buffer =
+        [](uint32_t colorbufferhandle, int x, int y, int width, int height, uint32_t format,
+           uint32_t type, uint32_t texture_type, uint32_t* textures, void* metadata) {
+            (void)metadata;
+            // TODO(joshuaduong): CP go/oag/2170490
+            FrameBuffer::getFB()->swapTexturesAndUpdateColorBuffer(
+                colorbufferhandle, x, y, width, height, format, type, texture_type, textures);
+        },
+    .get_last_posted_color_buffer =
+        []() { return FrameBuffer::getFB()->getLastPostedColorBuffer(); },
+    .bind_color_buffer_to_texture =
+        [](uint32_t handle) { FrameBuffer::getFB()->bindColorBufferToTexture2(handle); },
+    .get_global_egl_context = []() { return FrameBuffer::getFB()->getGlobalEGLContext(); },
+    .wait_for_gpu = [](uint64_t eglsync) { FrameBuffer::getFB()->waitForGpu(eglsync); },
+    .wait_for_gpu_vulkan =
+        [](uint64_t device, uint64_t fence) {
             FrameBuffer::getFB()->waitForGpuVulkan(device, fence);
         },
-        .set_guest_managed_color_buffer_lifetime = [](bool guestManaged) {
+    .set_guest_managed_color_buffer_lifetime =
+        [](bool guestManaged) {
             FrameBuffer::getFB()->setGuestManagedColorBufferLifetime(guestManaged);
         },
-        .async_wait_for_gpu_with_cb = [](uint64_t eglsync, FenceCompletionCallback cb) {
+    .async_wait_for_gpu_with_cb =
+        [](uint64_t eglsync, FenceCompletionCallback cb) {
             FrameBuffer::getFB()->asyncWaitForGpuWithCb(eglsync, cb);
         },
-        .async_wait_for_gpu_vulkan_with_cb = [](uint64_t device, uint64_t fence, FenceCompletionCallback cb) {
+    .async_wait_for_gpu_vulkan_with_cb =
+        [](uint64_t device, uint64_t fence, FenceCompletionCallback cb) {
             FrameBuffer::getFB()->asyncWaitForGpuVulkanWithCb(device, fence, cb);
         },
-        .async_wait_for_gpu_vulkan_qsri_with_cb = [](uint64_t image, FenceCompletionCallback cb) {
+    .async_wait_for_gpu_vulkan_qsri_with_cb =
+        [](uint64_t image, FenceCompletionCallback cb) {
             FrameBuffer::getFB()->asyncWaitForGpuVulkanQsriWithCb(image, cb);
         },
-        .wait_for_gpu_vulkan_qsri = [](uint64_t image) {
-            FrameBuffer::getFB()->waitForGpuVulkanQsri(image);
-        },
-        .platform_import_resource = [](uint32_t handle, uint32_t info, void* resource) {
+    .wait_for_gpu_vulkan_qsri =
+        [](uint64_t image) { FrameBuffer::getFB()->waitForGpuVulkanQsri(image); },
+    .platform_import_resource =
+        [](uint32_t handle, uint32_t info, void* resource) {
             return FrameBuffer::getFB()->platformImportResource(handle, info, resource);
         },
-        .platform_resource_info = [](uint32_t handle, int32_t* width, int32_t* height, int32_t* internal_format) {
+    .platform_resource_info =
+        [](uint32_t handle, int32_t* width, int32_t* height, int32_t* internal_format) {
             return FrameBuffer::getFB()->getColorBufferInfo(handle, width, height, internal_format);
         },
-        .platform_create_shared_egl_context = []() {
-            return FrameBuffer::getFB()->platformCreateSharedEglContext();
-        },
-        .platform_destroy_shared_egl_context = [](void* context) {
+    .platform_create_shared_egl_context =
+        []() { return FrameBuffer::getFB()->platformCreateSharedEglContext(); },
+    .platform_destroy_shared_egl_context =
+        [](void* context) {
             return FrameBuffer::getFB()->platformDestroySharedEglContext(context);
         },
+    .update_color_buffer_from_framework_format =
+        [](uint32_t handle, int x, int y, int width, int height, uint32_t fwkFormat,
+           uint32_t format, uint32_t type, void* pixels, void* pMetadata) {
+            FrameBuffer::getFB()->updateColorBufferFromFrameworkFormat(
+                handle, x, y, width, height, (FrameworkFormat)fwkFormat, format, type, pixels);
+        },
 };
 
 struct AndroidVirtioGpuOps* RendererImpl::getVirtioGpuOps() {