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 */