intel/compiler: Track patch count threshold

Return the number of patches to accumulate before an 8_PATCH mode thread
is launched.

v2: (Kenneth Graunke)
- Track patch count threshold instead of input control points.

Signed-off-by: Sagar Ghuge <sagar.ghuge@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3563>
This commit is contained in:
Sagar Ghuge
2020-01-23 22:24:37 -08:00
committed by Marge Bot
parent b3dd54fe13
commit 1a5ac646ce
2 changed files with 33 additions and 0 deletions

View File

@@ -1136,6 +1136,9 @@ struct brw_tcs_prog_data
/** Number vertices in output patch */
int instances;
/** Track patch count threshold */
int patch_count_threshold;
};

View File

@@ -323,6 +323,34 @@ vec4_tcs_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
}
}
/**
* Return the number of patches to accumulate before an 8_PATCH mode thread is
* launched. In cases with a large number of input control points and a large
* amount of VS outputs, the VS URB space needed to store an entire 8 patches
* worth of data can be prohibitive, so it can be beneficial to launch threads
* early.
*
* See the 3DSTATE_HS::Patch Count Threshold documentation for the recommended
* values. Note that 0 means to "disable" early dispatch, meaning to wait for
* a full 8 patches as normal.
*/
static int
get_patch_count_threshold(int input_control_points)
{
if (input_control_points <= 4)
return 0;
else if (input_control_points <= 6)
return 5;
else if (input_control_points <= 8)
return 4;
else if (input_control_points <= 10)
return 3;
else if (input_control_points <= 14)
return 2;
/* Return patch count 1 for PATCHLIST_15 - PATCHLIST_32 */
return 1;
}
extern "C" const unsigned *
brw_compile_tcs(const struct brw_compiler *compiler,
@@ -362,6 +390,8 @@ brw_compile_tcs(const struct brw_compiler *compiler,
bool has_primitive_id =
nir->info.system_values_read & (1 << SYSTEM_VALUE_PRIMITIVE_ID);
prog_data->patch_count_threshold = get_patch_count_threshold(key->input_vertices);
if (compiler->use_tcs_8_patch &&
nir->info.tess.tcs_vertices_out <= (devinfo->gen >= 12 ? 32 : 16) &&
2 + has_primitive_id + key->input_vertices <= 31) {