mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 02:58:05 +02:00
llvmpipe: handle vulkan conditional rendering
This implements the new hook to conditionialise rendering on memory contents Reviewed-by: Roland Scheidegger <sroland@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8182>
This commit is contained in:
parent
86328fc7b7
commit
9cc3328842
3 changed files with 22 additions and 0 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue