[Mesa-dev] [PATCH v2 23/27] i965/blorp: Break the guts of do_single_blorp_clear into two helpers
Pohjolainen, Topi
topi.pohjolainen at intel.com
Sun Jul 31 08:56:51 UTC 2016
On Tue, Jul 26, 2016 at 03:11:27PM -0700, Jason Ekstrand wrote:
> The helpers are completely miptree-unaware and each fairly cleanly do a
> single thing. This does come at the downside of not doing proper debug
> reporting on whether or not we're doing replicated clears.
> ---
> src/mesa/drivers/dri/i965/brw_blorp_clear.cpp | 175 ++++++++++++++++----------
> 1 file changed, 111 insertions(+), 64 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
> index 6cb28d0..4b4b8af 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
> @@ -120,33 +120,51 @@ set_write_disables(const struct intel_renderbuffer *irb,
> return disables;
> }
>
> -static bool
> -do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
> - struct gl_renderbuffer *rb, unsigned buf,
> - bool partial_clear, bool encode_srgb, unsigned layer)
> -{
> - struct gl_context *ctx = &brw->ctx;
> - struct intel_renderbuffer *irb = intel_renderbuffer(rb);
> - mesa_format format = irb->mt->format;
>
> +static void
> +blorp_fast_clear(struct brw_context *brw, const struct brw_blorp_surf *surf,
> + uint32_t level, uint32_t layer,
> + uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1)
> +{
> struct brw_blorp_params params;
> brw_blorp_params_init(¶ms);
>
> - /* Override the surface format according to the context's sRGB rules. */
> - if (!encode_srgb && _mesa_get_format_color_encoding(format) == GL_SRGB)
> - format = _mesa_get_srgb_format_linear(format);
> + params.x0 = x0;
> + params.y0 = y0;
> + params.x1 = x1;
> + params.y1 = y1;
>
> - params.x0 = fb->_Xmin;
> - params.x1 = fb->_Xmax;
> - if (rb->Name != 0) {
> - params.y0 = fb->_Ymin;
> - params.y1 = fb->_Ymax;
> - } else {
> - params.y0 = rb->Height - fb->_Ymax;
> - params.y1 = rb->Height - fb->_Ymin;
> - }
> + memset(¶ms.wm_inputs, 0xff, 4*sizeof(float));
> + params.fast_clear_op = GEN7_PS_RENDER_TARGET_FAST_CLEAR_ENABLE;
> +
> + brw_get_fast_clear_rect(brw, surf->aux_surf, ¶ms.x0, ¶ms.y0,
> + ¶ms.x1, ¶ms.y1);
> +
> + brw_blorp_params_get_clear_kernel(brw, ¶ms, true);
> +
> + brw_blorp_surface_info_init(brw, ¶ms.dst, surf, level, layer,
> + surf->surf->format, true);
> +
> + brw_blorp_exec(brw, ¶ms);
> +}
>
> - memcpy(¶ms.wm_inputs, ctx->Color.ClearColor.f, sizeof(float) * 4);
> +
> +static void
> +blorp_clear(struct brw_context *brw, const struct brw_blorp_surf *surf,
> + uint32_t level, uint32_t layer,
> + uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1,
> + enum isl_format format, union isl_color_value clear_color,
> + bool color_write_disable[4])
> +{
> + struct brw_blorp_params params;
> + brw_blorp_params_init(¶ms);
> +
> + params.x0 = x0;
> + params.y0 = y0;
> + params.x1 = x1;
> + params.y1 = y1;
> +
> + memcpy(¶ms.wm_inputs, clear_color.f32, sizeof(float) * 4);
>
> bool use_simd16_replicated_data = true;
>
> @@ -156,21 +174,60 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
> * accessing tiled memory. Using this Message Type to access linear
> * (untiled) memory is UNDEFINED."
> */
> - if (irb->mt->tiling == I915_TILING_NONE)
> + if (surf->surf->tiling == ISL_TILING_LINEAR)
> use_simd16_replicated_data = false;
>
> /* Constant color writes ignore everyting in blend and color calculator
> * state. This is not documented.
> */
> - if (set_write_disables(irb, ctx->Color.ColorMask[buf],
> - params.color_write_disable))
> - use_simd16_replicated_data = false;
> + for (unsigned i = 0; i < 4; i++) {
> + params.color_write_disable[i] = color_write_disable[i];
> + if (color_write_disable[i])
> + use_simd16_replicated_data = false;
> + }
> +
> + brw_blorp_params_get_clear_kernel(brw, ¶ms, use_simd16_replicated_data);
> +
> + brw_blorp_surface_info_init(brw, ¶ms.dst, surf, level, layer,
> + format, true);
>
> - bool is_fast_clear = false;
> - if (irb->mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_NO_MCS &&
> - !partial_clear && use_simd16_replicated_data &&
> - brw_is_color_fast_clear_compatible(brw, irb->mt,
> - &ctx->Color.ClearColor)) {
> + brw_blorp_exec(brw, ¶ms);
> +}
> +
> +static bool
> +do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
> + struct gl_renderbuffer *rb, unsigned buf,
> + bool partial_clear, bool encode_srgb, unsigned layer)
> +{
> + struct gl_context *ctx = &brw->ctx;
> + struct intel_renderbuffer *irb = intel_renderbuffer(rb);
> + mesa_format format = irb->mt->format;
> + uint32_t x0, x1, y0, y1;
> +
> + if (!encode_srgb && _mesa_get_format_color_encoding(format) == GL_SRGB)
> + format = _mesa_get_srgb_format_linear(format);
> +
> + x0 = fb->_Xmin;
> + x1 = fb->_Xmax;
> + if (rb->Name != 0) {
> + y0 = fb->_Ymin;
> + y1 = fb->_Ymax;
> + } else {
> + y0 = rb->Height - fb->_Ymax;
> + y1 = rb->Height - fb->_Ymin;
> + }
> +
> + bool can_fast_clear = !partial_clear;
> +
> + bool color_write_disable[4] = { false, false, false, false };
> + if (set_write_disables(irb, ctx->Color.ColorMask[buf], color_write_disable))
> + can_fast_clear = false;
> +
> + if (irb->mt->fast_clear_state == INTEL_FAST_CLEAR_STATE_NO_MCS ||
> + !brw_is_color_fast_clear_compatible(brw, irb->mt, &ctx->Color.ClearColor))
> + can_fast_clear = false;
> +
> + if (can_fast_clear) {
> /* Record the clear color in the miptree so that it will be
> * programmed in SURFACE_STATE by later rendering and resolve
> * operations.
> @@ -197,57 +254,47 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
> return false;
> }
> }
> -
> - is_fast_clear = true;
> }
>
> intel_miptree_check_level_layer(irb->mt, irb->mt_level, layer);
> intel_miptree_used_for_rendering(irb->mt);
>
> + /* We can't setup the blorp_surf until we've allocated the MCS above */
This is valid comment but doesn't seem to have anything to do with other
changes in this patch.
Otherwise:
Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> struct isl_surf isl_tmp[2];
> struct brw_blorp_surf surf;
> unsigned level = irb->mt_level;
> brw_blorp_surf_for_miptree(brw, &surf, irb->mt, &level, isl_tmp);
> - brw_blorp_surface_info_init(brw, ¶ms.dst, &surf, level, layer,
> - brw_blorp_to_isl_format(brw, format, true),
> - true);
> -
> - if (is_fast_clear) {
> - memset(¶ms.wm_inputs, 0xff, 4*sizeof(float));
> - params.fast_clear_op = GEN7_PS_RENDER_TARGET_FAST_CLEAR_ENABLE;
>
> - brw_get_fast_clear_rect(brw, ¶ms.dst.aux_surf, ¶ms.x0, ¶ms.y0,
> - ¶ms.x1, ¶ms.y1);
> - }
> + if (can_fast_clear) {
> + DBG("%s (fast) to mt %p level %d layer %d\n", __FUNCTION__,
> + irb->mt, irb->mt_level, irb->mt_layer);
>
> - brw_blorp_params_get_clear_kernel(brw, ¶ms, use_simd16_replicated_data);
> + blorp_fast_clear(brw, &surf, level, layer, x0, y0, x1, y1);
>
> - const char *clear_type;
> - if (is_fast_clear)
> - clear_type = "fast";
> - else if (use_simd16_replicated_data)
> - clear_type = "replicated";
> - else
> - clear_type = "slow";
> -
> - DBG("%s (%s) to mt %p level %d layer %d\n", __FUNCTION__, clear_type,
> - irb->mt, irb->mt_level, irb->mt_layer);
> -
> - brw_blorp_exec(brw, ¶ms);
> -
> - if (is_fast_clear) {
> /* Now that the fast clear has occurred, put the buffer in
> * INTEL_FAST_CLEAR_STATE_CLEAR so that we won't waste time doing
> * redundant clears.
> */
> irb->mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_CLEAR;
> - } else if (intel_miptree_is_lossless_compressed(brw, irb->mt)) {
> - /* Compressed buffers can be cleared also using normal rep-clear. In
> - * such case they bahave such as if they were drawn using normal 3D
> - * render pipeline, and we simply mark the mcs as dirty.
> - */
> - assert(partial_clear);
> - irb->mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_UNRESOLVED;
> + } else {
> + DBG("%s (slow) to mt %p level %d layer %d\n", __FUNCTION__,
> + irb->mt, irb->mt_level, irb->mt_layer);
> +
> + union isl_color_value clear_color;
> + memcpy(clear_color.f32, ctx->Color.ClearColor.f, sizeof(float) * 4);
> +
> + blorp_clear(brw, &surf, level, layer, x0, y0, x1, y1,
> + (enum isl_format)brw->render_target_format[format],
> + clear_color, color_write_disable);
> +
> + if (intel_miptree_is_lossless_compressed(brw, irb->mt)) {
> + /* Compressed buffers can be cleared also using normal rep-clear. In
> + * such case they bahave such as if they were drawn using normal 3D
> + * render pipeline, and we simply mark the mcs as dirty.
> + */
> + assert(partial_clear);
> + irb->mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_UNRESOLVED;
> + }
> }
>
> return true;
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list