xf86drm: Update drmGetFormatModifierNameFromArm to handle AFRC

Update drmGetFormatModifierNameFromArm function to handle AFRC
modifiers.

Signed-off-by: Dennis Tsiang <dennis.tsiang@arm.com>
main
Dennis Tsiang 2021-09-22 14:53:50 +01:00
parent d2875fe008
commit bd26b61cff
2 changed files with 85 additions and 21 deletions

View File

@ -64,7 +64,7 @@ static const struct drmFormatModifierInfo drm_format_modifier_table[] = {
for entry in fm_re['others']: for entry in fm_re['others']:
(vendor, mod) = entry.split('_', 1) (vendor, mod) = entry.split('_', 1)
if vendor == 'ARM' and (mod == 'TYPE_AFBC' or mod == 'TYPE_MISC'): if vendor == 'ARM' and (mod == 'TYPE_AFBC' or mod == 'TYPE_MISC' or mod == 'TYPE_AFRC'):
continue continue
print_fm(f, vendor, mod, mod) print_fm(f, vendor, mod, mod)

104
xf86drm.c
View File

@ -210,30 +210,16 @@ static bool is_x_t_amd_gfx9_tile(uint64_t tile)
return false; return false;
} }
static char * static bool
drmGetFormatModifierNameFromArm(uint64_t modifier) drmGetAfbcFormatModifierNameFromArm(uint64_t modifier, FILE *fp)
{ {
uint64_t type = (modifier >> 52) & 0xf;
uint64_t mode_value = modifier & AFBC_FORMAT_MOD_MODE_VALUE_MASK; uint64_t mode_value = modifier & AFBC_FORMAT_MOD_MODE_VALUE_MASK;
uint64_t block_size = mode_value & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK; uint64_t block_size = mode_value & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK;
FILE *fp;
char *modifier_name = NULL;
size_t size = 0;
unsigned int i;
const char *block = NULL; const char *block = NULL;
const char *mode = NULL; const char *mode = NULL;
bool did_print_mode = false; bool did_print_mode = false;
/* misc type is already handled by the static table */
if (type != DRM_FORMAT_MOD_ARM_TYPE_AFBC)
return NULL;
fp = open_memstream(&modifier_name, &size);
if (!fp)
return NULL;
/* add block, can only have a (single) block */ /* add block, can only have a (single) block */
switch (block_size) { switch (block_size) {
case AFBC_FORMAT_MOD_BLOCK_SIZE_16x16: case AFBC_FORMAT_MOD_BLOCK_SIZE_16x16:
@ -251,15 +237,13 @@ drmGetFormatModifierNameFromArm(uint64_t modifier)
} }
if (!block) { if (!block) {
fclose(fp); return false;
free(modifier_name);
return NULL;
} }
fprintf(fp, "BLOCK_SIZE=%s,", block); fprintf(fp, "BLOCK_SIZE=%s,", block);
/* add mode */ /* add mode */
for (i = 0; i < ARRAY_SIZE(arm_mode_value_table); i++) { for (unsigned int i = 0; i < ARRAY_SIZE(arm_mode_value_table); i++) {
if (arm_mode_value_table[i].modifier & mode_value) { if (arm_mode_value_table[i].modifier & mode_value) {
mode = arm_mode_value_table[i].modifier_name; mode = arm_mode_value_table[i].modifier_name;
if (!did_print_mode) { if (!did_print_mode) {
@ -271,7 +255,87 @@ drmGetFormatModifierNameFromArm(uint64_t modifier)
} }
} }
return true;
}
static bool
drmGetAfrcFormatModifierNameFromArm(uint64_t modifier, FILE *fp)
{
for (unsigned int i = 0; i < 2; ++i) {
uint64_t coding_unit_block =
(modifier >> (i * 4)) & AFRC_FORMAT_MOD_CU_SIZE_MASK;
const char *coding_unit_size = NULL;
switch (coding_unit_block) {
case AFRC_FORMAT_MOD_CU_SIZE_16:
coding_unit_size = "CU_16";
break;
case AFRC_FORMAT_MOD_CU_SIZE_24:
coding_unit_size = "CU_24";
break;
case AFRC_FORMAT_MOD_CU_SIZE_32:
coding_unit_size = "CU_32";
break;
}
if (!coding_unit_size) {
if (i == 0) {
return false;
}
break;
}
if (i == 0) {
fprintf(fp, "P0=%s,", coding_unit_size);
} else {
fprintf(fp, "P12=%s,", coding_unit_size);
}
}
bool scan_layout =
(modifier & AFRC_FORMAT_MOD_LAYOUT_SCAN) == AFRC_FORMAT_MOD_LAYOUT_SCAN;
if (scan_layout) {
fprintf(fp, "SCAN");
} else {
fprintf(fp, "ROT");
}
return true;
}
static char *
drmGetFormatModifierNameFromArm(uint64_t modifier)
{
uint64_t type = (modifier >> 52) & 0xf;
FILE *fp;
size_t size = 0;
char *modifier_name = NULL;
bool result = false;
fp = open_memstream(&modifier_name, &size);
if (!fp)
return NULL;
switch (type) {
case DRM_FORMAT_MOD_ARM_TYPE_AFBC:
result = drmGetAfbcFormatModifierNameFromArm(modifier, fp);
break;
case DRM_FORMAT_MOD_ARM_TYPE_AFRC:
result = drmGetAfrcFormatModifierNameFromArm(modifier, fp);
break;
/* misc type is already handled by the static table */
case DRM_FORMAT_MOD_ARM_TYPE_MISC:
default:
result = false;
break;
}
fclose(fp); fclose(fp);
if (!result) {
free(modifier_name);
return NULL;
}
return modifier_name; return modifier_name;
} }