radv: Add logic for multisample format descriptions.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
Bas Nieuwenhuizen 2018-07-16 01:31:09 +02:00
parent 09c4a911e5
commit d3225e533f
4 changed files with 86 additions and 10 deletions

View File

@ -39,6 +39,8 @@ uint32_t radv_translate_buffer_dataformat(const struct vk_format_description *de
unsigned type;
int i;
assert(desc->layout != VK_FORMAT_LAYOUT_MULTIPLANE);
if (desc->format == VK_FORMAT_B10G11R11_UFLOAT_PACK32)
return V_008F0C_BUF_DATA_FORMAT_10_11_11;
@ -110,6 +112,8 @@ uint32_t radv_translate_buffer_dataformat(const struct vk_format_description *de
uint32_t radv_translate_buffer_numformat(const struct vk_format_description *desc,
int first_non_void)
{
assert(desc->layout != VK_FORMAT_LAYOUT_MULTIPLANE);
if (desc->format == VK_FORMAT_B10G11R11_UFLOAT_PACK32)
return V_008F0C_BUF_NUM_FORMAT_FLOAT;
@ -146,6 +150,8 @@ uint32_t radv_translate_tex_dataformat(VkFormat format,
bool uniform = true;
int i;
assert(vk_format_get_plane_count(format) == 1);
if (!desc)
return ~0;
/* Colorspace (return non-RGB formats directly). */
@ -371,6 +377,8 @@ uint32_t radv_translate_tex_numformat(VkFormat format,
const struct vk_format_description *desc,
int first_non_void)
{
assert(vk_format_get_plane_count(format) == 1);
switch (format) {
case VK_FORMAT_D24_UNORM_S8_UINT:
return V_008F14_IMG_NUM_FORMAT_UNORM;
@ -433,6 +441,9 @@ uint32_t radv_translate_color_numformat(VkFormat format,
int first_non_void)
{
unsigned ntype;
assert(vk_format_get_plane_count(format) == 1);
if (first_non_void == -1 || desc->channel[first_non_void].type == VK_FORMAT_TYPE_FLOAT)
ntype = V_028C70_NUMBER_FLOAT;
else {

View File

@ -74,7 +74,12 @@ enum vk_format_layout {
/**
* Everything else that doesn't fit in any of the above layouts.
*/
VK_FORMAT_LAYOUT_OTHER = 9
VK_FORMAT_LAYOUT_OTHER = 9,
/**
* Formats that contain multiple planes.
*/
VK_FORMAT_LAYOUT_MULTIPLANE = 10,
};
struct vk_format_block
@ -133,6 +138,11 @@ struct vk_format_description
unsigned char swizzle[4];
enum vk_format_colorspace colorspace;
unsigned plane_count:2;
unsigned width_divisor:2;
unsigned height_divisor:2;
VkFormat plane_formats[3];
};
extern const struct vk_format_description vk_format_description_table[];
@ -548,4 +558,28 @@ vk_format_get_nr_components(VkFormat format)
return desc->nr_channels;
}
static inline unsigned
vk_format_get_plane_count(VkFormat format)
{
const struct vk_format_description *desc = vk_format_description(format);
return desc->plane_count;
}
static inline VkFormat
vk_format_get_plane_format(VkFormat format, unsigned plane_id)
{
const struct vk_format_description *desc = vk_format_description(format);
if (desc->layout != VK_FORMAT_LAYOUT_MULTIPLANE) {
assert(plane_id == 0);
return format;
}
assert(plane_id < desc->plane_count);
return desc->plane_formats[plane_id];
}
#endif /* VK_FORMAT_H */

View File

@ -113,7 +113,7 @@ class Channel:
class Format:
'''Describe a pixel format.'''
def __init__(self, name, layout, block_width, block_height, le_channels, le_swizzles, be_channels, be_swizzles, colorspace):
def __init__(self, name, layout, block_width, block_height, le_channels, le_swizzles, be_channels, be_swizzles, colorspace, width_divisor, height_divisor, plane_formats):
self.name = name
self.layout = layout
self.block_width = block_width
@ -124,6 +124,13 @@ class Format:
self.be_swizzles = be_swizzles
self.name = name
self.colorspace = colorspace
self.plane_count = len(plane_formats)
self.width_divisor = width_divisor
self.height_divisor = height_divisor
self.plane_formats = plane_formats
while len(self.plane_formats) < 3:
self.plane_formats.append("VK_FORMAT_UNDEFINED")
def __str__(self):
return self.name
@ -334,6 +341,16 @@ def _parse_channels(fields, layout, colorspace, swizzles):
return channels
def parse_plane_divisor(format):
if format == '444':
return (1, 1)
elif format == '422':
return (2, 1)
elif format == '420':
return (2, 2)
else:
return (1, 1)
def parse(filename):
'''Parse the format description in CSV format in terms of the
Channel and Format classes above.'''
@ -354,10 +371,9 @@ def parse(filename):
fields = [field.strip() for field in line.split(',')]
if len (fields) < 10:
continue
if len (fields) == 10:
fields += fields[4:9]
assert len (fields) == 15
be_fields = fields[4:9]
name = fields[0]
layout = fields[1]
block_width, block_height = map(int, fields[2:4])
@ -366,8 +382,8 @@ def parse(filename):
le_swizzles = [_swizzle_parse_map[swizzle] for swizzle in fields[8]]
le_channels = _parse_channels(fields[4:8], layout, colorspace, le_swizzles)
be_swizzles = [_swizzle_parse_map[swizzle] for swizzle in fields[14]]
be_channels = _parse_channels(fields[10:14], layout, colorspace, be_swizzles)
be_swizzles = [_swizzle_parse_map[swizzle] for swizzle in be_fields[4]]
be_channels = _parse_channels(be_fields, layout, colorspace, be_swizzles)
le_shift = 0
for channel in le_channels:
@ -383,7 +399,18 @@ def parse(filename):
for i in range(4):
assert (le_swizzles[i] != SWIZZLE_NONE) == (be_swizzles[i] != SWIZZLE_NONE)
format = Format(name, layout, block_width, block_height, le_channels, le_swizzles, be_channels, be_swizzles, colorspace)
width_divisor = 1
height_divisor = 1
plane_formats = [name]
if layout == "multiplane":
plane_formats = []
(width_divisor, height_divisor) = parse_plane_divisor(fields[10])
for i in range(11, len(fields)):
plane_formats.append(fields[i])
assert (len(plane_formats) > 1)
format = Format(name, layout, block_width, block_height, le_channels, le_swizzles, be_channels, be_swizzles, colorspace, width_divisor, height_divisor, plane_formats)
formats.append(format)
return formats

View File

@ -140,9 +140,13 @@ def write_format_table(formats):
print_channels(format, do_channel_array)
print_channels(format, do_swizzle_array)
print(" %s," % (colorspace_map(format.colorspace),))
print(" %u,\t/* plane_count */" % (format.plane_count))
print(" %u,\t/* width_divisor */" % (format.width_divisor))
print(" %u,\t/* height_divisor */" % (format.height_divisor))
print(" {%s, %s, %s}," % (format.plane_formats[0], format.plane_formats[1], format.plane_formats[2]))
print("};")
print()
print("const struct vk_format_description *")
print("vk_format_description(VkFormat format)")
print("{")