All Impeller shaders use the lowest-common-denominator features available across all supported backends (Metal, Vulkan, and OpenGL ES 2.0). This has worked fine and we will always need fallbacks for legacy backends. But, in some cases, it is desirable to add fast-paths that use modern features where available. Doing this using platform (iOS, Android, etc..) or backend (OpenGL ES 2.0, Metal, etc..) is brittle. Instead, introduce the notion of a "legacy" and "modern" backend and define their feature sets (like SSBO availability). Then, developers can have specific paths for each backend as necessary.