return true;
}
+ /* VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT emulates GL_PRIMITIVES_GENERATED,
+ * which wasn't designed to care about tilers and expects the result not to
+ * be multiplied by tile count.
+ * See https://gitlab.khronos.org/vulkan/vulkan/-/issues/3131
+ */
+ if (cmd->state.has_prim_generated_query_in_rp ||
+ cmd->state.prim_generated_query_running_before_rp) {
+ assert(fb->binning_possible);
+ return true;
+ }
+
return fb->binning;
}
if (cmd->state.xfb_used && !cmd->state.framebuffer->binning_possible)
return true;
+ /* QUERY_TYPE_PRIMITIVES_GENERATED is incompatible with non-hw binning
+ * GMEM rendering, see use_hw_binning.
+ */
+ if ((cmd->state.has_prim_generated_query_in_rp ||
+ cmd->state.prim_generated_query_running_before_rp) &&
+ !cmd->state.framebuffer->binning_possible)
+ return true;
+
if (unlikely(cmd->device->physical_device->instance->debug_flags & TU_DEBUG_GMEM))
return false;
cmd_buffer->state.disable_gmem = false;
cmd_buffer->state.drawcall_count = 0;
cmd_buffer->state.drawcall_bandwidth_per_sample_sum = 0;
+ cmd_buffer->state.has_prim_generated_query_in_rp = false;
/* LRZ is not valid next time we use it */
cmd_buffer->state.lrz.valid = false;
*/
uint32_t drawcall_bandwidth_per_sample_sum;
+ bool prim_generated_query_running_before_rp;
+ bool has_prim_generated_query_in_rp;
+
struct tu_lrz_state lrz;
struct tu_draw_state lrz_and_depth_plane_state;
struct tu_cs *cs = cmdbuf->state.pass ? &cmdbuf->draw_cs : &cmdbuf->cs;
uint64_t begin_iova = primitives_generated_query_iova(pool, query, begin);
+ if (cmdbuf->state.pass) {
+ cmdbuf->state.has_prim_generated_query_in_rp = true;
+ } else {
+ cmdbuf->state.prim_generated_query_running_before_rp = true;
+ }
+
tu6_emit_event_write(cmdbuf, cs, START_PRIMITIVE_CTRS);
tu6_emit_event_write(cmdbuf, cs, RST_PIX_CNT);
tu6_emit_event_write(cmdbuf, cs, TILE_FLUSH);
{
struct tu_cs *cs = cmdbuf->state.pass ? &cmdbuf->draw_cs : &cmdbuf->cs;
+ if (!cmdbuf->state.pass) {
+ cmdbuf->state.prim_generated_query_running_before_rp = false;
+ }
+
uint64_t begin_iova = primitives_generated_query_iova(pool, query, begin);
uint64_t end_iova = primitives_generated_query_iova(pool, query, end);
uint64_t result_iova = primitives_generated_query_iova(pool, query, result);