return so;
}
-/* Assigns a vertex buffer for a given (index, divisor) tuple */
-
-static unsigned
-pan_assign_vertex_buffer(struct pan_vertex_buffer *buffers,
- unsigned *nr_bufs,
- unsigned vbi,
- unsigned divisor)
-{
- /* Look up the buffer */
- for (unsigned i = 0; i < (*nr_bufs); ++i) {
- if (buffers[i].vbi == vbi && buffers[i].divisor == divisor)
- return i;
- }
-
- /* Else, create a new buffer */
- unsigned idx = (*nr_bufs)++;
-
- buffers[idx] = (struct pan_vertex_buffer) {
- .vbi = vbi,
- .divisor = divisor
- };
-
- return idx;
-}
-
static void *
panfrost_create_vertex_elements_state(
struct pipe_context *pctx,
unsigned active_variant;
};
+/** (Vertex buffer index, divisor) tuple that will become an Attribute Buffer
+ * Descriptor at draw-time on Midgard
+ */
struct pan_vertex_buffer {
unsigned vbi;
unsigned divisor;
unsigned formats[PIPE_MAX_ATTRIBS];
};
+unsigned
+pan_assign_vertex_buffer(struct pan_vertex_buffer *buffers,
+ unsigned *nr_bufs,
+ unsigned vbi,
+ unsigned divisor);
+
struct panfrost_zsa_state;
struct panfrost_sampler_state;
struct panfrost_sampler_view;
return out;
}
+/**
+ * Given an (index, divisor) tuple, assign a vertex buffer. Midgard and
+ * Bifrost put divisor information on the attribute buffer descriptor, so this
+ * is the most we can compact in general. Crucially, this runs at vertex
+ * elements CSO create time, not at draw time.
+ */
+unsigned
+pan_assign_vertex_buffer(struct pan_vertex_buffer *buffers,
+ unsigned *nr_bufs,
+ unsigned vbi,
+ unsigned divisor)
+{
+ /* Look up the buffer */
+ for (unsigned i = 0; i < (*nr_bufs); ++i) {
+ if (buffers[i].vbi == vbi && buffers[i].divisor == divisor)
+ return i;
+ }
+
+ /* Else, create a new buffer */
+ unsigned idx = (*nr_bufs)++;
+
+ buffers[idx] = (struct pan_vertex_buffer) {
+ .vbi = vbi,
+ .divisor = divisor
+ };
+
+ return idx;
+}