Specialization Constants tests Tests: + dEQP-VK.pipeline.spec_constant.* Includes: + Uses extended GLSL (KHR_vulkan_glsl) to specify shaders (dependency on glslang) + Basic specialization constants (OpSpecConstant, OpSpecConstantTrue, OpSpecConstantFalse instructions) - No specialization info (default values) - Partial and full specialization - 32 bit boolean, integer and float types - (optional) 16 and 64 bit types, where supported + Specialization constants in composites (OpSpecConstantComposite instruction) - struct members - array elements - vector components - matrix columns + Specialization constants in expressions (OpSpecConstantOp instruction) - Array size - (optional) Various instructions as listed in the spec + Compute shader work group size specialization + Built-in constant specialization (override the default value) + All of the above should be exercised with all applicable shader stages in both pipeline types (compute and graphics). Excludes: + SPIR-V assembly code + OpSpecConstantOp instructions are covered by assembly tests in external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp Notes: + SPIR-V generated from GLSL should be inspected for instruction coverage and overall correctness before accepting the tests. Description: The tests will run various shader stages with some specialization constants. Constant values are read in the shader, written to a SSBO, and read back from a host-visible buffer. Depending on the test, none, some, or all specialization constants are defined through VkSpecializationInfo. The test passes if the value written by the shader matches the expected reference value (either the default or a set specialized value). For expression tests result of an operation is written to the output SSBO and then compared to a reference operation result. A test with no specialization info verifies that the default values defined in the shader are used correctly. Specialization with one or more specialization constants check if Vulkan structure is consumed correctly by the API. Different types and type widths are tested to see if provided value is passed correctly to the shader. The tests will use types and expressions similar to the following (examples are not exhaustive): // Basic specialization constants and const expressions layout(constant_id = 7) const int foo = 3; layout(constant_id = 9) const float bar = 6.5; int data[foo]; int data2[foo + 2]; // Specialization constant expressions const float expr_fadd = bar + 3.5; // OpFAdd // Specialization constant composites const vec3 sc_vec = vec3(1.0, bar, 3.0); const int sc_array[4] = int[](foo, 2, 3, 4); // Override work group size layout(local_size_y_id = 19) in; // y=? (id=19) layout(local_size_x_id = 20, local_size_z_id = 21) in; // x=? z=? // Override Built-in constant layout(constant_id = 13) gl_MaxImageUnits;