return result;
}
+int TestBase::maxImageUniforms(Utils::SHADER_STAGES stage) const
+{
+ const glw::Functions& gl = m_context.getRenderContext().getFunctions();
+ GLint max_image_uniforms;
+
+ switch (stage)
+ {
+ case Utils::COMPUTE_SHADER:
+ gl.getIntegerv(GL_MAX_COMPUTE_IMAGE_UNIFORMS, &max_image_uniforms);
+ break;
+ case Utils::FRAGMENT_SHADER:
+ gl.getIntegerv(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, &max_image_uniforms);
+ break;
+ case Utils::GEOMETRY_SHADER:
+ gl.getIntegerv(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, &max_image_uniforms);
+ break;
+ case Utils::TESS_CTRL_SHADER:
+ gl.getIntegerv(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, &max_image_uniforms);
+ break;
+ case Utils::TESS_EVAL_SHADER:
+ gl.getIntegerv(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, &max_image_uniforms);
+ break;
+ case Utils::VERTEX_SHADER:
+ gl.getIntegerv(GL_MAX_VERTEX_IMAGE_UNIFORMS, &max_image_uniforms);
+ break;
+ default:
+ TCU_FAIL("Invalid enum");
+ break;
+ }
+ return max_image_uniforms;
+}
+
/** Constructor
*
* @param context Test context
"in vec4 tes_gs_result[];\n"
"out vec4 gs_fs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_TRUNKS\n"
"UNI_GOKU\n"
"UNI_VEGETA\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 vs_tcs_result[];\n"
"out vec4 tcs_tes_result[];\n"
"\n"
+ "#if IMAGES\n"
"UNI_VEGETA\n"
"UNI_TRUNKS\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 tcs_tes_result[];\n"
"out vec4 tes_gs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
"UNI_TRUNKS\n"
"UNI_VEGETA\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"\n"
"out vec4 vs_tcs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_TRUNKS\n"
"UNI_VEGETA\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
+ "#if IMAGES\n"
"VERIFICATION"
+ "#endif\n"
"\n"
" vs_tcs_result = result;\n"
"}\n"
Utils::replaceToken("COORDINATES", position, coordinates_write, out_source.m_parts[0].m_code);
+ Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
+ out_source.m_parts[0].m_code);
+
Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
Utils::replaceAllTokens("UNI_VEGETA", uni_vegeta, out_source.m_parts[0].m_code);
"in vec4 tes_gs_result[];\n"
"out vec4 gs_fs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 vs_tcs_result[];\n"
"out vec4 tcs_tes_result[];\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 tcs_tes_result[];\n"
"out vec4 tes_gs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"\n"
"out vec4 vs_tcs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
+ "#if IMAGES\n"
"VERIFICATION"
+ "#endif\n"
"\n"
" vs_tcs_result = result;\n"
"}\n"
break;
case Utils::FRAGMENT_SHADER:
shader_template = fragment_shader_template;
+ /* We can't rely on the binding qualifier being present in m_test_stage
+ * if images are unsupported in that stage.
+ */
+ if (maxImageUniforms(m_test_stage) == 0)
+ uniform_definition = uni_goku_with_binding;
break;
case Utils::GEOMETRY_SHADER:
shader_template = geometry_shader_template;
Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
+ Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
+ out_source.m_parts[0].m_code);
+
Utils::replaceAllTokens("UNI_GOKU", uniform_definition, out_source.m_parts[0].m_code);
}
"in vec4 tes_gs_result[];\n"
"out vec4 gs_fs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 vs_tcs_result[];\n"
"out vec4 tcs_tes_result[];\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 tcs_tes_result[];\n"
"out vec4 tes_gs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"\n"
"out vec4 vs_tcs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
+ "#if IMAGES\n"
"VERIFICATION"
+ "#endif\n"
"\n"
" vs_tcs_result = result;\n"
"}\n"
Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
+ Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
+ out_source.m_parts[0].m_code);
+
Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
}
"in vec4 tes_gs_result[];\n"
"out vec4 gs_fs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 vs_tcs_result[];\n"
"out vec4 tcs_tes_result[];\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 tcs_tes_result[];\n"
"out vec4 tes_gs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"\n"
"out vec4 vs_tcs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
+ "#if IMAGES\n"
"VERIFICATION"
+ "#endif\n"
"\n"
" vs_tcs_result = result;\n"
"}\n"
Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
+ Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
+ out_source.m_parts[0].m_code);
+
Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
}
"in vec4 tes_gs_result[];\n"
"out vec4 gs_fs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 vs_tcs_result[];\n"
"out vec4 tcs_tes_result[];\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"in vec4 tcs_tes_result[];\n"
"out vec4 tes_gs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
- "VERIFICATION"
- " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
+ "#if IMAGES\n"
+ "VERIFICATION else\n"
+ "#endif\n"
+ " if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n"
" {\n"
" result = vec4(1, 0, 0, 1);\n"
" }\n"
"\n"
"out vec4 vs_tcs_result;\n"
"\n"
+ "#if IMAGES\n"
"UNI_GOKU\n"
+ "#endif\n"
"\n"
"void main()\n"
"{\n"
" vec4 result = vec4(0, 1, 0, 1);\n"
"\n"
+ "#if IMAGES\n"
"VERIFICATION"
+ "#endif\n"
"\n"
" vs_tcs_result = result;\n"
"}\n"
Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code);
+ Utils::replaceAllTokens("IMAGES", maxImageUniforms(in_stage) > 0 ? "1" : "0",
+ out_source.m_parts[0].m_code);
+
Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code);
}