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:
@@ -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
|
||||||
|
@@ -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(¶ms);
|
blorp_params_init(¶ms);
|
||||||
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user