virgl: Add command and flags to initiate debugging on the host (v2)
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>
This commit is contained in:
parent
caa964b422
commit
8d4bb6e5cd
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue