summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/virgl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/virgl')
-rw-r--r--src/gallium/drivers/virgl/virgl_context.c13
-rw-r--r--src/gallium/drivers/virgl/virgl_encode.c8
-rw-r--r--src/gallium/drivers/virgl/virgl_encode.h2
-rw-r--r--src/gallium/drivers/virgl/virgl_hw.h1
-rw-r--r--src/gallium/drivers/virgl/virgl_protocol.h5
5 files changed, 29 insertions, 0 deletions
diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c
index 41ba853805b..d224b68cfcd 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 68ec5a1dc9d..1d193ae6c7f 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 a45c0ac4c6b..e353c3d04d5 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 01baf05e6d4..6bb11f6598a 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 cdd534ff243..0c38b1fc2ed 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