i965: Advertise the CCS modifier
v2: Rename modifier to be more smart (Jason) FINISHME: Use the kernel's final choice for the fb modifier bwidawsk@norris2:~/intel-gfx/kmscube (modifiers $) ~/scripts/measure_bandwidth.sh ./kmscube none Read bandwidth: 603.91 MiB/s Write bandwidth: 615.28 MiB/s bwidawsk@norris2:~/intel-gfx/kmscube (modifiers $) ~/scripts/measure_bandwidth.sh ./kmscube ytile Read bandwidth: 571.13 MiB/s Write bandwidth: 555.51 MiB/s bwidawsk@norris2:~/intel-gfx/kmscube (modifiers $) ~/scripts/measure_bandwidth.sh ./kmscube ccs Read bandwidth: 259.34 MiB/s Write bandwidth: 337.83 MiB/s v2: Move all references to the new fourcc code(s) to this patch. v3: Rebase, remove Yf_CCS (Daniel) Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> Acked-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Chad Versace <chadversary@chromium.org>
This commit is contained in:

committed by
Jason Ekstrand

parent
51600b8489
commit
1efd73df39
@@ -294,14 +294,43 @@ static const struct {
|
|||||||
{ .modifier = DRM_FORMAT_MOD_LINEAR , .since_gen = 1 },
|
{ .modifier = DRM_FORMAT_MOD_LINEAR , .since_gen = 1 },
|
||||||
{ .modifier = I915_FORMAT_MOD_X_TILED , .since_gen = 1 },
|
{ .modifier = I915_FORMAT_MOD_X_TILED , .since_gen = 1 },
|
||||||
{ .modifier = I915_FORMAT_MOD_Y_TILED , .since_gen = 6 },
|
{ .modifier = I915_FORMAT_MOD_Y_TILED , .since_gen = 6 },
|
||||||
|
{ .modifier = I915_FORMAT_MOD_Y_TILED_CCS , .since_gen = 9 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
modifier_is_supported(const struct gen_device_info *devinfo,
|
modifier_is_supported(const struct gen_device_info *devinfo,
|
||||||
|
struct intel_image_format *fmt, int dri_format,
|
||||||
uint64_t modifier)
|
uint64_t modifier)
|
||||||
{
|
{
|
||||||
|
const struct isl_drm_modifier_info *modinfo =
|
||||||
|
isl_drm_modifier_get_info(modifier);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* ISL had better know about the modifier */
|
||||||
|
if (!modinfo)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (modinfo->aux_usage == ISL_AUX_USAGE_CCS_E) {
|
||||||
|
/* If INTEL_DEBUG=norbc is set, don't support any CCS_E modifiers */
|
||||||
|
if (unlikely(INTEL_DEBUG & DEBUG_NO_RBC))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* CCS_E is not supported for planar images */
|
||||||
|
if (fmt && fmt->nplanes > 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (fmt) {
|
||||||
|
assert(dri_format == 0);
|
||||||
|
dri_format = fmt->planes[0].dri_format;
|
||||||
|
}
|
||||||
|
|
||||||
|
mesa_format format = driImageFormatToGLFormat(dri_format);
|
||||||
|
format = _mesa_get_srgb_format_linear(format);
|
||||||
|
if (!isl_format_supports_ccs_e(devinfo,
|
||||||
|
brw_isl_format_for_mesa_format(format)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(supported_modifiers); i++) {
|
for (i = 0; i < ARRAY_SIZE(supported_modifiers); i++) {
|
||||||
if (supported_modifiers[i].modifier != modifier)
|
if (supported_modifiers[i].modifier != modifier)
|
||||||
continue;
|
continue;
|
||||||
@@ -561,6 +590,7 @@ enum modifier_priority {
|
|||||||
MODIFIER_PRIORITY_LINEAR,
|
MODIFIER_PRIORITY_LINEAR,
|
||||||
MODIFIER_PRIORITY_X,
|
MODIFIER_PRIORITY_X,
|
||||||
MODIFIER_PRIORITY_Y,
|
MODIFIER_PRIORITY_Y,
|
||||||
|
MODIFIER_PRIORITY_Y_CCS,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint64_t priority_to_modifier[] = {
|
const uint64_t priority_to_modifier[] = {
|
||||||
@@ -568,20 +598,25 @@ const uint64_t priority_to_modifier[] = {
|
|||||||
[MODIFIER_PRIORITY_LINEAR] = DRM_FORMAT_MOD_LINEAR,
|
[MODIFIER_PRIORITY_LINEAR] = DRM_FORMAT_MOD_LINEAR,
|
||||||
[MODIFIER_PRIORITY_X] = I915_FORMAT_MOD_X_TILED,
|
[MODIFIER_PRIORITY_X] = I915_FORMAT_MOD_X_TILED,
|
||||||
[MODIFIER_PRIORITY_Y] = I915_FORMAT_MOD_Y_TILED,
|
[MODIFIER_PRIORITY_Y] = I915_FORMAT_MOD_Y_TILED,
|
||||||
|
[MODIFIER_PRIORITY_Y_CCS] = I915_FORMAT_MOD_Y_TILED_CCS,
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint64_t
|
static uint64_t
|
||||||
select_best_modifier(struct gen_device_info *devinfo,
|
select_best_modifier(struct gen_device_info *devinfo,
|
||||||
|
int dri_format,
|
||||||
const uint64_t *modifiers,
|
const uint64_t *modifiers,
|
||||||
const unsigned count)
|
const unsigned count)
|
||||||
{
|
{
|
||||||
enum modifier_priority prio = MODIFIER_PRIORITY_INVALID;
|
enum modifier_priority prio = MODIFIER_PRIORITY_INVALID;
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
if (!modifier_is_supported(devinfo, modifiers[i]))
|
if (!modifier_is_supported(devinfo, NULL, dri_format, modifiers[i]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch (modifiers[i]) {
|
switch (modifiers[i]) {
|
||||||
|
case I915_FORMAT_MOD_Y_TILED_CCS:
|
||||||
|
prio = MAX2(prio, MODIFIER_PRIORITY_Y_CCS);
|
||||||
|
break;
|
||||||
case I915_FORMAT_MOD_Y_TILED:
|
case I915_FORMAT_MOD_Y_TILED:
|
||||||
prio = MAX2(prio, MODIFIER_PRIORITY_Y);
|
prio = MAX2(prio, MODIFIER_PRIORITY_Y);
|
||||||
break;
|
break;
|
||||||
@@ -631,7 +666,8 @@ intel_create_image_common(__DRIscreen *dri_screen,
|
|||||||
if (modifier == DRM_FORMAT_MOD_INVALID) {
|
if (modifier == DRM_FORMAT_MOD_INVALID) {
|
||||||
if (modifiers) {
|
if (modifiers) {
|
||||||
/* User requested specific modifiers */
|
/* User requested specific modifiers */
|
||||||
modifier = select_best_modifier(&screen->devinfo, modifiers, count);
|
modifier = select_best_modifier(&screen->devinfo, format,
|
||||||
|
modifiers, count);
|
||||||
if (modifier == DRM_FORMAT_MOD_INVALID)
|
if (modifier == DRM_FORMAT_MOD_INVALID)
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
@@ -879,7 +915,7 @@ intel_create_image_from_fds_common(__DRIscreen *dri_screen,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (modifier != DRM_FORMAT_MOD_INVALID &&
|
if (modifier != DRM_FORMAT_MOD_INVALID &&
|
||||||
!modifier_is_supported(&screen->devinfo, modifier))
|
!modifier_is_supported(&screen->devinfo, f, 0, modifier))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (f->nplanes == 1)
|
if (f->nplanes == 1)
|
||||||
@@ -1135,7 +1171,7 @@ intel_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max,
|
|||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(supported_modifiers); i++) {
|
for (i = 0; i < ARRAY_SIZE(supported_modifiers); i++) {
|
||||||
uint64_t modifier = supported_modifiers[i].modifier;
|
uint64_t modifier = supported_modifiers[i].modifier;
|
||||||
if (!modifier_is_supported(&screen->devinfo, modifier))
|
if (!modifier_is_supported(&screen->devinfo, f, 0, modifier))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
num_mods++;
|
num_mods++;
|
||||||
|
Reference in New Issue
Block a user