for attributes and varyings.
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4832>
for (unsigned i = 0; i < BIFROST_MAX_RENDER_TARGET_COUNT; i++)
state->blend_types[i] = bifrost_blend_type_from_nir(program.blend_types[i]);
- unsigned default_vec1_swizzle = panfrost_get_default_swizzle(1);
- unsigned default_vec2_swizzle = panfrost_get_default_swizzle(2);
- unsigned default_vec4_swizzle = panfrost_get_default_swizzle(4);
+ unsigned default_vec1_swizzle;
+ unsigned default_vec2_swizzle;
+ unsigned default_vec4_swizzle;
+
+ if (dev->quirks & HAS_SWIZZLES) {
+ default_vec1_swizzle = panfrost_get_default_swizzle(1);
+ default_vec2_swizzle = panfrost_get_default_swizzle(2);
+ default_vec4_swizzle = panfrost_get_default_swizzle(4);
+ } else {
+ default_vec1_swizzle = panfrost_bifrost_swizzle(1);
+ default_vec2_swizzle = panfrost_bifrost_swizzle(2);
+ default_vec4_swizzle = panfrost_bifrost_swizzle(4);
+ }
/* Record the varying mapping for the command stream's bookkeeping */
/* Set the type appropriately. TODO: Integer varyings XXX */
assert(o->stream == 0);
ovs[i].format = pan_xfb_format(o->num_components);
- ovs[i].swizzle = panfrost_get_default_swizzle(o->num_components);
+
+ if (device->quirks & HAS_SWIZZLES)
+ ovs[i].swizzle = panfrost_get_default_swizzle(o->num_components);
+ else
+ ovs[i].swizzle = panfrost_bifrost_swizzle(o->num_components);
/* Link to the fragment */
signed fs_idx = -1;
const struct pipe_vertex_element *elements)
{
struct panfrost_vertex_state *so = CALLOC_STRUCT(panfrost_vertex_state);
+ struct panfrost_device *dev = pan_device(pctx->screen);
so->num_elements = num_elements;
memcpy(so->pipe, elements, sizeof(*elements) * num_elements);
enum pipe_format fmt = elements[i].src_format;
const struct util_format_description *desc = util_format_description(fmt);
so->hw[i].unknown1 = 0x2;
- so->hw[i].swizzle = panfrost_translate_swizzle_4(desc->swizzle);
+
+ if (dev->quirks & HAS_SWIZZLES)
+ so->hw[i].swizzle = panfrost_translate_swizzle_4(desc->swizzle);
+ else
+ so->hw[i].swizzle = panfrost_bifrost_swizzle(desc->nr_channels);
so->hw[i].format = panfrost_find_format(desc);
}
/* Let's also prepare vertex builtins */
so->hw[PAN_VERTEX_ID].format = MALI_R32UI;
- so->hw[PAN_VERTEX_ID].swizzle = panfrost_get_default_swizzle(1);
+ if (dev->quirks & HAS_SWIZZLES)
+ so->hw[PAN_VERTEX_ID].swizzle = panfrost_get_default_swizzle(1);
+ else
+ so->hw[PAN_VERTEX_ID].swizzle = panfrost_bifrost_swizzle(1);
+
so->hw[PAN_INSTANCE_ID].format = MALI_R32UI;
- so->hw[PAN_INSTANCE_ID].swizzle = panfrost_get_default_swizzle(1);
+ if (dev->quirks & HAS_SWIZZLES)
+ so->hw[PAN_INSTANCE_ID].swizzle = panfrost_get_default_swizzle(1);
+ else
+ so->hw[PAN_INSTANCE_ID].swizzle = panfrost_bifrost_swizzle(1);
return so;
}
}
}
+static inline unsigned
+panfrost_bifrost_swizzle(unsigned components)
+{
+ /* Set all components to 0 and force w if needed */
+ return components < 4 ? 0x10 : 0x00;
+}
+
enum mali_format
panfrost_format_to_bifrost_blend(const struct util_format_description *desc);
/* What it says on the tin */
#define IS_BIFROST (1 << 3)
+/* What it says on the tin */
+#define HAS_SWIZZLES (1 << 4)
+
/* Quirk collections common to particular uarchs */
-#define MIDGARD_QUIRKS (MIDGARD_BROKEN_FP16)
+#define MIDGARD_QUIRKS (MIDGARD_BROKEN_FP16 | HAS_SWIZZLES)
#define BIFROST_QUIRKS (IS_BIFROST)
case 0x880:
return MIDGARD_QUIRKS;
+ case 0x6000: /* G71 */
+ return BIFROST_QUIRKS | HAS_SWIZZLES;
+
case 0x7093: /* G31 */
case 0x7212: /* G52 */
return BIFROST_QUIRKS;