WEBVTT 00:00.000 --> 00:15.440 Okay, thank you for attending this talk. My name is Juan Suarez, I'm a sobering 00:15.440 --> 00:21.000 generator working at the area. It's typically in the graphic steam where we are working 00:21.000 --> 00:29.960 mainly on driver developments. In my case, I've involved with MSA for since 2016, I was 00:29.960 --> 00:36.440 10 years, well, 10 years out of 3. First, involved with the interdrivers, with all I-965 00:36.440 --> 00:43.080 drive, which is now totally degraded, and later moved to work with the Raspberry Pi drivers 00:43.080 --> 00:53.400 with Chema in the Raspberry Pi 1 to 5, and I've been working a ringman a year for several 00:53.480 --> 01:02.840 misoblices. So, what's the motivation of all this talk? Well, maybe during the years, there was 01:02.840 --> 01:10.520 several talks, this kind of topics related with Mr. For instance, the words like talks about 01:10.520 --> 01:15.560 status updates on the drivers like Chema did now, and there was some talks about the 01:15.560 --> 01:20.520 pretty components of Mr. Like the one that faced this morning, but actually there was never 01:21.480 --> 01:27.640 you know, you talk about exactly what is Mr. And I mean, I know that probably a lot of people 01:27.640 --> 01:32.600 are already know how what is Mr. But in the graphics, there are probably people working with 01:34.200 --> 01:41.080 and there that doesn't know exactly how Mr. What's behind colors. So, equally interesting to 01:41.080 --> 01:47.560 explain them, not so to the brother Owens in the internet, that is watching this talk. So, 01:48.520 --> 01:54.120 that's the reason why we are giving this talk, and hopefully at the end, you get a better 01:54.120 --> 02:00.040 year how Mr. Works, and if you are not contributing to Mr. Maybe you are getting motivated 02:00.040 --> 02:07.640 for you to contribute. So, this is more or less the outline of the talk, we are going to start with 02:07.640 --> 02:13.640 a spend difference between users, paying some current space drivers, which is part of the 02:13.720 --> 02:20.440 repair and for Mr. Then Abit of History. So, we have this, Mr. What is the, why Mr. Is, 02:23.000 --> 02:30.680 has the key to have nowadays? Then Abit of technical discussion on what is the architecture, 02:30.680 --> 02:36.280 the main components, showing us more than a sample of what happens, we had curtains like when 02:36.360 --> 02:43.000 you draw something, what is happening until the pixels end up, so in the display. 02:44.440 --> 02:49.960 And then at the end Abit of, like, how we are in Mr. Testament, all of these things, 02:49.960 --> 02:53.960 and how you can contribute and for conclusions. So, 02:56.920 --> 03:02.680 different between current space and the user space driver. Well, when we used to think 03:02.680 --> 03:08.040 out of the driver, we think about this very small piece of code that is running on the 03:08.040 --> 03:13.640 corner, and that basically helps to interact with a hardware like this, or if you be a driver or 03:13.640 --> 03:20.840 whatever. And in the case of GPUs is not different, I mean, in the case of GPUs also you need a 03:20.840 --> 03:28.360 driver to handle the, to interact with the hardware itself. The big difference is that the 03:28.920 --> 03:35.960 GPUs are really, really big monsters. These are very complex devices to, to work with. 03:36.920 --> 03:43.000 Just in a sample, you check the programming manual of the internal skylic, which is a GPU 03:43.000 --> 03:50.040 from 3 years ago, and there is not much, much powerful one in the market. Yeah, basically, 03:50.040 --> 03:56.280 the, this, the, the, the performance is like six, how some page long. So, and there is a lot of 03:56.360 --> 04:02.600 multi-taste like, uh, if you do this, you don't do that, a lot of, uh, iterations, a lot of 04:02.600 --> 04:09.080 virtual multi-taste that makes very, very complicated, uh, for, probably, however. So, 04:10.360 --> 04:15.960 now what they want to do, that, I mean, if you want to write a very, very specific application for 04:15.960 --> 04:21.480 a very, very specific device that does very, very big things, you never are going to use the, 04:21.560 --> 04:26.440 do it, however, directly. Right, what you want to do is, what you're application, using a 04:26.440 --> 04:34.120 one-long API like up in jail, full-con, whoever, and then let something, some part of the, 04:34.120 --> 04:41.480 so, well, you don't want to implement to deal with a hover. And basically, this is where Missa 04:42.280 --> 04:49.320 enters. Missa is a framework that helps to write drivers that resize an user space, 04:49.960 --> 04:57.880 and the main objective is to translate this, OpenGL, API Vulkan API to something that 04:57.880 --> 05:02.680 then can be switched to a counter, something that is very specific for each of the GPUs. 05:05.320 --> 05:12.360 Usually, uh, there is like, uh, as a middle, we depend on the pattern, it's a GPU. 05:12.360 --> 05:16.760 Usually, uh, we have different drivers inside Missa, but covers different GPUs. 05:17.400 --> 05:24.520 Uh, usually, I mean, it could be that you have like different drivers for the same, uh, family, 05:24.520 --> 05:29.000 for instance, the work case that we're going to apply, um, uh, devices, which is missing growth 05:29.000 --> 05:35.880 common GPUs, or, uh, for Braco, for the GPUs that runs in the garage, we apply 1 to 4 to 3. 05:35.880 --> 05:40.840 There is a, uh, driver, and then for four or five, it's a different drive, why? Because, 05:40.840 --> 05:45.320 basically, because a, what is the same growth common GPU, even in the same family, they can be, 05:45.400 --> 05:50.040 big difference. Sometimes, uh, we need to deal with, with, uh, with different drivers. 05:52.360 --> 05:56.120 Um, uh, what, also, because, uh, 05:56.120 --> 06:03.160 highly, helpingGL, uh, API is quite different from, uh, family, Vulkan API, so you have two different drivers. 06:03.160 --> 06:07.000 We have basic, are assigned the same code, because, uh, the end is, at the same power, 06:07.000 --> 06:10.600 is a workbed by four for instance, the power, but they are separated. 06:11.080 --> 06:17.400 So, uh, message, as I say, it's a, it's a, it's a framework, because you write the drivers, 06:17.400 --> 06:22.520 and you want to know because they provide a lot of tools and utilities and everything you need, 06:23.400 --> 06:29.640 uh, to implement, uh, the driver makes the life easier. For instance, uh, you need to compile shaders. 06:30.200 --> 06:37.000 So, uh, compile is, uh, it requires a lot of steps and things like that, and well, 06:37.160 --> 06:41.720 this provides like a, shape, compilation, compiler, um, and see that. 06:44.600 --> 06:52.840 So, uh, do we talk about how miss, uh, uh, uh, uh, is, okay, like is, let's do a bit of history. 06:53.720 --> 06:56.440 Uh, so miss is started in, in, start to work in, 06:57.000 --> 07:02.120 was worked in, sorry, by Brian Paul, which is still contributing to miss, uh, in 1993. 07:02.680 --> 07:07.960 Uh, the first release was in 1995, and it was, the real was, okay. 07:08.760 --> 07:14.200 Let's take an up in jail, one point single application, and translate all the, the P.I. 07:14.600 --> 07:20.600 to something like I can see in the exam, right? Uh, so basically it was translating all the P, 07:20.600 --> 07:26.360 up in jail to cause text sleep. So basically, we can show the index server. So in this sense, 07:26.360 --> 07:32.040 the first version of the miss was like a sober rendering, and the reason was because 07:32.120 --> 07:39.640 I mean, uh, in the 90s, there was no GPUs available for consumers. I mean, the GPUs were 07:40.680 --> 07:46.600 quite expensive, uh, devices, uh, it was like a silicon graphics, uh, devices were quite expensive. 07:46.600 --> 07:54.520 So not for, probably, but allow people to deal and try up in jail in jail, uh, normal, uh, PCs. 07:55.160 --> 08:05.000 But it's still not, uh, it's not, uh, sorry, it's not, uh, how about the latest? Then, in 1997, 1996, 08:05.000 --> 08:11.240 I don't know, it's at the end of the year, the first, uh, GPU car in 10th floor in market, was the, 08:11.240 --> 08:18.040 the 3 px blue. And, uh, well, it didn't, what, did you, what's the, you see up in jail, 08:18.040 --> 08:25.880 but, uh, private library was called Blight. So it was, uh, quite, uh, interesting to, 08:25.880 --> 08:31.640 basically, like with translate the opinion to a sleep was using the right opinion to use the 08:31.640 --> 08:39.560 life. So in the sense, uh, this was in miss, uh, 2.2, and it was like the first popular 08:39.640 --> 08:45.240 oping yell, uh, drive it, it was a serrated. So people can use oping yell applications, 08:45.240 --> 08:54.360 I was real serrated. Still, uh, it was a wrap, I mean, the visa didn't access the hard work 08:54.360 --> 09:05.240 directly, it was like a user, uh, a private library. And, uh, so yeah. Then, in 1999, another milestone 09:05.880 --> 09:10.200 was the inclusion of the, which is the, the interface, which is basically allowed now, it allows 09:10.200 --> 09:15.960 to, uh, access the network to the, to the hardware, it's only the, uh, uh, wrapper, um, 09:15.960 --> 09:23.720 perpetrator, perpetrator, wrapper. And the first, uh, device was the, again, the 3d, f blue, 09:24.520 --> 09:31.320 but, uh, I mean, with, I started to appear a lot of, of, of, of, uh, driver for different brands, 09:31.400 --> 09:38.440 was the matters. Intel was for, for him, D for the, all 80 rage devices, uh, 3d labs. I mean, 09:38.440 --> 09:45.720 work, what do you guys, I mean, so, uh, feel them. So, what was the situation now? Well, first 09:45.720 --> 09:54.920 we were, uh, in 2008, sorry, 2008, this is the, it was like, we have oping yell, which have multiple 09:55.000 --> 10:04.520 versions. We have multiple drivers, uh, oping yell, uh, is, uh, white, heavy, uh, API, 10:04.520 --> 10:08.920 what you're, why do you, because you have a lot of, states, a lot of things. And, 10:08.920 --> 10:12.760 I mean, you're a lot of, I mean, it's very, we need to work on the song. And, 10:12.760 --> 10:18.920 probably a lot of, they are, all of the same problems in, it's rubbish. So, and I, in this moment, 10:18.920 --> 10:24.840 it was, Gallium was introduced, which basically tries to abstract, uh, all the common parts 10:25.800 --> 10:33.480 are requested in, uh, in oping yell. And just let it's drivers to a specific job, uh, that all, 10:33.480 --> 10:44.920 that it pays, actually, to, uh, to the, to the GPU, but on the GPU. Um, now there's, I mean, all the 10:44.920 --> 10:51.240 drivers are using Gallium, all of them. I mean, uh, no drivers, no issues in the, uh, 10:51.320 --> 10:57.320 impending the oping yell, that's using Gallium. So, this, this is a very important, uh, moment, 10:58.120 --> 11:06.920 of, of the history of Mesa. Then, well, uh, the next was, like, in 2016, 11:07.800 --> 11:13.560 I, I purified, uh, the, uh, bull can driver, which was Ambil, which was, 11:13.640 --> 11:22.200 implemented as a wife bed. Uh, it was in, uh, in Mesa 12. And, but sooner, I mean, after that, 11:22.200 --> 11:26.680 it was, uh, it was, uh, it was, uh, it was, uh, it was basically the driver for the, you can drive for 11:26.680 --> 11:36.360 Ambil details. Uh, uh, so, so, so yeah, so now, what happens nowadays? Well, the, the current 11:36.440 --> 11:41.720 missile, basically supports multiple APIs. I mean, the, well, no are oping yell, 11:41.720 --> 11:47.880 oping yell is in all their versions. But also it's bulka, but it's also oping yell, 11:47.880 --> 11:54.520 and there are also older APIs, like op, uh, V8 API, which is a video series and a yell. 11:55.320 --> 11:59.720 We have multiple drivers for multiple devices, like, uh, for instance, I use a 11:59.800 --> 12:06.520 corpus, which is for Intel, uh, however, or the own C, which is for NV and wall, which is for all, um, 12:06.520 --> 12:14.360 NVIDIA hardware, then, uh, for Males, uh, qualcomm devices, uh, there is for, uh, 12:14.360 --> 12:20.680 uh, bracco, bbante, as I think, which is for the, basically, for I, uh, appeal M1 GPUs. 12:22.200 --> 12:27.960 Then we have, also book, a lot of different book and drivers, again, for, uh, Intel, for, uh, 12:28.680 --> 12:37.880 MD, NVK, which is, uh, in writing in rust, is for, uh, on the newer, newer, uh, for NVIDIA 12:37.880 --> 12:46.040 hardware, uh, PNBK, which is, uh, for bali, uh, bracco, again, qualcomm, chronically, which is, uh, 12:46.040 --> 12:52.840 the murka implementation for the appeal, uh, PN1 GPUs, uh, popular, and so on. 12:53.800 --> 12:59.560 We have also, so we're editing, uh, which basically remains, uh, OpenGL, uh, 12:59.560 --> 13:04.760 and Vulkan, uh, in case you don't want to use there, the, the, the hardware, uh, 13:04.760 --> 13:08.040 hardware, basically, because maybe we don't have, uh, GPU, but you need to run 13:08.040 --> 13:11.640 Vulkan application, in this case, and then pipe and lava pipe, 13:11.640 --> 13:17.080 was, are the most efficient ones. So, uh, because there, because it's like a, uh, 13:17.080 --> 13:22.680 reference driver, what you want to, and it's like, uh, first of all, and then 13:23.640 --> 13:27.800 something very interesting is, are the ledger drivers, which are, like, drivers that 13:27.800 --> 13:33.080 works on top of other drivers, for instance, the, well, the most common, well, no, 13:33.080 --> 13:38.440 is sync, which basically, uh, influence OpenGL on top of Vulkan. I think, 13:38.440 --> 13:44.520 interesting, because, for instance, in the new NVIDIA, GPUs, we only have NVIDIA driver, 13:44.520 --> 13:49.320 which is Vulkan, but then you use sync on top of NVIDIA, so you get for free, 13:49.400 --> 13:52.760 OpenGL drivers working on the GPU, uh, on NVIDIA GPUs. 13:54.600 --> 14:01.160 Same thing that we have, uh, OpenGL on top of, uh, during, during 3D, for Windows, 14:01.160 --> 14:06.920 we have Cosmic Reef, which basically, uh, supports Vulkan on top of metal, so you have, uh, uh, 14:07.880 --> 14:14.360 you can run a Vulkan in, uh, any, uh, Apple device. And then what, 14:14.920 --> 14:22.760 we see here, OpenGL, um, um, um, um, um, sort of, um, Vulkan on, uh, virtual machines, like, 14:22.760 --> 14:28.360 for instance, venues is like, you can't run, Vulkan is a virtual machine, uh, it's oscillated 14:28.360 --> 14:36.600 because the, uses the host GPU. There is also said, uh, OpenGL, which is, nowadays, 14:36.680 --> 14:43.960 Rustysiel, uh, the area is, uh, that you have, uh, your driver, OpenGL driver is, uh, 14:43.960 --> 14:48.680 implemented, which is using Galium, uh, you support the required, uh, uh, 14:49.080 --> 14:53.880 implemented requirements, let you get how, hopefully, our PC driver. And then, 14:54.840 --> 15:00.120 something, when you, is to flow, which is basically a tens of flow, late, delegate, 15:01.080 --> 15:05.400 that, uh, lots to use, there's a flow to run, they have a little, uh, AI, uh, 15:07.160 --> 15:11.800 application, uh, in this game, we have this, uh, MP, like the Roxia, P-Vanti, 15:11.800 --> 15:17.000 and they're, they are, they're also based on Galium, so basically it means that you need to implement, 15:17.000 --> 15:22.280 they think, uh, function to a Galium requires, and then you can use these devices to, uh, 15:22.280 --> 15:25.320 to accelerate the, the, your, the, your AI work. 15:27.880 --> 15:35.640 Now, uh, so let's see the components of this. Uh, this is, uh, simplified diagram, um, uh, 15:35.720 --> 15:40.600 I just want to talk to the tells, uh, that's it, a lot of, uh, parts that are not, 15:40.600 --> 15:46.600 interesting for this, I mean, for this stuff, because I mean, we have no, much time, um, so, 15:48.040 --> 15:52.760 first of all, we have the OpenGL, and we can application, right? And the first thing is that, 15:54.200 --> 15:59.560 these applications are not going to be linked against your driver, right? Basically, they use 15:59.640 --> 16:07.960 all of them, and the post of the loader is to find the proper driver, and then, uh, hook the, uh, 16:07.960 --> 16:12.360 directly, they make the, the operations, the OpenGL functions, to the specific driver. 16:15.560 --> 16:19.160 They have the advantage that you run the pick, you create the applications, and you can, 16:19.160 --> 16:24.680 will choose different, uh, GPUs to run your application, I mean, the, the, the, the, 16:24.920 --> 16:29.560 rather, we choose the, there's one for you, but you can change it, or you have multiple GPUs, 16:29.560 --> 16:34.840 you can choose, okay, I want to, with this, this application, like, this other, this application. 16:37.320 --> 16:46.680 So, um, then, on the left, we have the, uh, the OpenGL driver, right? And as you can see, 16:46.680 --> 16:52.360 is, uh, much more complex than they look on the right. And the reason is, because OpenGL is 16:53.320 --> 17:03.000 for the 90s, it's a very, very old, um, API, and when it was created, it was like, um, GPUs were thought, 17:03.000 --> 17:11.960 like, uh, machine states, right? And, uh, OpenGL was designed without in mind, and that design, 17:13.800 --> 17:19.880 kept until this days, uh, and what I mean with, it's a machine world, just, basically, 17:19.880 --> 17:24.760 means that for instance, you want to draw, uh, you want just to take a, uh, texture, sample, 17:24.760 --> 17:30.040 I'll draw it in the frame buffer. There is no, I mean, that operation is not explicit in the 17:30.040 --> 17:34.280 sense of that, you don't have a function to say, but you pass the texture, you pass the frame buffer 17:34.280 --> 17:40.760 and the wrong, rather, the, the procedure is, you buy a texture in, in the OpenGL. So, 17:40.760 --> 17:45.320 you need to think that, OpenGL is a steam machine, transitory, you just taste the word, now I have a 17:45.400 --> 17:50.840 texture bound, right? Then you bind with another operation or another call to OpenGL, 17:50.840 --> 17:55.080 you bind the frame buffer. Now again, I have another state where I have, uh, a, uh, 17:55.080 --> 18:00.920 frame buffer and I have, uh, texture. Now, any present, uh, you're going to go into the, from 18:00.920 --> 18:06.360 the moment on, we'll be, use this two bound, these two bound resources. So, now you say draw, 18:06.360 --> 18:12.120 or whatever, or sample. And we, this, this, this, this, this, this resources, 18:12.200 --> 18:15.640 you want to change the frame buffer, you need to undo another operation and they, 18:15.640 --> 18:21.080 away, or another transition and other, OpenGL. So, there are a lot of states, uh, that need to be 18:21.080 --> 18:27.880 carried. And the other problem is that, did you really openGL spec? I mean, like, this is, 18:27.880 --> 18:32.200 happy to say, OpenGL will come in. In order to execute operation, you have to, uh, 18:32.200 --> 18:36.920 much sound preconditions, right? For example, you want to sample a texture, you need to have a 18:37.000 --> 18:42.200 texture bound because otherwise you can sample it. And the openGL spec is very, 18:43.080 --> 18:48.520 specific about if you don't have something, the error you need to do. I mean, you can, 18:48.520 --> 18:53.480 I mean, it's not like, okay, if, if something doesn't fulfill, whatever can happen, no, no, 18:53.480 --> 18:59.480 it's say, okay, if you don't have this collision, that you need to write this specific error. So, 18:59.480 --> 19:01.560 it's, it's, it's, it's, it's, it's, it's, it's, it's, it's, it's, it's, it's, it's, it's, it's, 19:01.560 --> 19:07.240 because a lot of pages are just saying, the, all the errors you need to submit when there's something 19:07.240 --> 19:12.920 that's in, uh, it's not fulfilled. So, this means that a lot of time, a lot of, 19:12.920 --> 19:19.160 such as are spent validating that you can execute the operation and the portable errors. 19:20.760 --> 19:26.440 So, a lot, again, all of these stuff is, it doesn't matter if you are running, you'll be, 19:26.440 --> 19:32.200 I, MD, or the only, I'm 30 P.U. So, I mean, you need to do that. And all of this part is quite common. 19:32.200 --> 19:39.240 So, that the reason, uh, why the half is, uh, quite complex, uh, part. 19:40.520 --> 19:49.480 Yes, assuming it, I read, uh, there are like, uh, uh, a first layer, which is, this, 19:49.480 --> 19:53.240 come from, I mean, from the older versions, this is like a very thin layer, which is, 19:53.320 --> 19:59.160 basically like, it's the end, end to the point for the open-year, uh, API. 19:59.720 --> 20:05.800 This layer is quite thin, uh, basically what it does is kind of, uh, validate that you can't 20:05.800 --> 20:11.320 run the operation. I mean, all the conditions are, uh, fulfilled. And then, if it, it happens, 20:11.320 --> 20:17.160 then, move to value, which is the, this, uh, has all the complexity of this state, 20:17.160 --> 20:23.640 state machines, and things like that. So, the way it's work is like, when you run your driver, 20:23.640 --> 20:29.560 like, it's driving, basically you, uh, I'm going to, uh, create a structure for, for 20:29.560 --> 20:35.720 volume. I mean, this is, there's, uh, API to that, actually like that. And then, basically, 20:36.440 --> 20:42.280 this volume provides like hooks that you need to just implement them. And these hooks are, 20:43.160 --> 20:49.880 specific parts for your driver, uh, to, um, they're going to call, sorry, uh, 20:49.880 --> 20:54.280 Gary is going to use, just when something, it really depends on your driver, 20:54.280 --> 20:58.680 I also, sorry, sorry, JP, I mean, for instance, you are going to draw at the end, 20:58.680 --> 21:04.120 Julie, to use the GPU. So, there will be a hook for driving when all the state machines and all the 21:04.200 --> 21:13.560 things are managed. Uh, also the drivers provides like capabilities. So, they form, like, 21:13.560 --> 21:20.920 what kind of features they support. So, Gary can decide what to do depends on their, uh, for instance, 21:20.920 --> 21:27.560 is the way of, Gary, you say, okay, I'm supporting OPNGL, C.1, because my, uh, 21:28.440 --> 21:36.200 back end, my user space driver is telling the, I support this kind of features. But at the end, 21:36.200 --> 21:42.520 the mean work is done in, in the, in the volume part. Then in the right part, we'll have the 21:42.520 --> 21:47.720 hook and drivers. I mean, this is, is much more simple, because hook and listen, what an API is, 21:47.720 --> 21:57.480 is explicit. And, uh, there is no validation in the sense that, I mean, API also helps 21:57.480 --> 22:03.560 on requirements, like, you need to help this, um, this, uh, fulfill this requirements in order to 22:03.560 --> 22:08.840 execute the operation, but they will partner and they say, if you don't do, whatever can happen. 22:08.840 --> 22:13.720 I mean, if that not date to validate, it's, the, the user need to validate, ensure that everything 22:13.720 --> 22:19.800 goes, uh, is, uh, is correct. So, it's hard to, you have to, you don't support that, you can, 22:20.040 --> 22:26.520 um, uh, happen that you can attach or if you reset or if you have, or whatever. I mean, 22:26.520 --> 22:33.160 fortunately, I mean, uh, it's, what difficult to implement, uh, implementation and no half errors. 22:33.160 --> 22:39.560 So, in the case of, uh, Vulcan, the recent intermediate layer, which is called, um, the validation layer, 22:40.120 --> 22:45.240 which, uh, sits between the Vulcan role and the Vulcan drivers, basically, what it is like, 22:45.560 --> 22:52.280 when you call a Vulcan, uh, function, this validation just intercept the, the call and basic 22:52.280 --> 22:58.040 tracks all the states and it's ensuring that you fulfill all the requirements and it's not, 22:58.040 --> 23:04.280 it will tell you, okay, you are in, uh, fulfill this requirement and if you, even, uh, tips 23:04.280 --> 23:09.400 about, okay, you are doing this, but it's not very performant, say that. But the, the point is that, 23:09.400 --> 23:14.760 all these validation things is not done by the Vulcan driver. So, it's just implement, 23:15.240 --> 23:18.520 faster when you're running in production, uh, the applications. 23:20.360 --> 23:26.040 Still, I mean, uh, uh, there is some parts that are like common for instance, 23:26.040 --> 23:33.320 still, you need to create like a dispatch table, which basically is like, uh, uh, the, when the 23:33.320 --> 23:41.000 Vulcan function should, which function should call from the driver itself. Uh, I hope all the 23:41.080 --> 23:48.440 Vulcan will be changed, uh, but, uh, change, or the calls, uh, for instance, uh, uh, there are 23:48.440 --> 23:54.760 like, uh, common for recycling, but we can't raise the Vulcan buffer. So, uh, the Vulcan run 23:54.760 --> 24:03.960 times utilities, basically is like a common service, uh, it's in quotes, uh, it's not a service, 24:03.960 --> 24:09.000 uh, what service. But, uh, it's something that it really can use to, uh, make it through life, 24:09.080 --> 24:12.120 is sure for instance, I don't know. Uh, I'm thinking now, uh, for instance, time nine 24:12.120 --> 24:16.920 semaphores, which can be provided through the Vulcan. So, the duty, but that, if you don't support 24:16.920 --> 24:23.560 that, it can be prevented using this normal semaphores. And, uh, so, yeah, so you can do that. 24:23.560 --> 24:29.160 Um, nowadays, I mean, all the drivers are using this, uh, this Vulcan run time, because make, 24:29.160 --> 24:34.120 really makes the life easier because, uh, quite a lot of little things are handled by this 24:34.280 --> 24:43.000 one time. Um, then we have the shaded compilation, because again, all the modeling applications 24:43.000 --> 24:51.640 need to compile shaders. Uh, so this is the part that does receive a GLSL server, or 24:51.640 --> 24:57.080 SPRV, you already see Vulcan. And, uh, the transferring to the final assembly code suitable for your 24:57.080 --> 25:02.200 GPU. Uh, again, there are some parts, common to all the drivers, but the partners, 25:02.280 --> 25:08.200 specific to the Vulcan, because the assembly really depends on each GPU, which GPU has its own assembly, 25:08.200 --> 25:13.800 and even for the CPU, depends on the formula, there are some changes on, and things. So, basically, 25:13.800 --> 25:25.080 this is, uh, what we said that, we will see that later in a more detail. And then, once we have everything, 25:26.040 --> 25:33.320 we have the, the kind of part. So, um, in this case, basically, uh, there is like, uh, 25:34.920 --> 25:41.080 a library, which, uh, used to, um, talk with the kernel drivers, which is called, 25:41.080 --> 25:48.520 let the run, the run, why the render memory, I'm a large manager. And, uh, so, yeah, basically, 25:48.600 --> 25:55.160 when your driver, the Vulcan, or, or, or, or OPINGL driver, has everything really to be a 25:55.160 --> 26:01.160 circuit. It's like, uh, everything, you know, memory, uh, basically, some sense that to the, 26:01.160 --> 26:07.880 the, the RAM, uh, which is in the kernel, and then each of these, uh, speak drivers, 26:08.680 --> 26:14.120 basically what they do is, uh, is, I mean, do, it's, I mean, do it, it's calorie in the 26:14.120 --> 26:17.880 domain. They just need to be secured by the, what did you build? So, basically, it doesn't seem like, 26:17.880 --> 26:23.480 okay, let's, uh, scale the job, prioritize, touch them, write, uh, register or whatever. So, 26:23.480 --> 26:31.320 they'll job as a starter, what did you, uh, monitor, when they don't, if finished, to tell the user 26:31.320 --> 26:38.040 space driver, okay, I'm finished, you know, it's waiting for a signal. Uh, if something wrong happens, 26:38.680 --> 26:46.680 which a lot of time happens, we need to reset the GPU, do that. I mean, a lot of things that are, 26:47.400 --> 26:59.240 required to do to find a circuit this, this, uh, the job. So, uh, I think it, I mean, 26:59.240 --> 27:05.080 why we see the components, we can go a bit of more detail on the, what happened behind the 27:05.160 --> 27:11.160 components, when you call a function, an open-gel function or a broken function, what happens inside 27:11.160 --> 27:18.200 this, okay. So, first of all, or for, I'm deleting a lot of details as a military, so I just like, 27:18.760 --> 27:24.840 simplify a lot of the code. I would simplify a lot of the two chain, all the chain, all the calls, 27:24.840 --> 27:31.960 because a lot of, I mean, a lot of calls. So, yes, get, give you an idea of what is happening here. So, 27:32.760 --> 27:38.840 this is the, the, for the way we call, you know, draw a rice and the lower, uh, find the proper 27:38.840 --> 27:44.040 driver, basically, this is the first, um, function, the, at the point for this operation, which is called 27:44.040 --> 27:49.160 B-set draw a rice. And as I explained before in the literature, this is the analysis of the 27:49.160 --> 27:56.280 state's, right? And validate that, uh, since, uh, our correct, if something is not correct, 27:56.360 --> 28:01.000 the letters are not correct. That's a level, and I'm in return. And if anything goes fine, 28:01.000 --> 28:09.080 then it's not the, the draw itself. Uh, this draw itself is still the, in the, in the, uh, 28:09.080 --> 28:15.560 measure layer, but again, it does several, uh, set some, several, uh, reach to something like that, 28:16.760 --> 28:20.520 uh, structure, sorry, and then it calls the state tracker to prepare the right, and 28:21.480 --> 28:27.080 call the draw value, which is basically, uh, is, uh, is the, in the California, it's in charge of, 28:27.080 --> 28:35.960 uh, a student, the draw. Again, the draw value, draw a tough thing is, I call CS, CSO draw, uh, 28:35.960 --> 28:42.440 video, CSO CSO is an object that keeps, uh, the, uh, a constant state of it that keeps the states 28:42.440 --> 28:48.920 on the full machine, and, uh, yeah, and basically calls that. This, in now, is everything in, in 28:49.800 --> 28:57.240 Galin. No, I want to go ahead, because it just check the, uh, the stack is like, uh, 20 calls, 28:57.240 --> 29:04.840 and I want to show 20 funcels. Okay. So, we'll be with that. But at the end, it ends up running the, 29:05.960 --> 29:12.440 the, the function of the reflection of the specific GPU, right, and in, in this case, I will show 29:12.520 --> 29:17.960 in the case for the, with the leak, which is the graph, um, the OpenGL, uh, drive for the 29:17.960 --> 29:27.160 Raspberry Pi 415, uh, uh, from the moment on, it's driver, handless operation, uh, really 29:27.160 --> 29:34.120 depending on the GPU. So, it driver has different, that influencing different ways, um, and I 29:34.120 --> 29:40.040 want to show the, uh, how the, the OpenGL, sorry, how the visually drive it does. But more or 29:40.040 --> 29:46.600 as the, the idea is that all of those drivers will, like, at the end, like, um, they'll tell me, 29:46.600 --> 29:52.440 what's similar, all of them is like, great, a bunch of common streams or jobs, which are basically, 29:52.440 --> 29:57.400 like, a lot of structures, where you configure the, you put the values in the structures, 29:58.520 --> 30:04.760 that contains addresses, um, you contains a simply called, a lot of things, that are the things 30:04.840 --> 30:10.920 that GPU configures the GPU, and then put that in a buffer memory, and this is going to be 30:10.920 --> 30:15.800 dispatched to the kernel, because that's, what GPU is going to read, and I see, do this here, 30:15.800 --> 30:21.880 so, so you can, or things there. More is, I mean, I mean, of course, each driver has, it's all 30:21.880 --> 30:26.040 structures, but at the end, it's not more or less the idea of all the, all the drivers. 30:27.880 --> 30:33.560 For the case of Vulcan, the indication is, uh, decay, CMT draw, but that's it, much more simpler, 30:34.120 --> 30:38.120 and almost the call is deleted, I mean, the entry point is deleted, uh, 30:38.120 --> 30:42.440 provided by the, provided by the hardware, in this case is the V3V, so, 30:43.960 --> 30:53.640 unless you have, uh, the disvalidation, uh, calling the V3V to be 3D, the CMT draw, sorry, is, uh, 30:53.640 --> 30:58.600 very fast, there's no high operation of that, so in this case, it's very simple, and then you see, 30:58.680 --> 31:06.840 we start to draw, I mean, there's no validation at all, yeah, uh, again, I'm not going to show how 31:06.840 --> 31:13.160 we, this keeps continuing, but again, it depends on the hardware, but at the end, as this is the 31:13.160 --> 31:18.360 same hardware, like the, sorry, this is the more, for the same hardware at the previous one, 31:18.360 --> 31:23.320 more as the, the outcome will be similar, I mean, we like a bunch of structures that put in 31:23.320 --> 31:29.640 a mail in the buffer, uh, I simply call for a sayers, and then we'd have to, for the review, 31:29.640 --> 31:38.440 to be this, to be executed. Now, before we draw, uh, we need sayers, I mean, as I said before, 31:38.440 --> 31:45.960 the, the start-up contains a share, I simply call it, and uh, you use OpenGL, the shares are 31:45.960 --> 31:51.960 basically writing in GLSL, and you use Bucca, is it working in Spielbeak, which is how much 31:52.040 --> 32:01.640 load level, uh, binary, uh, language, which is basically created from GLSL, or other high, high 32:01.640 --> 32:10.520 level, language, uh, by the end, but again, it, well, another, you need to, uh, compiler, that, to 32:10.520 --> 32:20.200 generate a final, uh, assembly code. In the case of GLSL, this like, uh, and this time where 32:20.280 --> 32:24.920 there is a parser, you solve MISA, the parsed code, generates an intermediate level, uh, language, 32:24.920 --> 32:31.800 and then that is compared to, to, to, to near, uh, in the case of PIRB, it's basically just 32:31.800 --> 32:37.000 compared to, like, a match, one, one, two, one, that convert GLS, it's already split it to near. 32:38.360 --> 32:46.040 Near is, uh, language is by MISA, which means, uh, new intermediate, uh, representation, um, 32:47.000 --> 32:54.040 which is, uh, I think was introduced in 2015, and this, the, the language, this, uh, used, uh, 32:54.040 --> 32:59.720 uh, all the drivers, mostly, and this, the, we, was designed for the GPU, so much is very 32:59.720 --> 33:07.640 well to GPU, and, uh, so it is that, you transform, that, that, uh, GLSL or SPB to, 33:08.120 --> 33:15.960 Thisよう is, a sample of Gls, a piece, and these near is they're performing in, in S, S, S, S, S, I, 33:15.960 --> 33:21.800 form, where a single is a, uh, Sigma began, significant static, uh, well, normal, the, the, the chronicle, 33:21.800 --> 33:24.200 But, um, the thing is that this, uh, this, in the form, that you can apply a lot of 33:24.840 --> 33:30.440 optimization, that are, very well-known, from the compiler wall, um, you can apply a lot of the 33:31.080 --> 33:37.560 socializations, and samples like, like you know, Algiere, like, uh, 33:37.560 --> 33:38.560 of the mission. 33:38.560 --> 33:47.100 And if you have to appreciate the say A plus A, you can simplify that as twice A, it depends 33:47.100 --> 33:52.460 on how much the faster or not, come as a dispersion elimination, let's call the elimination 33:52.460 --> 33:56.060 like if you have a code that is not going to be executed, it will lose that. 33:56.060 --> 34:00.660 I mean, all those kinds of optimizations are applied in this near step. 34:00.660 --> 34:07.660 These are applied logonins, basically logonins is replacing an operation by which is more 34:07.660 --> 34:11.900 accomplished by a different, more simpler operations, and as somebody's for instance, 34:11.900 --> 34:18.100 if you have a, you need to compute the sign of a number, and you're however, let's 34:18.100 --> 34:25.020 support the sign by itself, you can replace the sign by a Taylor expansion, you see more 34:25.020 --> 34:26.020 simple instructions. 34:26.020 --> 34:31.460 So, the logonins is, do that, and there are quite a lot of logonins, they can be applied 34:31.460 --> 34:37.460 on the near, and a lot of them depends on your hardware, I mean, that's the reason why we 34:37.460 --> 34:41.380 have this capability for instance, that is, that you can have a support this, okay, then 34:41.380 --> 34:46.740 like I, as you could just, this near operation, otherwise I need to lower and transform 34:46.740 --> 34:47.740 that. 34:47.740 --> 34:54.740 So, as I said, these common for all the drivers, although there is a benefit for this 34:54.740 --> 34:55.740 kind of optimizations. 34:55.740 --> 35:06.340 So, you have any automation, all there will be, get this automation for free, and then 35:06.340 --> 35:15.340 when you have near, we still need a sample code for GPU, and basically what we do is, 35:15.340 --> 35:21.300 we have an optimal near, was a past world basis, and say to the specific driver, because 35:21.300 --> 35:26.820 now for now, for that moment, only the drivers know how to transform that in the specific 35:26.820 --> 35:27.820 GPU. 35:27.820 --> 35:37.920 I said, be called for that GPU, again, I'm sure we, in a sample with the, with the GPU for 35:37.920 --> 35:44.920 the run by free, I'm sorry, for I'm 5, in this case, the near is converted to another 35:44.920 --> 35:53.200 intermediate language, it's called beer, this beer is more sweet, more, more, more, it's 35:53.200 --> 35:59.400 more for the GPU, I mean, this is instructions that are more than, the ones that have 35:59.400 --> 36:07.140 a support, okay, and here we do more de-visations, very specific to the beer, we do 36:07.220 --> 36:13.060 a scaling, we're already in the strategy, let's say that, and they'll get optimised beer, 36:13.060 --> 36:19.860 and then this beer is converted to QPU, which is basically, this is the, was simply of 36:19.860 --> 36:25.780 the, for the run by free, run by free, which basically it has two, like two lines of 36:25.780 --> 36:31.500 issues, like two, one for multiplication and other for automatic operations, I can 36:31.500 --> 36:38.380 run in parallel. So this is very, very specific to the Raspberry Pi 4 and 5. Again, 36:38.380 --> 36:42.780 you go to another device. It's quite different. For instance, in the case of AMD, 36:42.780 --> 36:48.060 it uses echo, which is the back end compiler. There are other cases that are using 36:48.060 --> 36:54.380 given lvm, this, well, no, they use that as the intermediate language and the 36:54.460 --> 36:59.900 operator of programming. This is completely depends on the, on the, on the, on each other 36:59.900 --> 37:10.860 appeal. Okay, now we have all these jobs and common lines of the 74. We have now the assembly 37:10.860 --> 37:17.580 and I need to sum it to the, to the GPU. As I said, this, uh, don't, we, uh, slip the RAM. 37:18.540 --> 37:24.700 Basically, what it does is HTTP, we take the results, it sum it to the GPU, which, basically, 37:24.700 --> 37:30.140 sometimes means, uh, for instance, in case of all the Raspberry Pi, it means that, okay, 37:30.140 --> 37:35.980 I'm going to writing a register where the others of this buffer and write another register that 37:35.980 --> 37:40.860 says, okay, start to get, uh, the security job and there's another register that says, when the job is, 37:40.860 --> 37:45.660 it's finished or not. And there are signals to say, okay, the job, there was like a interrupt soon, 37:45.740 --> 37:52.300 because it was a crash or whatever. This everything is managed. The newer GPUs, for instance, 37:52.300 --> 37:58.940 are able to scale in, by, through Howard, like, have the components to scale the jobs, 37:58.940 --> 38:05.340 through Howard's, but at the end, uh, everything is executed until you get these, uh, 38:05.340 --> 38:14.140 beautiful, triangle and screen. Okay. So more races, this is a simplification of, 38:14.140 --> 38:18.700 what have we behind the cortex, you know, when you run the open gear, or we can, um, 38:20.060 --> 38:27.820 now, from a point on view of, uh, of the priority self, how to test and continue, how we test 38:27.820 --> 38:32.380 the critical things, okay. So basically, we use the GitHub, uh, the red letter, we love where we, 38:32.460 --> 38:39.260 basically report fixes, and report pieces, fixes, or sorry, patches, or we would, 38:39.260 --> 38:45.820 basically, my requests, assuming, the rap, it would be review with my people, uh, by, by, 38:45.820 --> 38:52.540 very smart people, and they can't, I said it, I said, okay, this is fine, I said it, or maybe 38:52.540 --> 38:58.220 is, which is multiple times, it's okay. You need to fix this, and if it's not, or maybe, 38:58.300 --> 39:03.980 you need to, for instance, I may be a little, I may request to fix something in my driver, but then 39:03.980 --> 39:09.340 that change is broken, not the driver, so it will say, okay, be careful, there's really that, 39:09.340 --> 39:13.580 because you are breaking other drivers, so you need to review. So this is an iteration process, 39:13.580 --> 39:19.260 and when everything is, is a set, uh, the my request is not directly, uh, merge, but it's 39:19.340 --> 39:25.580 submit to a main sign to the March board, and basically what March board is like, 39:25.580 --> 39:30.700 you have the key, a key of my request to be merged, and what it does is, it's the first 39:30.700 --> 39:38.060 memory quest, we'll erase this against master, sorry, upstream, the main, um, to the top, then 39:38.060 --> 39:45.340 wrong, uh, several tests, and several was fine, merge it, okay, it's nothing, it doesn't go, 39:45.420 --> 39:53.340 reeds, until, okay, something is wrong. Next, let's more request, and so on and so, why does that, 39:53.340 --> 39:58.300 because if you try to do the more request, all together, maybe this work, this work, but 39:58.300 --> 40:08.460 together, we fail, so there's a very wide, is, is executing one by one, okay, and how, this is, 40:08.460 --> 40:14.460 how much is testing thing, well, the first thing is that if we rebuild all the tests, all the drivers, 40:14.460 --> 40:17.900 that are affected by the memory quest, sometimes there is a memory quest that touches for 40:17.900 --> 40:23.180 instead of the Raccoon code, so that is not going to affect the worst of the drivers, because the 40:23.180 --> 40:28.380 Raccoon is going to come, but for it, you touch something about near itself, this need to be 40:28.380 --> 40:33.420 issued by all the drivers, so all the drivers need to be compiled, and then, uh, basically, it 40:33.420 --> 40:38.300 should use a lot of different tests with, basically, it should use a pilot, which is a set of, uh, 40:38.700 --> 40:47.980 community, test feed, uh, for OpenGL, and, but we also run OpenGL CTS, a multi-CTS, 40:47.980 --> 40:55.900 which are the conformance test feeds for, for the level, running multi-CTS can take out of 40:55.900 --> 41:03.740 hours, okay, and we don't want to have a, a lot of hours to, until something is merged, so, 41:03.820 --> 41:09.340 well, we don't, it's out of different, uh, actions to make the things work faster, for instance, 41:10.060 --> 41:15.580 instead of running one test, like, we can see the wrong one test, uh, it's time, in, in, okay, 41:15.580 --> 41:22.380 we run like, for the, we already have four CPUs, four cores, we run four tests in pile, which make 41:22.380 --> 41:27.820 many things faster, then we distribute the institution, multiple GPUs for instance, for the 41:27.900 --> 41:34.780 Raspberry Pi, for instance, we have eight or nine or ten Raspberry Pi 3s, so we run, uh, test, 41:34.780 --> 41:40.060 the subject, affects the, the Raspberry Pi 3, we distribute all the stuff in all these, uh, 41:41.660 --> 41:47.420 devices, so they are only in parallel, and then we also run a subset of tests, so, more 41:47.420 --> 41:54.220 everyday is that to have everything, a security in 15 minutes, more or less, right, and it's 41:54.300 --> 42:00.220 happening, I mean, it's a sex, it will match, then, of course, every night, we have one, like, uh, 42:01.660 --> 42:06.460 nightly pipeline, which basically is, okay, now I have time, we are not blocking all the 42:06.460 --> 42:12.220 memory quests, that's also why we run these, uh, uh, uh, in 15 minutes, but so, let's, let's 42:12.220 --> 42:16.540 run all the tests, so in this case, we run a more comprehensive test, for instance, we run, 42:16.540 --> 42:22.300 maybe the full CTS, uh, you can't take maybe one to hours, but we will have time, what do we 42:22.380 --> 42:28.860 do with this only night, on the night, and, uh, and if everything happens, well, uh, people 42:28.860 --> 42:35.340 we see the next day, okay, maybe my change passed there, but it was a very specific corner 42:35.340 --> 42:41.980 case of the test that I did it past, well, we need to work on all the fix, and well, that's all, 42:41.980 --> 42:48.620 so, uh, as conclusion was, Messiah is, like, basically a translation between, uh, different 42:48.700 --> 42:56.860 RFCPIs, and the hardware, uh, for the case of OpenGL, it provides all the, uh, full steam machine 42:56.860 --> 43:02.220 trucker and multiple utilities that are implemented, uh, to implement the, the, the drivers that 43:02.220 --> 43:09.900 helps to implement the drivers, uh, it's also provides a very comprehensive set of tools, uh, for, uh, 43:09.900 --> 43:17.420 compile shaders, provides a lot of, uh, optimizations, uh, and, uh, helps, helpers just to get the final 43:17.420 --> 43:24.460 assembly code, near, is the, the common language used for all the, all, most of all the drivers 43:24.460 --> 43:31.580 nowadays, and then, all the work is submitted to the GPU, is a lip your RAM, okay, so, I hope, 43:32.460 --> 43:38.220 you have enough better idea, not deep, but as the, at least some real, what happened, 43:38.220 --> 43:42.620 mechanical, with, with, with Messiah, and the hope that you can start to continue to miss 43:42.620 --> 43:45.660 a video on, not like that, and that's all. 43:54.540 --> 43:54.940 Who is this? 44:05.340 --> 44:11.340 Why are they, they are, uh, it's only for the sake, right, okay. Yeah, so, I'm not walking on the sake, 44:11.340 --> 44:17.020 so let's take this with a grain of salt, but I think one of the problems is that, um, 44:17.020 --> 44:28.780 as I've implemented the full OpenGL, uh, API, and the OpenGL API, not the, yes, but the, 44:28.780 --> 44:38.780 the API is thought for desktop devices, but mostly the Apple M1 GPU is like a big mobile GPU, 44:38.780 --> 44:41.900 so, there are a lot of features that are not, um, 44:42.940 --> 44:46.300 support by the hardware, so I didn't do a lot of things to that, and then on top of that, 44:47.020 --> 44:53.100 is that most of the things were quite robust in engineering, because there is no documentation 44:53.100 --> 45:02.540 of how to put on the GPU, so you need to do a lot of, uh, like tests to just, uh, to just to, 45:02.540 --> 45:09.260 uh, fill out how these works, which is, I mean, I mean, fortunately, in my case, I don't do that, 45:09.260 --> 45:13.580 but it can be very, very challenging, a lot of experience, uh, do that. Fortunately, 45:13.580 --> 45:19.100 the person that is working on the, uh, suffix, which is Alyssa, uh, she has a lot of experience, 45:19.100 --> 45:23.340 because she was, uh, doing Rochigi for all the drivers, so she has a lot of knowledge, 45:23.340 --> 45:27.500 how to address this, but yeah, they, they, they, they, they, they, they more complicated parts. 45:33.100 --> 45:37.580 Do you have any particular advice for someone who's been working for a while, but would want to, 45:37.580 --> 45:39.580 wants to actually start concentrating on something? 45:41.820 --> 45:48.940 Yeah, well, I think, I'm sorry, uh, yeah, if there's a bias for someone that, uh, 45:48.940 --> 45:52.540 would like to start to continue to miss, all right, this is the, yeah, well, yeah, 45:52.540 --> 45:59.100 the thing is, they are a miss that are quite of several issues, um, that basically they are, 45:59.660 --> 46:05.900 like, after going to, like, easier, you can start to do that, so that, I would start to do that, 46:05.900 --> 46:13.900 do that. Then, uh, another bison is that is easier, usually, uh, to start with how 46:13.900 --> 46:19.820 that you have the documentation, like, if you need to do things, and then you don't have the, 46:19.820 --> 46:22.780 documentation for the however, it's quite complicated. So for instance, in this case, 46:23.740 --> 46:30.780 Intel, however, has its public documentation, it's, it's a complete device, but it has 46:30.780 --> 46:35.820 more communication. And now, of course, asking, because, I mean, the people, the community, 46:35.820 --> 46:40.060 would like to get more continue to some, people, the community are very nice and polite. So, 46:40.060 --> 46:45.820 I think, uh, if you have doubts, you can ask, there is, like, a IRC channel, you can ask questions, 46:45.820 --> 46:50.380 so you can, uh, submit them. So, yeah, basically, it's just a matter of, 46:50.460 --> 46:54.300 starting with something simpler, you have the code, you can check the code, 46:54.300 --> 46:57.500 you can do experiments with that, you have this, this, you'll see what happened to the 46:57.500 --> 47:03.340 ID so on that, you have GDB or whatever to do test. So, yeah, basically, that's, uh, my advice, 47:03.340 --> 47:05.180 just to start, basically. 47:10.140 --> 47:10.780 Yes. 47:13.180 --> 47:15.660 So, lift the RF contains, uh, 47:16.620 --> 47:21.980 I'm a specific staff, and there's also a lot of things stuff in the space, 47:23.420 --> 47:29.340 you just make both. Yeah. How, how, if you have something that's specific to your team here, 47:29.740 --> 47:33.740 how do you decide to do it? Yeah, the thing is, uh, in the, 47:33.740 --> 47:38.060 Libby or M, you have, like, common functions that are common for, for all the, all, okay. 47:38.060 --> 47:43.260 In, the question is that, um, Libby or M have a specific, uh, 47:43.260 --> 47:47.420 function for the power. So, basically, how we basically manage because there are, like, 47:47.420 --> 47:51.420 multiple drivers and multiple different structures, right? Okay. So, yeah, basically, 47:52.220 --> 47:57.500 Libby or M is, like, like, a common part, this function that are common for all the drivers, 47:57.500 --> 48:00.860 basically, like, for instance, creating a memory, as I remember, it's like, 48:00.860 --> 48:05.100 it's more or less the same, right? But then it have backends, like, different backends. 48:05.100 --> 48:11.260 And these backends are embedded with IOCTLs, where you pass, like, uh, operation, okay. And then, 48:11.820 --> 48:15.580 the structural whatever. And this is very specific for the, for each driver. So, it's the 48:15.580 --> 48:21.820 driver. Uh, when the lost Libby or M actually loaded the DRM, for its own backends, for 48:21.820 --> 48:28.620 its own driver. So, for instance, when we use, uh, the Raccoon, Libby or M is like, a Libby or M is 48:28.620 --> 48:33.420 large, uh, the room within it. You, be through the, I think of something like that. And I 48:33.420 --> 48:38.860 contains the IOCTLs with the code specific for the, for the UPSO. Now, I know, as 48:38.940 --> 48:42.940 it's basically the driver, the user space driver knows, okay, or I want to submit this job. 48:42.940 --> 48:48.620 This is basically the API need to be IOCTL with this, but the structures are everything I need to 48:48.620 --> 48:55.500 know is one document. This is like, is, like, uh, in the, in the, it's been for this, for this, uh, 48:55.500 --> 49:01.100 your M. So, it's like, that, like, two parts on the Libby or M. Come and check that, I understand, 49:01.660 --> 49:08.700 but, sort of, the API between the user space, but, and, look, DRM is potentially, it's got 49:08.700 --> 49:13.180 overlapping bits for different hardware, but they can, they can have, like, a different API. 49:13.180 --> 49:14.620 Yeah. Okay. Yes. 49:14.620 --> 49:20.780 I mean, for some operations are the same. Sure. It's like, is, you have, like, DRM.H, which 49:20.780 --> 49:28.060 is a common function, and then you have DRM, it's last NBK, point H, or DRM, it's last, uh, 49:28.060 --> 49:31.980 as I say, point H, whatever. And that's the specific parts of the, I mean, the first is, 49:31.980 --> 49:37.020 quite similar, because they are, or they are IOCTLs, which is basically the common way of, of, 49:38.300 --> 49:44.140 communication with IOC, but yeah, the, why, the, what service offers really depends on each 49:44.140 --> 49:51.820 hours. So, a lot of time, we need to add new, uh, IOCTLs in DRM, when you need to, uh, use, speak, a 49:51.820 --> 49:57.580 new, a newer thing that, you need to support for the current part. So, you add new IOCTL, and that's 49:57.580 --> 49:59.580 what. No, there's no. Okay. No. 50:27.580 --> 50:34.580 much, but the question is, how moved forward? 50:34.580 --> 50:37.180 Yeah, so in regards to, like, statistics 50:37.180 --> 50:40.580 about the failures of magic wastes, but it, oh. 50:40.580 --> 50:44.580 Yeah, I like, I'm not sure, but it's like, 50:44.580 --> 50:51.580 Jesus, like, put it to, would it be common to fail those tests? 50:51.580 --> 50:54.580 After this, like, can I run it with opening, 50:54.580 --> 50:57.580 I've been expecting this with invisible parameters, 50:57.580 --> 51:01.580 basically because I think that's how it comes to. 51:01.580 --> 51:03.580 I'm actually getting the question correctly, 51:03.580 --> 51:06.580 but I understand that if something fails, 51:06.580 --> 51:09.580 when you're only going to request this pre-testing thing, 51:09.580 --> 51:13.580 something fails that, if you can do something, 51:13.580 --> 51:20.580 the local, you mean, the local computer tool. 51:20.580 --> 51:26.660 I think she's going to move between words of Google first, first, first, first, first. 51:26.660 --> 51:33.180 OK, so I mean, yeah, I mean, sometimes you are working, everything works fine, you are 51:33.180 --> 51:37.060 competitive, you submit to the American, to the, to the, to the, to the, to the 51:37.060 --> 51:43.580 miracles and there's something else. OK, so I mean, really depends of, I mean, 51:43.580 --> 51:49.100 sometimes it's obvious what is, what is happening, really depends, but sometimes 51:49.100 --> 51:53.380 it's really depends, I mean, maybe the failure always fails in a speak of driver 51:53.380 --> 51:59.860 that you don't have this driver. And I mean, I mean, you can't check the code and I guess 51:59.860 --> 52:05.340 what is happening, but sometimes when we end up doing this, I ping person, the person 52:05.340 --> 52:09.700 might turn around this, OK, I do this, and this is failing, but I'm not sure why, maybe 52:09.700 --> 52:16.180 you can take a look at that, because you don't have, you don't have all the GPUs in your 52:16.260 --> 52:20.740 account, so other time it's like, you guess, OK, maybe this, this, this, this is the 52:20.740 --> 52:28.460 problem, and then just, basically, you can basically sum it up lunch, and then force the GPU 52:28.460 --> 52:33.740 to execute this, this code, it's happening a lot of times, so you execute, using the CI, 52:33.740 --> 52:38.380 the OMSCI, you execute the test and say, OK, yeah, now it's fixed, now I can, I'm, I'm 52:38.380 --> 52:42.100 request, and I see that that, I really depends on the kind of errors on things that 52:42.100 --> 52:43.100 I'll see that. 52:51.580 --> 52:56.700 How difficult things like, how can make your life, because it obligates a lot of things ahead 52:56.700 --> 52:59.980 of time, I'd say, it's less likely to question the driver because something like 52:59.980 --> 53:05.060 wrong, how does that affect, like, how much you have to be super careful when doing the 53:05.140 --> 53:08.460 driver course, when you're talking about things that nothing can be validate. 53:08.460 --> 53:13.940 OK, so basically, it's like, the question is, how much life is more complicated in 53:13.940 --> 53:18.260 vulca, because if you're a result of things, and you do that in vulca, right? 53:18.260 --> 53:24.860 OK, actually, it makes things more easier for multiple reasons, OK, first, yeah, you don't 53:24.860 --> 53:30.180 need to validate anything, I mean, you assume that thing is correct, if something is wrong, 53:30.220 --> 53:36.780 the point is not your size, in the, the burrow per side, unless the requirements are 53:36.780 --> 53:42.100 fully, and it still, something is wrong, OK, so in that case, it's more simpler. 53:42.100 --> 53:47.660 And then the vulca API, which basically, what do you think, what do I do, what going to, 53:47.660 --> 53:54.820 to implement, I mean, is big, it's very, very robust, but at the same time, it's more 53:54.820 --> 54:00.860 near to what, what actually the GPU is doing, in the case of OpenGL, if you want to 54:00.860 --> 54:07.260 look, since really fast, due to a lot of solutions and tricks, I feel like that, and part 54:07.260 --> 54:12.740 of it, and are done, by going, that's why it is very complex, and the part needs to be done 54:12.740 --> 54:18.460 in the driver, so in this, in the sense, I mean, the thing is that the OpenGL driver is not 54:18.460 --> 54:23.180 the same like, the or how or what the driver, due to a lot of, of, of, option, a lot of 54:23.180 --> 54:28.300 implementation, so in this sense, when you're ready to call in the vulcan, I mean, I understand 54:28.300 --> 54:33.700 that writing vulcan application is more complex, because you need to write the whole 54:33.700 --> 54:38.140 bit Bible, but when you see the functions, it's OK, it is more simpler to what the GPU 54:38.140 --> 54:43.620 is doing, so I don't need to, and the kind of assumptions are, or how I going to 54:43.700 --> 54:48.900 up study is comes in, with input pain, to implement this in the media, so in this, this 54:48.900 --> 54:59.140 is in more simpler, OK, I think that's all, OK, thank you very much.