On Wed, Jul 19, 2017 at 02:01:46PM -0700, Jason Ekstrand wrote: > --- > src/intel/isl/isl.h | 88 > ++++++++++++++++----------- > src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 11 ++++ > 2 files changed, 64 insertions(+), 35 deletions(-) > > diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h > index d81df31..68bfcee 100644 > --- a/src/intel/isl/isl.h > +++ b/src/intel/isl/isl.h > @@ -618,7 +618,11 @@ enum isl_aux_usage { > * color by simply changing the clear color without modifying either > * surface. > * > - * 2) Compressed w/ Clear: In this state, neither the auxiliary surface > + * 2) Partial Clear: In this state, each block in the auxiliary surface > + * contains either the magic clear or pass-through value. See Clear > and > + * Pass-through for more details. > + * > + * 3) Compressed w/ Clear: In this state, neither the auxiliary surface > * nor the primary surface has a complete representation of the data. > * Instead, both surfaces must be used together or else rendering > * corruption may occur. Depending on the auxiliary compression format > @@ -627,19 +631,19 @@ enum isl_aux_usage { > * values. Blocks may also be in the clear state (see Clear) and have > * their value taken from outside the surface. > * > - * 3) Compressed w/o Clear: This state is identical to the state above > + * 4) Compressed w/o Clear: This state is identical to the state above > * except that no blocks are in the clear state. In this state, all of > * the data required to reconstruct the final sample values is > contained > * in the auxiliary and primary surface and the clear value is not > * considered. > * > - * 4) Resolved: In this state, the primary surface contains 100% of the > + * 5) Resolved: In this state, the primary surface contains 100% of the > * data. The auxiliary surface is also valid so the surface can be > * validly used with or without aux enabled. The auxiliary surface > may, > * however, contain non-trivial data and any update to the primary > * surface with aux disabled will cause the two to get out of sync. > * > - * 5) Pass-through: In this state, the primary surface contains 100% of > the > + * 6) Pass-through: In this state, the primary surface contains 100% of > the > * data and every block in the auxiliary surface contains a magic value > * which indicates that the auxiliary surface should be ignored and the > * only the primary surface should be considered. Updating the primary > @@ -648,7 +652,7 @@ enum isl_aux_usage { > * cause the auxiliary buffer to contain non-trivial data and no longer > * be in the pass-through state. > * > - * 5) Aux Invalid: In this state, the primary surface contains 100% of > the > + * 7) Aux Invalid: In this state, the primary surface contains 100% of > the > * data and the auxiliary surface is completely bogus. Any attempt to > * use the auxiliary surface is liable to result in rendering > * corruption. The only thing that one can do to re-enable aux once > @@ -662,7 +666,8 @@ enum isl_aux_usage { > * 1) Fast Clear: This operation writes the magic "clear" value to the > * auxiliary surface. This operation will safely transition any slice > * of a surface from any state to the clear state so long as the entire > - * slice is fast cleared at once. > + * slice is fast cleared at once. A fast clear that only covers part > of > + * a slice of a surface is called a partial fast clear. > * > * 2) Full Resolve: This operation combines the auxiliary surface data > * with the primary surface data and writes the result to the primary. > @@ -689,34 +694,46 @@ enum isl_aux_usage { > * Draw w/ Aux > * +----------+ > * | | > - * | +-------------+ Draw w/ Aux +-------------+ > - * +------>| Compressed |<---------------------| Clear | > - * | w/ Clear | | | > - * +-------------+ +-------------+ > - * | | | > - * Partial | | | > - * Resolve | | Full Resolve | > - * | +----------------------------+ | Full > - * | | | Resolve > - * Draw w/ aux | | | > - * +----------+ | | | > - * | | \|/ \|/ \|/ > - * | +-------------+ Full Resolve +-------------+ > - * +------>| Compressed |--------------------->| Resolved | > - * | w/o Clear |<---------------------| | > - * +-------------+ Draw w/ Aux +-------------+ > - * /|\ | | > - * | Draw | | Draw > - * | w/ Aux | | w/o Aux > - * | Ambiguate | | > - * | +----------------------------+ | > - * Draw w/o Aux | | | Draw w/o Aux > - * +----------+ | | | +----------+ > - * | | | \|/ \|/ | | > - * | +-------------+ Ambiguate +-------------+ | > - * +------>| Pass- |<---------------------| Aux |<------+ > - * | through | | Invalid | > - * +-------------+ +-------------+ > + * | +-------------+ Draw w/ Aux +-------------+ > + * +------>| Compressed |<-------------------| Clear | > + * | w/ Clear |----->----+ | | > + * +-------------+ | +-------------+ > + * | /|\ | | | > + * | | | | | > + * | | +------<-----+ | Draw w/ > + * | | | | Clear Only > + * | | Full | | +----------+ > + * Partial | | Resolve | \|/ | | > + * Resolve | | | +-------------+ | > + * | | | | Partial |<------+ > + * | | | | Clear |<----------+ > + * | | | +-------------+ | > + * | | | | | > + * | | +------>---------+ Full | > + * | | | Resolve | > + * Draw w/ aux | | Partial Fast Clear | | > + * +----------+ | +--------------------------+ | |
I would have thought we go from "Resolved" to "Partial Clear" with "Partial Fast Clear".. > + * | | \|/ | \|/ | > + * | +-------------+ Full Resolve +-------------+ | > + * +------>| Compressed |------------------->| Resolved | | > + * | w/o Clear |<-------------------| | | > + * +-------------+ Draw w/ Aux +-------------+ | > + * /|\ | | | > + * | Draw | | Draw | > + * | w/ Aux | | w/o Aux | > + * | Ambiguate | | | > + * | +--------------------------+ | | > + * Draw w/o Aux | | | Draw w/o Aux | > + * +----------+ | | | +----------+ | > + * | | | \|/ \|/ | | | > + * | +-------------+ Ambiguate +-------------+ | | > + * +------>| Pass- |<-------------------| Aux |<------+ | > + * +------>| through | | Invalid | | > + * | +-------------+ +-------------+ | > + * | | | | > + * +----------+ +-----------------------------------------------------+ > + * Draw w/ Partial Fast Clear > + * Clear Only > * > * > * While the above general theory applies to all forms of auxiliary > @@ -742,7 +759,7 @@ enum isl_aux_usage { > * CCS_D: Single-sample fast-clears (also called CCS_D in ISL) are one of > * the simplest forms of compression since they don't do anything > * beyond clear color tracking. They really only support three of > - * the six states: Clear, Compressed w/ Clear, and Pass-through. > The > + * the six states: Clear, Partial Clear, and Pass-through. The > * only CCS_D operation is "Resolve" which maps to a full resolve > * followed by an ambiguate. > * > @@ -762,6 +779,7 @@ enum isl_aux_usage { > */ > enum isl_aux_state { > ISL_AUX_STATE_CLEAR = 0, > + ISL_AUX_STATE_PARTIAL_CLEAR, > ISL_AUX_STATE_COMPRESSED_CLEAR, > ISL_AUX_STATE_COMPRESSED_NO_CLEAR, > ISL_AUX_STATE_RESOLVED, > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > index b284af9..91fcd0b 100644 > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > @@ -2181,6 +2181,7 @@ get_ccs_d_resolve_op(enum isl_aux_state aux_state, > case ISL_AUX_STATE_PASS_THROUGH: > return BLORP_FAST_CLEAR_OP_NONE; > > + case ISL_AUX_STATE_PARTIAL_CLEAR: > case ISL_AUX_STATE_RESOLVED: > case ISL_AUX_STATE_AUX_INVALID: > case ISL_AUX_STATE_COMPRESSED_NO_CLEAR: > @@ -2216,6 +2217,7 @@ get_ccs_e_resolve_op(enum isl_aux_state aux_state, > case ISL_AUX_STATE_PASS_THROUGH: > return BLORP_FAST_CLEAR_OP_NONE; > > + case ISL_AUX_STATE_PARTIAL_CLEAR: > case ISL_AUX_STATE_RESOLVED: > case ISL_AUX_STATE_AUX_INVALID: > break; > @@ -2299,6 +2301,7 @@ intel_miptree_finish_ccs_write(struct brw_context *brw, > } > break; > > + case ISL_AUX_STATE_PARTIAL_CLEAR: > case ISL_AUX_STATE_RESOLVED: > case ISL_AUX_STATE_AUX_INVALID: > unreachable("Invalid aux state for CCS_E"); > @@ -2321,6 +2324,7 @@ intel_miptree_finish_ccs_write(struct brw_context *brw, > /* Nothing to do */ > break; > > + case ISL_AUX_STATE_PARTIAL_CLEAR: > case ISL_AUX_STATE_COMPRESSED_NO_CLEAR: > case ISL_AUX_STATE_RESOLVED: > case ISL_AUX_STATE_AUX_INVALID: > @@ -2354,6 +2358,7 @@ intel_miptree_prepare_mcs_access(struct brw_context > *brw, > case ISL_AUX_STATE_RESOLVED: > case ISL_AUX_STATE_PASS_THROUGH: > case ISL_AUX_STATE_AUX_INVALID: > + case ISL_AUX_STATE_PARTIAL_CLEAR: > unreachable("Invalid aux state for MCS"); > } > } > @@ -2410,6 +2415,9 @@ intel_miptree_prepare_hiz_access(struct brw_context > *brw, > if (hiz_supported) > hiz_op = BLORP_HIZ_OP_HIZ_RESOLVE; > break; > + > + case ISL_AUX_STATE_PARTIAL_CLEAR: > + unreachable("Invalid HiZ state"); > } > > if (hiz_op != BLORP_HIZ_OP_NONE) { > @@ -2471,6 +2479,9 @@ intel_miptree_finish_hiz_write(struct brw_context *brw, > case ISL_AUX_STATE_AUX_INVALID: > assert(!written_with_hiz); > break; > + > + case ISL_AUX_STATE_PARTIAL_CLEAR: > + unreachable("Invalid HiZ state"); > } > } > > -- > 2.5.0.400.gff86faf > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev