mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 02:48:06 +02:00
softpipe: fix render condition checking
always casting this to a u64 is invalid if the value is just a bool, and it even generates ASAN/valgrind errors about uninitialized reads Fixes:41450b03a8("softpipe: implement conditional rendering") Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10398> (cherry picked from commit8dbb022b8a)
This commit is contained in:
parent
a24924bb60
commit
4d28c2b086
2 changed files with 28 additions and 4 deletions
|
|
@ -454,7 +454,7 @@
|
|||
"description": "softpipe: fix render condition checking",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": "41450b03a8e8e0f94f8eefc6880d32e9b0ef6f6d"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -268,6 +268,29 @@ softpipe_get_query_result(struct pipe_context *pipe,
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_result_nonzero(struct pipe_query *q,
|
||||
union pipe_query_result *vresult)
|
||||
{
|
||||
struct softpipe_query *sq = softpipe_query(q);
|
||||
|
||||
switch (sq->type) {
|
||||
case PIPE_QUERY_TIMESTAMP_DISJOINT:
|
||||
case PIPE_QUERY_SO_STATISTICS:
|
||||
case PIPE_QUERY_PIPELINE_STATISTICS:
|
||||
unreachable("unpossible");
|
||||
break;
|
||||
case PIPE_QUERY_GPU_FINISHED:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
|
||||
case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
|
||||
case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
|
||||
return vresult->b;
|
||||
default:
|
||||
return !!vresult->u64;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by rendering function to check rendering is conditional.
|
||||
|
|
@ -278,7 +301,8 @@ softpipe_check_render_cond(struct softpipe_context *sp)
|
|||
{
|
||||
struct pipe_context *pipe = &sp->pipe;
|
||||
boolean b, wait;
|
||||
uint64_t result;
|
||||
union pipe_query_result result;
|
||||
memset(&result, 0, sizeof(union pipe_query_result));
|
||||
|
||||
if (!sp->render_cond_query) {
|
||||
return TRUE; /* no query predicate, draw normally */
|
||||
|
|
@ -288,9 +312,9 @@ softpipe_check_render_cond(struct softpipe_context *sp)
|
|||
sp->render_cond_mode == PIPE_RENDER_COND_BY_REGION_WAIT);
|
||||
|
||||
b = pipe->get_query_result(pipe, sp->render_cond_query, wait,
|
||||
(void*)&result);
|
||||
&result);
|
||||
if (b)
|
||||
return (!result) == sp->render_cond_cond;
|
||||
return !is_result_nonzero(sp->render_cond_query, &result) == sp->render_cond_cond;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue