[virglrenderer-devel] [PATCH] virglrenderer: introduce a second capability set to workaround bugs in first.

Dave Airlie airlied at gmail.com
Fri Feb 16 00:42:30 UTC 2018


From: Dave Airlie <airlied at redhat.com>

This introduces a second capability set exposing a larger struct size.

The kernel ioctl has some bugs that necessitated this change.
---
 src/virgl_hw.h       |  4 ++++
 src/virglrenderer.h  |  3 +++
 src/vrend_renderer.c | 35 +++++++++++++++++++++++++----------
 src/vrend_renderer.h |  1 +
 4 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/virgl_hw.h b/src/virgl_hw.h
index 6468e27..790263c 100644
--- a/src/virgl_hw.h
+++ b/src/virgl_hw.h
@@ -260,6 +260,10 @@ struct virgl_caps_v1 {
         uint32_t max_texture_gather_components;
 };
 
+/*
+ * This struct should be growable when used in capset 2,
+ * so we shouldn't have to add a v3 ever.
+ */
 struct virgl_caps_v2 {
         struct virgl_caps_v1 v1;
         float min_aliased_point_size;
diff --git a/src/virglrenderer.h b/src/virglrenderer.h
index 6eb7bdb..0639261 100644
--- a/src/virglrenderer.h
+++ b/src/virglrenderer.h
@@ -169,4 +169,7 @@ VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie);
 VIRGL_EXPORT void virgl_renderer_reset(void);
 
 VIRGL_EXPORT int virgl_renderer_get_poll_fd(void);
+
+#define VIRGLRENDERER_SUPPORTS_CAPSET2
+
 #endif
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 5cea848..a00a6d1 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -6294,18 +6294,23 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
    GLint max;
    GLfloat range[2];
    int gl_ver = epoxy_gl_version();
-
+   bool fill_capset2 = false;
    if (!caps)
       return;
 
-   memset(caps, 0, sizeof(*caps));
-
-   if (set != 1 && set != 0) {
+   if (set > 2) {
       caps->max_version = 0;
       return;
    }
 
-   caps->max_version = 2;
+   if (set == 1) {
+      memset(caps, 0, sizeof(struct virgl_caps_v1));
+      caps->max_version = 1;
+   } else if (set == 2) {
+      fill_capset2 = true;
+      memset(caps, 0, sizeof(*caps));
+      caps->max_version = 2;
+   }
 
    caps->v1.bset.occlusion_query = 1;
    if (gl_ver >= 30) {
@@ -6473,6 +6478,9 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
       }
    }
 
+   if (!fill_capset2)
+      return;
+
    glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, range);
    caps->v2.min_aliased_point_size = range[0];
    caps->v2.max_aliased_point_size = range[1];
@@ -6704,14 +6712,21 @@ int vrend_renderer_resource_get_info(int res_handle,
 void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver,
                                 uint32_t *max_size)
 {
-   if (cap_set != VREND_CAP_SET) {
+   switch (cap_set) {
+   case VREND_CAP_SET:
+      *max_ver = 1;
+      *max_size = sizeof(struct virgl_caps_v1);
+      break;
+   case VREND_CAP_SET2:
+      /* we should never need to increase this - it should be possible to just grow virgl_caps */
+      *max_ver = 2;
+      *max_size = sizeof(struct virgl_caps_v2);
+      break;
+   default:
       *max_ver = 0;
       *max_size = 0;
-      return;
+      break;
    }
-
-   *max_ver = 2;
-   *max_size = sizeof(union virgl_caps);
 }
 
 void vrend_renderer_create_sub_ctx(struct vrend_context *ctx, int sub_ctx_id)
diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h
index 71d14c4..0d8089b 100644
--- a/src/vrend_renderer.h
+++ b/src/vrend_renderer.h
@@ -353,6 +353,7 @@ int vrend_renderer_resource_get_info(int res_handle,
                                      struct vrend_renderer_resource_info *info);
 
 #define VREND_CAP_SET 1
+#define VREND_CAP_SET2 2
 
 void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver,
                                 uint32_t *max_size);
-- 
2.14.3



More information about the virglrenderer-devel mailing list