[Piglit] [PATCH 17/18] !UPSTREAM util-gl: Probe with GS / TRAFO_FDBK

Fabian Bieler fabianbieler at fastmail.fm
Sun Jan 7 22:23:27 UTC 2018


Please disregard this patch.

On 2018-01-07 23:14, Fabian Bieler wrote:
> WIP
> 
> not faster -> drop it
> ---
>  tests/util/piglit-util-gl.c | 180 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 180 insertions(+)
> 
> diff --git a/tests/util/piglit-util-gl.c b/tests/util/piglit-util-gl.c
> index e9c20385e..39125e3a4 100644
> --- a/tests/util/piglit-util-gl.c
> +++ b/tests/util/piglit-util-gl.c
> @@ -1067,6 +1067,27 @@ can_probe_ubyte()
>  	return r <= 8 && g <= 8 && b <= 8 && a <= 8;
>  }
>  
> +static bool
> +can_and_should_probe_gpu(int x, int y, int w, int h)
> +{
> +	//TODO: check environment variable to enable feature
> +	if (piglit_get_gl_version() < 32)
> +		return false;
> +	if (!piglit_is_extension_supported("GL_ARB_explicit_uniform_location"))
> +		return false;
> +	if (!piglit_use_fbo)
> +		return false;
> +	int query;
> +	glGetQueryiv(GL_PRIMITIVES_GENERATED, GL_CURRENT_QUERY, &query);
> +	if (query)
> +		return false;
> +
> +	if (w * h <= 0x100) //TODO: benchmark this
> +		return false;
> +
> +	return true;
> +}
> +
>  static void
>  print_components_ubyte(const GLubyte *pixel, unsigned components)
>  {
> @@ -1261,6 +1282,156 @@ probe_rect_ubyte(int x, int y, int w, int h, int num_components,
>  	return true;
>  }
>  
> +static bool
> +probe_rect_gpu(int x, int y, int w, int h, int num_components,
> +	       const float *expected, bool silent)
> +{
> +	assert (num_components == 3 || num_components == 4);
> +
> +	//TODO: check if moving logic to vs and passing bool is faster
> +	static const char *vs_src =
> +		"#version 150\n"
> +		"#extension GL_ARB_explicit_uniform_location : enable\n"
> +		"layout(location = 0) uniform sampler2D color_buffer;\n"
> +		"layout(location = 1) uniform ivec4 rect;\n"
> +		"out vec4 color;\n"
> +		"out ivec2 xy;\n"
> +		"void main()\n"
> +		"{\n"
> +		"	xy = ivec2(rect.x, rect.y);\n"
> +		"	xy += ivec2(gl_VertexID % rect.z, gl_VertexID / rect.z);\n"
> +		"	color = texelFetch(color_buffer, xy, 0);\n"
> +		"}\n";
> +#define GS_SRC_HEADER \
> +	"#version 150\n" \
> +	"#extension GL_ARB_explicit_uniform_location : enable\n" \
> +	"layout(points) in;\n" \
> +	"layout(points, max_vertices=1) out;\n" \
> +	"layout(location = 11) uniform vec4 expected;\n" \
> +	"layout(location = 12) uniform vec4 tolerance;\n" \
> +	"in vec4 color[];\n" \
> +	"in ivec2 xy[];\n" \
> +	"out ivec2 xy_err;\n" \
> +	"out vec4 color_err;\n" \
> +	"void main()\n" \
> +	"{\n"
> +#define GS_SRC_FOOTER \
> +	"		xy_err = xy[0];\n" \
> +	"		color_err = color[0];\n" \
> +	"		EmitVertex();\n" \
> +	"	}\n" \
> +	"}\n"
> +	static const char *gs_src3 =
> +		GS_SRC_HEADER
> +		"	if (any(greaterThan(abs(expected.xyz - color[0].xyz), tolerance.xyz))) {\n"
> +		GS_SRC_FOOTER;
> +	static const char *gs_src4 =
> +		GS_SRC_HEADER
> +		"	if (any(greaterThan(abs(expected - color[0]), tolerance))) {\n"
> +		GS_SRC_FOOTER;
> +#undef GS_SRC_HEADER
> +#undef GS_SRC_FOOTER
> +
> +	static int prog3, prog4;
> +	int *prog = num_components == 3 ? &prog3 : &prog4;
> +	const char *gs_src = num_components == 3 ? gs_src3 : gs_src4;
> +
> +	if (!*prog) {
> +		*prog = piglit_build_simple_program_unlinked_multiple_shaders(
> +			GL_VERTEX_SHADER, vs_src, GL_GEOMETRY_SHADER, gs_src, 0);
> +		const char *names[] = {"xy_err", "color_err"};
> +		glTransformFeedbackVaryings(*prog, 2, names, GL_INTERLEAVED_ATTRIBS);
> +		glLinkProgram(*prog);
> +	}
> +
> +	/* Set up the transform feedback buffer. */
> +	unsigned buf;
> +	int old_buf;
> +	glGenBuffers(1, &buf);
> +	glGetIntegerv(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, &old_buf);
> +	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
> +	glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,
> +		     (2*sizeof(int) + 4*sizeof(float)), NULL, GL_STREAM_READ);
> +
> +	//FIXME: how to get previous buffer binding?
> +	glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
> +
> +	/* bind program */
> +	int old_prog;
> +	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
> +	glUseProgram(*prog);
> +
> +	/* set up uniforms */
> +	glUniform1i(0, 0);
> +	glUniform4i(1, x, y, w, h);
> +	if (num_components == 3) {
> +		glUniform3fv(11, 1, expected);
> +	} else {
> +		glUniform4fv(11, 1, expected);
> +	}
> +	glUniform4fv(12, 1, piglit_tolerance);
> +
> +	/* bind texture */
> +	int tex;
> +	glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &tex);
> +	int old_texture_unit;
> +	glGetIntegerv(GL_ACTIVE_TEXTURE, &old_texture_unit);
> +	glActiveTexture(GL_TEXTURE0);
> +	int old_tex;
> +	glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_tex);
> +	glBindTexture(GL_TEXTURE_2D, tex);
> +
> +	bool old_raster_discard = glIsEnabled(GL_RASTERIZER_DISCARD);
> +	glEnable(GL_RASTERIZER_DISCARD);
> +
> +	//XXX: Disable arrays?
> +
> +	unsigned query;
> +	glGenQueries(1, &query);
> +	glBeginQuery(GL_PRIMITIVES_GENERATED, query);
> +	glBeginTransformFeedback(GL_POINTS);
> +
> +	glDrawArrays(GL_POINTS, 0, w * h);
> +
> +	glEndTransformFeedback();
> +	glEndQuery(GL_PRIMITIVES_GENERATED);
> +
> +	/* restore state */
> +	if (!old_raster_discard)
> +		glDisable(GL_RASTERIZER_DISCARD);
> +	glBindTexture(GL_TEXTURE_2D, old_tex);
> +	glActiveTexture(old_texture_unit);
> +	glUseProgram(old_prog);
> +	//glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, ???);
> +	glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, old_buf);
> +
> +	int result;
> +	glGetQueryObjectiv(query, GL_QUERY_RESULT, &result);
> +
> +	if (result != 0) {
> +		glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
> +		struct {
> +			int xy[2];
> +			float color[4];
> +		} data;
> +		glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0,
> +				   sizeof(data), &data);
> +		glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, old_buf);
> +
> +		if (!silent) {
> +			print_bad_pixel_float(data.xy[0], data.xy[1],
> +					      num_components, expected,
> +					      data.color);
> +		}
> +	}
> +
> +	/* delete objects */
> +	glDeleteQueries(1, &query);
> +	glDeleteBuffers(1, &buf);
> +
> +	return result == 0;
> +}
> +
>  int
>  piglit_probe_rect_rgb_silent(int x, int y, int w, int h, const float *expected)
>  {
> @@ -1268,6 +1439,9 @@ piglit_probe_rect_rgb_silent(int x, int y, int w, int h, const float *expected)
>  	GLfloat *probe;
>  	GLfloat *pixels;
>  
> +	if (can_and_should_probe_gpu(x, y, w, h))
> +		return probe_rect_gpu(x, y, w, h, 3, expected, true);
> +
>  	if (can_probe_ubyte())
>  		return probe_rect_ubyte(x, y, w, h, 3, expected, true);
>  
> @@ -1328,6 +1502,9 @@ piglit_probe_rect_rgb(int x, int y, int w, int h, const float *expected)
>  	GLfloat *probe;
>  	GLfloat *pixels;
>  
> +	if (can_and_should_probe_gpu(x, y, w, h))
> +		return probe_rect_gpu(x, y, w, h, 3, expected, false);
> +
>  	if (can_probe_ubyte())
>  		return probe_rect_ubyte(x, y, w, h, 3, expected, false);
>  
> @@ -1436,6 +1613,9 @@ piglit_probe_rect_rgba(int x, int y, int w, int h, const float *expected)
>  	GLfloat *probe;
>  	GLfloat *pixels;
>  
> +	if (can_and_should_probe_gpu(x, y, w, h))
> +		return probe_rect_gpu(x, y, w, h, 4, expected, false);
> +
>  	if (can_probe_ubyte())
>  		return probe_rect_ubyte(x, y, w, h, 4, expected, false);
>  
> 


More information about the Piglit mailing list