All CSF does is replace the old Job Manager frontend with the Command Stream Frontend, so rather than having job description structures statically allocated, they are built up by a command stream that is Turing complete. An MCU is added to make this work better.
So previously there was (very simplified, and not how the driver actually does things, and the pointers should be GPU pointers):
struct job {
struct job *next;
};
struct vertex_job {
struct job header;
uint32_t num_vertices;
};
struct vertex_job my_vertex_jobs[] = {
{
.header.next = &my_vertex_jobs[1].header,
.num_vertices = 3,
},
{
.num_vertices = 10,
},
};
and now we have (again, simplified and not how things actually work):
uint64_t commands[] = {
CMD_MOV_32(NUM_VERTICES, 3),
CMD_VERTEX_JOB,
CMD_MOV_32(NUM_VERTICES, 10),
CMD_VERTEX_JOB,
};
That is a big change, yes, and one that affects the driver a lot, but most of the rest of the GPU is unchanged, and I suspect that the old vertex_job
struct still exists behind the scenes.
Even from the driver side, I have made CSF mostly look like the old way of doing things, so the same code can often be used for both non-CSF and CSF GPUs.
Apart from one bug that can affect programs drawing a lot of vertices (so far I’ve only hit this in one Xscreensaver demo), most of the current driver shortcomings can be blamed on kbase
rather than CSF.