arb_separate_shader_objects: extend active sampler conflict to test arrays

Message ID 1434543262-21147-1-git-send-email-t_arceri@yahoo.com.au
State New
Headers show

Commit Message

'Timothy Arceri' via Patchwork Forward June 17, 2015, 12:14 p.m.
---
 .../active-sampler-conflict.c                      | 187 ++++++++++++++++-----
 1 file changed, 143 insertions(+), 44 deletions(-)

Patch hide | download patch | download mbox

diff --git a/tests/spec/arb_separate_shader_objects/active-sampler-conflict.c b/tests/spec/arb_separate_shader_objects/active-sampler-conflict.c
index 5388449..a9b87ab 100644
--- a/tests/spec/arb_separate_shader_objects/active-sampler-conflict.c
+++ b/tests/spec/arb_separate_shader_objects/active-sampler-conflict.c
@@ -81,56 +81,108 @@  static const char *fs_code =
 	"}\n"
 	;
 
+static const char *fs_arrays_code =
+	"#version 130\n"
+	"#extension GL_ARB_separate_shader_objects: require\n"
+	"\n"
+	"out vec4 out_color;\n"
+	"\n"
+	"uniform sampler2D s2[2];\n"
+	"uniform sampler3D s3[2];\n"
+	"\n"
+	"void main()\n"
+	"{\n"
+	"    out_color = texture(s2[1], vec2(0)) + texture(s3[1], vec3(0));\n"
+	"}\n"
+	;
+
+static const char *fs_arrays_of_arrays_code =
+	"#version 130\n"
+	"#extension GL_ARB_separate_shader_objects: require\n"
+	"#extension GL_ARB_arrays_of_arrays: require\n"
+	"\n"
+	"out vec4 out_color;\n"
+	"\n"
+	"uniform sampler2D s2[2][2];\n"
+	"uniform sampler3D s3[2][2];\n"
+	"\n"
+	"void main()\n"
+	"{\n"
+	"    out_color = texture(s2[1][1], vec2(0)) + texture(s3[1][1], vec3(0));\n"
+	"}\n"
+	;
+
 static const float vert[2] = {
 	0.0, 0.0
 };
 
-void piglit_init(int argc, char **argv)
+static bool
+setup_program(GLuint *prog, GLuint *pipe, GLuint *vao,
+	      GLuint *bo, const char **fs_code)
 {
-	GLuint prog;
-	GLint s2_loc;
-	GLint s3_loc;
-	GLuint pipe;
-	GLuint vao;
-	GLuint bo;
 	bool pass = true;
 
-	piglit_require_extension("GL_ARB_separate_shader_objects");
-
-	prog = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1,
-					 (const GLchar *const *) &fs_code);
-	piglit_link_check_status(prog);
-
-	s2_loc = glGetUniformLocation(prog, "s2");
-	if (s2_loc == -1) {
-		fprintf(stderr, "Failed to get uniform location for s2.\n");
-		pass = false;
-	}
-
-	s3_loc = glGetUniformLocation(prog, "s3");
-	if (s3_loc == -1) {
-		fprintf(stderr, "Failed to get uniform location for s3.\n");
-		pass = false;
-	}
+	*prog = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1,
+				      (const GLchar *const *) fs_code);
+	piglit_link_check_status(*prog);
 
-	glGenProgramPipelines(1, &pipe);
-	glUseProgramStages(pipe,
+	glGenProgramPipelines(1, pipe);
+	glUseProgramStages(*pipe,
 			   GL_FRAGMENT_SHADER_BIT,
-			   prog);
-	glActiveShaderProgram(pipe, prog);
-	glBindProgramPipeline(pipe);
+			   *prog);
+	glActiveShaderProgram(*pipe, *prog);
+	glBindProgramPipeline(*pipe);
 
-	glGenVertexArrays(1, &vao);
-	glBindVertexArray(vao);
+	glGenVertexArrays(1, vao);
+	glBindVertexArray(*vao);
 
 	/* Configure a vertex array object and buffer object that will
 	 * be used for drawing later.
 	 */
-	glGenBuffers(1, &bo);
-	glBindBuffer(GL_ARRAY_BUFFER, bo);
+	glGenBuffers(1, bo);
+	glBindBuffer(GL_ARRAY_BUFFER, *bo);
 	glBufferData(GL_ARRAY_BUFFER, sizeof(vert), vert, GL_STATIC_DRAW);
 
-	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+	return piglit_check_gl_error(GL_NO_ERROR) && pass;
+}
+
+static void
+cleanup(GLuint prog, GLuint *pipe, GLuint *vao, GLuint *bo)
+{
+	glBindProgramPipeline(0);
+	glDeleteProgram(prog);
+	glDeleteProgramPipelines(1, pipe);
+
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+	glBindVertexArray(0);
+
+	glDeleteBuffers(1, bo);
+	glDeleteVertexArrays(1, vao);
+}
+
+static bool
+get_uniform_location(GLuint prog, GLint *loc, char *uni_name)
+{
+	bool pass = true;
+	*loc = glGetUniformLocation(prog, uni_name);
+	if (*loc == -1) {
+		fprintf(stderr, "Failed to get uniform location for %s.\n",
+                        uni_name);
+		pass = false;
+	}
+	return pass;
+}
+
+static bool
+test_sampler_conflict(GLuint prog, GLuint pipe,
+		      char *s2_uni_name, char *s3_uni_name)
+{
+	GLint s2_loc;
+	GLint s3_loc;
+	bool pass = true;
+
+	pass = get_uniform_location(prog, &s2_loc, s2_uni_name);
+	pass = get_uniform_location(prog, &s3_loc, s3_uni_name);
 
 	/* First, try an invalid configuration.
 	 */
@@ -187,17 +239,64 @@  void piglit_init(int argc, char **argv)
 
 	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
-	/* Clean up.
-	 */
-	glBindProgramPipeline(0);
-	glDeleteProgram(prog);
-	glDeleteProgramPipelines(1, &pipe);
-	
-	glBindBuffer(GL_ARRAY_BUFFER, 0);
-	glBindVertexArray(0);
+	return pass;
+}
+
+void piglit_init(int argc, char **argv)
+{
+	GLuint prog;
+	GLuint pipe;
+	GLuint vao;
+	GLuint bo;
+	GLint s_loc;
+	char *s2_uni_name = "s2";
+	char *s3_uni_name = "s3";
+	char *s2_uni_array_name = "s2[1]";
+	char *s3_uni_array_name = "s3[1]";
+	bool pass;
+
+	piglit_require_extension("GL_ARB_separate_shader_objects");
+
+	pass = setup_program(&prog, &pipe, &vao, &bo, &fs_code);
+	pass = test_sampler_conflict(prog, pipe,
+				     s2_uni_name, s3_uni_name) && pass;
+	cleanup(prog, &pipe, &vao, &bo);
+
+	pass = setup_program(&prog, &pipe, &vao, &bo, &fs_arrays_code);
+	/* Initialise all sampler array elements with a unique texture unit*/
+	get_uniform_location(prog, &s_loc, "s2[0]");
+	glUniform1i(s_loc, 3);
+	get_uniform_location(prog, &s_loc, "s3[0]");
+	glUniform1i(s_loc, 4);
+	pass = test_sampler_conflict(prog, pipe, s2_uni_array_name,
+				     s3_uni_array_name) && pass;
+	cleanup(prog, &pipe, &vao, &bo);
 
-	glDeleteBuffers(1, &bo);
-	glDeleteVertexArrays(1, &vao);
+	if (piglit_is_extension_supported("GL_ARB_arrays_of_arrays")) {
+		char *s2_uni_aoa_name = "s2[1][1]";
+		char *s3_uni_aoa_name = "s3[1][1]";
+
+		pass = setup_program(&prog, &pipe, &vao, &bo,
+				     &fs_arrays_of_arrays_code);
+		/* Initialise all sampler array elements
+		 * with a unique texture unit.
+		 */
+		get_uniform_location(prog, &s_loc, "s2[0][0]");
+		glUniform1i(s_loc, 3);
+		get_uniform_location(prog, &s_loc, "s3[0][0]");
+		glUniform1i(s_loc, 4);
+		get_uniform_location(prog, &s_loc, "s2[0][1]");
+		glUniform1i(s_loc, 5);
+		get_uniform_location(prog, &s_loc, "s3[0][1]");
+		glUniform1i(s_loc, 6);
+		get_uniform_location(prog, &s_loc, "s2[1][0]");
+		glUniform1i(s_loc, 7);
+		get_uniform_location(prog, &s_loc, "s3[1][0]");
+		glUniform1i(s_loc, 8);
+		pass = test_sampler_conflict(prog, pipe, s2_uni_aoa_name,
+					     s3_uni_aoa_name) && pass;
+		cleanup(prog, &pipe, &vao, &bo);
+	}
 
 	piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
 }