{
    /* 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
 {
    /* 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;
 
 
    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;
 }
 
          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;
 }