turnip: fix tess param bo size calculation
authorJonathan Marek <jonathan@marek.ca>
Thu, 2 Jul 2020 15:53:33 +0000 (11:53 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sat, 4 Jul 2020 03:33:43 +0000 (03:33 +0000)
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>

src/freedreno/vulkan/tu_cmd_buffer.c
src/freedreno/vulkan/tu_pipeline.c
src/freedreno/vulkan/tu_private.h

index 4effbba572aa8899e356e3833ebc5640b7a67b00..62751ba4ccb695916336c78d3ec0fce7d8aa5aa5 100644 (file)
@@ -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;
index e43fc34f32bc52caf9fff2c680a43b6c14dd56bc..965aa34209f03b6b3e1d5d6f295a41e15dde8f7b 100644 (file)
@@ -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;
 }
index 3287edf8a22b689d32fc405269724be93ce20f6a..c91c86c3949bcbc59c9b8ad1b63e89b2394394ca 100644 (file)
@@ -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;