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