intel/blorp: Take a fast_clear_op in ccs_resolve

Eventually, we may want to just have a single blorp_ccs_op function that
does both clears and resolves.  For now we'll stick to just making the
ccs_resolve function we have now a bit more configurable.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
Jason Ekstrand
2016-10-25 10:48:12 -07:00
parent 7c560e8ccc
commit 1ba2f05bc0
4 changed files with 29 additions and 15 deletions

View File

@@ -167,10 +167,18 @@ blorp_clear_attachments(struct blorp_batch *batch,
bool clear_depth, float depth_value, bool clear_depth, float depth_value,
uint8_t stencil_mask, uint8_t stencil_value); uint8_t stencil_mask, uint8_t stencil_value);
enum blorp_fast_clear_op {
BLORP_FAST_CLEAR_OP_NONE = 0,
BLORP_FAST_CLEAR_OP_CLEAR,
BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL,
BLORP_FAST_CLEAR_OP_RESOLVE_FULL,
};
void void
blorp_ccs_resolve(struct blorp_batch *batch, blorp_ccs_resolve(struct blorp_batch *batch,
struct blorp_surf *surf, uint32_t level, uint32_t layer, struct blorp_surf *surf, uint32_t level, uint32_t layer,
enum isl_format format); enum isl_format format,
enum blorp_fast_clear_op resolve_op);
/** /**
* For an overview of the HiZ operations, see the following sections of the * For an overview of the HiZ operations, see the following sections of the

View File

@@ -543,7 +543,8 @@ blorp_clear_attachments(struct blorp_batch *batch,
void void
blorp_ccs_resolve(struct blorp_batch *batch, blorp_ccs_resolve(struct blorp_batch *batch,
struct blorp_surf *surf, uint32_t level, uint32_t layer, struct blorp_surf *surf, uint32_t level, uint32_t layer,
enum isl_format format) enum isl_format format,
enum blorp_fast_clear_op resolve_op)
{ {
struct blorp_params params; struct blorp_params params;
blorp_params_init(&params); blorp_params_init(&params);
@@ -586,14 +587,13 @@ blorp_ccs_resolve(struct blorp_batch *batch,
params.y1 = ALIGN(params.y1, y_scaledown) / y_scaledown; params.y1 = ALIGN(params.y1, y_scaledown) / y_scaledown;
if (batch->blorp->isl_dev->info->gen >= 9) { if (batch->blorp->isl_dev->info->gen >= 9) {
if (params.dst.aux_usage == ISL_AUX_USAGE_CCS_E) assert(resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_FULL ||
params.fast_clear_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL; resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL);
else
params.fast_clear_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL;
} else { } else {
/* Broadwell and earlier do not have a partial resolve */ /* Broadwell and earlier do not have a partial resolve */
params.fast_clear_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL; assert(resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_FULL);
} }
params.fast_clear_op = resolve_op;
/* Note: there is no need to initialize push constants because it doesn't /* 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 * matter what data gets dispatched to the render target. However, we must

View File

@@ -44,13 +44,6 @@ enum {
BLORP_NUM_BT_ENTRIES BLORP_NUM_BT_ENTRIES
}; };
enum blorp_fast_clear_op {
BLORP_FAST_CLEAR_OP_NONE = 0,
BLORP_FAST_CLEAR_OP_CLEAR,
BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL,
BLORP_FAST_CLEAR_OP_RESOLVE_FULL,
};
struct brw_blorp_surface_info struct brw_blorp_surface_info
{ {
bool enabled; bool enabled;

View File

@@ -943,10 +943,23 @@ brw_blorp_resolve_color(struct brw_context *brw, struct intel_mipmap_tree *mt)
unsigned level = 0; unsigned level = 0;
blorp_surf_for_miptree(brw, &surf, mt, true, &level, isl_tmp); blorp_surf_for_miptree(brw, &surf, mt, true, &level, isl_tmp);
enum blorp_fast_clear_op resolve_op;
if (brw->gen >= 9) {
if (surf.aux_usage == ISL_AUX_USAGE_CCS_E)
resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
else
resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL;
} else {
assert(surf.aux_usage == ISL_AUX_USAGE_CCS_D);
/* Broadwell and earlier do not have a partial resolve */
resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
}
struct blorp_batch batch; struct blorp_batch batch;
blorp_batch_init(&brw->blorp, &batch, brw, 0); blorp_batch_init(&brw->blorp, &batch, brw, 0);
blorp_ccs_resolve(&batch, &surf, 0 /* level */, 0 /* layer */, blorp_ccs_resolve(&batch, &surf, 0 /* level */, 0 /* layer */,
brw_blorp_to_isl_format(brw, format, true)); brw_blorp_to_isl_format(brw, format, true),
resolve_op);
blorp_batch_finish(&batch); blorp_batch_finish(&batch);
mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED; mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED;