The pipeline is an agreement
A graphics pipeline combines shader stages with the state needed to interpret vertices, assemble primitives, rasterize them, and produce attachment values. A vertex attribute location is an interface number, not a C++ member name. Describe a vertex binding stride and each attribute offset from a deliberately laid-out record. Use fixed-width types, standard-layout checks, and offsetof where appropriate. Do not upload a class containing pointers, a vector, or a vtable as if it were shader data.
Compile GLSL to SPIR-V for the chosen Vulkan target, then run spirv-val with the same target environment. These checks need no GPU. Compilation checks the source; the separate validator checks structural and environment rules in the resulting module. Neither establishes compatibility with a host pipeline that has not been created. Preserve diagnostics and tool versions as build evidence. Check byte counts and word alignment before creating a shader module; arbitrary bytes from an input file are not automatically a valid program. Keep shader source, compiler target, and pipeline expectations together so a build artifact cannot silently drift away from its host layout.
Begin with a triangle or one stem and a constant fragment color. Pipeline creation can fail independently of module creation. Report which stage and format combination failed, keep the previous usable pipeline during a reload attempt, and release a replaced pipeline only after its last submission has completed.
