{
bool has_prefetch = cmd_buffer->device->physical_device->rad_info.chip_class >= GFX7;
bool pipeline_is_dirty = pipeline != cmd_buffer->state.emitted_compute_pipeline;
- struct radv_shader *compute_shader = pipeline->shaders[MESA_SHADER_COMPUTE];
- unsigned *cs_block_size = compute_shader->info.cs.block_size;
- bool cs_regalloc_hang = cmd_buffer->device->physical_device->rad_info.has_cs_regalloc_hang_bug &&
- cs_block_size[0] * cs_block_size[1] * cs_block_size[2] > 256;
- if (cs_regalloc_hang)
+ if (pipeline->compute.cs_regalloc_hang_bug)
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_PS_PARTIAL_FLUSH |
RADV_CMD_FLAG_CS_PARTIAL_FLUSH;
: VK_PIPELINE_BIND_POINT_COMPUTE);
}
- if (cs_regalloc_hang)
+ if (pipeline->compute.cs_regalloc_hang_bug)
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH;
radv_cmd_buffer_after_draw(cmd_buffer, RADV_CMD_FLAG_CS_PARTIAL_FLUSH);
pipeline->push_constant_size = pipeline_layout->push_constant_size;
pipeline->dynamic_offset_count = pipeline_layout->dynamic_offset_count;
+ if (device->physical_device->rad_info.has_cs_regalloc_hang_bug) {
+ struct radv_shader *compute_shader = pipeline->shaders[MESA_SHADER_COMPUTE];
+ unsigned *cs_block_size = compute_shader->info.cs.block_size;
+
+ pipeline->compute.cs_regalloc_hang_bug =
+ cs_block_size[0] * cs_block_size[1] * cs_block_size[2] > 256;
+ }
+
radv_compute_generate_pm4(pipeline);
*pPipeline = radv_pipeline_to_handle(pipeline);