struct list_head suspended_queries;
struct list_head primitives_generated_queries;
struct zink_query *vertices_query;
+ bool primitives_generated_active;
bool queries_disabled, render_condition_active;
struct {
struct zink_query *query;
ctx->base.bind_compute_state = zink_bind_cs_state;
ctx->base.delete_compute_state = zink_delete_shader_state;
}
+
+void
+zink_set_rasterizer_discard(struct zink_context *ctx, bool disable)
+{
+ bool value = disable ? false : (ctx->rast_state ? ctx->rast_state->base.rasterizer_discard : false);
+ bool changed = ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard != value;
+ ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard = value;
+ if (!changed)
+ return;
+ if (!zink_screen(ctx->base.screen)->info.have_EXT_extended_dynamic_state2)
+ ctx->gfx_pipeline_state.dirty |= true;
+ ctx->rasterizer_discard_changed = true;
+}
}
}
+void
+zink_set_rasterizer_discard(struct zink_context *ctx, bool disable);
+
#ifdef __cplusplus
}
#endif
#include "zink_context.h"
#include "zink_fence.h"
+#include "zink_program.h"
#include "zink_resource.h"
#include "zink_screen.h"
list_addtail(&q->stats_list, &ctx->primitives_generated_queries);
zink_batch_usage_set(&q->batch_id, batch->state);
_mesa_set_add(batch->state->active_queries, q);
+ if (q->type == PIPE_QUERY_PRIMITIVES_GENERATED) {
+ ctx->primitives_generated_active = true;
+ zink_set_rasterizer_discard(ctx, true);
+ }
}
static bool
list_delinit(&q->stats_list);
update_query_id(ctx, q);
+ if (q->type == PIPE_QUERY_PRIMITIVES_GENERATED) {
+ ctx->primitives_generated_active = false;
+ zink_set_rasterizer_discard(ctx, false);
+ }
}
static bool
ctx->gfx_pipeline_state.dyn_state1.front_face = ctx->rast_state->front_face;
ctx->gfx_pipeline_state.dirty |= !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state;
}
- if (ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard != ctx->rast_state->base.rasterizer_discard) {
- ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard = ctx->rast_state->base.rasterizer_discard;
- ctx->gfx_pipeline_state.dirty |= !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state2;
- if (zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state2)
- ctx->rasterizer_discard_changed = true;
- }
+ if (!ctx->primitives_generated_active)
+ zink_set_rasterizer_discard(ctx, false);
+
if (ctx->rast_state->base.point_quad_rasterization != point_quad_rasterization)
zink_set_fs_point_coord_key(ctx);
if (ctx->rast_state->base.scissor != scissor)