mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 19:20:12 +01:00
turnip: fix tess param bo size calculation
ir3 already calculates the stride in the tess param bo, so use that instead of a incorrect calculation. The calculation of per_vertex_output_size / per_patch_output_size is wrong because it counts dwords instead of bytes, and what it counts for per_vertex_output_size is a per-patch size because the glsl type is already an array of # vertex/patch elements. Signed-off-by: Jonathan Marek <jonathan@marek.ca> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5743>
This commit is contained in:
parent
395511d169
commit
19f3c79c7e
3 changed files with 13 additions and 43 deletions
|
|
@ -2808,21 +2808,17 @@ get_tess_param_bo_size(const struct tu_pipeline *pipeline,
|
|||
{
|
||||
/* TODO: For indirect draws, we can't compute the BO size ahead of time.
|
||||
* Still not sure what to do here, so just allocate a reasonably large
|
||||
* BO and hope for the best for now.
|
||||
* (maxTessellationControlPerVertexOutputComponents * 2048 vertices +
|
||||
* maxTessellationControlPerPatchOutputComponents * 512 patches) */
|
||||
if (!draw_count) {
|
||||
return ((128 * 2048) + (128 * 512)) * 4;
|
||||
}
|
||||
* BO and hope for the best for now. */
|
||||
if (!draw_count)
|
||||
draw_count = 2048;
|
||||
|
||||
/* For each patch, adreno lays out the tess param BO in memory as:
|
||||
* (v_input[0][0])...(v_input[i][j])(p_input[0])...(p_input[k]).
|
||||
* where i = # vertices per patch, j = # per-vertex outputs, and
|
||||
* k = # per-patch outputs.*/
|
||||
/* the tess param BO is pipeline->tess.param_stride bytes per patch,
|
||||
* which includes both the per-vertex outputs and per-patch outputs
|
||||
* build_primitive_map in ir3 calculates this stride
|
||||
*/
|
||||
uint32_t verts_per_patch = pipeline->ia.primtype - DI_PT_PATCHES0;
|
||||
uint32_t num_patches = draw_count / verts_per_patch;
|
||||
return draw_count * pipeline->tess.per_vertex_output_size +
|
||||
pipeline->tess.per_patch_output_size * num_patches;
|
||||
return num_patches * pipeline->tess.param_stride;
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
|
|
@ -2831,11 +2827,9 @@ get_tess_factor_bo_size(const struct tu_pipeline *pipeline,
|
|||
{
|
||||
/* TODO: For indirect draws, we can't compute the BO size ahead of time.
|
||||
* Still not sure what to do here, so just allocate a reasonably large
|
||||
* BO and hope for the best for now.
|
||||
* (quad factor stride * 512 patches) */
|
||||
if (!draw_count) {
|
||||
return (28 * 512) * 4;
|
||||
}
|
||||
* BO and hope for the best for now. */
|
||||
if (!draw_count)
|
||||
draw_count = 2048;
|
||||
|
||||
/* Each distinct patch gets its own tess factor output. */
|
||||
uint32_t verts_per_patch = pipeline->ia.primtype - DI_PT_PATCHES0;
|
||||
|
|
|
|||
|
|
@ -2028,30 +2028,6 @@ tu_pipeline_builder_compile_shaders(struct tu_pipeline_builder *builder,
|
|||
|
||||
builder->binning_variant = variant;
|
||||
|
||||
if (builder->shaders[MESA_SHADER_TESS_CTRL]) {
|
||||
struct ir3_shader *hs =
|
||||
builder->shaders[MESA_SHADER_TESS_CTRL]->ir3_shader;
|
||||
assert(hs->type != MESA_SHADER_NONE);
|
||||
|
||||
/* Calculate and store the per-vertex and per-patch HS-output sizes. */
|
||||
uint32_t per_vertex_output_size = 0;
|
||||
uint32_t per_patch_output_size = 0;
|
||||
nir_foreach_variable (output, &hs->nir->outputs) {
|
||||
switch (output->data.location) {
|
||||
case VARYING_SLOT_TESS_LEVEL_OUTER:
|
||||
case VARYING_SLOT_TESS_LEVEL_INNER:
|
||||
continue;
|
||||
}
|
||||
uint32_t size = glsl_count_attribute_slots(output->type, false) * 4;
|
||||
if (output->data.patch)
|
||||
per_patch_output_size += size;
|
||||
else
|
||||
per_vertex_output_size += size;
|
||||
}
|
||||
pipeline->tess.per_vertex_output_size = per_vertex_output_size;
|
||||
pipeline->tess.per_patch_output_size = per_patch_output_size;
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -2200,6 +2176,7 @@ tu_pipeline_builder_parse_tessellation(struct tu_pipeline_builder *builder,
|
|||
domain_info->domainOrigin == VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT;
|
||||
const struct ir3_shader_variant *hs = builder->variants[MESA_SHADER_TESS_CTRL];
|
||||
const struct ir3_shader_variant *ds = builder->variants[MESA_SHADER_TESS_EVAL];
|
||||
pipeline->tess.param_stride = hs->output_size * 4;
|
||||
pipeline->tess.hs_bo_regid = hs->const_state->offsets.primitive_param + 1;
|
||||
pipeline->tess.ds_bo_regid = ds->const_state->offsets.primitive_param + 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1076,8 +1076,7 @@ struct tu_pipeline
|
|||
struct
|
||||
{
|
||||
uint32_t patch_type;
|
||||
uint32_t per_vertex_output_size;
|
||||
uint32_t per_patch_output_size;
|
||||
uint32_t param_stride;
|
||||
uint32_t hs_bo_regid;
|
||||
uint32_t ds_bo_regid;
|
||||
bool upper_left_domain_origin;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue