anv: limit generated draws to pipelines without HS stage

This is done for gfx11 specific workaround.

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21308>
This commit is contained in:
Tapani Pälli
2023-02-09 17:26:40 +02:00
committed by Marge Bot
parent 2028f1caa3
commit f8a1100ca1
2 changed files with 25 additions and 11 deletions

View File

@@ -4208,13 +4208,6 @@ anv_device_init_generated_indirect_draws(struct anv_device *device);
void
anv_device_finish_generated_indirect_draws(struct anv_device *device);
static inline bool anv_use_generated_draws(const struct anv_device *device,
uint32_t count)
{
return device->physical->generated_indirect_draws &&
count >= device->physical->instance->generated_indirect_threshold;
}
struct anv_utrace_flush_copy {
/* Needs to be the first field */
struct intel_ds_flush_data ds;

View File

@@ -3538,6 +3538,27 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
#include "genX_cmd_draw_generated_indirect.h"
#endif
#if GFX_HAS_GENERATED_CMDS
ALWAYS_INLINE static bool
anv_use_generated_draws(const struct anv_cmd_buffer *cmd_buffer, uint32_t count)
{
const struct anv_device *device = cmd_buffer->device;
#if GFX_VER == 11
/* Limit generated draws to pipelines without HS stage. This makes things
* simpler for implementing Wa_1306463417.
*/
if (anv_pipeline_has_stage(cmd_buffer->state.gfx.pipeline,
MESA_SHADER_TESS_CTRL)) {
return false;
}
#endif
return device->physical->generated_indirect_draws &&
count >= device->physical->instance->generated_indirect_threshold;
}
#endif
VkResult
genX(BeginCommandBuffer)(
VkCommandBuffer commandBuffer,
@@ -4657,7 +4678,7 @@ void genX(CmdDrawIndirect)(
trace_intel_begin_draw_indirect(&cmd_buffer->trace);
#if GFX_HAS_GENERATED_CMDS
if (anv_use_generated_draws(cmd_buffer->device, drawCount)) {
if (anv_use_generated_draws(cmd_buffer, drawCount)) {
genX(cmd_buffer_emit_indirect_generated_draws)(
cmd_buffer,
anv_address_add(buffer->address, offset),
@@ -4698,7 +4719,7 @@ void genX(CmdDrawIndexedIndirect)(
trace_intel_begin_draw_indexed_indirect(&cmd_buffer->trace);
#if GFX_HAS_GENERATED_CMDS
if (anv_use_generated_draws(cmd_buffer->device, drawCount)) {
if (anv_use_generated_draws(cmd_buffer, drawCount)) {
genX(cmd_buffer_emit_indirect_generated_draws)(
cmd_buffer,
anv_address_add(buffer->address, offset),
@@ -4894,7 +4915,7 @@ void genX(CmdDrawIndirectCount)(
stride = MAX2(stride, sizeof(VkDrawIndirectCommand));
#if GFX_HAS_GENERATED_CMDS
if (anv_use_generated_draws(cmd_buffer->device, maxDrawCount)) {
if (anv_use_generated_draws(cmd_buffer, maxDrawCount)) {
genX(cmd_buffer_emit_indirect_generated_draws_count)(
cmd_buffer,
indirect_data_address,
@@ -4951,7 +4972,7 @@ void genX(CmdDrawIndexedIndirectCount)(
stride = MAX2(stride, sizeof(VkDrawIndexedIndirectCommand));
#if GFX_HAS_GENERATED_CMDS
if (anv_use_generated_draws(cmd_buffer->device, maxDrawCount)) {
if (anv_use_generated_draws(cmd_buffer, maxDrawCount)) {
genX(cmd_buffer_emit_indirect_generated_draws_count)(
cmd_buffer,
indirect_data_address,