[virglrenderer-devel] [PATCH] implement VIRGL_CCMD_SET_MIN_SAMPLES

Erik Faye-Lund erik.faye-lund at collabora.com
Tue Jul 10 08:43:38 UTC 2018


This is required to implement glMinSampleShading().

Sadly, we've been setting has_sample_shading for a while, even
though this is needed. So we need to set a capability so mesa will
know that it's safe to emit this command.

Signed-off-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Reviewed-by: Dave Airlie <airlied at redhat.com>
---

Jakob: Dave asked me to back-port this from the gl-4.3 branch,
and have you push it, as he'll be away most of the week.

This backport is needed, because sample-shading is already
a shipping feature.

 src/virgl_hw.h       |  1 +
 src/virgl_protocol.h |  5 +++++
 src/vrend_decode.c   | 14 ++++++++++++++
 src/vrend_renderer.c | 14 +++++++++++++-
 src/vrend_renderer.h |  1 +
 5 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/src/virgl_hw.h b/src/virgl_hw.h
index 44c7108..5260f62 100644
--- a/src/virgl_hw.h
+++ b/src/virgl_hw.h
@@ -215,6 +215,7 @@ enum virgl_formats {
 #define VIRGL_CAP_NONE 0
 #define VIRGL_CAP_TGSI_INVARIANT       (1 << 0)
 #define VIRGL_CAP_TEXTURE_VIEW         (1 << 1)
+#define VIRGL_CAP_SET_MIN_SAMPLES      (1 << 2)
 
 struct virgl_caps_bool_set1 {
         unsigned indep_blend_enable:1;
diff --git a/src/virgl_protocol.h b/src/virgl_protocol.h
index d0e6c49..a0b6984 100644
--- a/src/virgl_protocol.h
+++ b/src/virgl_protocol.h
@@ -84,6 +84,7 @@ enum virgl_context_cmd {
    VIRGL_CCMD_DESTROY_SUB_CTX,
    VIRGL_CCMD_BIND_SHADER,
    VIRGL_CCMD_SET_TESS_STATE,
+   VIRGL_CCMD_SET_MIN_SAMPLES,
 };
 
 /*
@@ -485,4 +486,8 @@ enum virgl_context_cmd {
 /* tess state */
 #define VIRGL_TESS_STATE_SIZE 6
 
+/* set min samples */
+#define VIRGL_SET_MIN_SAMPLES_SIZE 1
+#define VIRGL_SET_MIN_SAMPLES_MASK 1
+
 #endif
diff --git a/src/vrend_decode.c b/src/vrend_decode.c
index d50f385..111fc90 100644
--- a/src/vrend_decode.c
+++ b/src/vrend_decode.c
@@ -865,6 +865,17 @@ static int vrend_decode_set_sample_mask(struct vrend_decode_ctx *ctx, int length
    return 0;
 }
 
+static int vrend_decode_set_min_samples(struct vrend_decode_ctx *ctx, int length)
+{
+   unsigned min_samples;
+
+   if (length != VIRGL_SET_MIN_SAMPLES_SIZE)
+      return EINVAL;
+   min_samples = get_buf_entry(ctx, VIRGL_SET_MIN_SAMPLES_MASK);
+   vrend_set_min_samples(ctx->grctx, min_samples);
+   return 0;
+}
+
 static int vrend_decode_resource_copy_region(struct vrend_decode_ctx *ctx, int length)
 {
    struct pipe_box box;
@@ -1267,6 +1278,9 @@ int vrend_decode_block(uint32_t ctx_id, uint32_t *block, int ndw)
       case VIRGL_CCMD_SET_SAMPLE_MASK:
          ret = vrend_decode_set_sample_mask(gdctx, len);
          break;
+      case VIRGL_CCMD_SET_MIN_SAMPLES:
+         ret = vrend_decode_set_min_samples(gdctx, len);
+         break;
       case VIRGL_CCMD_SET_STREAMOUT_TARGETS:
          ret = vrend_decode_set_streamout_targets(gdctx, len);
          break;
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index cc99087..30f0bab 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -6086,6 +6086,18 @@ void vrend_set_sample_mask(UNUSED struct vrend_context *ctx, unsigned sample_mas
    glSampleMaski(0, sample_mask);
 }
 
+void vrend_set_min_samples(struct vrend_context *ctx, unsigned min_samples)
+{
+   float min_sample_shading = (float)min_samples;
+   if (ctx->sub->nr_cbufs > 0 && ctx->sub->surf[0]) {
+      assert(ctx->sub->surf[0]->texture);
+      min_sample_shading /= MAX2(1, ctx->sub->surf[0]->texture->base.nr_samples);
+   }
+
+   if (vrend_state.have_sample_shading)
+      glMinSampleShading(min_sample_shading);
+}
+
 void vrend_set_tess_state(UNUSED struct vrend_context *ctx, const float tess_factors[6])
 {
    if (vrend_state.have_tessellation) {
@@ -7550,7 +7562,7 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
 
    caps->v1.max_samples = vrend_renderer_query_multisample_caps(max, &caps->v2);
 
-   caps->v2.capability_bits |= VIRGL_CAP_TGSI_INVARIANT;
+   caps->v2.capability_bits |= VIRGL_CAP_TGSI_INVARIANT | VIRGL_CAP_SET_MIN_SAMPLES;
 
    if (gl_ver >= 43 || epoxy_has_gl_extension("GL_ARB_texture_view"))
       caps->v2.capability_bits |= VIRGL_CAP_TEXTURE_VIEW;
diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h
index f59d45f..eda09e4 100644
--- a/src/vrend_renderer.h
+++ b/src/vrend_renderer.h
@@ -272,6 +272,7 @@ void vrend_set_polygon_stipple(struct vrend_context *ctx, struct pipe_poly_stipp
 
 void vrend_set_clip_state(struct vrend_context *ctx, struct pipe_clip_state *ucp);
 void vrend_set_sample_mask(struct vrend_context *ctx, unsigned sample_mask);
+void vrend_set_min_samples(struct vrend_context *ctx, unsigned min_samples);
 
 void vrend_set_constants(struct vrend_context *ctx,
                          uint32_t shader,
-- 
2.18.0.rc2



More information about the virglrenderer-devel mailing list