[v2] ARB_vertex_attrib_64bit: add doubles support to attributes test

Submitted by Timothy Arceri on June 25, 2018, 8:45 a.m.

Details

Message ID 20180625084547.4452-1-tarceri@itsqueeze.com
State New
Headers show
Series "ARB_vertex_attrib_64bit: add doubles support to attributes test" ( rev: 2 ) in Piglit

Not browsing as part of any series.

Commit Message

Timothy Arceri June 25, 2018, 8:45 a.m.
---

 V2: Add missing opengl.py entry.

 tests/general/attribs.c | 68 +++++++++++++++++++++++++++++++++++++++--
 tests/opengl.py         |  3 +-
 2 files changed, 67 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/tests/general/attribs.c b/tests/general/attribs.c
index 05a0d4a1e..bf627dece 100644
--- a/tests/general/attribs.c
+++ b/tests/general/attribs.c
@@ -53,6 +53,7 @@  enum {
 };
 
 enum {
+	DOUBLE_TYPE,
 	FLOAT_TYPE,
 	INT_TYPE,
 	UINT_TYPE
@@ -120,12 +121,13 @@  static GLboolean test(int x, int y, const char *shaderfunc,
 		      const char *info)
 {
 	static const char *templ = {
+		"%s \n"
 		"%s \n"
 		"#extension GL_ARB_explicit_attrib_location : require \n"
 		"layout(location = 1) in %s attr; \n"
 		"void main() { \n"
 		"  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n"
-		"  gl_FrontColor = (%s) * vec4(1.0, 1.0, 1.0, 0.5); \n"
+		"  gl_FrontColor = vec4(%s %s) * vec4(1.0, 1.0, 1.0, 0.5); \n"
 		"} \n"
 	};
 	GLuint prog, vs;
@@ -139,10 +141,56 @@  static GLboolean test(int x, int y, const char *shaderfunc,
 		{0.5, 0.3, 0.9, 0.2}
 	};
 
+	char *defaults;
+	char *type_string;
+
+	/* From Section 11.1.1 (Vertex Attributes) of the OpenGL 4.6
+	 * Compatibility Profile spec:
+	 *
+	 *    "Scalar and vector vertex attribute types and VertexAttrib*
+	 *    commands used to set the values of the corresponding generic
+	 *    attribute. values are provided if the values of the vertex
+	 *    attribute variable are specified with fewer components than
+	 *    required for the attribute variable. For example, the fourth
+	 *    component of a variable of type dvec4 will be undefined if
+	 *    specified using VertexAttribL3dv, or using a vertex array
+	 *    specified with VertexAttribLPointer and a size of three.
+	 *
+	 * TODO: We should probably also be doing this for attribute functions
+	 *       other than doubles.
+	 */
+	if (type == DOUBLE_TYPE) {
+		switch (mask) {
+		case R:
+			type_string = "double";
+			defaults = ", dvec3(0.0, 0.0, 1.0)";
+			break;
+		case RG:
+			type_string = "dvec2";
+			defaults = ", dvec2(0.0, 1.0)";
+			break;
+		case RGB:
+			type_string = "dvec3";
+			defaults = ", 1.0";
+			break;
+		case RGBA:
+			type_string = "dvec4";
+			defaults = "";
+			break;
+		default:
+			assert(0);
+		}
+	} else {
+		defaults = "";
+		type_string =
+			type == INT_TYPE ? "ivec4" : type == UINT_TYPE ? "uvec4" : "vec4";
+	}
+
 	sprintf(vstext, templ,
 		type != FLOAT_TYPE ? "#version 130" : "",
-		type == INT_TYPE ? "ivec4" : type == UINT_TYPE ? "uvec4" : "vec4",
-		shaderfunc);
+		type == DOUBLE_TYPE ?
+		"#extension GL_ARB_gpu_shader_fp64: enable\n#extension GL_ARB_vertex_attrib_64bit: enable" : "",
+		type_string, shaderfunc, defaults);
 
 	/* Create the shader. */
 	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vstext);
@@ -343,6 +391,19 @@  static test_func tests_GL3[] = {
 	test_glVertexAttribI4ui,
 };
 
+/* ARB_vertex_attrib_64bit */
+DEFINE_TEST(glVertexAttribL1d,,  (1, x),		"attr", R, DOUBLE_TYPE, "")
+DEFINE_TEST(glVertexAttribL2d,,  (1, x, y),		"attr", RG, DOUBLE_TYPE, "")
+DEFINE_TEST(glVertexAttribL3d,,  (1, x, y, z),		"attr", RGB, DOUBLE_TYPE, "")
+DEFINE_TEST(glVertexAttribL4d,,  (1, x, y, z, w),	"attr", RGBA, DOUBLE_TYPE, "")
+
+static test_func tests_GL_ARB_vertex_attrib_64bit[] = {
+	test_glVertexAttribL1d,
+	test_glVertexAttribL2d,
+	test_glVertexAttribL3d,
+	test_glVertexAttribL4d,
+};
+
 /* ARB_vertex_type_2_10_10_10_rev */
 /* Packing functions for a signed normalized 2-bit component.
  * These are based on equation 2.2 and 2.3 from the opengl specification, see:
@@ -503,6 +564,7 @@  struct test_set {
 } test_sets[] = {
 	{ TESTS(GL2) },
 	{ TESTS(GL3), 30 },
+	{ TESTS(GL_ARB_vertex_attrib_64bit), 32 },
 	{ TESTS(GL_ARB_vertex_type_2_10_10_10_rev), 0, "GL_ARB_vertex_type_2_10_10_10_rev" },
 };
 
diff --git a/tests/opengl.py b/tests/opengl.py
index 669d9055b..3ed00e5b7 100644
--- a/tests/opengl.py
+++ b/tests/opengl.py
@@ -4697,7 +4697,8 @@  with profile.test_list.group_manager(
 with profile.test_list.group_manager(
         PiglitGLTest,
         grouptools.join('spec', 'arb_vertex_attrib_64bit')) as g:
-    g(['arb_vertex_attrib_64bit-double_attribs'], 'double_attribs')
+    g(['attribs', 'GL_ARB_vertex_attrib_64bit'], 'attribs')
+    g(['arb_vertex_attrib_64bit-double_attribs'], 'get_double_attribs')
     g(['arb_vertex_attrib_64bit-check-explicit-location'], 'check-explicit-location')
     g(['arb_vertex_attrib_64bit-getactiveattrib'], 'getactiveattrib')
     g(['arb_vertex_attrib_64bit-max-vertex-attrib'], 'max-vertex-attrib')

Comments

LGTM. Just a nitpick below. But in any case:
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>

On 25/06/18 10:45, Timothy Arceri wrote:
> ---
>
>  V2: Add missing opengl.py entry.
>
>  tests/general/attribs.c | 68 +++++++++++++++++++++++++++++++++++++++--
>  tests/opengl.py         |  3 +-
>  2 files changed, 67 insertions(+), 4 deletions(-)
>
> diff --git a/tests/general/attribs.c b/tests/general/attribs.c
> index 05a0d4a1e..bf627dece 100644
> --- a/tests/general/attribs.c
> +++ b/tests/general/attribs.c
> @@ -53,6 +53,7 @@ enum {
>  };
>  
>  enum {
> +	DOUBLE_TYPE,
>  	FLOAT_TYPE,
>  	INT_TYPE,
>  	UINT_TYPE
> @@ -120,12 +121,13 @@ static GLboolean test(int x, int y, const char *shaderfunc,
>  		      const char *info)
>  {
>  	static const char *templ = {
> +		"%s \n"

Is this extra line really needed?

>  		"%s \n"
>  		"#extension GL_ARB_explicit_attrib_location : require \n"
>  		"layout(location = 1) in %s attr; \n"
>  		"void main() { \n"
>  		"  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n"
> -		"  gl_FrontColor = (%s) * vec4(1.0, 1.0, 1.0, 0.5); \n"
> +		"  gl_FrontColor = vec4(%s %s) * vec4(1.0, 1.0, 1.0, 0.5); \n"
>  		"} \n"
>  	};
>  	GLuint prog, vs;
> @@ -139,10 +141,56 @@ static GLboolean test(int x, int y, const char *shaderfunc,
>  		{0.5, 0.3, 0.9, 0.2}
>  	};
>  
> +	char *defaults;
> +	char *type_string;
> +
> +	/* From Section 11.1.1 (Vertex Attributes) of the OpenGL 4.6
> +	 * Compatibility Profile spec:
> +	 *
> +	 *    "Scalar and vector vertex attribute types and VertexAttrib*
> +	 *    commands used to set the values of the corresponding generic
> +	 *    attribute. values are provided if the values of the vertex
> +	 *    attribute variable are specified with fewer components than
> +	 *    required for the attribute variable. For example, the fourth
> +	 *    component of a variable of type dvec4 will be undefined if
> +	 *    specified using VertexAttribL3dv, or using a vertex array
> +	 *    specified with VertexAttribLPointer and a size of three.
> +	 *
> +	 * TODO: We should probably also be doing this for attribute functions
> +	 *       other than doubles.
> +	 */
> +	if (type == DOUBLE_TYPE) {
> +		switch (mask) {
> +		case R:
> +			type_string = "double";
> +			defaults = ", dvec3(0.0, 0.0, 1.0)";
> +			break;
> +		case RG:
> +			type_string = "dvec2";
> +			defaults = ", dvec2(0.0, 1.0)";
> +			break;
> +		case RGB:
> +			type_string = "dvec3";
> +			defaults = ", 1.0";
> +			break;
> +		case RGBA:
> +			type_string = "dvec4";
> +			defaults = "";
> +			break;
> +		default:
> +			assert(0);
> +		}
> +	} else {
> +		defaults = "";
> +		type_string =
> +			type == INT_TYPE ? "ivec4" : type == UINT_TYPE ? "uvec4" : "vec4";
> +	}
> +
>  	sprintf(vstext, templ,
>  		type != FLOAT_TYPE ? "#version 130" : "",
> -		type == INT_TYPE ? "ivec4" : type == UINT_TYPE ? "uvec4" : "vec4",
> -		shaderfunc);
> +		type == DOUBLE_TYPE ?
> +		"#extension GL_ARB_gpu_shader_fp64: enable\n#extension GL_ARB_vertex_attrib_64bit: enable" : "",
> +		type_string, shaderfunc, defaults);
>  
>  	/* Create the shader. */
>  	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vstext);
> @@ -343,6 +391,19 @@ static test_func tests_GL3[] = {
>  	test_glVertexAttribI4ui,
>  };
>  
> +/* ARB_vertex_attrib_64bit */
> +DEFINE_TEST(glVertexAttribL1d,,  (1, x),		"attr", R, DOUBLE_TYPE, "")
> +DEFINE_TEST(glVertexAttribL2d,,  (1, x, y),		"attr", RG, DOUBLE_TYPE, "")
> +DEFINE_TEST(glVertexAttribL3d,,  (1, x, y, z),		"attr", RGB, DOUBLE_TYPE, "")
> +DEFINE_TEST(glVertexAttribL4d,,  (1, x, y, z, w),	"attr", RGBA, DOUBLE_TYPE, "")
> +
> +static test_func tests_GL_ARB_vertex_attrib_64bit[] = {
> +	test_glVertexAttribL1d,
> +	test_glVertexAttribL2d,
> +	test_glVertexAttribL3d,
> +	test_glVertexAttribL4d,
> +};
> +
>  /* ARB_vertex_type_2_10_10_10_rev */
>  /* Packing functions for a signed normalized 2-bit component.
>   * These are based on equation 2.2 and 2.3 from the opengl specification, see:
> @@ -503,6 +564,7 @@ struct test_set {
>  } test_sets[] = {
>  	{ TESTS(GL2) },
>  	{ TESTS(GL3), 30 },
> +	{ TESTS(GL_ARB_vertex_attrib_64bit), 32 },
>  	{ TESTS(GL_ARB_vertex_type_2_10_10_10_rev), 0, "GL_ARB_vertex_type_2_10_10_10_rev" },
>  };
>  
> diff --git a/tests/opengl.py b/tests/opengl.py
> index 669d9055b..3ed00e5b7 100644
> --- a/tests/opengl.py
> +++ b/tests/opengl.py
> @@ -4697,7 +4697,8 @@ with profile.test_list.group_manager(
>  with profile.test_list.group_manager(
>          PiglitGLTest,
>          grouptools.join('spec', 'arb_vertex_attrib_64bit')) as g:
> -    g(['arb_vertex_attrib_64bit-double_attribs'], 'double_attribs')
> +    g(['attribs', 'GL_ARB_vertex_attrib_64bit'], 'attribs')
> +    g(['arb_vertex_attrib_64bit-double_attribs'], 'get_double_attribs')
>      g(['arb_vertex_attrib_64bit-check-explicit-location'], 'check-explicit-location')
>      g(['arb_vertex_attrib_64bit-getactiveattrib'], 'getactiveattrib')
>      g(['arb_vertex_attrib_64bit-max-vertex-attrib'], 'max-vertex-attrib')