I'm currently working for Broadcom, working with the Raspberry Pi developers, but in the set-top box group within Broadcom. Oh, no. Where's my focus? There's all tap just now. There we go. OK. So I'm going to talk briefly at the start about the Raspberry Pi architecture. Made it hard to get open sourcing to happen. The previous software architecture that was based on that. And then the architecture that I'm building instead and some of the challenges we face doing so. So the Raspberry Pi has a 700 megahertz ARM CPU. This is ARM V6. It's a little funny. It has hard floats. So groups like Debian have a hard time dealing with this architecture. So Raspberry Pi has fourth Debian. They have their own Raspbian distribution, which they get to load a bunch of other software in, but mostly recompiled to the particular ARM architecture here. So attached to this ARM, there's the VPU. In previous generations, the VPU was the 3D engine. But on this one, the VPU actually kind of has this fairly limited role. It does the hardware encode and decode stuff.  So the VPU is, in a way, kind of in charge of things. Attached to the VPU, now there's this separate QPU engine, which is the actual GLS2 3D part. So a lot of people talk about the VPU because if it's doing 3D, there really is separate hardware doing the 3D engine now. It is just a GLS2 engine. It doesn't do anything but that. It is really just GLS2 and OpenVG. Also, because this is a mobile part, it's a tiled renderer. It seems like that's just kind of the way everything gets built for mobile pretty much. Keith is shaking his head. Vivante is not tiled. Oh, Vivante is not tiled. OK, I've forgotten that. So the software architecture. Because the graphics had always been done on the VPU previously when they built the new chip, the graphics was still done on the VPU. It's a custom vendor driver. Their OpenGL stack is something that was written in-house. It's closed source. It was. And that's the part that has the job of generating the shaders and the commands stream to hand off to the QPU engine. So the bulk of the driver code is on the VPU, doing all of the work of being an OpenGL shader compiler. So on the ARM side, what you had was this thin little library that would take the incoming GL command stream, put it in some buffers, and hand that command stream off to the VPU to get the actual work done. There was a three clause BSD code dump back in 2012. But the community didn't find it terribly useful, because the kinds of things you want to hack on as a driver developer are that shader compiler and all of the interesting stuff inside of there. So having the ability to hack on the emission of the command stream that's basically just a translation of OpenGL ended up not being terribly interesting to us. So how I got involved. I'd been an Intel graphics driver developer for eight years, I think it was, working on much larger desktop chips for the most part. But I eventually got to the point where I was really excited about fixing Android graphics, actually kind of specifically because my phone is super unstable. It's like I've been working on Linux graphics for so long, and Linux graphics I'm using constantly is crashing. How can I go fix this? Most of the vendors are still fairly close source oriented. But back in February this year, Broadcom released a giant pile of code. They released a spec for the chipset that I took a look at. And it's like this looks like a really good spec. It seems to cover pretty much all the stuff. It documents the weird constraints fairly nicely. And they also shipped a three clause BSD source, pile of source code. What happened was that some of their other chips that they build don't have the VPU part. So the closed source driver developers working on supporting those chips had to port all that VPU code over to the arm to run their driver on those chips. So the Raspberry Pi guys figured out that this had happened and said, wait a second, we could just ship an arm side driver for approximately our chip. Get the open source code out the door. The downside of course, given the history of this code is that it's Android only. It doesn't support GLX or EGL, a bunch of this stuff that we sort of expect as Linux desktop users. But I got really excited about the opportunity when, you know, found a position online, applied to it, even though it wasn't really for what I wanted to do. And they said, oh, you want to do that? Oh yeah, can you come interview? So I joined back in June this year. And pretty much got to decide how I wanted to build the project. They sort of trusted me to make all of the technical decisions here. So yeah, I get to build a free software Mesa driver. It's MIT licensed, it runs on the arm. And I'm also building a free software DRM kernel driver. My goal is to get this into the upstream kernel. I'm gonna talk a little bit later about some of the challenges we face with that. And I'm targeting X for the most part. What I'm building should be usable for Wayland, right out of the box. For Android, you have to build the little hydraulic part that nobody has built yet, but it won't be that hard. But yeah, I'm using the XFace 6 video mode setting driver that Keith and I have been working on over the last year, couple of years. I talked about it last year and Keith talked about it this year. It's been a while. So one of the neat features of having so much support from my vendor is that within like two days of joining, they had handed me the simulator source code. So we've got this little functional simulator that emulates the chip on an arbitrary CPU and it has like four little entry points to it. There's allocate the memory and memset all the things. There's translate, generate a physical address for a chunk of the memory, generate a virtual address for one of these physical addresses and there's execute some code. So I took this library, built it into an i9-65 driver, which looks as far as the libgl loader is concerned like the i9-65 driver I used to have, except that when it takes all these buffers from the window system and needs to go do some graphics drawing to them, instead it copies the contents out of the buffers, runs the simulator on them and copies the contents back into the window system buffers. So I can run GLX gears on my laptop under simulation and see what the output would be on hardware without having to actually run the hardware, which is a little bit slow. What I get out of simulation though is really awesome stuff that graphics drivers and driver developers have always wanted. I can print out the registers from my shader as it's executing. You never get access to look at your registers because there's no input and output from the chip, there's no debugging facilities on our chips for doing this. You would, to debug you would do tricks like, oh, at this point in my shader, I will store the contents of this value some more special and then I'll paint that value as the color at the end of the shader and hope that nothing else like stomped it in between. It's all very custom ad hoc and it would take you a long time to do any single debug step. Now it's just put printfs in the simulator and look at the register contents at every single step. I can GDB when the GPU crashes, which is pretty awesome. I can Valgrind to see when it's reading undefined texture memory. Not also I can sometimes forget to test on the real hardware push regressions. So I mentioned this with a Glass 2 part. Glass 2 is this kind of fork of desktop open GL as of about GL 2.0, 2.1, where they cut out a ton of features.   Like why did we like those? Why did you take that away? But the result of having just a Glass 2 part is you end up with like 110 page hardware spec, which is like, you know, I'll just page through that in an afternoon. The first hardware I worked on eight years ago was 1700 pages. I didn't try to measure how many pages my current hardware spec from Intel was because it was just too many files to even look at. So yeah, my hardware, there's like nine little state packets for open GL, six state packets for draw calls, eight state packets for the, you have to emit the binner command stream to decide like which rectangle to draw and which order. Simple code. I actually got started with a piece of demo code from Scott Mansell that was 340 lines to draw a triangle. You know, within a couple of days I had this running on my DRM kernel driver drawing triangles. I would have been really happy if I had a triangle in three months, I'd say. The downside to simple hardware is that you end up doing a lot of work in other places. So parts of open GL that would normally be in fixed function hardware and have a bunch of documentation about how to set these various bits to enable various bits of fixed function hardware, I get to emit code to my compiler to do all of that work. So vertex fetch format conversion, whether you're taking in eight bit per channel normalized values or you're taking in floats, well I have to figure out how to unpack the eight bit normalized values correctly. All sorts of stuff, user clipping, shadow mapping, blending, logic ops, color masking, point sprites. I think I found all of the things that I'm doing but I'm not even sure. There are so many fallbacks happening where I'm emitting a bunch of code to deal with a feature because it's not fixed function. Of course, if you have plenty of shader time, plenty of cycles in your shaders to spend compared to your memory band, if you don't really mind that you're running CPU cycles kind of to get this work done. But some things end up being harder. So I mentioned before that I'm trying to build a GL driver, not just a glass driver. I think this is gonna be a really big feature for users.  We still in the open source community have a lot of GL 1 software out there and porting those to Glass 2 is kind of hard. You have to write a bunch of new shaders and figure out how to get shaders to even work in the first place. So what we have is a bunch of support in the Gallium driver for turning desktop GL features into Glass 2 features. So when I'm handed Quad Primitives, which is four vertices per primitive, I'll make a little index buffer that says do this one, this one, this one and this one, this one, this one in two primitives. Okay, that's pretty easy. If they hand me 32-bit index buffers, well, Glass 2 only does eight and 16-bit index buffers. So right now, I just take the buffer they hand me, go and pick out all the elements, chop off the top 16 bits and hope. There's an assert in there, so at least I'll know when it happens. This is. Yep, okay, there we go. Thank you. Yeah, so we expose occlusion queries with zero bits of precision. I have to do shadow map texturing in the shaders. I have to wake up Keith's laptop. And there's a bunch of stuff I haven't done yet, where we have test cases showing that the driver's broken for these, but yeah, it's not that important quite yet. Polygon and line stippling, weird features that nobody uses. Polygon fill modes, I know software exists that uses this. Mostly it's in the sort of like CAD area. And maybe not doing this on your Raspberry Pi, I don't know. 3D textures, I have a really horrific plan for emulating these in a bunch of 2D textures.  Okay, yes, I will have fun, you're right. Derivatives, there might be enough hardware support to manage this, it's gonna be ugly. LOD clamping, I have no idea. It's not that important, other than the giant piles of test cases that fail. So that's sort of the general feature set problems I face. This has also been an interesting little architecture to play with. So each of the instructions that I generate in my compiler has two separate operations. One of the operations can be knob. There's one that's ad-like stuff and one that's multiply-like stuff. So a min or max operation is an ad and there's like a couple of mole operations. It's mostly moles because you do a lot of multiplying in fragment shaders. Each of these operations has two arguments. The outside is that there's only one address into each of the register files for your arguments. So there's a tiny little MUX field that decides for each argument whether you're picking from the A or B file and then a bigger field for where in the file you're reading from. And there's four other accumulators. So you can get some pairing of operations but your accumulators are kind of precious because you wanna use them for all the things. Also there's no ability to spill registers which is kind of painful. Sometimes I just have to say no, I won't draw that for you. Here's an example of one of the instructions that I pulled out of GLX gears, I think. So in one sort of cycle, we're going to do an ad operation reading from R3 and writing to A0 and we're going to square the RB file number two into R3. So I can stack up these instructions in pairs and get better throughput. This is hard for your register allocator. Our register allocator, we use graph coloring in Mesa for the most part. And this is that thing where you say that there's a bunch, you generate a graph for all of the values you need to store and based on their live intervals you put edges between them indicating where you can't store two values in the same register at the same time. The problem is, as I'm choosing, once I choose a particular register for a value that changes which set of other values I'm going to interfere with because for individual operations, if I've already got a particular register in the A file, my other argument can't also be in the A file. And the file restrictions change as you assign individual registers. So for now I have this gross hack. I'm saving two of the registers, one from A, one from B. And when the register allocator picks something unfortunate I spill into the file I need and use it from that file. Generates extra moves, it's pretty ugly. I do force some values into the A file only because some operations require A file. I can say, yeah, that particular value I will just always store it in A. Once I've register allocated I generate a stream of single operation instructions. So if it's an ad, it goes in the ad and there's a knob in the mole or there's a knob in the ad and there's an actual mole instruction. Once I've got all of those individual QPU instructions generated then I have a little instruction scheduler that tries to look at them and say, okay, you've got a knob in the ad here and a knob in the mole here and you aren't both trying to use something from the A file with the conflicting index and piles and piles of code trying to pair these things up. It's fairly effective. I don't have metrics on them but I think I cut instruction count by probably like 20 or 30% overall over the course of adding all of the pairing support. But this isn't the only way I could do things.  One way would be to give the driver the opportunity to just choose something better at the moment we're selecting. So the register allocator right now as it's choosing each individual register has two heuristics available. One is choose the lowest number of register that's available for you. This generally works out pretty well because we keep our accumulators in low numbers so you tend to use your accumulators more often. The alternative is for nice each five we added round robin. So just choose the newest register that you haven't used recently which improves their scheduling. What if instead I handed the driver, here's all the registers that are available. Would you prefer that this value be stored in any one of them in particular and the driver could say, oh, this operation has a bunch of things already, or all of the operations using this value have things assigned to A. I'm gonna choose a B for this one if there's a B available. Alternatively, I could try something more global doing a pre-pass splitting things into each individual value would be an A or B. Generate a bunch of extra moves up front, do the assignment, forcing things into A or B and then noticing that, oh, a bunch of these moves are from the same location to the same destination and cutting the moves out at that point. That might work. The other option, this would be, this is kind of based on what they do in the code dump from Broadcom. They just do a bottom up linear scan allocator. So just generate instructions from the bottom to the top, pick the node for your destination at the moment you're picking, at the moment you need to generate your sources, kind of look at the tree and decide where that source should go in particular. I haven't been putting a whole lot of work in register allocation because if we switch to some of the new SSA architecture that's being worked on in Mesa, there are some really neat things you can do with register allocation directly out of SSA. I haven't looked into them enough yet, so I'm not putting too much attention on register allocation. So this Mesa new IR thing.  GLSL IR is this tree structured IR that we generate out of the parsing of the GLSL source code. We have a bunch of optimizations at the GLSL IR level. That gets turned into TGSI code, which is this serialized packet format that's really awful to work on for any optimization. Oh, thank you, Keith. So TGSI is kind of mostly just a format for streaming shaders between things. It's not very good for drivers.  And out of the QIR, I do my register allocation and generate QPU code. My QIR is SSA, which is really easy to do when you don't have any control flow and I don't have control flow because, well, it's a GLS2 part. I shouldn't need to do any, right? Oops. Turns out that our loop unroller doesn't manage to unroll all of the loops in the GLS conformance suite. And you look at the loops that aren't getting unrolled and it's like, yeah, I could unroll that. Why doesn't it do that? I don't know. But I still think that doing control flow is probably the right answer. It would mean that we can run a lot more desktop code which doesn't have the guarantee that all groups need to be unrollable. So I should probably do this. And the hardware has support for it. It's just not being used in the original Broadcom driver. There's this new thing though, NIR, NIR, it's the pronunciation of it, that landed this morning in Mesa. I've been working a little bit with Jason Extrand at Intel, who's been doing a bunch of the work. NIR was actually originally started by Connor Abbott, a high school student who hung out in Intel for a while and wrote a new compiler architecture for us, which was pretty fun. So I've got this little branch in my tree that now inserts a couple more steps in the compiler pipeline. It takes GLSLIR, turns it into TGSI. From that, I turn it into NIR, then turn it back into TGSI so I can feed it into my current driver architecture for turning TGSI into QIR into QPU code. This is probably more steps than I actually want. Obvious next thing would be to get rid of that extra TGSI step because part of the whole point here is that I'm not a fan of using TGSI. My goal with NIR is I wanna be able to write optimizations for the compiler in shared code. All of us driver developers keep writing the same optimizations in our drivers, and it's not that fun the 10th time you've written a copy propagation pass. If I could just do that once in NIR, I would be really happy. So the NIR directly into QIR is almost working. Maybe sometime in the future, we would drop the TGSI in the middle because we have GLSLIR to NIR already for the NICT-5 driver. What if I fed that NIR directly through the gallium interfaces somehow into my driver? That would be pretty nice. I don't think anybody has any concrete plans for doing that yet though. Moving away from compilers, by far the most difficult part of working on this hardware is that there is no MMU on it. Everything else I've worked on since I can remember, which is a long time ago, has had an MMU under the GPU so that the driver can build a bunch of page tables for mapping the memory that needs to be accessed by the GPU from the user into the GPU. In our case, the GPU has direct access to system memory. My addresses that I generate in my command stream are physical memory addresses. They would be DMA addresses, but I think they're the same. The kernel CMA support helps this a lot. This would have been really hard to do a while ago, but these days I can just ask the kernel, hey, can you give me 256K of contiguous memory? And the kernel can actually say yes now. The downside is that that's allocating out of this pool of memory that's kind of half saved for just CMA's own usages. So that's kind of unfortunate. I can't really allocate out of CMA either too much memory. A, my system doesn't have a lot of memory up front, and B, the CMA pool is a fraction of that total system memory. It's also fairly slow to try and make those allocations.  Anything the kernel is hanging on to. With the, since obviously the hardware can draw to memory, it can also store values onto your page cache if you wanted. So in the closed source driver stack, they just didn't deal with this. Basically, if you could manage to hand some shader code off to that stack, it would execute into arbitrary system memory. You could hand it bad vertex data and read too far and read out of things you shouldn't be. What I built for my solution, though, is in kernel validation of the command stream. So I actually have to read through your shaders, figure out which uniforms are being used as texture sampler setup, and track those out of that. I think then look at your uniform stream and make sure that in those, there are actual good addresses for textures and that you're not trying to set up a texture that's too big for the beo that's being referenced. I can cache the parsing of the shaders. I can't cache the parsing of the uniforms because those change all the time. Also, your command stream changes all the time. I have to look at all of your vertex reads and make sure that they're bounded correctly. I have to look at the tile buffer address and make sure that that's not going to scan, not going to draw to anything it shouldn't. Actually, surprisingly, this only takes about 5% of the ARM CPU time, which granted is a lot. I don't have that much CPU time. This kind of hurts. I wouldn't have been surprised if this was a lot worse, though. However, this is the scariest code I've ever written. 1700 lines of just a long series of, if the user tries to do this, say no. If the user tries to do this, say no. If the user tries to do that, also say no. All of which is predicated on me correctly understanding how the hardware works, that I have a kind of perfect image of what this hardware does and how it responds to all the different ways you could set up your state packets. I have never had that understanding for any hardware ever. A few other notes about my kernel software. I'm using the gemCMA helpers that were sort of generalized out of some other drivers. I put a thin little wrapper around that to track where it is in my GPU command stream. It's like I have a sequence number and I have a couple of list pointers for the BO cache. I have to have an internal BO cache because that binner step, the part that's taking your incoming vertices, deciding where they are on the screen and building up little per screen area command lists for draw this particular set of vertices for this tile, needs kind of an arbitrary amount of system memory. You could construct some sort of function that would figure out how much memory you needed up front and that function would answer way, way too much memory. So you do runtime allocation of memory in response to interrupts. Since I'm doing runtime allocation of memory and CMA is kind of slow to allocate out of, I need a kernel cache to do this. My driver interface though is really, really simple. I have three eye octals currently that are driver specific. I have submit command lists. I have wait for a particular sequence number to pass. This is the fencing idea that you see frequently. And I have wait for a particular BO to be idle because sometimes you don't know what sequence number was last used for rendering to this BO because it came from somebody else. Some other user passed an FD over a socket to you. So I have a wait for a BO to be idle. And then I'm just abusing the dumb allocation APIs to do my buffer allocation and mapping and Dave is probably not a fan of this. I've talked about execution so far. All I've really done so far for KMS is I'm abusing the firmware to set a dumb frame buffer for me. So the firmware has a little tiny chunk of memory that it's using for all of its graphic stuff. I'm not using the rest of its graphics functionality, but I can't ask it to set up a scan out buffer from somewhere in that area that it chooses. After it sets up the scan out buffer, I just go and smash the hardware and say, no, no, no, that mode you set, great. Thanks, but I'll scan out of my buffer instead. And this is all the filthy hacks. So it's assuming 8888, it's untiled, lots of assumptions in this code, and I really need something better. Building something better is going to be interesting. The notable feature of this hardware is that, so most hardware has a couple of scan out planes, right? You have the thing you see here, there's another plane for the cursor and if you had a movie playing, you would put that into a plane too because scaling and color conversion is hard. The VC4 instead has this HBS display list. So they came up with this fun idea, hey, we'll have a little microcontroller kind of thing whose job is to read your scan out buffer for you and it will take as input this chunk of memory that has a series of rectangles, formats, and addresses. For each line, it will decide what pieces of memory it needs to read and go and read from them and do it with the compositing itself. So my number of planes is not really limited by the hardware other than if it's a 4K buffer and my little rect format and addresses 10 bytes or whatever, 100 of them. Instead I'm limited just by the memory bandwidth in the system, right? I need enough bandwidth that I can actually answer all of those reads in time for the display to get successfully scanned out. So we've kicked around a bunch of ideas for this and when we started the atomic modes work hadn't quite landed yet. These days my best ideas will expose a giant number of KMS planes and the driver will get to try and set video, present a scene with a ton of frame, a ton of planes stacked up and if the HBS won't be capable of that it gets to just say no try again with something simpler. What can we do with this? With the present extension in X, X now sometimes asks the driver, hey, could you present your scene at this V blank number with this plane contents? What if I extended that interface a little bit to be, hey driver, please present at this V blank interval this scene composed of this plane with this plane on top of it with this plane on top of it with these formats. That would look a lot like what my Harborator face is. We'll need some sort of communication here for when the kernel says, no I can't do that for you. X could take a look at its scene and decide, well I could probably save a bunch of bandwidth if I squashed this plane onto this plane, I'll go to fire off an open GL operation to do that rendering and then try the scene a little simpler and see how the kernel feels about that. This would be pretty neat that we can build this sort of automatic put your stuff in planes implementation that would save a bunch of memory bandwidth for most people while not having to have the driver know all the specifics of the weird, weird cases that your particular kernel has for being able to scan out combinations of planes. Basically by just having the driver pick to squash things down until it gets down to a single plane. Plan initially is to use GL for this, the Glamour code that we have in place. The HVS that we have in the hardware actually has a neat little bit of magic. I can configure a scene with the output not being the output on the screen but being a chunk of memory. So if I wanna squash a couple of planes down I could configure the hardware to read those couple of planes exactly in the way that it would for scanning out to the screen and it will just, when there's a little bit of bandwidth to spare get a little of progress done on rendering that. Then once it's rendered I would ask it to actually scan that rendered content out. That's gonna be a while, we'll start trying to do with GL first. The neat thing here is that we could avoid all of our X copy areas to the screen things like Firefox scrolling and all of this by just putting most of the contents in planes in the first place. Upstream status. All of my Mesa code is upstream already. I started pushing that back in August I think and I'm doing pure upstream development since then. The kernel is a little harder and not because of the kernel upstream. So Raspberry Pi maintains vendor kernel treats. Razbian has 3.16 currently. These trees are take upstream and rebase a bunch of drivers onto it.  I'm based off of one of those trees so it will boot on my Raspberry Pi. I'm using 3.15 at the moment. The particular version isn't that important to me. I could rebase, I just haven't. I've got a couple of hacks to core DRM to share some extra code and then another 59 commits to build up the kernel driver. I would obviously like to stop working into my own tree. I'm not a fan of working in my own private trees. I would like to just be in upstream. But the upstream tree has a bunch of stuff missing that is in these vendor kernel trees. I just saw a patch to get the USB networking working. I was unable to boot upstream actually because my configuration requires networking to even boot, I use NFS. So USB that gets the ethernet running might be about to land but there are some other features that I really need. The mailbox is this little interface to the VPU. It's the way you pass messages between them for doing things like, hey, VPU, could you set up my frame buffer for me? Also, hey, VPU, could you turn on all the clocks for the QPU for me? Because I don't know how to do it myself. So I rely on that driver in my kernel driver at the moment and that isn't upstream. There's a bunch of other features that are missing from upstream.  So for me, I need to get them, mostly I need bootable upstream, the USB bits. I need the mailbox driver in order to report my stuff to upstream. But before I try and push upstream, I probably ought to fix some stuff in my ABI.  I'm using those APIs in my driver. As far as I know, Dave would get very, very angry if I actually shipped code using this.  Is that the best implementation I could do? I should probably go do some profiling and do a couple of experiments before I actually finalize this ABI. And the worst thing, I need review. So my kernel driver notably has this 1700 lines of absolutely horrible shader validation code. Who's gonna read through that? And if somebody does read through that, who's going to have the attention to detail to notice that in this one place over here, you forgot to overflow check your ad, or even worse, what about the interaction of this packet with this packet? What if you put them in the opposite order and try to use some undefined packet contents? My best idea for dealing with the shader validation stuff and getting something tested and believable out of that is actually probably using Dave's Trinity fuzzer, Dave Jones's, to at least verify that, yeah, in this giant mess of code, you can't actually successfully do buffer overruns or stomp on system memory.  But if I can run this for a couple of days and not trash my disks, that would give me some amount of confidence. So my driver that I've built is fairly simple. Under 15,000 lines of 3D driver code, which coming from a project before that was, I think we were hitting about a hundred K lock in the 3D driver for Intel. And under 5,000 lines of kernel code, granted, I need to write a bunch more because I need to actually do native display. But it's fairly small. And despite being fairly small in my simulator, I'm at a 98.7% pass rate on the ES2 conformance tests. Those failures are mostly the loop problems that I mentioned before. There's like four of those. And there's a bunch of EGL image stuff where the code base I have just doesn't have them hooked up for my window system. I'm doing pretty well on the Piglet GPU tests. These are the OpenGL mostly desktop tests that we've built in the open source community. 92% on those, which I'm feeling really good about. Actually, one of the problems there is a bunch of math is too inaccurate for those tests. The worst problem though is the hacked up KMS code I wrote. It works on my monitor. It's forced to use 1680 by 1050 resolution, which was the monitor I had at the time. It works for me. It probably won't work for you. You'll note that I'm not displaying on the conference projectors off of this hardware. Links to the code. So I've got a sort of to-do list and build instructions up on the DRI.fd.o wiki. Hey, the spec does actually exist. You can find it. And the sample implementation. The link here actually to the sample implementation from Broadcom is the Broadcom code dump that was ported to the Raspberry Pi by Simon Hall for Raspberry Pi's Quake 3 bounty. So he actually managed to get the Broadcom dump up and running on the Pi enough to run Quake 3. I think that concludes the presentation. If we have questions. Hi, two questions. Number one, is it possible to turn off the security checking to get back that 5% if you were in a performance bound use for the Pi? Yeah, so can we turn off the security to get the performance back? It's kind of tricky because my, how do I explain this? So one of the problems we have in generating of GPU command streams is that user space doesn't know the particular addresses of your buffers. So you pass in these sort of relocation structures that say, hey, in this part of my command stream, this is actually a reference to this buffer and you need to pick its address out and, you know, or it in. Because I'm doing all of this shader, all of this validation of my command stream anyway to get the security, that's where all my relocation processing happens. So I don't have a way right now to implement my relocations without parsing all of your command stream. You can imagine kind of hacking up that code to have something like if depths that would only do most of the validation in the validation case. But I've also been thinking about rewriting my command stream entirely to sort of separate these two parts out, to have the relocations in one look spot and all of the uses of the relocations in something that looks more like the native command stream. It's gonna be tricky though. The other question was your slides mentioned X. So you're looking at Wayland at all as well? Yeah, so I've only been really looking at X. Wayland should be easy. I've got all of the GL infrastructure necessary for Wayland. I've got the prime buffer import export so that I can do DRI three. All that's in place, you know, other than bugs. The more interesting thing for Wayland is going to be building the compositor. Though there is a port of Wayland to the Pi that uses all of this HVS infrastructure I talked about by shipping these scenes off to the VPU and saying, hey, VPU, could you set up my scene to scan out all of these various Wayland planes in their various locations? We would need to port that idea to the new atomic mode set APIs. Right, so another question on the command stream validator. A lot of it sounded pretty hardware specific. I know there are a few other chips out there which are also lacking hardware memory management. Do you think there's any benefit later down the track in someone trying to create something a bit more generic with just a library of different functions or different chips? Yeah, I've kind of, I was talking about Jamie Sharpe about this a while ago. I'm not sure because, yeah, it is so hardware specific. You know, the checks are all about the particular interactions of this packet with this packet and needing to have one of these set up before this one and, you know, pick these bits out of this one and multiply them in various ways, checking for overflows and all of that. And, you know, 1700 lines of code is a lot to write and it's really ugly, but I have a hard time believing that we've come up with a generic infrastructure that was simpler. And to a significant extent, like you want something simple and trustable for this. Yeah. Last question. You mentioned that originally it was the VPU that was doing the shader compiling, but now that's on the arm along with validation. I guess the VPU is still like a kind of proprietary bit so you couldn't put it to work to do at least a shader compilation to offload stuff off that arm. Yeah, there's no interfaces as far as I know in the current VPU firmware for, hey, here's a pile of VPU code. Could you render some things for me? Obvious problems here. I believe there's no open VPU tool chain. There was a guy that was working on hacking up an LLVM backend for the VPU that I think got to the point of emitting some instructions. So A, we don't know how to generate code for it. B, there's no interfaces for it. So for all of my stuff, I'm still using the existing Raspberry Pi firmware blob. It still has the Raspberry Pi driver in it. You have to like set a flag in it to say, hey, firmware blob, stop listening to the graphics interrupts. Those are mine now. Please don't mess with that. Someday, once I get to the point of us doing this in Raspbian, we'll probably get to put out a new firmware blob that's a lot smaller. At the point where you're putting out a smaller firmware blob, well, could you do something else in place of what's currently on the VPU? There's more potential then once we get this giant pile of code off of the firmware. Eric Arland, thank you. There you go. Thank you very much from the organizers. Thank you for your welcome and welcome to Raspbian Pi.


Hey, hey, you guys! It's me, Nino, and we're back again with another reaction video. And it has been a while since I have done a reaction video to SF9, and I am completely sorry about that. To my fellow fantasies, I am sorry about that. It's just, uh, I don't know why I actually haven't done any SF9 videos. But before we get into this, I just want to quickly talk about their comeback and all that stuff, you know, because it's going to be a high dub, isn't it? I am so freaking excited for this SF9 comeback. It's going to be absolutely amazing. SF9, they're going to slay the game. It's going to be the Knights of the Sun, which is us, because we are the SoulMio. I'm not sure. This is just from my memory. We are the SoulMio, which is my sunshine or my sun or something like that. And then they're the Knights of the Sun, because that's what their album is. And that just means they're protecting us, their fantasies, and it's going to be freaking dope.  I was just running around the house and I was like, yeah, yeah, yeah, yeah, yeah. SF9, SF9, SF9, SF9. So basically, I'm freaking excited for this. And now this is the first time I'm going to be doing this, but I'm going to be reacting to the teasers when they come out for the music video, because I'm freaking excited for this. And it's just SF9, and they're my favorite boy group out there. They're my favorite group out there. So I am just freaking excited to do this. But anyways, back to the video. Yeah, actually, I want to tell you guys quickly something else. I had to cook dinner tonight. They basically wanted to tell you, so it kind of failed.  And I did stuff that I've never done before, and then it just turned out like rubbish. So here's some clips of what it looked like when I was cooking. Yep, I burnt the chicken. I burnt the bacon. And I overcooked the fries. And that was everything that I had for dinner. I didn't even have enough time to cook vegetables because I just wanted to come into my room and play some video games after having a long day at work. So finally, let's get back to this video.  You guys got any recommendations? Because this might be something... Because there might be some things that I haven't watched from SF9, and you guys have seen it or something like that, because sometimes people make like compilations and all that stuff, and I just haven't seen it because I can't see every SF9 video out there, even though I wish I could, I just can't. So I tweeted out asking any recommendations and all that stuff. They're fancies, fascinates mode. So fascinates mode tweeted at me saying that they want me to do the SF9 on crack number two. And I'm like, yo, I'm going to do number one first, then do number two because never caught water, am I right? So today, we're going to be watching SF9 on crack number one. And it's fake subs. So it's going to be funny. But then that, let's get straight into this. I'm freaking excited. I hope you guys are too... Let's do this. Yo, SF9 logo, we got a real tape, a real tape, I don't know. I love this, Valia. I did a reaction to this. I love that. I love that. I steal that. They're snares. Look at them, they're snaying the game.  Oh, God, this is going to be good. I just, just judging everyone with you. It's happening. The ship is happening. These fake subs are dope. Sugar, I'm loving this. Hey, that's what's big. I think I'm a lot cuter than Channy. Damn right. You're my bias. He was at home. Faces. He's up. Now we're going to show you how to act like a gangsta. Real baddies, yo.  I touched the bottom. Hey, yo, hey, yo, hey, yo. It wasn't that bad. Cure me please. I always say that I'm a strong shrimp. But people still think I'm girly. I'm like, or in this, I like a pretty old thing that was born in 19, even though it's fake subs and who did still didn't hurt when you fell from heaven. Oh, I'll tell him for real. Oh, here's your price. See, even though there's a fake sub, no one would still say that. He'll say I'm the bias for this group. Because why not? Oh, yeah.  Damn right. You OK, mate? You touched my chalala, my deening dong. How are you?  What's up, man? Oh, yeah, what's up? What's up? Here's how many people we actually care for you guys. It's so true. I could have read the rest because I'm slow read.  If it's freaking visuals, man, I'm ruined, man. Come on, there's a bit. Come on, but there's SF9. Thanks for watching. Yo, thanks for making the video for us. OK, bye, I'm out. No, but really, thank you for making this video. It was absolutely amazing. I cannot wait for the second installment for the series. I need to get a haircut.  You know, I want to try something new. Because I always just get a short cut. Why not change the color of my hair as well? I'll probably do that in the weekend, which is two days from now. But man, this video is absolutely amazing. I freaking love it. I reckon you guys loved it as well. It was just so freaking awesome. It was funny as well. I actually am loving this. I'm going to watch this again tonight. I've already pinned the tab. I'm going to watch it again because it was actually just freaking amazing. I actually really enjoyed that. That was actually pretty funny. There will be a link in the description down below if you want to watch the video during your own time. And also, you might as well just subscribe to all my SF9 at the same time. Am I right? Yeah, I am right. I think I don't know why am I doing this? Yeah, damn. But you guys are just going to be able to do this video. If you guys did and enjoyed this, don't forget to show us a like and also comment down below your favorite moment from SF9, just in general, just your favorite moment that you have just seen from SF9. If you've met them or if you haven't met them or just watching the user, that's not a highlight.  But comment down below your favorite moment to do with SF9. And also subscribe if you guys need to do more reactions coming to you guys in the near future. And definitely a reaction for SF9's comeback and definitely the second installment for this series will be coming out tomorrow. I'm going to react to this tomorrow. And yeah, that's basically all. Sorry, hope you guys have a great day. And just keep on smiling. And adios, amigos.


Hey guys, welcome to another video stuck in a mild traffic jam Thought I would take this opportunity quiet opportunity to Talk to you all Because the faster I go the louder it gets I got me a forerunner I want to explain why I got me a forerunner. What's wrong with this one so far and What I think of it basically so it's gonna be a video of me talking you listening So a little background behind this What's happening and what not? found this car truck SUV whatever I Don't know what to call it. I don't want to upset anyone vehicle found this vehicle on the Facebook marketplace in Houston, Texas Took me about two weeks of looking every day every hour several different platforms Craigslist Facebook I Know several dealers cars that come what not whatever everywhere spoke with the owner several times He sent me pictures of the frame. Yes. I saw the frame before I actually went there. I'm actually flown in from Chicago To Houston yesterday Uber 40 miles or so West of Houston met on the parking lot You know, I liked it. Well, obviously because I'm driving it back 1100 1100 miles Back home, and you know, it's not all rainbows and sunshine. It does have issues. It has 130 Thriller 134,000 miles now and oh, yeah, this is the V8 version 07 V8 and Well, I guess it's not a four-runner. It's it's a two-runner. It's rear-wheel-drive only It's the sport version, which is the middle. I guess the the kind of the poor man's version No heated seats Obviously, no four-wheel lock and stuff like that. No sunroom or sunroom moonroof sunroof, whatever Which I thought it did had it. I didn't notice in the pictures didn't ask whatever my loss But I actually don't care that it's only rear-wheel-drive because well, I'm not Didn't buy it for off-roading. I bought it for daily usage You know vacation trips I Can put my dogs in the back and I can tow light vehicles If you've been following my channel You probably know remember Look we bought a super impresa and we intend to strip it down Make it lighter. No make it a race car and tow it to the events in case of you know Breaks whatever we can always tow it back So that's the reason so what's wrong with this so far what I've noticed Are we getting off the highway now? What's going on over here? I see cops Yes, we are what I've noticed right away and the parking lot is noise What seems like Seemed like at the time from the rear tires There are those off-roading tires and the way you you can tell if it's tire noise Could be bearings to could be rear differential Which now I'm thinking it is rear differential, which is just a bummer But I'm hoping it's gonna be the tires because you know, obviously the thread is It's not your conventional Turing tire thread It's the off-roading thread and the thread is not even it's got these Scales going on, you know, it's not an even thread. It's got it's uneven These tire they're all tires to these tires were put on use from a different vehicle So who knows what happened and the fronts are different too. So we got two different types of tires all right, we got we got My five cop cars Another five or so the construction, you know Pickup trucks with the lights and all and then when I see six or more plows the big highway plows Well, there's no snow on the road. I guess they got hit pretty hard Couple days ago. I'm in Arkansas by the way anyways So, you know, and just I assume it's the tires. It is this whiny road noise Coming from the back because of the of the how the tires look but now that I've driven I actually driven it yesterday I drove it for 350 miles and today for about a hundred miles, so, you know, I So what that's 450 miles. So, you know, it's enough to Kind of get to know the vehicle. So I'm hoping it's not the rear diff There's another whiny noise, which I've noticed right away. It's it's very loud. It's sounds like Your power steering pump is going out, you know that and goes up with our PN you know and Can't really Have a listen, you know, you need a stethoscope or a long screwdriver Put it against the power steering pump or something else whatever could be a an alternator also don't know Sounds like it's coming from the timing cover, but I don't know it, you know What a Component inside the timing cover could be making that whiny noise. So Don't know. Hopefully we'll make it 650 miles to go only So not even halfway So those are the two major things that kind of worry me I'm gonna make their nuts. We got no high beams Both are out Let's hope it's the light it's the light bulbs Got a TPMS light Sensor that's out inside of one of the tires or wheels And there's the little Display telling you the range mileage range temperature outside inside clock the light the little bulb is out and What else I think that is it I've got a little stone chip on the windshield. I'm gonna try and fix that before it Spreads and we got an average mileage of I did not reset this 19.6 had 19.7 yesterday. I went to actually slap in the back, you know, it was nice No, no wasn't if you don't know what it's like to sleep in the back of the Seats flip down. So there's plenty of room if you sleep kind of angled sideways But if you don't if you never slept in the back of a forerunner take a nap on some plywood then you know I will now we're just they all left The pickup trucks in the plows besides except the police, okay, I guess we're we're about to move. Are we yeah Oddly enough, there's a forerunner right behind the cops leading the leading the way again if you've been watching some of my Videos you may have noticed a an old BMW 530i premium version which I've had for almost seven years Beautiful car the e39 You know engines the cars BMWs are just Also straight six engines smooth comfortable All the bells and whistles You know besides the obvious You know like automatic windows up and down all around, you know full power seats On the premium version you've got the headrest up and down But not like you need that You also get the heated steering wheel and Rain sensor flip the wipers on and depends on the Rain on the water on the windshield The wipers just do their thing right you're not gonna touch anything And I'm sure I'm missing something whatever so I mean it hurt me actually sold it. It hurt me. It still hurts me The Now I don't have it anymore was a nice car in great shape hundred and eighteen thousand miles But yeah, it's just not practical for me anymore for my needs So I had to go if I had the room space, you know and money obviously I would keep it, but it is what it is And I was afraid I'm gonna whatever I'm gonna buy next There are not gonna like and I'm just gonna be Pissed at myself For you know selling the BMW But this is my first ever SUV And I like I love it. It's it's awesome drivability is surprisingly surprisingly Not SUV ish If you kind of get what I'm saying so this version the sport version has the hydraulic suspension I forget there's a name for that. I forget literally there is there's fluid inside the shock There's lines going across the frame and you've got some solenoids or some something along the frame and Whatever it goes it Equates to a softer ride especially on the highway and it it shows it Maybe you guys the forerunner guys can tell me I did drive a 2020 forerunner v6 obviously They only made the v8s from all three to O9 and the VVT Was on the O5 to O9. So this is the O7 v8 with VVT so that's 260 some some horsepower and 305 maybe more The torque so So that's the whole reason, you know, it's it's the I guess the the torquey the most torquey forerunner you'll ever get I guess and Because it's only rear wheel drive it can tow 300 pounds more over the all-wheel drive Forerunners which is which comes out to 7300 versus the 7000 For the four-wheel so that's so that's a plus not gonna probably need it But you know always good to have room and with the trailer that I have Gotten two weeks ago or so. I'm looking at After the strip down of the our race car We're gonna be Looking at five thousand pounds. So which is it's not too much, you know, it's it's probably the limit of this Of this of this car truck, whatever and we're stuck again. So going back to the 2020 forerunner I drove it for 200 miles to Wisconsin highway and This drives much better. I don't know why On different tires from the back No bad tires in the rear, but it just wants to go straight the 2020 Had to I had to keep keep it Straight myself. It just wanted to go sway left and right Did not want to go straight It was it's kind of tiring, you know, don't know where it is. Maybe you guys can tell me What's what's what's with that?  No modifications to anything whatsoever stuck tires It I think it had like 15,000 miles at the time Maybe 20,000 miles. So, you know, still semi-new This is a totally Different experience as far as driving goes, you know road tripping and stuff like that And I like it can't say that I don't this seating position is awesome I can adjust the steering wheel tilt and then do that, you know this back and forth I'm actually the seat is actually almost all the way down. I Raise it up a little bit so I can see the Tip of the hood. I don't know. It's whenever you see the hood of your car. It's always for some reason Feels different and this being an SUV it's it's nimble, you know, the steering is very responsive The brakes are there right away It this thing gives you the feedback that you want Man, this thing probably never seen snow and I'm going over snow right now I'm sorry. So this was a California car for a long time then went to Florida Not sure for how many years specifically Miami and it ended up in Texas for several months And now it's gonna be in Illinois But the the the day I get home today So tomorrow when I'm gonna I don't care the temperature there if it's even if it's 15 I'm gonna pressure wash the the undercarriage right away Keep it inside So it dries up and we're gonna spray Kind of like fluid fill but I've got this this product from M soil It's in cans. So it comes out liquid and then it dries up and it becomes kind of Like Like wax basically it's supposed to last A few years longer than fluid film fluid film or wool wax you got to redo it every year or two This stuff supposedly stays on for four or five years. Well depends where you are So, um I plan to spray that everywhere. Okay, we may use Chassis saver Because there is a few you're gonna see the frame. I'm going to show you it's I'm amazed And I'm never buying a car ever From any of the rust built States always going to travel take the time Pay the little you know a little bit of extra money Uh and buy a car from Texas, california Florida what what a little bit of snow and people are going crazy come on Also have a slight Break pulsation in the rear Plenty of pads rotors look good, but they are work to Tell them apart. It's very simple if when you break And your you can feel the pulsation in the steering wheel. It does, you know This number on you Whilst pressing the brake and slowing down Then it's the front rotors if We're doing the same obviously and you you break and You you feel the car doing this or maybe even the s doing this then it's the rears Basically if you feel it in the steering wheel, it's the front If you don't feel it in the steering wheel, but you feel it in the car In the seat, then it's the rears. I'm probably gonna do some changes in here I may or may not install some Heat pads whatever in the seats because I do like heated seats I don't care for the heated steering wheel I may put a different stereo In here I kind of like this one, but it could be better We may do some lights in the front and in the rear when I'm backing up I need oh, yeah, I'm probably gonna do a radio for the rear camera. So I have a screen here Um to see where I'm backing up You know hitching hitching the trailer. I would like some Kind of dim lights Maybe some orange or blue lights somewhere here. So I see what's going on over here So I don't have to hit the light switch during nighttime when I'm driving to see what I'm trying to grab or whatnot I'm gonna tin the front windows side windows. We do have these wind side deflectors things, you know That's nice fix the tpms Sensor replace that Check all the fluids. The Engine oil is is fresh Definitely look at the rear diff fluid Do a oh, yeah, the steering The power steering fluid It's black. It's bad. Number one is the noises number two Or not necessarily not order is the frame seal up Not go not with this into the what besides today Into the salts of chicago of illinois Without sealing sealing up the frame Let's go You know before I bought this I went on Facebook and I joined a few groups forerunner enthusiast groups Uh, fourth fourth generation. This is the fourth generation forerunner And every once in a while there would be a guy You know joining the group already there saying hey, I just got my new Forerunner first or second whatever and I'm loving it, you know I had it for a few hours or few weeks And they're they're all loving it, right? and You know, I'll think into myself You know, we'll see about that, you know, we'll see if I'm gonna love it I don't know if I love it yet, but I do like it and I I know why I know why there's just some Some cars have these Things, you know about them Yeah, you know, you you start driving A certain make and then you Almost never go to another, you know Like if you've driven a subgroup all their subgroups not the new ones. I don't care for the new ones much All their subgroups There's something about them even if it's a pile of crap. It's still There's something about those those cars That just makes you Enjoy the drive. Whatever whatever you're going if it's a store or if it's a trip, you know a couple hundred miles or whatever Same thing with this. It's just something about this That the driving experience. It's just different than then say I don't know a Chevy Aveo, you know or or a Toyota Corolla even or you know something something That's just gets you from A to B. This is this is not just an A to B vehicle. This is This is a different experience I don't know. I can't put my finger on it. It's just you gotta you gotta drive one to to understand Almost drives like a agile sedan big sedan I guess the the responsiveness of you know even even the The get the accelerator the gas pedal. I mean you press on it. It goes engine is smooth. Like I said braking Right away You don't even feel it switching gears same with the the BMW that I had the e39 it had Obviously can't really compare the two the drivability of that is also it had heavy steering Which which I liked actually Not like on some cars, you know down the old Honda Accords Even from the 90s. You just turn the steering wheel with your pinky. You know, there is so light And I think the highway is opening up. Let's see if you can pick up on the noise Can you hear the wind? Perhaps get off the highway. I probably don't hear it I hear it Radio works if I set the volume precisely to 36 all the noises go away Road trip updates just did a full tank Just driving no idling It was 19 6 versus 16 something with the overnight idling So doing 19 6 highway miles. It's not too bad. That's it.  I also had a minivan pass me And about 50 yards in front of me this huge patch of ice It flies up breaks it breaks in smaller pieces and the biggest obviously Like a two feet by two feet piece just slams into my windshield. I mean I thought Something like wipers, maybe the windshields broke, but it didn't thank god. I keep forgetting to check but I think it's all good. I mean it was it was just a giant slab of of frozen ice frozen snow Yeah So I thought once I get home I'll wash it because it's filthy Once I have it on the lift I'm gonna take a closer look So see you later


Before you or I make important decisions, we need to gather information to make well informed choices. Central banks are no different. To make sound decisions, the ECB relies on trustworthy statistics and data. These statistics are produced by the ECB and Eurostat. For our analysis of economic development such as inflation, we rely on the statistics of Eurostat. For our work on monetary developments we produce the statistics ourselves, Rydyn ni fod yw wneud o ddataeth o'r perffugiadu eu ddeinigol. We follow strict quality standards to make sure that our statistics are accurate, consistent and timely. We produce our statistics following agreed methodologies, and without any political interference. This independence is critical to ensure reliable figures. We highly value transparency and publish all our data free of charge. Make use of them.


Next compound is hydrogen peroxide. Hydrogen peroxide H2O2. Preparation from, from barium peroxide. Preparation from barium peroxide. Write down, hydrated barium peroxide, hydrated barium peroxide reacts with dilute S2SO4 to form hydrogen peroxide. This is the reaction. Once they ask this question, they don't use here and hydrous form of this we do not use. Barium peroxide and hydrous form we do not use. Write down the next line here. Hydrous barium peroxide forms a protective layer of barium sulphate. Hydrous barium peroxide forms a protective layer of barium sulphate on barium peroxide and hence the further reaction is not possible. Hydrous barium peroxide forms a protective layer of barium sulphate on barium peroxide and hence the further reaction is not possible. Sir, so barium sulphate is soluble in water? Yes, this forms, it gets dissolved and hence it won't accumulate on the surface. Let's write down the structure of this. The structure of H2O2 is open book structure. It is an open book structure and it is something like this. This is here. Oxygen has 2 lone pairs. The bond length is L1, this is L2 and this is L4. The bond angle here is 97 degrees. This is also 97 degrees. I think it is 97 degrees. See, how much means what? See, open book structure is this. Suppose this is the oxygen. Here we will have one oxygen and another oxygen is this. So this oxygen, this bond is 90 degrees but still the bond angle is 97 or 100 whatever you said. So this oxygen and hydrogen bond is something like this. It goes this way and this oxygen and hydrogen bond is like this. So this looks like open book. So this is an open book structure, non-planar structure. There is a non-planar structure. Write down non-planar. Which bond length is more here? L1 or L2? Why L1 is more? L2 is more than L2. Here we are repulsion. L1 is more than L2. It is a question they ask in the exam. L1 is around 1.48 and L2 is 0.97. Can you draw the orbital diagram of H2O2? Can you draw the orbital diagram of H2O2? Then it is oxygen-oxygen bond forms. What are the orbital overlaps here? Yes, draw the structures. This is hydrogen atom. This is sp3. This one is sp3. This one is also sp3. Okay, one last thing we will discuss here. Three different types of forms of hydrogen we have. First we will write down nescent hydrogen. Just you have to memorize this. Write it down fast. Hydrogen. Hydrogen now. At the moment of formation, at the moment of formation, don't add nescent hydrogen. It is more reactive than ordinary hydrogen. Generally forms at ordinary means normal temperature. Not at very high temperature. The most important property is it has less reducing power. The second one is atomic hydrogen. Atomic hydrogen, this forms at normal temperature, generally at lesser temperature. Atomic hydrogen forms at relatively higher temperature. So right now it forms at higher temperature. At lower temperature. When hydrogen gas passes through an electric arc, at that time it dissociates into its atomic form. That is atomic hydrogen. So for basic hydrogen, if you reduce the temperature of normal hydrogen, it is possible at a lower temperature. See, it is just one state. If you have nescent hydrogen, hydrogen is forming. Hydrogen forms and then it converts into atomic hydrogen. Just the moment where the atomic hydrogen is forming. Before that, only the state of hydrogen, whatever. Atomic hydrogen at high temperature. No, low temperature. Normal temperature basically. Comparatively here we have higher temperature. This forms when you have H2 gas, suppose hydrogen gas, it passes through an electric arc. Electric arc, higher temperature. This converts into atomic hydrogen. Atomic hydrogen. This has more reducing power than less. So what is the decent hydrogen? How is it? It is hydrogen only. Like apart from the temperature at which it starts. How wide does it have? It has very less intensity to lose electron. What? See, obviously it is just the game of temperature. So the higher temperature, hydrogen has more intensity to lose electron. Because temperature is high, the electron present in the orbital. It has more tendency to go out. But then, if it is just the temperature thing, it is not hydrogen's fault. So why are we classifying it as being significant enough for the reaction? See, it reduces the property. One of the properties reduces the property. It is different for the two hydrogen. But that is just the temperature. That is what. At one particular normal temperature, its property is different than this. Means the active hydrogen atom we have, its property is getting changed when you change the temperature. At different different states, we have defined the two different types of hydrogen. So based on temperature, the reactions they undergo also change? Obviously, because the electron, the tendency to release electron for mesent hydrogen is less than that of atomic hydrogen. So generally, a higher temperature required for mesent hydrogen is different. But for reaction, generally we take atomic hydrogen. Okay, so this is a relatively higher temperature. And it has more reducing power. More reducing power for atomic hydrogen. Once they have asked comparison of reducing nature of these two hydrogen. So reducing property, you must remember. The last one is, write down the last one. The third one is ortho and para-hydrogen. Ortho and para-hydrogen. Ortho and para-hydrogen. In the hydrogen molecule, both protons, two protons are there in the hydrogen molecule. So in both protons, it spins in the same direction. It spins in the same direction. Then it is known as ortho-hydrogen. So it says spin, spin. Proton rotates around its own axis. So if it is same direction, then it is ortho. If it is opposite direction, then para-hydrogen. Why does it rotate around its own axis? Protons always rotates around its axis. Yes, always rotates around its axis. So this is ortho. You find a way to rotate them. So with these electrons, they have to always evolve. Protons have to evolve. Yes, so exactly. So in the hydrogen molecule, it spins around its own axis. Is there one way to rotate a proton? Yes. This way, it rotates around its own axis. So this will rotate. This is a very light particle. It goes through a very small amount of energy it can move. Right. That's why it rotates around its axis. So same direction as ortho. Opposite. So ortho is, when proton spins the same, then when the spin of the proton is in opposite direction, it is called as para-hydrogen. Ordinary hydrogen has 75% ortho and 25% para. This is the observation factor. 25% ortho and 25% rest. This is the example. NCRT just go through few properties of hydrogen. You just have to go through NCRT.


what's up everybody I'm EvilRabbit we're here on Drift21 for another episode here on the PC we're gonna be doing a build on the BRZ so make sure you follow me in Instagram and Twitter all the fun in the description box below let's get to it let's build that BRZ so if you guys been following the channel you guys know that we've been battling with force feedback and stuff like that but today we're gonna get into this BRZ so the BRZ does not have anything in it it's got basic interior in it but we are going to be doing a full build on this now we have not decided if I'm gonna do in the four cylinder or six that's got a thousand horsepower six cylinder in it so we may do a four cylinder in the BRZ so first thing we need to do is we need to get the BRZ over to the lift and get all the suspension nitty gritty off this car because we need to do a full suspension we work on this car including brakes control arms everything like that front and rear we're gonna do a little bit less of an angle this time angle kit this time because I feel like we may have had too much angle a lot of couple you guys were commenting that maybe too much power too much angle and open up the garage door look outside hopefully we'll get a chance to be able to use stuff back here it would be awesome so we're going to do full suspension on this car oh we have all the wheels stacked over here forgot we have just random wheel stuffs and everything everywhere so drop all that off so let's work with the front of the car first we are gonna do we're gonna take the brakes off and then we're going to be probably doing upgraded brakes as well I mean we could probably just drop that over there we got take off brake part drop that over there throw that bearing oh we might need that bearing well it's okay we can get another one because luckily we're just throwing parts luckily parts that we already own we don't have to pay for again so let's drop this suspension and then we got to pull the knuckle off and then we got to pull the lower control arm off alright so now let's get into buying some upgraded parts we're gonna hit E start with the lower control arm we're gonna go with the type 2 of course put that in there and then knuckle is where I was so I believe last when we were running we were running in the other one 55 degrees so we're gonna run the actual tuning knuckle which is 45 degrees because the basic one is 35 so we're gonna go up to just the tuning which is 45 degrees and we're gonna see if this possibly helps so we're gonna put the wheel bearing the front hub back on alright so we got to go with some suspension I think we're gonna go with sports or tuning we're gonna go with the more expensive ones we're gonna go with the sports just because why not throw in the sports we got to throw in the shift link garage we got enough money right now I believe so we are gonna upgrade to a 350 in the front so we got to throw 350 rotor in there as well so 350 type 1 type 2 type 3 mmm yep we're gonna go with type 3 type 3 rotor well we're not gonna worry about the wheels again no no we need a caliper we got to go well I guess maybe we need to put the car up higher so that I can get to the caliber side there it is so we're gonna go with the biggest and best caliper we can for the front there we go so that corner is done we got to do the other corner now real quick turn E off well and then we're going to throw that over there nice shot up against the wall there we go we're just gonna we're just gonna chuck all these parts over to the wall why not I mean get it out of my way we're gonna lower this back down a little bit so the BRZ build is going to be a little different than the other build so like cuz like I said if you guys followed before you guys know I went all out with that this time we're gonna go a little less power a little less angle and hopefully that will help us in the long run we're just like eating these parts this one didn't get as far as I wanted to so we're gonna pick that up doof okay so we got to get our parts back on we're gonna go E oh and we're gonna throw control arm in so we also didn't do back suspension in the S15 so I feel like it'd be a good idea to actually do full suspension on this car front and rear and we did do that one alright so that one's all together that one is all together so the fronts all together now we got to come and take the back apart think we can get over the fence oh it did I collected it too we I mean I'm okay with that we collected it as we threw it in the back that's definitely intense so we got two sets of calipers back here of course for that little bit of a hydro you know what we're just gonna oh no we're just gonna drop pretty much everything over here just for sake of time oh no no not the axle take out the rear suspension is there a different sway bar link no rear stabilizer link is not any different oh do we got to take that all apart okay so we can upgrade the arm and then we can upgrade the knuckle or do that we got to pull the axle out which we're gonna need so we're gonna drop that and we can upgrade so we got to take all of this apart I'm not sure okay now we can take the knuckle off alright there we go so I'm gonna go E throw upgraded knuckle in there sport rear upgraded upper upgraded linkage now do we have any upgraded axles no I don't there's no upgraded drive axles so drive axle can go back into place and now we need to put on the hub that I chucked across the way and then we're gonna go 350 in the rear now we need to get that second one on there so there is a secondary 350 brackets so we're gonna go here 350 bracket oh no 300 bracket then hmm so we do need a secondary bracket so we go E I know we need to so we have to put this up higher gonna make sure you have every single part on this car otherwise it will not let you go so we're gonna throw big 350 rotor in the rear and it won't let me get to that bracket so it's not gonna actually let me work with a 300 350 in the rear so but that being said we're gonna take that off I don't know why it doesn't let me work the 350 but we're gonna get rid of that so we're gonna go E and then we're going to lower that unless it only needs a single one in the front or in the back we will have to see once we actually get the car fully together and if it allows us to run a single caliper in the rear because as of right now it did have originally have two so we find out that lets us run a single now it may require see it is showing that we're required to have a secondary bracket on there but for some reason it will not let me put the bracket on so we will have to figure that out but we need to figure this out sooner than later because well maybe we should just put the original brakes in the rear and just upgrade all the linkages and stuff I don't know we need to figure this out before this car is able to go on to the track take the axle out drop the axle all right take that off drop that suspension drop that control arm drop that knuckle comes out we go E and go upgraded rear and then we need to put oh nope nope linkage parts back up no no we need that one come here Mr. Link there we go drop that in there get the upgraded upper and then put the drive shaft back in and then hub so should we do the factory break oh it only see it only makes me do one all right so we're gonna go with the the 300 and then we're gonna add brake one and then a rotor and then we'll go with that so for suspension wise the car is absolutely done that from what I know now it's a matter of an engine so I feel like we should do the four cylinder and drop it in there but I feel like we should upgrade it first so let's take that back to the stand and I think we should just turbo the four cylinder so let's take off exhaust manifold and then let's turbo that manifold throw a type 2 turbo on it nope I just dropped my good turbo and then throw on the pipe and then an air filter on there turbo pipe for the four cylinder there we go and there so we're gonna go with the BRZ radiator hose and the BRZ radiator hose on the ground all right that on let's send this to the BRZ and now we need to find out what other stuff we're missing in the BRZ we're missing wheels we know that underneath what are we missing so we're missing an intercooler so we're gonna throw in the biggest intercooler we can charge pipe charge pipe on the ground so I'm gonna put some wheels on this car we're gonna take the two fronts that were originally on well we're really front one was a front one was a rear but they'll work the same and then we're gonna take these other wheels that were on the 15 we're gonna put those in the rear for right now and then we're gonna send the car to engine parameters and then we need to send this car to the dyno dyno car parameters missing a gearbox we're not gonna put that in there forgot the gearbox but also be missing oh and see it does say the rear brakes are missing so there's a lot of things that we need to address fully but I think that'll do it here for this episode so far we're gonna have to go through and readjust the back of the brake systems and everything like that because we're gonna need a second caliper bracket on here so make sure you guys follow me on all social media all of which are in the description box below we will get this car running in the next episode and get it sideways with our turbo four cylinder so as always I thank you guys for watching I'm EvilRabbit I'll see you guys on the track