case mismatch_number_of_declarations version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable1; }; out mediump float vtx_val; void main() { vtx_val = variable1; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable1; mediump float variable2; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable1 + variable2); } "" end case mismatch_order version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable1; mediump float variable2; }; out mediump float vtx_val; void main() { vtx_val = variable1 + variable2; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable2; mediump float variable1; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable1 + variable2); } "" end case mismatch_type version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump vec2 variable; }; out mediump float vtx_val; void main() { vtx_val = variable.y; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable); } "" end case mismatch_member_name version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable1; }; out mediump float vtx_val; void main() { vtx_val = variable1; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable2; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable2); } "" end case mismatch_member_unsized_sized_array version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable[]; }; out mediump float vtx_val; void main() { vtx_val = variable[0]; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable[1]; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable[0]); } "" end case mismatch_member_array_size version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable[1]; }; out mediump float vtx_val; void main() { vtx_val = variable[0]; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable[2]; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable[0]); } "" end case mismatch_with_and_without_instance_name version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable; } instanceName; out mediump float vtx_val; void main() { vtx_val = instanceName.variable; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable); } "" end case mismatch_block_array_size version 310 es desc "Shader storage block mismatch: different number of declarations" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable; } instanceName[1]; out mediump float vtx_val; void main() { vtx_val = instanceName[0].variable; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=0) buffer BufferBlockName { mediump float variable; } instanceName[2]; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + instanceName[0].variable + instanceName[1].variable); } "" end case ambiguous_variable_name_1 version 310 es desc "Unnamed shader storage block variable and global variable with identical names" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 expect compile_or_link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} float variable; layout(binding=0) buffer BufferBlockName { mediump float variable; }; out mediump float vtx_val; void main() { vtx_val = variable; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val); } "" end case ambiguous_variable_name_2 version 310 es desc "Two unnamed shader storage blocks with variables with identical names" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 1 expect compile_or_link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockNameA { mediump float variable; }; layout(binding=1) buffer BufferBlockNameB { mediump float variable; }; out mediump float vtx_val; void main() { vtx_val = variable; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val); } "" end case ambiguous_variable_name_3 version 310 es desc "Two unnamed shader storage blocks in different stages with variables with identical names" require limit "GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" > 0 require limit "GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" > 0 # language to make link error explicitly defined. ("Within an interface, ...") require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex, fragment } expect link_fail vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(binding=0) buffer BufferBlockNameA { mediump float variable; }; out mediump float vtx_val; void main() { vtx_val = variable; ${VERTEX_OUTPUT} } "" fragment "" #version 310 es precision mediump float; ${FRAGMENT_DECLARATIONS} layout(binding=1) buffer BufferBlockNameB { mediump float variable; }; in mediump float vtx_val; void main() { ${FRAG_COLOR} = vec4(vtx_val + variable); } "" end