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.
macos/master
Dave Airlie 7 years ago
parent 192169f8e0
commit 12f25462c2
  1. 4
      src/virgl_hw.h
  2. 1
      src/virglrenderer.h
  3. 33
      src/vrend_renderer.c
  4. 1
      src/vrend_renderer.h

@ -260,6 +260,10 @@ struct virgl_caps_v1 {
uint32_t max_texture_gather_components; 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_v2 {
struct virgl_caps_v1 v1; struct virgl_caps_v1 v1;
float min_aliased_point_size; float min_aliased_point_size;

@ -169,4 +169,5 @@ VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie);
VIRGL_EXPORT void virgl_renderer_reset(void); VIRGL_EXPORT void virgl_renderer_reset(void);
VIRGL_EXPORT int virgl_renderer_get_poll_fd(void); VIRGL_EXPORT int virgl_renderer_get_poll_fd(void);
#endif #endif

@ -6308,18 +6308,23 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
GLint max; GLint max;
GLfloat range[2]; GLfloat range[2];
int gl_ver = epoxy_gl_version(); int gl_ver = epoxy_gl_version();
bool fill_capset2 = false;
if (!caps) if (!caps)
return; return;
memset(caps, 0, sizeof(*caps)); if (set > 2) {
if (set != 1 && set != 0) {
caps->max_version = 0; caps->max_version = 0;
return; return;
} }
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->max_version = 2;
}
caps->v1.bset.occlusion_query = 1; caps->v1.bset.occlusion_query = 1;
if (gl_ver >= 30) { 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); glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, range);
caps->v2.min_aliased_point_size = range[0]; caps->v2.min_aliased_point_size = range[0];
caps->v2.max_aliased_point_size = range[1]; 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, void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver,
uint32_t *max_size) 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_ver = 0;
*max_size = 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) void vrend_renderer_create_sub_ctx(struct vrend_context *ctx, int sub_ctx_id)

@ -353,6 +353,7 @@ int vrend_renderer_resource_get_info(int res_handle,
struct vrend_renderer_resource_info *info); struct vrend_renderer_resource_info *info);
#define VREND_CAP_SET 1 #define VREND_CAP_SET 1
#define VREND_CAP_SET2 2
void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver, void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver,
uint32_t *max_size); uint32_t *max_size);

Loading…
Cancel
Save