- From: Corentin Wallez <cwallez@google.com>
- Date: Wed, 25 Oct 2017 23:39:27 -0400
- To: Kai Ninomiya <kainino@google.com>
- Cc: Maciej Stachowiak <mjs@apple.com>, "public-gpu@w3.org" <public-gpu@w3.org>
- Message-ID: <CAGdfWNN4EYxuL0AP=hXVsqz1J71vMoe_4dCNo-2oHvgMU0Q9-Q@mail.gmail.com>
Thanks for the data Kai. In the original shadertoy example I don't see the map function defined anywhere (it is interesting because it gets compiled to a giant mess in). Also are the 32-37ms numbers after an initial compile to gets the compiler warmed up? Such a small difference between a trivial shader and a shadertoy is surprising. On Wed, Oct 25, 2017 at 9:12 PM, Kai Ninomiya <kainino@google.com> wrote: > With dev tools open I actually get much less variance in my results (maybe > performance.now behaves differently). > > Now I'm getting 32-37 ms for "void main() {}" and 46-49 ms to compile the > big shadertoy from earlier. > > On Wed, Oct 25, 2017 at 4:13 PM Kai Ninomiya <kainino@google.com> wrote: > >> On Wed, Oct 25, 2017 at 11:39 AM Maciej Stachowiak <mjs@apple.com> wrote: >> >>> >>> On Oct 25, 2017, at 10:49 AM, Corentin Wallez <cwallez@google.com> >>> wrote: >>> >>> Thanks Kai for putting this together, a couple more trade-offs would be >>> the following: >>> >>> - Interoperability. It might be more difficult to have to have >>> multiple implementations be interoperable with a SL. >>> >>> I know you said "it might", but I'm not sure this is true. There are >>> many human-readable languages normally have high interoperability, arguably >>> higher than SPIR-V does. The main factor affecting interop is precision of >>> the spec, not whether the formal is text or binary. >>> >>> >>> - Browser engineering. How much do the compiler add to the browser >>> attack surface and binary size. >>> >>> Note that whether we use an "IR" or "SL" format, we need to include in >>> this complexity all the required validation and translation logic. I >>> mention this because human-readable text formats are often easier to >>> validate than SSA-level formats, since the parser proves many of the >>> desired well-formedness constraints automatically. >>> >>> >>> - Governance. How do we make changes to the SL / IR, who's involved. >>> - Portability to MSL, HLSL and SPIR-V. This so important that we >>> forgot it ^^. >>> >>> >>> On Tue, Oct 24, 2017 at 2:21 AM, Kai Ninomiya <kainino@google.com> >>> wrote: >>> >>>> Hey all, >>>> >>>> We said we would resume the shader language "levels" discussion via >>>> email, so here we are. (Apologies that it's so late.) I'll try to start >>>> this off with some concrete ideas before we dive into the rabbit hole. >>>> Please add suggestions as necessary. We'll be talking about shading >>>> languages again this Wednesday, so I'd ask everyone to spend some time to >>>> think about the topic before then. >>>> >>>> The forms of language we've discussed: >>>> >>>> * "SL". High-level, human-authored, highly-structured, imperative, >>>> whatever-you-want-to-call-it language, like WSL, HLSL, or GLSL. >>>> * "IR". Machine-generated, typically-SSA, lower-level, >>>> canonically-binary representation, like SPIR-V or DXIL. >>>> >>>> The alternatives we've discussed: >>>> >>>> * WebGPU ingests SL only. >>>> * WebGPU ingests both SL and IR. We bless an offline SL->IR tool. >>>> * WebGPU ingests IR only, but we have a Web API to compile unsecured SL >>>> to unsecured IR. We bless an offline SL->IR tool. >>>> * WebGPU ingests IR only. We bless both online and offline SL->IR tools >>>> - an online compiler is required for some applications. >>>> >>> >>> It seems like the second and third options are nearly equivalent in >>> capability. The third makes it less convenient and potentially less >>> efficient to use the SL form. But both expose the additional >>> interoperability considerations and security attack surface inherent in >>> consuming two different formats to about the same degree. >>> >>> [1] A shader compiler may, for example, be a WebAssembly module on a CDN. >>>> >>>> In any alternative, we seem to agree to bless an SL. We bless/provide >>>> tools for that SL, and documentation is written using that SL. The browser >>>> compiles its ingested language to a secured shader in the native API's >>>> ingested language. >>>> >>>> Some trade-offs we've discussed: >>>> >>>> * Compilation performance. SLs may be more expensive to compile. IRs >>>> may be expensive to compile securely - we're working on this one. >>>> * Runtime performance. Could a practical SL be more "performantly >>>> securable" than an IR? >>>> * View Source. Vocal web developers have complained about the View >>>> Source story for WebAssembly. (And how well could we mitigate this if >>>> needed?) >>>> >>> Apologies for not doing this before our meeting today, but here are some >> shaders compiled from GLSL to SPIRV, optimized, and decompiled. I hope >> these help everyone understand the level of abstraction that is provided by >> SPIR-V (and as a bonus, the quality of a potential "decompiling View >> Source" dev tool). They are quite educational for me as well. >> >> An example of a small but not-quite-trivial shader we used in the very >> first NXT demo. I inserted extra line breaks to make the rows line up. >> https://cdn.rawgit.com/kainino0x/7df254f5d3a2343fd1cab5f9c09e3354/raw/ >> fbcb4815877c6344d587106879be6b10aa10155c/boids.comp.opt.spv.html >> >> Here is a much larger example, iq's famous "Raymarching - Primitives" >> resource for the ShaderToy community. (I grabbed it from Dev Tools by >> breaking at gl.shaderSource, and modified it slightly to compile with >> shaderc.) The code got reordered, so I didn't pretty it up. >> https://cdn.rawgit.com/kainino0x/2504dc196b04c8db6487b2d9050329fd/raw/ >> 483e7ae1d8383aa8c61ac751fbe45c0f5931e5f4/shadertoy-Xds3zN.opt.html >> >> * Compiler maintenance. SL compilers may be more prone to bugs. (Critical >>>> for any compiler/translator that must enforce security boundaries.) >>>> * Download/initialization time. Probably not a significant issue for >>>> either format after compression, but we also have to consider the download >>>> and compile time of, e.g., runtime shader compiler modules. >>>> * Ecosystem bootstrapping. There a lot of HLSL and GLSL out there, in >>>> the form of libraries, sample code, and existing engines (including WebGL). >>>> * Development time for the ingested format. Probably not an issue if we >>>> start out with HLSL or GLSL. >>>> * Soundness/provability. We differ on whether this is important at all, >>>> and whether it's easier for SL or IR. Probably not worth discussing right >>>> now? >>>> >>>> Please add topics to this list. I have one more: >>>> >>>> * Code reuse. Some engines (like Three.js) manipulate shader strings to >>>> generate shaders at runtime; if we only ingest IR, they would have to >>>> either use a new method or add a shader compiler. On the other hand, some >>>> engines may(?) prefer to use concepts like SPIRV's specialization and >>>> linking. >>>> >>>> Relevant notes for review: >>>> >>>> 2017-09-22 (F2F): https://docs.google.com/document/d/1VridLAmC05h80_ >>>> d-FGmwyI7On0_AY5y8pVGI-TT4ysQ/edit >>>> 2017-10-11: https://docs.google.com/document/d/1- >>>> ciiWbGletoOXOGrBBZpOhhWEWJcIqK0Bb-dtHJ8ffE/edit >>>> >>>> -Kai >>>> >>> >>>
Received on Thursday, 26 October 2017 03:40:17 UTC