virgl: Add command and flags to initiate debugging on the host (v2)
authorGert Wollny <gert.wollny@collabora.com>
Wed, 12 Sep 2018 09:59:35 +0000 (11:59 +0200)
committerGert Wollny <gw.fossdev@gmail.com>
Tue, 13 Nov 2018 13:42:22 +0000 (14:42 +0100)
On the host VREND_DEBUG=guestallow must be set to let the guest override
the debug flags.

v2: Send flag string instead of flags, this avoids the need to keep
    the flags in sync.
v3: Only request host logging if the host actually understands the command

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
src/gallium/drivers/virgl/virgl_context.c
src/gallium/drivers/virgl/virgl_encode.c
src/gallium/drivers/virgl/virgl_encode.h
src/gallium/drivers/virgl/virgl_hw.h
src/gallium/drivers/virgl/virgl_protocol.h

index 4511bf3b2fbeff560bbc55929c1acaf9a9be7e67..96932c473d8ffc613f666a15f094d5c0745a3e92 100644 (file)
@@ -1164,6 +1164,7 @@ struct pipe_context *virgl_context_create(struct pipe_screen *pscreen,
    struct virgl_context *vctx;
    struct virgl_screen *rs = virgl_screen(pscreen);
    vctx = CALLOC_STRUCT(virgl_context);
+   const char *host_debug_flagstring;
 
    vctx->cbuf = rs->vws->cmd_buf_create(rs->vws);
    if (!vctx->cbuf) {
@@ -1268,6 +1269,13 @@ struct pipe_context *virgl_context_create(struct pipe_screen *pscreen,
    virgl_encoder_create_sub_ctx(vctx, vctx->hw_sub_ctx_id);
 
    virgl_encoder_set_sub_ctx(vctx, vctx->hw_sub_ctx_id);
+
+   if (rs->caps.caps.v2.capability_bits & VIRGL_CAP_GUEST_MAY_INIT_LOG) {
+      host_debug_flagstring = getenv("VIRGL_HOST_DEBUG");
+      if (host_debug_flagstring)
+         virgl_encode_host_debug_flagstring(vctx, host_debug_flagstring);
+   }
+
    return &vctx->base;
 fail:
    return NULL;
index e86d0711a57df50f91a4fafea8e1ffb21eec40ca..400ba684742e9cd54cdcd55a9820986b44fb46cf 100644 (file)
@@ -1044,3 +1044,27 @@ int virgl_encode_texture_barrier(struct virgl_context *ctx,
    virgl_encoder_write_dword(ctx->cbuf, flags);
    return 0;
 }
+
+int virgl_encode_host_debug_flagstring(struct virgl_context *ctx,
+                                       char *flagstring)
+{
+   unsigned long slen = strlen(flagstring) + 1;
+   uint32_t sslen;
+   uint32_t string_length;
+
+   if (!slen)
+      return 0;
+
+   if (slen > 4 * 0xffff) {
+      debug_printf("VIRGL: host debug flag string too long, will be truncated\n");
+      slen = 4 * 0xffff;
+   }
+
+   sslen = (uint32_t )(slen + 3) / 4;
+   string_length = (uint32_t)MIN2(sslen * 4, slen);
+
+   virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_SET_DEBUG_FLAGS, 0, sslen));
+   virgl_encoder_write_block(ctx->cbuf, (uint8_t *)flagstring, string_length);
+
+   return 0;
+}
index 40e62d453b6014dfbf66176ad285d026f6bb81dc..80b943a6b34f851efd6d12cd6261301843a73319 100644 (file)
@@ -276,4 +276,7 @@ int virgl_encode_launch_grid(struct virgl_context *ctx,
                              const struct pipe_grid_info *grid_info);
 int virgl_encode_texture_barrier(struct virgl_context *ctx,
                                  unsigned flags);
+
+int virgl_encode_host_debug_flagstring(struct virgl_context *ctx,
+                                  char *envname);
 #endif
index 7736ceb935cf5cba693953ae7c28c52cc0f4bb3e..e682c750e75cb30a7138696ca628e498c1362f9d 100644 (file)
@@ -231,6 +231,7 @@ enum virgl_formats {
 #define VIRGL_CAP_SHADER_CLOCK         (1 << 11)
 #define VIRGL_CAP_TEXTURE_BARRIER      (1 << 12)
 #define VIRGL_CAP_TGSI_COMPONENTS      (1 << 13)
+#define VIRGL_CAP_GUEST_MAY_INIT_LOG   (1 << 14)
 
 /* virgl bind flags - these are compatible with mesa 10.5 gallium.
  * but are fixed, no other should be passed to virgl either.
index 8d99c5ed4701c7c1591e189d5cd971675d33fed3..3373121bf7494e173237418ca0e44f6b1ee12450 100644 (file)
@@ -92,6 +92,7 @@ enum virgl_context_cmd {
    VIRGL_CCMD_SET_FRAMEBUFFER_STATE_NO_ATTACH,
    VIRGL_CCMD_TEXTURE_BARRIER,
    VIRGL_CCMD_SET_ATOMIC_BUFFERS,
+   VIRGL_CCMD_SET_DEBUG_FLAGS,
 };
 
 /*