[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