virtgpu_virgl: implement backend get_max_texture_2d_size()

BUG=b:194426249
TEST=launch Cuttlefish w/ 2D mode
TEST=launch Cuttlefish w/ 3D mode

Change-Id: Ib96be2c783d47959a24f579a1ae99244f8afffdb
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3194814
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Tested-by: Yiwei Zhang <zzyiwei@chromium.org>
Commit-Queue: Yiwei Zhang <zzyiwei@chromium.org>
diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c
index 3423b42..82a39d9 100644
--- a/virtgpu_virgl.c
+++ b/virtgpu_virgl.c
@@ -22,6 +22,8 @@
 
 #define PIPE_TEXTURE_2D 2
 
+#define MESA_LLVMPIPE_MAX_TEXTURE_2D_LEVELS 15
+#define MESA_LLVMPIPE_MAX_TEXTURE_2D_SIZE (1 << (MESA_LLVMPIPE_MAX_TEXTURE_2D_LEVELS - 1))
 #define MESA_LLVMPIPE_TILE_ORDER 6
 #define MESA_LLVMPIPE_TILE_SIZE (1 << MESA_LLVMPIPE_TILE_ORDER)
 
@@ -508,6 +510,16 @@
 		    gem_map.offset);
 }
 
+static uint32_t virgl_3d_get_max_texture_2d_size(struct driver *drv)
+{
+	struct virgl_priv *priv = (struct virgl_priv *)drv->priv;
+
+	if (priv->caps.v2.max_texture_2d_size)
+		return priv->caps.v2.max_texture_2d_size;
+
+	return UINT32_MAX;
+}
+
 static int virgl_get_caps(struct driver *drv, union virgl_caps *caps, int *caps_is_v2)
 {
 	int ret;
@@ -1028,6 +1040,14 @@
 	return 0;
 }
 
+static uint32_t virgl_get_max_texture_2d_size(struct driver *drv)
+{
+	if (params[param_3d].value)
+		return virgl_3d_get_max_texture_2d_size(drv);
+	else
+		return MESA_LLVMPIPE_MAX_TEXTURE_2D_SIZE;
+}
+
 const struct backend virtgpu_virgl = { .name = "virtgpu_virgl",
 				       .init = virgl_init,
 				       .close = virgl_close,
@@ -1040,4 +1060,5 @@
 				       .bo_flush = virgl_bo_flush,
 				       .resolve_format = virgl_resolve_format,
 				       .resolve_use_flags = virgl_resolve_use_flags,
-				       .resource_info = virgl_resource_info };
+				       .resource_info = virgl_resource_info,
+				       .get_max_texture_2d_size = virgl_get_max_texture_2d_size };