asahi: Check box implement NV_conditional_render
Use the freedreno lowering. It'll be slow but I don't know of any apps that actually use this and it's required for GL 3.0. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20446>
This commit is contained in:
+1
-1
@@ -39,7 +39,7 @@ Feature Status
|
||||
GL 3.0, GLSL 1.30 --- all DONE: freedreno, i965, nv50, nvc0, r600, radeonsi, llvmpipe, softpipe, virgl, zink, d3d12, panfrost
|
||||
|
||||
glBindFragDataLocation, glGetFragDataLocation DONE
|
||||
GL_NV_conditional_render (Conditional rendering) DONE ()
|
||||
GL_NV_conditional_render (Conditional rendering) DONE (asahi)
|
||||
GL_ARB_map_buffer_range (Map buffer subranges) DONE (v3d, vc4, lima, asahi)
|
||||
GL_ARB_color_buffer_float (Clamping controls) DONE (v3d, vc4, lima, asahi)
|
||||
GL_ARB_texture_float (Float textures, renderbuffers) DONE (v3d, asahi)
|
||||
|
||||
@@ -68,12 +68,11 @@ agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter,
|
||||
void
|
||||
agx_blit(struct pipe_context *pipe, const struct pipe_blit_info *info)
|
||||
{
|
||||
// if (info->render_condition_enable &&
|
||||
// !agx_render_condition_check(pan_context(pipe)))
|
||||
// return;
|
||||
|
||||
struct agx_context *ctx = agx_context(pipe);
|
||||
|
||||
if (info->render_condition_enable && !agx_render_condition_check(ctx))
|
||||
return;
|
||||
|
||||
if (!util_blitter_is_blit_supported(ctx->blitter, info)) {
|
||||
fprintf(stderr, "\n");
|
||||
util_dump_blit_info(stderr, info);
|
||||
|
||||
@@ -870,6 +870,9 @@ agx_clear(struct pipe_context *pctx, unsigned buffers,
|
||||
struct agx_context *ctx = agx_context(pctx);
|
||||
struct agx_batch *batch = agx_get_batch(ctx);
|
||||
|
||||
if (unlikely(!agx_render_condition_check(ctx)))
|
||||
return;
|
||||
|
||||
unsigned fastclear = buffers & ~(batch->draw | batch->load);
|
||||
unsigned slowclear = buffers & ~fastclear;
|
||||
|
||||
@@ -1239,6 +1242,8 @@ agx_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
||||
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
|
||||
case PIPE_CAP_VS_INSTANCEID:
|
||||
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
|
||||
case PIPE_CAP_CONDITIONAL_RENDER:
|
||||
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
|
||||
return 1;
|
||||
|
||||
case PIPE_CAP_TEXTURE_MULTISAMPLE:
|
||||
|
||||
@@ -176,6 +176,36 @@ agx_finish_batch_occlusion_queries(struct agx_batch *batch)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
agx_render_condition(struct pipe_context *pipe, struct pipe_query *query,
|
||||
bool condition, enum pipe_render_cond_flag mode)
|
||||
{
|
||||
struct agx_context *ctx = agx_context(pipe);
|
||||
|
||||
ctx->cond_query = query;
|
||||
ctx->cond_cond = condition;
|
||||
ctx->cond_mode = mode;
|
||||
}
|
||||
|
||||
bool
|
||||
agx_render_condition_check_inner(struct agx_context *ctx)
|
||||
{
|
||||
assert(ctx->cond_query != NULL && "precondition");
|
||||
|
||||
perf_debug_ctx(ctx, "Implementing conditional rendering on the CPU");
|
||||
|
||||
union pipe_query_result res = {0};
|
||||
bool wait = ctx->cond_mode != PIPE_RENDER_COND_NO_WAIT &&
|
||||
ctx->cond_mode != PIPE_RENDER_COND_BY_REGION_NO_WAIT;
|
||||
|
||||
struct pipe_query *pq = (struct pipe_query *)ctx->cond_query;
|
||||
|
||||
if (agx_get_query_result(&ctx->base, pq, wait, &res))
|
||||
return res.u64 != ctx->cond_cond;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
agx_init_query_functions(struct pipe_context *pctx)
|
||||
{
|
||||
@@ -185,6 +215,7 @@ agx_init_query_functions(struct pipe_context *pctx)
|
||||
pctx->end_query = agx_end_query;
|
||||
pctx->get_query_result = agx_get_query_result;
|
||||
pctx->set_active_query_state = agx_set_active_query_state;
|
||||
pctx->render_condition = agx_render_condition;
|
||||
|
||||
/* By default queries are active */
|
||||
agx_context(pctx)->active_queries = true;
|
||||
|
||||
@@ -2157,12 +2157,16 @@ agx_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
|
||||
const struct pipe_draw_indirect_info *indirect,
|
||||
const struct pipe_draw_start_count_bias *draws, unsigned num_draws)
|
||||
{
|
||||
struct agx_context *ctx = agx_context(pctx);
|
||||
|
||||
if (unlikely(!agx_render_condition_check(ctx)))
|
||||
return;
|
||||
|
||||
if (num_draws > 1) {
|
||||
util_draw_multi(pctx, info, drawid_offset, indirect, draws, num_draws);
|
||||
return;
|
||||
}
|
||||
|
||||
struct agx_context *ctx = agx_context(pctx);
|
||||
struct agx_batch *batch = agx_get_batch(ctx);
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
@@ -505,4 +505,15 @@ uint16_t agx_get_oq_index(struct agx_batch *batch, struct agx_query *query);
|
||||
|
||||
void agx_finish_batch_occlusion_queries(struct agx_batch *batch);
|
||||
|
||||
bool agx_render_condition_check_inner(struct agx_context *ctx);
|
||||
|
||||
static inline bool
|
||||
agx_render_condition_check(struct agx_context *ctx)
|
||||
{
|
||||
if (likely(!ctx->cond_query))
|
||||
return true;
|
||||
else
|
||||
return agx_render_condition_check_inner(ctx);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user