virgl: Add a caps feature check version
authorGert Wollny <gert.wollny@collabora.com>
Wed, 27 Mar 2019 08:07:36 +0000 (09:07 +0100)
committerGert Wollny <gw.fossdev@gmail.com>
Fri, 29 Mar 2019 07:55:31 +0000 (07:55 +0000)
When we add new feature checks on the host side that is used to
enable a cap conditionally that was enabled unconditionally before
we might end up with a feature regression when a new mesa version
is used with an old virglrenderer version that doesn't check for
that cap.

To work around this problem add a version id to the caps that corresponds
to the features that are actually checked on the host and check that
version too when enabling the cap.

Fixes: 2ee197d6e84aa37638d423363aca183952816067
    virgl: Enable mixed color FBO attachemnets only when the host supports it

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Pohsien Wang <pwang@chromium.org>
src/gallium/drivers/virgl/virgl_hw.h
src/gallium/drivers/virgl/virgl_screen.c
src/gallium/drivers/virgl/virgl_winsys.h

index 1a4f193d8b1d0b2c6e27e39ba68d8eead3bdbd51..ed88b6cf8d3928e51d2771f4967b6e8af96040fb 100644 (file)
@@ -363,6 +363,7 @@ struct virgl_caps_v2 {
         uint32_t max_atomic_counter_buffers[6];
         uint32_t max_combined_atomic_counters;
         uint32_t max_combined_atomic_counter_buffers;
+        uint32_t host_feature_check_version;
 };
 
 union virgl_caps {
index 1ad8863bfca6c4a1e07fca9094810b33923d2b4f..33ebd9324f5f2175b64bb6e894b8b9a84e98119e 100644 (file)
@@ -144,7 +144,8 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_VERTEX_COLOR_CLAMPED:
       return vscreen->caps.caps.v1.bset.color_clamping;
    case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
-      return vscreen->caps.caps.v2.capability_bits & VIRGL_CAP_FBO_MIXED_COLOR_FORMATS;
+      return (vscreen->caps.caps.v2.capability_bits & VIRGL_CAP_FBO_MIXED_COLOR_FORMATS) ||
+            (vscreen->caps.caps.v2.host_feature_check_version < 1);
    case PIPE_CAP_GLSL_FEATURE_LEVEL:
       return vscreen->caps.caps.v1.glsl_level;
    case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
index face3f0243ff6c271a9c76a7ee29c430a5484e90..e7f15327db0304324c7763cd01acae1eada03352 100644 (file)
@@ -152,5 +152,6 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps)
    caps->caps.v2.max_image_samples = 0;
    caps->caps.v2.max_compute_work_group_invocations = 0;
    caps->caps.v2.max_compute_shared_memory_size = 0;
+   caps->caps.v2.host_feature_check_version = 0;
 }
 #endif