diff options
author | Nanley Chery <[email protected]> | 2017-03-06 17:37:49 -0800 |
---|---|---|
committer | Nanley Chery <[email protected]> | 2017-06-26 11:09:12 -0700 |
commit | d1119ab7b6e7d92505f4855e4f9f4d19e5a94804 (patch) | |
tree | 9ca90663ced01b73a2e2204eddd6a6ac50d2799e /src/intel | |
parent | 6235f08ff8870636d89d2181e0a9dfc3ebec7b45 (diff) |
blorp/clear: Add a binding-table-based CCS resolve function
v2:
- Do layered resolves.
(Jason Ekstrand):
- Replace "bt" suffix with "attachment".
- Rename helper function to prepare_ccs_resolve.
- Move blorp_params_init() into helper function.
Signed-off-by: Nanley Chery <[email protected]>
Reviewed-by: Iago Toral Quiroga <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/blorp/blorp.h | 11 | ||||
-rw-r--r-- | src/intel/blorp/blorp_clear.c | 63 |
2 files changed, 57 insertions, 17 deletions
diff --git a/src/intel/blorp/blorp.h b/src/intel/blorp/blorp.h index 744c1b1ea0a..d5226c22481 100644 --- a/src/intel/blorp/blorp.h +++ b/src/intel/blorp/blorp.h @@ -191,6 +191,17 @@ blorp_ccs_resolve(struct blorp_batch *batch, enum isl_format format, enum blorp_fast_clear_op resolve_op); +/* Resolves subresources of the image subresource range specified in the + * binding table. + */ +void +blorp_ccs_resolve_attachment(struct blorp_batch *batch, + const uint32_t binding_table_offset, + struct blorp_surf * const surf, + const uint32_t level, const uint32_t num_layers, + const enum isl_format format, + const enum blorp_fast_clear_op resolve_op); + /** * For an overview of the HiZ operations, see the following sections of the * Sandy Bridge PRM, Volume 1, Part2: diff --git a/src/intel/blorp/blorp_clear.c b/src/intel/blorp/blorp_clear.c index 0e523dfe5b3..581cf63c49f 100644 --- a/src/intel/blorp/blorp_clear.c +++ b/src/intel/blorp/blorp_clear.c @@ -703,16 +703,16 @@ blorp_clear_attachments(struct blorp_batch *batch, batch->blorp->exec(batch, ¶ms); } -void -blorp_ccs_resolve(struct blorp_batch *batch, - struct blorp_surf *surf, uint32_t level, uint32_t layer, - enum isl_format format, - enum blorp_fast_clear_op resolve_op) +static void +prepare_ccs_resolve(struct blorp_batch * const batch, + struct blorp_params * const params, + const struct blorp_surf * const surf, + const uint32_t level, const uint32_t layer, + const enum isl_format format, + const enum blorp_fast_clear_op resolve_op) { - struct blorp_params params; - blorp_params_init(¶ms); - - brw_blorp_surface_info_init(batch->blorp, ¶ms.dst, surf, + blorp_params_init(params); + brw_blorp_surface_info_init(batch->blorp, ¶ms->dst, surf, level, layer, format, true); /* From the Ivy Bridge PRM, Vol2 Part1 11.9 "Render Target Resolve": @@ -725,7 +725,7 @@ blorp_ccs_resolve(struct blorp_batch *batch, * multiply by 8 and 16. On Sky Lake, we multiply by 8. */ const struct isl_format_layout *aux_fmtl = - isl_format_get_layout(params.dst.aux_surf.format); + isl_format_get_layout(params->dst.aux_surf.format); assert(aux_fmtl->txc == ISL_TXC_CCS); unsigned x_scaledown, y_scaledown; @@ -739,11 +739,11 @@ blorp_ccs_resolve(struct blorp_batch *batch, x_scaledown = aux_fmtl->bw / 2; y_scaledown = aux_fmtl->bh / 2; } - params.x0 = params.y0 = 0; - params.x1 = minify(params.dst.aux_surf.logical_level0_px.width, level); - params.y1 = minify(params.dst.aux_surf.logical_level0_px.height, level); - params.x1 = ALIGN(params.x1, x_scaledown) / x_scaledown; - params.y1 = ALIGN(params.y1, y_scaledown) / y_scaledown; + params->x0 = params->y0 = 0; + params->x1 = minify(params->dst.aux_surf.logical_level0_px.width, level); + params->y1 = minify(params->dst.aux_surf.logical_level0_px.height, level); + params->x1 = ALIGN(params->x1, x_scaledown) / x_scaledown; + params->y1 = ALIGN(params->y1, y_scaledown) / y_scaledown; if (batch->blorp->isl_dev->info->gen >= 9) { assert(resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_FULL || @@ -752,7 +752,7 @@ blorp_ccs_resolve(struct blorp_batch *batch, /* Broadwell and earlier do not have a partial resolve */ assert(resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_FULL); } - params.fast_clear_op = resolve_op; + params->fast_clear_op = resolve_op; /* Note: there is no need to initialize push constants because it doesn't * matter what data gets dispatched to the render target. However, we must @@ -760,8 +760,37 @@ blorp_ccs_resolve(struct blorp_batch *batch, * color" message. */ - if (!blorp_params_get_clear_kernel(batch->blorp, ¶ms, true)) + if (!blorp_params_get_clear_kernel(batch->blorp, params, true)) return; +} + +void +blorp_ccs_resolve(struct blorp_batch *batch, + struct blorp_surf *surf, uint32_t level, uint32_t layer, + enum isl_format format, + enum blorp_fast_clear_op resolve_op) +{ + struct blorp_params params; + + prepare_ccs_resolve(batch, ¶ms, surf, level, layer, format, resolve_op); + + batch->blorp->exec(batch, ¶ms); +} + +void +blorp_ccs_resolve_attachment(struct blorp_batch *batch, + const uint32_t binding_table_offset, + struct blorp_surf * const surf, + const uint32_t level, const uint32_t num_layers, + const enum isl_format format, + const enum blorp_fast_clear_op resolve_op) +{ + struct blorp_params params; + + prepare_ccs_resolve(batch, ¶ms, surf, level, 0, format, resolve_op); + params.use_pre_baked_binding_table = true; + params.pre_baked_binding_table_offset = binding_table_offset; + params.num_layers = num_layers; batch->blorp->exec(batch, ¶ms); } |