00:04alyssa: airlied: real
00:05alyssa: oh i see what it's complaining about
00:06alyssa: or not.
00:07airlied: alyssa: the warning just gives up after the file gets too big
00:08airlied: nothing actually wrong
00:08alyssa: got it
00:08alyssa: sorry, we've been chasing a heisenbug all afternoon
00:08alyssa: brain is kinda splat
00:53jenatali: That is a lorge file
00:57idr: holy smokes
00:58airlied: zmike: I assume the only way to test VK_NV_compute_shader_derivatives would be piglit on zink? :)
00:58zmike: probably
01:01airlied: not sure how to implement it, just looking at missing bits :)
01:01alyssa: airlied: common NIR lowering to quad ops?
01:01airlied: probably can do linear easier than quad
01:01alyssa: ?
01:01alyssa: i havent actually read the extension
01:02airlied: I assume you have to execute the "quad" in a workgroup
01:02alyssa: oh i see
01:14jenatali: I'm surprised it took this long: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23811#note_1982471
01:23zmike: yes, I too am surprised I have not seen an EEE comment until now
01:30jenatali: At least on GitLab
01:33airlied: would it be bad if I added ...Ewoks?
01:35jenatali: Do it
01:39zmike: 🐔
01:42alyssa: jenatali: EEEEEEE
01:43alyssa: look how excited I am about you contributing it's making me squeal
01:43alyssa: EEEE
01:43alyssa: :P
01:54tarceri: Anyone able to run this piglit test on the close nvidia driver for me? https://pastebin.com/r73KTYge I think the hdd is dead in the laptop I normally use for testing
01:58zmike: I can get it tomorrow if nobody gets it before me
01:59tarceri: Thanks!
05:08cmarcelo: airlied: for NV_compute_shader_derivatives there are a couple of tests in crucible.
07:43mripard: javierm: It's not really the same thing DPI is to send the pixels, SPI to control it
07:43mripard: macromorgan: wants to operate the controller using SPI to send both
07:44mripard: so it requires a massive undertaking, because then you don't need to connect to a CRTC, etc. You are the CRTC (and plane, and so on)
07:44mripard: the controller setup is completely different too
07:45mripard: so I don't think it's worth it to handle both cases in the same driver, we wouldn't be able to share much (if at all)
08:12karolherbst: alyssa: because cross context stuff is weird
08:13karolherbst: maybe something in st/mesa doesn't do some weirdo implicit flush
08:14karolherbst: the programming model of gl doesn't really allow any kind of sanity here, so it's all implicit, and I guess if another context needs a resource we have to flush stuff out or _something_ didn't take a good look at those flakes, but .... something something
08:24MrCooper: airlied: you're late to the party :P https://gitlab.freedesktop.org/mesa/mesa/-/issues/9281
08:31javierm: mripard: thanks for the explanation. I thought that it was just a different transport just like some drivers support both SPI and I2C
08:32mripard: yeah, those controllers are usually fairly flexible, and can indeed be controlled by I2C or SPI, but also take their pixels directly from these buses
08:33mripard: the driver to handle the latter is panel-mipi-dbi
08:41javierm: mripard: right, I know that there are some generic drivers dor mipi-dbi and mipi-dsi for controllers that don't have a custom init sequence (or that the init is handled by firmware?)
08:42mripard: it's not the same answer for both cases :)
08:42mripard: I don't think we assume anywhere that the firmware will init a panel
08:42javierm: I've to admit that I'm not that familiar with dbi and dsi. But if you think that is not worth to share then a new tiny driver makes sense
08:42mripard: especially since we like to power it up and down on demand
08:43mripard: DBI is just a fancy MIPI word for sending data over SPI
08:44javierm: mripard: because when I upstreamed the drivers/gpu/drm/panel/panel-himax-hx8394.c for the PinePhonePro, I was told that couldn't use the MIPI-DSI generic driver because it needed a custom init seq
08:45javierm: so I wondered how panels that use that use drivers/gpu/drm/drm_mipi_dsi.c handle their init seq
08:45javierm: mripard: how different is mipi-dbi with 4-wire SPI ? I wonder if the handling of D/C pin that macromorgan mentioned is just dbi ?
08:45mripard: Those controllers are likely to need some kind of panel-specific initialization (which is usually quite obscure, and can't be made generic because it also depends on the panel tied to the controller). This is handled by the linux firmware interface and we will just request a firmware that contains the init sequence and send that to the controller
08:46javierm: mripard: got it. That was my guess indeed, and for controllers that don't have a linux driver, then you need to do those mipi_dsi_dcs_write_seq() calls
08:47mripard: DSI can handle pixels and control sequences over the bus, so then you have two cases: either the DSI panel doesn't require any initialization (instead of the dumb stuff everyone does like a reset GPIO or a regulator), in which case we should use panel-mipi-dsi
08:47mripard: or it requires some kind of init sequence, in which case we have a panel-specific driver for it
08:47mripard: which explains the answer you got for the Pinephone Pro I guess?
08:48mripard: for the DC pin, I didn't read the whole discussion, let me have a look
08:49mripard: ah right, I remember
08:49mripard: it has an extra pin, or it can use an extra bit
08:49mripard: I used it in 9 bits per word and ignored that pin entirely
08:50javierm: mripard: yes, that's what I suggested macromorgan to do as well
08:51javierm: so mipi-dbi is just the 3-wire SPI (that has a 1-bit D/C before the 8-bit payload)
08:51mripard: not all SPI controllers can do that though, so I used a spi-gpio controller last time I used it
08:51mripard: MIPI-DBI is 4 wire SPI iirc
08:51mripard: that controller wanted to do something fancy, but that has nothing to do with the spec afaik
08:52mripard: spi-gpio might be too slow if you're sending pixels with it too though
08:53javierm: mripard: you said that mipi-dbi is 4-wire SPI, but you meant 3-wire right ?
08:53javierm: 4-wire is with the D/C as an external pin and 3-wire is when is encoded in the payload
08:54mripard: Clock, MISO, MOSI, CS ?
09:30javierm: mripard: usually in the datasheets for these panels only clock, MOSI and CS are considered since you just write to the peripheral, not read from it
09:31javierm: that's why is called 3-wire SPI protocol I think
09:31mripard: sure, but you were asking for MIPI-DBI
09:31mripard: whether the devices follow the spec is another story :)
09:32javierm: mripard: right, but in panel lingo (at least in the datasheets I read) 3-wire is what I mentioned and 4-wire is with the additional D/C (data/command) external pin
09:33javierm: mripard: so I wondered whether MIPI-DBI was the "3-wire protocol" that sends 9-bit SPI messages with the D/C bit encoded before the 8-bit payload
09:33javierm: if that's the case, then I think that macromorgan can just use your driver ?
09:34mripard: no, MIPI-DBI is plain old SPI
09:35mripard: and no, he can't, because my driver is made for that controller taking its pixels from an RGB bus
09:35javierm: mripard: I see
09:36mripard: he needs to use panel-mipi-dbi
09:37javierm: Ok
09:38mripard: and just ignore that D/C pin, but use an extra bit per word
09:38javierm: mripard: yup, which is the "3-wire protocol" I mentioned. But now I understand my confusion, you do that manually in your driver
09:38javierm: https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/panel/panel-sitronix-st7789v.c#L131
09:39javierm: that u16 txbuf = ((prefix & 1) << 8) | data
09:39javierm: so is "3-wire protocol" over mipi-dbi
12:00alyssa: karolherbst: That test seems to glFinish() before each context switch. So should be fine. "should".
12:00karolherbst: yeah..... "should"
12:02karolherbst: alyssa: what I noticed while figuring out multithreading for nouveau is, that a lot of state tracking assumptions just don't hold anymore if you have a second context involved. But that also depends on how hardware vs context state is tracked.
12:02pq: I wonder if Weston should glFinish() before exiting, too, to make sure no job is still running and upsetting ASan...
12:06pq: No, that's not it.
12:12pq: Huh. Making sure that swrast_dri.so is never unloaded *fixes* all ASan reported leaks.
12:13karolherbst: can't have leaks if you never delete references
12:13karolherbst: probably some screen cleanup not happening properly or something?
12:13karolherbst: pq: we also have some static init methods around, like the glsl stuff
12:13karolherbst: maybe some unref on it is missing?
12:14karolherbst: kinda depends on what's leaked here
12:16pq: It's a bit hard to see, because getting a good stack trace depends on not unloading...
12:17karolherbst: mhhhh
12:17karolherbst: I think there was a solution for this..
12:18karolherbst: nvm
12:19karolherbst: pq: https://github.com/google/sanitizers/issues/89#issuecomment-394822953 🙃
12:19pq: building Mesa with ASan does something differently, but previously swrast always deadlocked inside ASan's own code. Maybe I need to try again, since I was actually able to run swrast with weston+ASan without deadlocking and no idea why.
12:19karolherbst: pq: _but_ what valgrind calls "reachable" is probably what's leaking here
12:19karolherbst: ohhh
12:19karolherbst: valgrind can report that stuff if you use valgrind
12:20karolherbst: pq: https://bugs.kde.org/show_bug.cgi?id=79362
12:20karolherbst: maybe just use valgrind here...
12:20karolherbst: *hideS*
12:22pq: I can live with forcing swrast and making it never unload.
12:22pq: That's what the Weston CI does, anyway.
12:23karolherbst: though we really should fix those leaks I think :D
12:23karolherbst: though.. might not matter
12:25pq: this is something I gathered with radeonsi yesterday, ignoring the Mesa created threads: https://gitlab.freedesktop.org/-/snippets/7648 Does that look worthwhile to report?
12:26pq: from Mesa 23.1.3
12:35karolherbst: yeah.. probably
12:35javierm: tzimmermann: hope that the motivation for the split makes more sense now after my explanation of how we manage the kernel package config options
13:00zmike: tarceri: pass
13:01tarceri: zmike: though it would thanks for testing
13:04tarceri: seems we had a compile test for this kind of thing it mesa but it only passed because everything get optimised away.
16:14alyssa: today on NIR control flow fun .. trying to figure out how to get the nir_if * from a nir_phi_instr *
16:15jenatali: There might not be an if, it could be a loop
16:16alyssa: sure, I can bail in that case
16:16alyssa: I think logically I want ... previous sibling in CF tree?
16:16alyssa: which should be either a nir_if or a nir_loop? maybe?
16:16karolherbst: somebody broke my CL impl and I'm gonna find out who it was :< (probably llvm-16)
16:16jenatali: Yeah that sounds right
16:17jenatali: Why do you want that?
16:17karolherbst: ...
16:17karolherbst: call _Z29async_work_group_strided_copyPU3AS3hPU3AS1Khmm9ocl_event ssa_61, ssa_43, ssa_55, ssa_58, ssa_59 (0x1), ssa_60 (0x0)
16:17karolherbst: pain
16:18jenatali: What's wrong with that?
16:18karolherbst: error: src->ssa->bit_size & bit_sizes (../src/compiler/nir/nir_validate.c:208)
16:18jenatali: Fun
16:18alyssa: jenatali: nir_opt_preamble, I want to (more or less) remat phis, which is only safe if I can remat the if-statement, which I can figure out based on the nir_if->condition
16:18karolherbst: yeah.. I'll figure it out
16:19jenatali: alyssa: It's not just one if condition though, you'd need to be able to remat all values leading up to the branches that the phi depends on
16:19alyssa: that.. should be fine, I think
16:20alyssa: phi can be remat <===> if-condition and all of the phi's sources can be remat
16:20jenatali: e.g. if (a) { if (b) { %5 = 1; } else { %6 = 2; } } else { % 7 = 3; } could have a phi selecting any of those, so you'd need to be able to capture a and b
16:20alyssa: right, if `b` can't be remat, then %5 can't either
16:20jenatali: Right
16:20alyssa: so `phi %5` at the end won't be remat even if a can be remat
16:21alyssa: (Actually, it's more complicated than that. If %5 can be speculated, we can pull it out of the if when rematerializing so it wouldn't matter if b can be remat.)
16:22alyssa: opt_preamble is a funny pass.
16:22alyssa: I'm.. mostly sure what I'm doing is kosher, i just need to get at the if from the phi
16:22alyssa: I guess nir_cf_node_prev(phi->instr->block)
16:24jenatali: Should be right, yeah
16:25karolherbst: jenatali: ... it's a 32 bit NULL pointer :')
16:25jenatali: Weird
16:26karolherbst: ehh wait.. maybe it's the return type being messed up actually
16:26karolherbst: something weird is happening
16:26alyssa: run: ../src/compiler/nir/nir_clone.c:504: clone_instr: Assertion `!"" "Cannot clone phis with clone_instr"' failed.
16:26alyssa: Ahahaha that would've been too easy (-:
16:29karolherbst: ehh wait.. the return value is the first argument
16:29karolherbst: okay, so it's a null pointer of an event
16:33jenatali: karolherbst: I thought events were 32-bit
16:33karolherbst: why?
16:33jenatali: Been a while since I looked at it, but I implemented that
16:33karolherbst: it's opaque afaik
16:33karolherbst: but
16:33karolherbst: it's a `OpConstantNull` thing anyway
16:33jenatali: Because nir doesn't model them, it just uses a 32-bit null
16:34karolherbst: right...
16:34karolherbst: maybe some type stuff going wrong
16:34jenatali: So somehow you have the function decl saying that it should take a differently-sized thing than the function call site is giving it?
16:34karolherbst: yes
16:35karolherbst: we also have this weirdo mangling going on, but maybe the libclc is now different
16:35jenatali: Fun
16:35jenatali: That mangling looks fine to me
16:36karolherbst: guess we have to select a different bit size for type event then...
16:36karolherbst: yeah... mhh
16:37jenatali: I take it that the ssa we're passing is 32-bit but the decl expects 64-bit?
16:37karolherbst: well... kinda
16:38karolherbst: https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/compiler/spirv/spirv_to_nir.c#L1945
16:38karolherbst: I suspect if llvm turned the event pointer to be 64 bit, then we kinda have to deal with that...
16:38karolherbst: I'll try to figure out if it's a llvm or translator change
16:38jenatali: I'd expect that the SPIR-V translator should still chase it to an event type, not a pointer to event
16:38karolherbst: ohh true, but an event is opaque
16:39jenatali: Right, so it should be passed by value, i.e. showing up in the function signature as a value type, and when vtn parses the decl it should put an int in the signature
16:39karolherbst: why? an event isn't an int
16:39jenatali: And then it's unused by the libclc implementation of the function so it'll all get DCE'd
16:40jenatali: An event doesn't do anything in nir or in libclc, so we can pick whatever we want to represent it
16:40jenatali: I tried to add a nir type for it and gfxstrand suggested to do it this way instead :P
16:40karolherbst: right..
16:42karolherbst: so the signature in the libclc spirv is: %6312 = OpTypeFunction %_ptr_Function_uchar %_ptr_Workgroup_uchar %_ptr_CrossWorkgroup_uchar %ulong %ulong %_ptr_Function_uchar
16:43jenatali: Looks like the SPIRV-LLVM-Translator maybe changed the parsing from taking it by value to making it a byte*
16:44karolherbst: mhh...
16:44alyssa: jenatali: seems to work in the case I wanted it to
16:44karolherbst: in llvm-15 it was `%Event = OpTypeEvent`
16:44karolherbst: so they turned that into a pointer now
16:44jenatali: Yeah
16:44karolherbst: whoever it was
16:44alyssa: which incidentally means entire CTS cases just get optimized away to absolutely nothing other than `gl_FragColor = <uniform>` and the whole case is in the preamble
16:44alyssa: Lol
16:44jenatali: Are you able to dump the LLVM IR?
16:45karolherbst: jenatali: 062788212ce7544b896afbce9dd210c4fea5c0ea
16:45karolherbst: in the translator
16:45karolherbst: ehh wait
16:45karolherbst: wrong commit...
16:46karolherbst: uhh
16:46karolherbst: opaque pointer stuff...
16:47jenatali: Oh
16:47jenatali: That makes sense, it was passed as a pointer-to-event in the LLVM IR probably and now the pointer loses its type info so the translator can't chase it anymore
16:47jenatali: Fun... anyway should be easy enough to just make the event pointer-sized instead of always 32-bit
16:48karolherbst: yeah...
16:48karolherbst: just wondering how to properly deal with it...
16:49karolherbst: however.. I wonder
16:49karolherbst: maybe we have to enable opaque pointers now
16:50jenatali: As long as the translator can deal with it, that sounds fine
16:51karolherbst: other bugs
16:51karolherbst: :D
16:54Lynne: how can I get the GFX version from an anv_physical_device?
16:56cmarcelo: Lynne: there's an info field. dev->info.ver or dev->info.verx10
16:58cmarcelo: verx10 give you a more "detailed" number if you need to distinguish between vers.
17:00Lynne: thanks!
17:00karolherbst: that's.... better I think?
17:02karolherbst: uhhhhh...
17:02karolherbst: something is horribly broken
17:03karolherbst: jenatali: which opaque pointers enabled, I get the event type into the function arg, but now it does... this:
17:03karolherbst: %call6 = OpGroupAsyncCopy %Event %uint_2 %101 %add_ptr %conv5 %ulong_1 %88
17:03karolherbst: %107 = OpBitcast %_ptr_Function__ptr_Function_uchar %event
17:03karolherbst: OpStore %107 %call6 Aligned 8
17:04jenatali: Awesome
17:04jenatali: Maybe we should write nir_builder routines for those async copies
17:04karolherbst: well.. it's invalid spirv
17:04jenatali: Oh a bitcast from an opaque type, sure
17:04karolherbst: not the bitcast
17:04karolherbst: the store
17:05karolherbst: it worked with opaque pointers disabled when I was forcing int64_t for events... so maybe just do this instead?
17:05karolherbst: let's try again with llvm-17 with opaque pointers :D
17:06karolherbst: jenatali: should we just u2u it inside vtn_opencl?
17:06jenatali: I dunno
17:07karolherbst: kinda dont't want to change the type depending on the llvm version...
17:16karolherbst: I'll think about while prepping food...
17:16karolherbst: but something is also super broken with images....
17:16karolherbst: and I wouldn't be surprised if that's related
17:16karolherbst: funny enough, it's only broken when using `llvm-spirv` to generate spir-vs...
17:17jenatali: The built-in SPIR-V target is working?
17:17karolherbst: no idea
17:17karolherbst: that's with the translator still
17:18karolherbst: the CTS just requires you to have an offline CLC to SPIR-V thing
17:18karolherbst: mhh.. ohh right... duh
17:18karolherbst: I should probably disable opaque pointers with it
17:21karolherbst: I hope my 170 regressions are gone with "Xclang -no-opaque-pointers"...
17:21karolherbst: but yeah, besudes the event stuff I don't think there is anything else in online compiled runs
17:25karolherbst: mhh... yeah.. so a lot of invalid spir-v .. pain
18:50karolherbst: uhhhhh
20:04karolherbst: jenatali: okay.. I'm sure that 87848537db5948c5c9c8dcb06942b070c66d56a3 broke it
20:06karolherbst: uhhh... no idea what to do about it though
20:06karolherbst: but opaque stuff is really messed up it seems
20:09karolherbst: but mhhh
20:10karolherbst: with opaque pointers disabled it seems kinda fine, just the libclc spirv is bonkers and I have no idea why...
20:10karolherbst: but llvm-spirv behaves differently that how clc compilers to spir-v and that's what's annoying me here
20:10karolherbst: I've seen it in the past as well
20:25karolherbst: I wonder if I want to bisect this...
20:27karolherbst: yeah...
20:27karolherbst: s
20:27karolherbst: so
20:27karolherbst: things just work with the old libclc spirv :(
20:27karolherbst: uhhh
20:27karolherbst: something messed up llvm-spirv
20:28karolherbst: but that makes sense as all my spirv generated with it are also just broken
20:32karolherbst: printf also broken: Printf string argument must be a pointer to a constant variable ...
20:32karolherbst: I wished people would validate _all_ spirv in the translator...
21:03karolherbst: yeah.....
21:03karolherbst: uhhh
21:03karolherbst: pain
21:04karolherbst: soo.. using llvm-spirv we get a different spirv for a bunch of stuff
21:04karolherbst: and using the translator like we do inside mesa generates the same spirv as with llvm-15 on 16 :/
21:05psykose: llvm divorce time
21:06karolherbst: uhh
21:06karolherbst: I want to get stuff done like this year
21:06karolherbst: but why....
21:07karolherbst: llvm-spirv is just calling the same stuff...
21:09karolherbst: mhhhhhh
21:10karolherbst: the llvm ir is a little different, but huh...
21:12karolherbst: mhhhhh
21:12karolherbst: okay.. why can't I disable opaque pointers on the clang cli...
21:16karolherbst: okay!
21:16airlied: i thought opaque ptrs were the only way
21:16karolherbst: I figured it out
21:17karolherbst: airlied: nah...
21:17airlied: with newer llvm
21:17karolherbst: sooo
21:17airlied: at some point they will be
21:17karolherbst: libclang honors -no-opaque-pointers
21:17karolherbst: but
21:17karolherbst: clang doesn't
21:17karolherbst: airlied: they are still very much broken sadly
21:17karolherbst: and the translator is still generating broken code
21:17karolherbst: anyway
21:18karolherbst: the problam kinda is, that invoking `clang` on the cli doesn't honor the `-no-opaque-pointers` flag...
21:18karolherbst: no idea if that's intentional or not
21:18karolherbst: but it does have that option
21:18karolherbst: it's just not doing anything
21:18karolherbst: and the libclc we get is full of broken stuff
21:18psykose: `time to open an issue :D
21:18airlied: as i said they are meant to be the only option
21:19airlied: since llvm 16 or 17
21:19karolherbst: and as I said: they are still broken
21:19karolherbst: and they are not
21:19karolherbst: it works perfectly with with libclang-16
21:19karolherbst: *fine
21:19karolherbst: just not with clang-16
21:20karolherbst: anyway.. even llvm docs specify you can still disable them
21:20karolherbst: so I suspect some weirdo clang bug here
21:21karolherbst: ahh and they still have _tons_ of tests setting that.. heh
21:22airlied: https://llvm.org/docs/OpaquePointers.html
21:22airlied: llvm 17 only opaque ptrs are supported
21:22karolherbst: yes, but I'm on llvm-16
21:22karolherbst: Also, "The opaque pointer mode can be disabled using -opaque-pointers=0 in LLVM tools like opt, or -Xclang -no-opaque-pointers in clang."
21:23airlied: ah but going.forward disabling isnt an option we csn rely on
21:23karolherbst: I know
21:23karolherbst: but it's broken
21:23karolherbst: the translator is still working through that stuff
21:24airlied: ah its likely libclc or translator that need fixing, though maybe some opencl specific psths havent been fixed
21:24karolherbst: yeah
21:24karolherbst: so opaque types are bonkers
21:24karolherbst: and some deref stuff is also broken
21:26karolherbst: I'm sure with llvm-17 this will probably all just work
21:26karolherbst: airlied: this sounds like the thing I'm hitting? https://github.com/KhronosGroup/SPIRV-LLVM-Translator/pull/2060
21:27karolherbst: maybe not.. mhh
21:35karolherbst: okay!
21:35karolherbst: airlied: it works if calling `clang -cc1' directly :')
21:40karolherbst: heh
21:40karolherbst: llvm-as adds them back
21:40karolherbst: interesting....
21:42karolherbst: okay!
21:42karolherbst: I figured it out
21:43airlied: that mr does sound like it
21:46karolherbst: so I think what happens is, that something in the llvm pipelines just translates to opaque pointers on it's own...
21:46dj-death: have people built GL deqp surfaceless?
21:46dj-death: what cmake magick are you using? :)
21:55mattst88: dj-death: here are the cmake args we use in chromeos: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/main/media-gfx/deqp/deqp-2023.05.18-r4.ebuild#102
21:55mattst88: -DDEQP_TARGET=surfaceless is the important one
22:02karolherbst: yeah so that PR doesn't help :)
22:11dj-death: mattst88: thanks, then I don't wtf is going on
22:11dj-death: mattst88: angle appears to be using the system GL driver
22:12dj-death: I thought angle was a GL implementation :)
22:20jenatali: ANGLE is a GLES implementation
22:20jenatali: It can run on a desktop GL driver
22:21dj-death: ah got it
22:22dj-death: I guess I need to build it for vulkan then
22:28karolherbst: airlied: yeah soo.. the problem is that various tools are implicitly upgrading to opaque pointers and that bites us heavily :/
22:28karolherbst: maybe we should just skip llvm-16, but uhhh....
22:29karolherbst: though I think it would be okay to just use the llvm-15 libclc for now as that should just make everything work
22:50karolherbst: anyway, the problem with printf looks like this:
22:50karolherbst: %_str = OpVariable %_ptr_UniformConstant__arr_uchar_ulong_5 UniformConstant %11
22:50karolherbst: %19 = OpBitcast %_ptr_UniformConstant_uchar %_str
22:50karolherbst: %22 = OpExtInst %uint %1 printf %19 %uint_10
22:51karolherbst: gfxstrand: ^^ a potential deref optimization we might want to support, where we bring back the array lengths back
22:52karolherbst: though I think we might also have to stop relying on printf giving us a pointer to a sized array :')
22:57karolherbst: anyway.. I'll deal with all of this later