[Mesa-dev] [PATCH 7/7] i965/gen7+: Implement fast color clears for MSAA buffers.

Kenneth Graunke kenneth at whitecape.org
Wed Dec 4 18:28:31 PST 2013


On 12/04/2013 03:07 PM, Chad Versace wrote:
> On 12/04/2013 06:30 AM, Paul Berry wrote:
>> Fast color clears of MSAA buffers work just like fast color clears
>> with non-MSAA buffers, except that the alignment and scaledown
>> requirements are different.
>> ---
>>   src/mesa/drivers/dri/i965/brw_blorp_clear.cpp | 131
>> +++++++++++++++++---------
>>   1 file changed, 87 insertions(+), 44 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>> b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>> index ab472e6..4d03cbe 100644
>> --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>> @@ -239,8 +239,7 @@
>> brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw,
>>      }
>>
>>      /* If we can do this as a fast color clear, do so. */
>> -   if (irb->mt->msaa_layout == INTEL_MSAA_LAYOUT_NONE &&
>> -       irb->mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_NO_MCS &&
>> +   if (irb->mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_NO_MCS &&
>>          !partial_clear && wm_prog_key.use_simd16_replicated_data &&
>>          is_color_fast_clear_compatible(brw, format,
>> &ctx->Color.ClearColor)) {
>>         memset(push_consts, 0xff, 4*sizeof(float));
>> @@ -251,48 +250,92 @@
>> brw_blorp_clear_params::brw_blorp_clear_params(struct brw_context *brw,
>>          */
>>         unsigned x_align, y_align, x_scaledown, y_scaledown;
>>
>> -      /* From the Ivy Bridge PRM, Vol2 Part1 11.7 "MCS Buffer for Render
>> -       * Target(s)", beneath the "Fast Color Clear" bullet (p327):
>> -       *
>> -       *     Clear pass must have a clear rectangle that must follow
>> alignment
>> -       *     rules in terms of pixels and lines as shown in the table
>> -       *     below. Further, the clear-rectangle height and width
>> must be
>> -       *     multiple of the following dimensions. If the height and
>> width of
>> -       *     the render target being cleared do not meet these
>> requirements,
>> -       *     an MCS buffer can be created such that it follows the
>> requirement
>> -       *     and covers the RT.
>> -       *
>> -       * The alignment size in the table that follows is related to the
>> -       * alignment size returned by
>> intel_get_non_msrt_mcs_alignment(), but
>> -       * with X alignment multiplied by 16 and Y alignment multiplied
>> by 32.
>> -       */
>> -      intel_get_non_msrt_mcs_alignment(brw, irb->mt, &x_align,
>> &y_align);
>> -      x_align *= 16;
>> -      y_align *= 32;
>> -
>> -      /* From the Ivy Bridge PRM, Vol2 Part1 11.7 "MCS Buffer for Render
>> -       * Target(s)", beneath the "Fast Color Clear" bullet (p327):
>> -       *
>> -       *     In order to optimize the performance MCS buffer (when
>> bound to 1X
>> -       *     RT) clear similarly to MCS buffer clear for MSRT case,
>> clear rect
>> -       *     is required to be scaled by the following factors in the
>> -       *     horizontal and vertical directions:
>> -       *
>> -       * The X and Y scale down factors in the table that follows are
>> each
>> -       * equal to half the alignment value computed above.
>> -       */
>> -      x_scaledown = x_align / 2;
>> -      y_scaledown = y_align / 2;
>> -
>> -      /* From BSpec: 3D-Media-GPGPU Engine > 3D Pipeline > Pixel > Pixel
>> -       * Backend > MCS Buffer for Render Target(s) [DevIVB+] > Table
>> "Color
>> -       * Clear of Non-MultiSampled Render Target Restrictions":
>> -       *
>> -       *   Clear rectangle must be aligned to two times the number of
>> pixels in
>> -       *   the table shown below due to 16x16 hashing across the slice.
>> -       */
>> -      x_align *= 2;
>> -      y_align *= 2;
>> +      if (irb->mt->msaa_layout == INTEL_MSAA_LAYOUT_NONE) {
>> +         /* From the Ivy Bridge PRM, Vol2 Part1 11.7 "MCS Buffer for
>> Render
>> +          * Target(s)", beneath the "Fast Color Clear" bullet (p327):
>> +          *
>> +          *     Clear pass must have a clear rectangle that must follow
>> +          *     alignment rules in terms of pixels and lines as shown
>> in the
>> +          *     table below. Further, the clear-rectangle height and
>> width
>> +          *     must be multiple of the following dimensions. If the
>> height
>> +          *     and width of the render target being cleared do not
>> meet these
>> +          *     requirements, an MCS buffer can be created such that it
>> +          *     follows the requirement and covers the RT.
>> +          *
>> +          * The alignment size in the table that follows is related
>> to the
>> +          * alignment size returned by
>> intel_get_non_msrt_mcs_alignment(), but
>> +          * with X alignment multiplied by 16 and Y alignment
>> multiplied by 32.
>> +          */
>> +         intel_get_non_msrt_mcs_alignment(brw, irb->mt, &x_align,
>> &y_align);
>> +         x_align *= 16;
>> +         y_align *= 32;
>> +
>> +         /* From the Ivy Bridge PRM, Vol2 Part1 11.7 "MCS Buffer for
>> Render
>> +          * Target(s)", beneath the "Fast Color Clear" bullet (p327):
>> +          *
>> +          *     In order to optimize the performance MCS buffer (when
>> bound to
>> +          *     1X RT) clear similarly to MCS buffer clear for MSRT
>> case,
>> +          *     clear rect is required to be scaled by the following
>> factors
>> +          *     in the horizontal and vertical directions:
>> +          *
>> +          * The X and Y scale down factors in the table that follows
>> are each
>> +          * equal to half the alignment value computed above.
>> +          */
>> +         x_scaledown = x_align / 2;
>> +         y_scaledown = y_align / 2;
>> +
>> +         /* From BSpec: 3D-Media-GPGPU Engine > 3D Pipeline > Pixel >
>> Pixel
>> +          * Backend > MCS Buffer for Render Target(s) [DevIVB+] >
>> Table "Color
>> +          * Clear of Non-MultiSampled Render Target Restrictions":
>> +          *
>> +          *   Clear rectangle must be aligned to two times the number of
>> +          *   pixels in the table shown below due to 16x16 hashing
>> across the
>> +          *   slice.
>> +          */
>> +         x_align *= 2;
>> +         y_align *= 2;
>> +      } else {
>> +         /* From the Ivy Bridge PRM, Vol2 Part1 11.7 "MCS Buffer for
>> Render
>> +          * Target(s)", beneath the "MSAA Compression" bugget (p326):
>> +          *
>> +          *     Clear pass for this case requires that scaled down
>> primitive
>> +          *     is sent down with upper left co-ordinate to coincide
>> with
>> +          *     actual rectangle being cleared. For MSAA, clear
>> rectangle’s
>> +          *     height and width need to as show in the following
>> table in
>> +          *     terms of (width,height) of the RT.
>> +          *
>> +          *     MSAA  Width of Clear Rect  Height of Clear Rect
>> +          *      4X     Ceil(1/8*width)      Ceil(1/2*height)
>> +          *      8X     Ceil(1/2*width)      Ceil(1/2*height)
>> +          *
>> +          * The text "with upper left co-ordinate to coincide with
>> actual
>> +          * rectangle being cleared" is a little confusing--it seems
>> to imply
>> +          * that to clear a rectangle from (x,y) to (x+w,y+h), one
>> needs to
>> +          * feed the pipeline using the rectangle (x,y) to
>> +          * (x+Ceil(w/N),y+Ceil(h/2)), where N is either 2 or 8
>> depending on
>> +          * the number of samples.  Experiments indicate that this is
>> not
>> +          * quite correct; actually, what the hardware appears to do
>> is to
>> +          * align whatever rectangle is sent down the pipeline to the
>> nearest
>> +          * multiple of 2x2 blocks, and then scale it up by a factor
>> of N
>> +          * horizontally and 2 vertically.  So the resulting
>> alignment is 4
>> +          * verticeally and either 4 or 16 horizontally, and the
>> scaledown
>> +          * factor is 2 vestically and either 2 or 8 horizontally.
> 
> bugget, verticeally, and vestically! oh my!
> 
> Patches 1-6 are
> Reviewed-by: Chad Versace <chad.versace at linux.intel.com>
> 
> But this patch 7... If the user specifies an ill-aligned clear rectangle,
> does this code clear a slightly larger, well-aligned rectangle? In other
> words,
> will this clear pixels outside the user-specified clear rectangle? Local
> inspection of the code suggests so to me. But my global understanding of
> these codepaths is vague.

The pre-existing !partial_clear check (visible in this patch) ought to
prevent clears with scissoring or such.  AFAICT fast color clears only
happen on full buffers today.

--Ken



More information about the mesa-dev mailing list