ac,radv,radeonsi: add a helper to translate buffer dataformat
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29236>
This commit is contained in:
committed by
Marge Bot
parent
5d9bdb6410
commit
0697452f57
@@ -41,3 +41,77 @@ ac_translate_buffer_numformat(const struct util_format_description *desc,
|
||||
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t
|
||||
ac_translate_buffer_dataformat(const struct util_format_description *desc,
|
||||
int first_non_void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
|
||||
return V_008F0C_BUF_DATA_FORMAT_10_11_11;
|
||||
|
||||
assert(first_non_void >= 0);
|
||||
|
||||
if (desc->nr_channels == 4 && desc->channel[0].size == 10 && desc->channel[1].size == 10 &&
|
||||
desc->channel[2].size == 10 && desc->channel[3].size == 2)
|
||||
return V_008F0C_BUF_DATA_FORMAT_2_10_10_10;
|
||||
|
||||
/* See whether the components are of the same size. */
|
||||
for (i = 0; i < desc->nr_channels; i++) {
|
||||
if (desc->channel[first_non_void].size != desc->channel[i].size)
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
}
|
||||
|
||||
switch (desc->channel[first_non_void].size) {
|
||||
case 8:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
case 3: /* 3 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_8;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_8_8;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_8_8_8_8;
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
case 3: /* 3 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_16;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_16_16;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_16_16_16_16;
|
||||
}
|
||||
break;
|
||||
case 32:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
case 3:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
|
||||
}
|
||||
break;
|
||||
case 64:
|
||||
/* Legacy double formats. */
|
||||
switch (desc->nr_channels) {
|
||||
case 1: /* 1 load */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
case 2: /* 1 load */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
|
||||
case 3: /* 3 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
case 4: /* 2 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,10 @@ uint32_t
|
||||
ac_translate_buffer_numformat(const struct util_format_description *desc,
|
||||
int first_non_void);
|
||||
|
||||
uint32_t
|
||||
ac_translate_buffer_dataformat(const struct util_format_description *desc,
|
||||
int first_non_void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -29,76 +29,9 @@
|
||||
uint32_t
|
||||
radv_translate_buffer_dataformat(const struct util_format_description *desc, int first_non_void)
|
||||
{
|
||||
unsigned type;
|
||||
int i;
|
||||
|
||||
assert(util_format_get_num_planes(desc->format) == 1);
|
||||
|
||||
if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
|
||||
return V_008F0C_BUF_DATA_FORMAT_10_11_11;
|
||||
|
||||
assert(first_non_void >= 0);
|
||||
|
||||
type = desc->channel[first_non_void].type;
|
||||
|
||||
if (type == UTIL_FORMAT_TYPE_FIXED)
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
if (desc->nr_channels == 4 && desc->channel[0].size == 10 && desc->channel[1].size == 10 &&
|
||||
desc->channel[2].size == 10 && desc->channel[3].size == 2)
|
||||
return V_008F0C_BUF_DATA_FORMAT_2_10_10_10;
|
||||
|
||||
/* See whether the components are of the same size. */
|
||||
for (i = 0; i < desc->nr_channels; i++) {
|
||||
if (desc->channel[first_non_void].size != desc->channel[i].size)
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
}
|
||||
|
||||
switch (desc->channel[first_non_void].size) {
|
||||
case 8:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
return V_008F0C_BUF_DATA_FORMAT_8;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_8_8;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_8_8_8_8;
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
return V_008F0C_BUF_DATA_FORMAT_16;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_16_16;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_16_16_16_16;
|
||||
}
|
||||
break;
|
||||
case 32:
|
||||
/* From the Southern Islands ISA documentation about MTBUF:
|
||||
* 'Memory reads of data in memory that is 32 or 64 bits do not
|
||||
* undergo any format conversion.'
|
||||
*/
|
||||
if (type != UTIL_FORMAT_TYPE_FLOAT && !desc->channel[first_non_void].pure_integer)
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
case 3:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
|
||||
}
|
||||
break;
|
||||
case 64:
|
||||
if (type != UTIL_FORMAT_TYPE_FLOAT && desc->nr_channels == 1)
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
}
|
||||
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
return ac_translate_buffer_dataformat(desc, first_non_void);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
@@ -505,11 +438,46 @@ radv_is_storage_image_format_supported(const struct radv_physical_device *pdev,
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
radv_is_buffer_dataformat_supported(const struct util_format_description *desc, int first_non_void)
|
||||
{
|
||||
uint32_t data_format, type;
|
||||
|
||||
data_format = ac_translate_buffer_dataformat(desc, first_non_void);
|
||||
if (data_format == V_008F0C_BUF_DATA_FORMAT_INVALID)
|
||||
return false;
|
||||
|
||||
assert(first_non_void >= 0);
|
||||
|
||||
type = desc->channel[first_non_void].type;
|
||||
|
||||
if (type == UTIL_FORMAT_TYPE_FIXED)
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
|
||||
if (desc->channel[first_non_void].size <= 16 && desc->nr_channels == 3 &&
|
||||
desc->format != PIPE_FORMAT_R11G11B10_FLOAT)
|
||||
return false;
|
||||
|
||||
/* From the Southern Islands ISA documentation about MTBUF:
|
||||
* 'Memory reads of data in memory that is 32 or 64 bits do not
|
||||
* undergo any format conversion.'
|
||||
*/
|
||||
if (desc->channel[first_non_void].size == 32 && type != UTIL_FORMAT_TYPE_FLOAT &&
|
||||
!desc->channel[first_non_void].pure_integer)
|
||||
return false;
|
||||
|
||||
if (desc->channel[first_non_void].size == 64 && (type == UTIL_FORMAT_TYPE_FLOAT || desc->nr_channels != 1))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
radv_is_buffer_format_supported(VkFormat format, bool *scaled)
|
||||
{
|
||||
const struct util_format_description *desc = vk_format_description(format);
|
||||
unsigned data_format, num_format;
|
||||
unsigned num_format;
|
||||
|
||||
if (format == VK_FORMAT_UNDEFINED)
|
||||
return false;
|
||||
|
||||
@@ -517,8 +485,7 @@ radv_is_buffer_format_supported(VkFormat format, bool *scaled)
|
||||
if (first_non_void < 0)
|
||||
return false;
|
||||
|
||||
data_format = radv_translate_buffer_dataformat(desc, first_non_void);
|
||||
if (data_format == V_008F0C_BUF_DATA_FORMAT_INVALID)
|
||||
if (!radv_is_buffer_dataformat_supported(desc, first_non_void))
|
||||
return false;
|
||||
|
||||
num_format = radv_translate_buffer_numformat(desc, first_non_void);
|
||||
|
||||
@@ -2460,76 +2460,9 @@ static uint32_t si_translate_buffer_dataformat(struct pipe_screen *screen,
|
||||
const struct util_format_description *desc,
|
||||
int first_non_void)
|
||||
{
|
||||
int i;
|
||||
|
||||
assert(((struct si_screen *)screen)->info.gfx_level <= GFX9);
|
||||
|
||||
if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
|
||||
return V_008F0C_BUF_DATA_FORMAT_10_11_11;
|
||||
|
||||
assert(first_non_void >= 0);
|
||||
|
||||
if (desc->nr_channels == 4 && desc->channel[0].size == 10 && desc->channel[1].size == 10 &&
|
||||
desc->channel[2].size == 10 && desc->channel[3].size == 2)
|
||||
return V_008F0C_BUF_DATA_FORMAT_2_10_10_10;
|
||||
|
||||
/* See whether the components are of the same size. */
|
||||
for (i = 0; i < desc->nr_channels; i++) {
|
||||
if (desc->channel[first_non_void].size != desc->channel[i].size)
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
}
|
||||
|
||||
switch (desc->channel[first_non_void].size) {
|
||||
case 8:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
case 3: /* 3 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_8;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_8_8;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_8_8_8_8;
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
case 3: /* 3 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_16;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_16_16;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_16_16_16_16;
|
||||
}
|
||||
break;
|
||||
case 32:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32;
|
||||
case 2:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
case 3:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32;
|
||||
case 4:
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
|
||||
}
|
||||
break;
|
||||
case 64:
|
||||
/* Legacy double formats. */
|
||||
switch (desc->nr_channels) {
|
||||
case 1: /* 1 load */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
case 2: /* 1 load */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
|
||||
case 3: /* 3 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32;
|
||||
case 4: /* 2 loads */
|
||||
return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return V_008F0C_BUF_DATA_FORMAT_INVALID;
|
||||
return ac_translate_buffer_dataformat(desc, first_non_void);
|
||||
}
|
||||
|
||||
static uint32_t si_translate_buffer_numformat(struct pipe_screen *screen,
|
||||
|
||||
Reference in New Issue
Block a user