[Mesa-dev] [PATCH 06/12] i965/gen7+: Implement fast color clear operation in BLORP.
Eric Anholt
eric at anholt.net
Thu May 23 16:32:35 PDT 2013
Paul Berry <stereotype441 at gmail.com> writes:
> On 22 May 2013 12:30, Ian Romanick <idr at freedesktop.org> wrote:
>
>> On 05/21/2013 04:52 PM, Paul Berry wrote:
>>
>>> Since we defer allocation of the MCS miptree until the time of the
>>> fast clear operation, this patch also implements creation of the MCS
>>> miptree.
>>>
>>> In addition, this patch adds the field
>>> intel_mipmap_tree::fast_clear_**color_value, which holds the most recent
>>> fast color clear value, if any. We use it to set the SURFACE_STATE's
>>> clear color for render targets.
>>> ---
>>> src/mesa/drivers/dri/i965/brw_**blorp.cpp | 1 +
>>> src/mesa/drivers/dri/i965/brw_**blorp.h | 11 +-
>>> src/mesa/drivers/dri/i965/brw_**blorp_clear.cpp | 143
>>> +++++++++++++++++++++-
>>> src/mesa/drivers/dri/i965/brw_**clear.c | 2 +-
>>> src/mesa/drivers/dri/i965/brw_**defines.h | 2 +
>>> src/mesa/drivers/dri/i965/**gen7_blorp.cpp | 18 ++-
>>> src/mesa/drivers/dri/i965/**gen7_wm_surface_state.c | 10 +-
>>> src/mesa/drivers/dri/intel/**intel_mipmap_tree.c | 47 +++++++
>>> src/mesa/drivers/dri/intel/**intel_mipmap_tree.h | 13 ++
>>> 9 files changed, 233 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/src/mesa/drivers/dri/i965/**brw_blorp.cpp
>>> b/src/mesa/drivers/dri/i965/**brw_blorp.cpp
>>> index 20f7153..c6019d1 100644
>>> --- a/src/mesa/drivers/dri/i965/**brw_blorp.cpp
>>> +++ b/src/mesa/drivers/dri/i965/**brw_blorp.cpp
>>> @@ -147,6 +147,7 @@ brw_blorp_params::brw_blorp_**params()
>>> y1(0),
>>> depth_format(0),
>>> hiz_op(GEN6_HIZ_OP_NONE),
>>> + fast_clear_op(GEN7_FAST_CLEAR_**OP_NONE),
>>> num_samples(0),
>>> use_wm_prog(false)
>>> {
>>> diff --git a/src/mesa/drivers/dri/i965/**brw_blorp.h
>>> b/src/mesa/drivers/dri/i965/**brw_blorp.h
>>> index 6360a62..687d7eb 100644
>>> --- a/src/mesa/drivers/dri/i965/**brw_blorp.h
>>> +++ b/src/mesa/drivers/dri/i965/**brw_blorp.h
>>> @@ -46,7 +46,8 @@ brw_blorp_blit_miptrees(struct intel_context *intel,
>>> bool mirror_x, bool mirror_y);
>>>
>>> bool
>>> -brw_blorp_clear_color(struct intel_context *intel, struct gl_framebuffer
>>> *fb);
>>> +brw_blorp_clear_color(struct intel_context *intel, struct gl_framebuffer
>>> *fb,
>>> + bool partial_clear);
>>>
>>> #ifdef __cplusplus
>>> } /* end extern "C" */
>>> @@ -195,6 +196,13 @@ struct brw_blorp_prog_data
>>> bool persample_msaa_dispatch;
>>> };
>>>
>>> +
>>> +enum gen7_fast_clear_op {
>>> + GEN7_FAST_CLEAR_OP_NONE,
>>> + GEN7_FAST_CLEAR_OP_FAST_CLEAR,
>>> +};
>>> +
>>> +
>>> class brw_blorp_params
>>> {
>>> public:
>>> @@ -212,6 +220,7 @@ public:
>>> brw_blorp_surface_info src;
>>> brw_blorp_surface_info dst;
>>> enum gen6_hiz_op hiz_op;
>>> + enum gen7_fast_clear_op fast_clear_op;
>>> unsigned num_samples;
>>> bool use_wm_prog;
>>> brw_blorp_wm_push_constants wm_push_consts;
>>> diff --git a/src/mesa/drivers/dri/i965/**brw_blorp_clear.cpp
>>> b/src/mesa/drivers/dri/i965/**brw_blorp_clear.cpp
>>> index 28d7ad0..675289b 100644
>>> --- a/src/mesa/drivers/dri/i965/**brw_blorp_clear.cpp
>>> +++ b/src/mesa/drivers/dri/i965/**brw_blorp_clear.cpp
>>> @@ -49,7 +49,8 @@ public:
>>> brw_blorp_clear_params(struct brw_context *brw,
>>> struct gl_framebuffer *fb,
>>> struct gl_renderbuffer *rb,
>>> - GLubyte *color_mask);
>>> + GLubyte *color_mask,
>>> + bool partial_clear);
>>>
>>> virtual uint32_t get_wm_prog(struct brw_context *brw,
>>> brw_blorp_prog_data **prog_data) const;
>>> @@ -105,10 +106,49 @@ brw_blorp_clear_program::~brw_**
>>> blorp_clear_program()
>>> ralloc_free(mem_ctx);
>>> }
>>>
>>> +
>>> +/**
>>> + * Determine if fast color clear supports the given clear color.
>>> + *
>>> + * Fast color clear can only clear to color values of 1.0 or 0.0. At the
>>> + * moment we only support floating point buffers.
>>> + */
>>> +static bool
>>> +is_color_fast_clear_**compatible(gl_format format,
>>> + const union gl_color_union *color)
>>> +{
>>> + if (_mesa_is_format_integer_**color(format))
>>> + return false;
>>> +
>>> + for (int i = 0; i < 4; i++) {
>>> + if (color->f[i] != 0.0 && color->f[i] != 1.0)
>>> + return false;
>>>
>>
>> Should this generate a perf debug message? Eric may have an opinion about
>> generating warnings for the non-fast path...
>
>
> Sounds reasonable to me. We already have perf debug messages for other
> things that can inhibit fast clears (e.g. scissor preventing fast depth
> clear). I'll add it unless I hear an objection.
Thanks! I love getting this kind of information into our driver at the
point that we're leaving some potential performance on the floor. Even
when it doesn't seem important now (non-8x4 fast depth clears, sigh...).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130523/df6b9a38/attachment-0001.pgp>
More information about the mesa-dev
mailing list