MODIFIER_PRIORITY_X,
MODIFIER_PRIORITY_Y,
MODIFIER_PRIORITY_Y_CCS,
+ MODIFIER_PRIORITY_Y_GEN12_RC_CCS,
};
static const uint64_t priority_to_modifier[] = {
[MODIFIER_PRIORITY_X] = I915_FORMAT_MOD_X_TILED,
[MODIFIER_PRIORITY_Y] = I915_FORMAT_MOD_Y_TILED,
[MODIFIER_PRIORITY_Y_CCS] = I915_FORMAT_MOD_Y_TILED_CCS,
+ [MODIFIER_PRIORITY_Y_GEN12_RC_CCS] = I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS,
};
static bool
modifier_is_supported(const struct gen_device_info *devinfo,
enum pipe_format pfmt, uint64_t modifier)
{
- /* XXX: do something real */
+ /* Check for basic device support. */
switch (modifier) {
+ case DRM_FORMAT_MOD_LINEAR:
+ case I915_FORMAT_MOD_X_TILED:
+ case I915_FORMAT_MOD_Y_TILED:
+ break;
+ case I915_FORMAT_MOD_Y_TILED_CCS:
+ if (devinfo->gen <= 8 || devinfo->gen >= 12)
+ return false;
+ break;
+ case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
+ if (devinfo->gen != 12)
+ return false;
+ break;
+ case DRM_FORMAT_MOD_INVALID:
+ default:
+ return false;
+ }
+
+ /* Check remaining requirements. */
+ switch (modifier) {
+ case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
case I915_FORMAT_MOD_Y_TILED_CCS: {
if (unlikely(INTEL_DEBUG & DEBUG_NO_RBC))
return false;
if (rt_format == ISL_FORMAT_UNSUPPORTED ||
!isl_format_supports_ccs_e(devinfo, rt_format))
return false;
-
- return devinfo->gen >= 9 && devinfo->gen <= 11;
}
- case I915_FORMAT_MOD_Y_TILED:
- case I915_FORMAT_MOD_X_TILED:
- case DRM_FORMAT_MOD_LINEAR:
- return true;
- case DRM_FORMAT_MOD_INVALID:
default:
- return false;
+ break;
}
+
+ return true;
}
static uint64_t
continue;
switch (modifiers[i]) {
+ case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
+ prio = MAX2(prio, MODIFIER_PRIORITY_Y_GEN12_RC_CCS);
+ break;
case I915_FORMAT_MOD_Y_TILED_CCS:
prio = MAX2(prio, MODIFIER_PRIORITY_Y_CCS);
break;
I915_FORMAT_MOD_X_TILED,
I915_FORMAT_MOD_Y_TILED,
I915_FORMAT_MOD_Y_TILED_CCS,
+ I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS,
};
int supported_mods = 0;
if (bindings & (PIPE_BIND_SHADER_IMAGE | PIPE_BIND_SHADER_BUFFER))
usage |= ISL_SURF_USAGE_STORAGE_BIT;
- if (bindings & PIPE_BIND_DISPLAY_TARGET)
+ if (bindings & PIPE_BIND_SCANOUT)
usage |= ISL_SURF_USAGE_DISPLAY_BIT;
return usage;
/* Try to create the auxiliary surfaces allowed by the modifier or by
* the user if no modifier is specified.
*/
- assert(!res->mod_info || res->mod_info->aux_usage == ISL_AUX_USAGE_NONE ||
- res->mod_info->aux_usage == ISL_AUX_USAGE_CCS_E);
+ assert(!res->mod_info ||
+ res->mod_info->aux_usage == ISL_AUX_USAGE_NONE ||
+ res->mod_info->aux_usage == ISL_AUX_USAGE_CCS_E ||
+ res->mod_info->aux_usage == ISL_AUX_USAGE_GEN12_CCS_E);
const bool has_mcs = !res->mod_info &&
isl_surf_get_mcs_surf(&screen->isl_dev, &res->surf, &res->aux.surf);
} else if (has_ccs && isl_surf_usage_is_stencil(res->surf.usage)) {
res->aux.possible_usages |= 1 << ISL_AUX_USAGE_STC_CCS;
} else if (has_ccs) {
- if (want_ccs_e_for_format(devinfo, res->surf.format))
- res->aux.possible_usages |= 1 << ISL_AUX_USAGE_CCS_E;
- else if (isl_format_supports_ccs_d(devinfo, res->surf.format))
+ if (want_ccs_e_for_format(devinfo, res->surf.format)) {
+ res->aux.possible_usages |= devinfo->gen < 12 ?
+ 1 << ISL_AUX_USAGE_CCS_E : 1 << ISL_AUX_USAGE_GEN12_CCS_E;
+ } else if (isl_format_supports_ccs_d(devinfo, res->surf.format)) {
res->aux.possible_usages |= 1 << ISL_AUX_USAGE_CCS_D;
+ }
}
res->aux.usage = util_last_bit(res->aux.possible_usages) - 1;
*/
initial_state = ISL_AUX_STATE_CLEAR;
break;
- case ISL_AUX_USAGE_GEN12_CCS_E:
- unreachable("Driver unprepared to handle this aux_usage.");
case ISL_AUX_USAGE_CCS_D:
case ISL_AUX_USAGE_CCS_E:
+ case ISL_AUX_USAGE_GEN12_CCS_E:
case ISL_AUX_USAGE_STC_CCS:
/* When CCS_E is used, we need to ensure that the CCS starts off in
* a valid state. From the Sky Lake PRM, "MCS Buffer for Render
iris_resource_destroy(&screen->base, res->base.next);
res->base.next = NULL;
+
+ map_aux_addresses(screen, res);
}
static struct pipe_resource *
/* Use linear for staging buffers */
if (templ->usage == PIPE_USAGE_STAGING ||
- templ->bind & (PIPE_BIND_LINEAR | PIPE_BIND_CURSOR) )
+ templ->bind & (PIPE_BIND_LINEAR | PIPE_BIND_CURSOR) ) {
tiling_flags = ISL_TILING_LINEAR_BIT;
- else if (templ->bind & PIPE_BIND_SCANOUT)
- tiling_flags = ISL_TILING_X_BIT;
+ } else if (templ->bind & PIPE_BIND_SCANOUT) {
+ if (devinfo->has_tiling_uapi)
+ tiling_flags = ISL_TILING_X_BIT;
+ else
+ tiling_flags = ISL_TILING_LINEAR_BIT;
+ }
}
isl_surf_usage_flags_t usage = pipe_bind_to_isl_usage(templ->bind);
struct iris_resource *res = iris_alloc_resource(pscreen, templ);
const struct isl_drm_modifier_info *mod_inf =
isl_drm_modifier_get_info(whandle->modifier);
- uint32_t tiling;
+ int tiling;
if (!res)
return NULL;
if (mod_inf)
tiling = isl_tiling_to_i915_tiling(mod_inf->tiling);
else
- tiling = I915_TILING_LAST + 1;
+ tiling = -1;
res->bo = iris_bo_import_dmabuf(bufmgr, whandle->handle,
tiling, whandle->stride);
break;
need_color_resolve =
(res->aux.usage == ISL_AUX_USAGE_CCS_D ||
- res->aux.usage == ISL_AUX_USAGE_CCS_E) &&
+ res->aux.usage == ISL_AUX_USAGE_CCS_E ||
+ res->aux.usage == ISL_AUX_USAGE_GEN12_CCS_E) &&
iris_has_color_unresolved(res, level, 1, box->z, box->depth);
need_resolve = need_color_resolve ||
if (fmtl->txc == ISL_TXC_ASTC)
no_gpu = true;
- if ((map_would_stall || res->aux.usage == ISL_AUX_USAGE_CCS_E) && !no_gpu) {
+ if ((map_would_stall ||
+ res->aux.usage == ISL_AUX_USAGE_CCS_E ||
+ res->aux.usage == ISL_AUX_USAGE_GEN12_CCS_E) && !no_gpu) {
/* If we need a synchronous mapping and the resource is busy, or needs
* resolving, we copy to/from a linear temporary buffer using the GPU.
*/