From 12f25462c22306ade709d4663086662752f44923 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 15 Feb 2018 14:22:58 +1000 Subject: [PATCH] virglrenderer: introduce a second capability set to workaround bugs in first. 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 | 1 + src/vrend_renderer.c | 35 +++++++++++++++++++++++++---------- src/vrend_renderer.h | 1 + 4 files changed, 31 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..9596dce 100644 --- a/src/virglrenderer.h +++ b/src/virglrenderer.h @@ -169,4 +169,5 @@ VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie); VIRGL_EXPORT void virgl_renderer_reset(void); VIRGL_EXPORT int virgl_renderer_get_poll_fd(void); + #endif diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index d4b312a..167a56c 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -6308,18 +6308,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) { @@ -6487,6 +6492,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]; @@ -6718,14 +6726,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 715729c..3308375 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);