xf86drm: Update drmGetFormatModifierNameFromArm to handle AFRC
Update drmGetFormatModifierNameFromArm function to handle AFRC modifiers. Signed-off-by: Dennis Tsiang <dennis.tsiang@arm.com>main
parent
d2875fe008
commit
bd26b61cff
|
@ -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
104
xf86drm.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue