From a090df0d5dc804c1b6e16442a49b2ecb612a990d Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 18 Jul 2018 13:37:49 +1000 Subject: [PATCH] virgl: add memory barrier support Reviwed-by: Gert Wollny --- src/gallium/drivers/virgl/virgl_context.c | 13 +++++++++++++ src/gallium/drivers/virgl/virgl_encode.c | 8 ++++++++ src/gallium/drivers/virgl/virgl_encode.h | 2 ++ src/gallium/drivers/virgl/virgl_hw.h | 1 + src/gallium/drivers/virgl/virgl_protocol.h | 5 +++++ 5 files changed, 29 insertions(+) diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c index 41ba853..d224b68 100644 --- a/src/gallium/drivers/virgl/virgl_context.c +++ b/src/gallium/drivers/virgl/virgl_context.c @@ -997,6 +997,17 @@ static void virgl_set_shader_images(struct pipe_context *ctx, virgl_encode_set_shader_images(vctx, shader, start_slot, count, images); } +static void virgl_memory_barrier(struct pipe_context *ctx, + unsigned flags) +{ + struct virgl_context *vctx = virgl_context(ctx); + struct virgl_screen *rs = virgl_screen(ctx->screen); + + if (!(rs->caps.caps.v2.capability_bits & VIRGL_CAP_MEMORY_BARRIER)) + return; + virgl_encode_memory_barrier(vctx, flags); +} + static void virgl_context_destroy( struct pipe_context *ctx ) { @@ -1136,6 +1147,8 @@ struct pipe_context *virgl_context_create(struct pipe_screen *pscreen, vctx->base.set_shader_buffers = virgl_set_shader_buffers; vctx->base.set_shader_images = virgl_set_shader_images; + vctx->base.memory_barrier = virgl_memory_barrier; + virgl_init_context_resource_functions(&vctx->base); virgl_init_query_functions(vctx); virgl_init_so_functions(vctx); diff --git a/src/gallium/drivers/virgl/virgl_encode.c b/src/gallium/drivers/virgl/virgl_encode.c index 68ec5a1..1d193ae 100644 --- a/src/gallium/drivers/virgl/virgl_encode.c +++ b/src/gallium/drivers/virgl/virgl_encode.c @@ -972,3 +972,11 @@ int virgl_encode_set_shader_images(struct virgl_context *ctx, } return 0; } + +int virgl_encode_memory_barrier(struct virgl_context *ctx, + unsigned flags) +{ + virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_MEMORY_BARRIER, 0, 1)); + virgl_encoder_write_dword(ctx->cbuf, flags); + return 0; +} diff --git a/src/gallium/drivers/virgl/virgl_encode.h b/src/gallium/drivers/virgl/virgl_encode.h index a45c0ac..e353c3d 100644 --- a/src/gallium/drivers/virgl/virgl_encode.h +++ b/src/gallium/drivers/virgl/virgl_encode.h @@ -267,4 +267,6 @@ int virgl_encode_set_shader_images(struct virgl_context *ctx, enum pipe_shader_type shader, unsigned start_slot, unsigned count, const struct pipe_image_view *images); +int virgl_encode_memory_barrier(struct virgl_context *ctx, + unsigned flags); #endif diff --git a/src/gallium/drivers/virgl/virgl_hw.h b/src/gallium/drivers/virgl/virgl_hw.h index 01baf05..6bb11f6 100644 --- a/src/gallium/drivers/virgl/virgl_hw.h +++ b/src/gallium/drivers/virgl/virgl_hw.h @@ -205,6 +205,7 @@ enum virgl_formats { #define VIRGL_CAP_COPY_IMAGE (1 << 3) #define VIRGL_CAP_TGSI_PRECISE (1 << 4) #define VIRGL_CAP_TXQS (1 << 5) +#define VIRGL_CAP_MEMORY_BARRIER (1 << 6) #define VIRGL_BIND_DEPTH_STENCIL (1 << 0) #define VIRGL_BIND_RENDER_TARGET (1 << 1) diff --git a/src/gallium/drivers/virgl/virgl_protocol.h b/src/gallium/drivers/virgl/virgl_protocol.h index cdd534f..0c38b1f 100644 --- a/src/gallium/drivers/virgl/virgl_protocol.h +++ b/src/gallium/drivers/virgl/virgl_protocol.h @@ -88,6 +88,7 @@ enum virgl_context_cmd { VIRGL_CCMD_SET_MIN_SAMPLES, VIRGL_CCMD_SET_SHADER_BUFFERS, VIRGL_CCMD_SET_SHADER_IMAGES, + VIRGL_CCMD_MEMORY_BARRIER, }; /* @@ -513,4 +514,8 @@ enum virgl_context_cmd { #define VIRGL_SET_SHADER_IMAGE_LEVEL_SIZE(x) ((x) * VIRGL_SET_SHADER_IMAGE_ELEMENT_SIZE + 6) #define VIRGL_SET_SHADER_IMAGE_RES_HANDLE(x) ((x) * VIRGL_SET_SHADER_IMAGE_ELEMENT_SIZE + 7) +/* memory barrier */ +#define VIRGL_MEMORY_BARRIER_SIZE 1 +#define VIRGL_MEMORY_BARRIER_FLAGS 1 + #endif -- 2.7.4