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. 35
      src/vrend_renderer.c
  4. 1
      src/vrend_renderer.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;

@ -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

@ -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)

@ -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);

Loading…
Cancel
Save