Mesa (master): llvmpipe: handle vulkan conditional rendering
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jan 27 01:28:57 UTC 2021
Module: Mesa
Branch: master
Commit: 9cc332884221102c1f4a6f75e6c666d369236d53
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9cc332884221102c1f4a6f75e6c666d369236d53
Author: Dave Airlie <airlied at redhat.com>
Date: Fri Dec 4 17:03:11 2020 +1000
llvmpipe: handle vulkan conditional rendering
This implements the new hook to conditionialise rendering
on memory contents
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8182>
---
src/gallium/drivers/llvmpipe/lp_context.c | 14 ++++++++++++++
src/gallium/drivers/llvmpipe/lp_context.h | 4 ++++
src/gallium/drivers/llvmpipe/lp_query.c | 4 ++++
3 files changed, 22 insertions(+)
diff --git a/src/gallium/drivers/llvmpipe/lp_context.c b/src/gallium/drivers/llvmpipe/lp_context.c
index ff364d8fa07..aaf6a80e810 100644
--- a/src/gallium/drivers/llvmpipe/lp_context.c
+++ b/src/gallium/drivers/llvmpipe/lp_context.c
@@ -132,6 +132,19 @@ llvmpipe_render_condition(struct pipe_context *pipe,
llvmpipe->render_cond_cond = condition;
}
+static void
+llvmpipe_render_condition_mem(struct pipe_context *pipe,
+ struct pipe_resource *buffer,
+ unsigned offset,
+ bool condition)
+{
+ struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe );
+
+ llvmpipe->render_cond_buffer = llvmpipe_resource(buffer);
+ llvmpipe->render_cond_offset = offset;
+ llvmpipe->render_cond_cond = condition;
+}
+
static void
llvmpipe_texture_barrier(struct pipe_context *pipe, unsigned flags)
{
@@ -191,6 +204,7 @@ llvmpipe_create_context(struct pipe_screen *screen, void *priv,
llvmpipe->pipe.texture_barrier = llvmpipe_texture_barrier;
llvmpipe->pipe.render_condition = llvmpipe_render_condition;
+ llvmpipe->pipe.render_condition_mem = llvmpipe_render_condition_mem;
llvmpipe->pipe.get_device_reset_status = llvmpipe_get_device_reset_status;
llvmpipe_init_blend_funcs(llvmpipe);
diff --git a/src/gallium/drivers/llvmpipe/lp_context.h b/src/gallium/drivers/llvmpipe/lp_context.h
index 6c5392141ba..b1adba61db7 100644
--- a/src/gallium/drivers/llvmpipe/lp_context.h
+++ b/src/gallium/drivers/llvmpipe/lp_context.h
@@ -170,6 +170,10 @@ struct llvmpipe_context {
enum pipe_render_cond_flag render_cond_mode;
boolean render_cond_cond;
+ /** VK render cond */
+ struct llvmpipe_resource *render_cond_buffer;
+ unsigned render_cond_offset;
+
/** The LLVMContext to use for LLVM related work */
LLVMContextRef context;
diff --git a/src/gallium/drivers/llvmpipe/lp_query.c b/src/gallium/drivers/llvmpipe/lp_query.c
index 0a5d63a0bbe..703512d011d 100644
--- a/src/gallium/drivers/llvmpipe/lp_query.c
+++ b/src/gallium/drivers/llvmpipe/lp_query.c
@@ -509,6 +509,10 @@ llvmpipe_check_render_cond(struct llvmpipe_context *lp)
boolean b, wait;
uint64_t result;
+ if (lp->render_cond_buffer) {
+ uint32_t data = *(uint32_t *)((char *)lp->render_cond_buffer->data + lp->render_cond_offset);
+ return (!data) == lp->render_cond_cond;
+ }
if (!lp->render_cond_query)
return TRUE; /* no query predicate, draw normally */
More information about the mesa-commit
mailing list