When aux bo allocation fails, ilo_image_disable_aux() should be called to disable aux buffer.tags/11.0-branchpoint
@@ -1445,3 +1445,22 @@ ilo_image_init_for_imported(struct ilo_image *img, | |||
return true; | |||
} | |||
bool | |||
ilo_image_disable_aux(struct ilo_image *img, const struct ilo_dev *dev) | |||
{ | |||
/* HiZ is required for separate stencil on Gen6 */ | |||
if (ilo_dev_gen(dev) == ILO_GEN(6) && | |||
img->aux.type == ILO_IMAGE_AUX_HIZ && | |||
img->separate_stencil) | |||
return false; | |||
/* MCS is required for multisample images */ | |||
if (img->aux.type == ILO_IMAGE_AUX_MCS && | |||
img->sample_count > 1) | |||
return false; | |||
img->aux.enables = 0x0; | |||
return true; | |||
} |
@@ -164,10 +164,13 @@ ilo_image_init_for_imported(struct ilo_image *img, | |||
enum gen_surface_tiling tiling, | |||
unsigned bo_stride); | |||
bool | |||
ilo_image_disable_aux(struct ilo_image *img, const struct ilo_dev *dev); | |||
static inline bool | |||
ilo_image_can_enable_aux(const struct ilo_image *img, unsigned level) | |||
{ | |||
return (img->aux.bo && (img->aux.enables & (1 << level))); | |||
return (img->aux.enables & (1 << level)); | |||
} | |||
/** |
@@ -288,15 +288,13 @@ tex_alloc_bos(struct ilo_texture *tex) | |||
switch (tex->image.aux.type) { | |||
case ILO_IMAGE_AUX_HIZ: | |||
if (!tex_create_hiz(tex)) { | |||
/* Separate Stencil Buffer requires HiZ to be enabled */ | |||
if (ilo_dev_gen(&is->dev) == ILO_GEN(6) && | |||
tex->image.separate_stencil) | |||
return false; | |||
} | |||
if (!tex_create_hiz(tex) && | |||
!ilo_image_disable_aux(&tex->image, &is->dev)) | |||
return false; | |||
break; | |||
case ILO_IMAGE_AUX_MCS: | |||
if (!tex_create_mcs(tex)) | |||
if (!tex_create_mcs(tex) && | |||
!ilo_image_disable_aux(&tex->image, &is->dev)) | |||
return false; | |||
break; | |||
default: |