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:
@@ -4208,13 +4208,6 @@ anv_device_init_generated_indirect_draws(struct anv_device *device);
|
|||||||
void
|
void
|
||||||
anv_device_finish_generated_indirect_draws(struct anv_device *device);
|
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 {
|
struct anv_utrace_flush_copy {
|
||||||
/* Needs to be the first field */
|
/* Needs to be the first field */
|
||||||
struct intel_ds_flush_data ds;
|
struct intel_ds_flush_data ds;
|
||||||
|
@@ -3538,6 +3538,27 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
#include "genX_cmd_draw_generated_indirect.h"
|
#include "genX_cmd_draw_generated_indirect.h"
|
||||||
#endif
|
#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
|
VkResult
|
||||||
genX(BeginCommandBuffer)(
|
genX(BeginCommandBuffer)(
|
||||||
VkCommandBuffer commandBuffer,
|
VkCommandBuffer commandBuffer,
|
||||||
@@ -4657,7 +4678,7 @@ void genX(CmdDrawIndirect)(
|
|||||||
trace_intel_begin_draw_indirect(&cmd_buffer->trace);
|
trace_intel_begin_draw_indirect(&cmd_buffer->trace);
|
||||||
|
|
||||||
#if GFX_HAS_GENERATED_CMDS
|
#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)(
|
genX(cmd_buffer_emit_indirect_generated_draws)(
|
||||||
cmd_buffer,
|
cmd_buffer,
|
||||||
anv_address_add(buffer->address, offset),
|
anv_address_add(buffer->address, offset),
|
||||||
@@ -4698,7 +4719,7 @@ void genX(CmdDrawIndexedIndirect)(
|
|||||||
trace_intel_begin_draw_indexed_indirect(&cmd_buffer->trace);
|
trace_intel_begin_draw_indexed_indirect(&cmd_buffer->trace);
|
||||||
|
|
||||||
#if GFX_HAS_GENERATED_CMDS
|
#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)(
|
genX(cmd_buffer_emit_indirect_generated_draws)(
|
||||||
cmd_buffer,
|
cmd_buffer,
|
||||||
anv_address_add(buffer->address, offset),
|
anv_address_add(buffer->address, offset),
|
||||||
@@ -4894,7 +4915,7 @@ void genX(CmdDrawIndirectCount)(
|
|||||||
stride = MAX2(stride, sizeof(VkDrawIndirectCommand));
|
stride = MAX2(stride, sizeof(VkDrawIndirectCommand));
|
||||||
|
|
||||||
#if GFX_HAS_GENERATED_CMDS
|
#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)(
|
genX(cmd_buffer_emit_indirect_generated_draws_count)(
|
||||||
cmd_buffer,
|
cmd_buffer,
|
||||||
indirect_data_address,
|
indirect_data_address,
|
||||||
@@ -4951,7 +4972,7 @@ void genX(CmdDrawIndexedIndirectCount)(
|
|||||||
stride = MAX2(stride, sizeof(VkDrawIndexedIndirectCommand));
|
stride = MAX2(stride, sizeof(VkDrawIndexedIndirectCommand));
|
||||||
|
|
||||||
#if GFX_HAS_GENERATED_CMDS
|
#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)(
|
genX(cmd_buffer_emit_indirect_generated_draws_count)(
|
||||||
cmd_buffer,
|
cmd_buffer,
|
||||||
indirect_data_address,
|
indirect_data_address,
|
||||||
|
Reference in New Issue
Block a user