unreachable("Invalid format");
}
- cfg.fixed_function.conversion.memory_format.srgb =
- desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB;
-
- cfg.fixed_function.conversion.memory_format.format =
+ cfg.fixed_function.conversion.memory_format =
panfrost_format_to_bifrost_blend(dev, desc, true);
}
* num_comps must be set to 4
*/
cfg.bifrost.internal.fixed_function.num_comps = 4;
- cfg.bifrost.internal.fixed_function.conversion.memory_format.format =
+ cfg.bifrost.internal.fixed_function.conversion.memory_format =
panfrost_format_to_bifrost_blend(dev, format_desc, true);
- if (dev->quirks & HAS_SWIZZLES) {
- cfg.bifrost.internal.fixed_function.conversion.memory_format.swizzle =
- panfrost_get_default_swizzle(4);
- }
cfg.bifrost.internal.fixed_function.conversion.register_format =
fs->blend_types[i];
}
<value name="Force Late" value="3"/>
</enum>
- <struct name="Pixel Format" no-direct-packing="true">
- <field name="RGB Component Order" size="8" start="0" type="RGB Component Order"/>
- <field name="YUV Component Order" size="3" start="0" type="YUV Swizzle"/>
- <field name="YUV Component Swap" size="1" start="3" type="bool"/>
- <field name="YUV Cr Siting" size="3" start="0" type="YUV Cr Siting"/>
- <field name="Swizzle" size="12" start="0" type="uint"/>
- <field name="Format" size="8" start="12" type="Format"/>
- <field name="sRGB" size="1" start="20" type="bool"/>
- <field name="Big Endian" size="1" start="21" type="bool"/>
- </struct>
-
<enum name="Block Format">
<!--- 16x16 block u-interleaved -->
<value name="Tiled U-Interleaved" value="0"/>
</struct>
<struct name="Bifrost Internal Conversion" size="1">
- <field name="Memory Format" size="22" start="0" type="Pixel Format"/>
+ <field name="Memory Format" size="22" start="0" type="uint"/>
<field name="Raw" size="1" start="22" type="bool"/>
<field name="Register Format" size="3" start="24" type="Bifrost Register File Format"/>
</struct>
cfg.bifrost.equation.alpha.c = MALI_BLEND_OPERAND_C_ZERO;
cfg.bifrost.equation.color_mask = 0xf;
cfg.bifrost.internal.fixed_function.num_comps = 4;
- cfg.bifrost.internal.fixed_function.conversion.memory_format.format =
+ cfg.bifrost.internal.fixed_function.conversion.memory_format =
panfrost_format_to_bifrost_blend(pool->dev, format_desc, true);
cfg.bifrost.internal.fixed_function.conversion.register_format =
blit_type_to_reg_fmt(T);
cfg.bifrost.internal.fixed_function.rt = rt;
- if (pool->dev->quirks & HAS_SWIZZLES) {
- cfg.bifrost.internal.fixed_function.conversion.memory_format.swizzle =
- panfrost_get_default_swizzle(4);
- }
}
}
}
#include <stdio.h>
#include "midgard_pack.h"
#include "pan_texture.h"
+#include "panfrost-quirks.h"
/* Convenience */
}
}
-enum mali_format
+unsigned
panfrost_format_to_bifrost_blend(const struct panfrost_device *dev,
const struct util_format_description *desc, bool dither)
{
/* Formats requiring blend shaders are stored raw in the tilebuffer */
if (!fmt.internal)
- return MALI_EXTRACT_INDEX(dev->formats[desc->format].hw);
+ return dev->formats[desc->format].hw;
+
+ unsigned extra = 0;
+
+ if (dev->quirks & HAS_SWIZZLES)
+ extra |= panfrost_get_default_swizzle(4);
+
+ if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
+ extra |= 1 << 20;
/* Else, pick the pixel format matching the tilebuffer format */
switch (fmt.internal) {
- case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A8:
- return MALI_RGBA8_TB;
-
- case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R10G10B10A2:
- return MALI_RGB10_A2_TB;
+#define TB_FORMAT(in, out) \
+ case MALI_COLOR_BUFFER_INTERNAL_FORMAT_ ## in: \
+ return (MALI_ ## out << 12) | extra
- case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A2:
- return dither ? MALI_RGB8_A2_AU : MALI_RGB8_A2_PU;
+#define TB_FORMAT_DITHER(in, out) \
+ case MALI_COLOR_BUFFER_INTERNAL_FORMAT_ ## in: \
+ return ((dither ? MALI_ ## out ## _AU : MALI_ ## out ## _PU) << 12) | extra
- case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R4G4B4A4:
- return dither ? MALI_RGBA4_AU : MALI_RGBA4_PU;
+ TB_FORMAT(R8G8B8A8, RGBA8_TB);
+ TB_FORMAT(R10G10B10A2, RGB10_A2_TB);
+ TB_FORMAT_DITHER(R8G8B8A2, RGB8_A2);
+ TB_FORMAT_DITHER(R4G4B4A4, RGBA4);
+ TB_FORMAT_DITHER(R5G6B5A0, R5G6B5);
+ TB_FORMAT_DITHER(R5G5B5A1, RGB5_A1);
- case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G6B5A0:
- return dither ? MALI_R5G6B5_AU : MALI_R5G6B5_PU;
+#undef TB_FORMAT_DITHER
+#undef TB_FORMAT
- case MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G5B5A1:
- return dither ? MALI_RGB5_A1_AU : MALI_RGB5_A1_PU;
default:
unreachable("invalid internal blendable");
}
return components < 4 ? 0x10 : 0x00;
}
-enum mali_format
+unsigned
panfrost_format_to_bifrost_blend(const struct panfrost_device *dev,
const struct util_format_description *desc,
bool dither);