Re: [igt-dev] [RFC PATCH v10 4/6] lib: ioctl_wrappers: reach engines by index as well

Andi Shyti
2019-03-07T17:17:10Z

> I understand the loop itself works, but I wanted to find out how do I write
> a test which uses it and actually submits work.
>
> for_each_engine2(fd, ctx) {
> ...
> eb.flags = ???;
> eb.rsvd1 = ctx;
>
> gem_execbuf(fd, &eb);
> }
>
> What do I replace ??? with so the test works on old and new kernels?

I guess it would be:

index_map = 0;
for_each_engine2(fd, ctx) {
...
eb.flags = ++index_map;
eb.rsvd1 = ctx;

gem_execbuf(fd, &eb);
}

for_each_engine2 is just responsible for iterating through
engines. (*)

while for the current api it would be:

for_each_engine2(fd, 0) {
eb.flags = gem_class_instance_to_eb_flags(fd, e2__->class, e2__->instance));
eb.rsvd1 = 0;
}

There definitely are better way for doing the
for_each_engine(...) but I think this is the most consistent to
the way things are done now.

In my opinion, next step would be, indeed, to get rid of all
legacy and have a single for_each_engine(...) that works with
everything.

But for this, at my current understanding, we need some
re-architecturing of igt (and possibly using dynamic lists of
engines as Chris pointed out).

Once this patch gets in, I can start looking at the next steps,
but in one go, we would get everything in only at "[PATCH v1174]" :)

Andi

(*) Some extra code would be required to increment index_map
into the for_each_engine2(), Chris was suggesting, indeed, an
iter structure (or we can use some other 'C' tricks that would
make the code quite unreadable).