[Piglit] [PATCH] util: Add new headed matrix_index header to [vertex data]

Alejandro Piñeiro apinheiro at igalia.com
Sun Apr 3 13:14:08 UTC 2016


On 03/04/16 03:45, Timothy Arceri wrote:
> On Fri, 2016-04-01 at 13:01 +0200, Alejandro Piñeiro wrote:
>> While searching how to specify matrices on shader runner I found this
>> unreviewed patch. I guess that a late review is better than nothing.
>>
>> On 10/12/15 06:25, Timothy Arceri wrote:
>>> This allows data to be set for matrix attributes in shader runner.
>>>
>>> For example to set colunm 2 of mat2x3:
>>> attname/float/3/1
>>> ---
>>>  tests/util/piglit-vbo.cpp | 43 +++++++++++++++++++++++++++++++++
>>> ----------
>>>  1 file changed, 33 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/tests/util/piglit-vbo.cpp b/tests/util/piglit-vbo.cpp
>>> index 6453d40..07a5ee6 100644
>>> --- a/tests/util/piglit-vbo.cpp
>>> +++ b/tests/util/piglit-vbo.cpp
>>> @@ -151,6 +151,11 @@ public:
>>>  	size_t count;
>>>  
>>>  	/**
>>> +	 * Index of the matrix column for this attribute.
>>> +	 */
>>> +	size_t matrix_index;
>> Isn't size_t for the index somewhat an overkill. I guess that GLint
>> is
>> enough. But this is just a nitpick, you can forget it if you prefer.
>>
>>> +
>>> +	/**
>>>  	 * Index of this vertex attribute in the linked program.
>>>  	 */
>>>  	GLuint index;
>>> @@ -171,7 +176,8 @@
>>> vertex_attrib_description::vertex_attrib_description(GLuint prog,
>>>  	/* Split the column header into name/type/count fields */
>>>  	const char *first_slash = strchr(text, '/');
>>>  	if (first_slash == NULL) {
>>> -		printf("Column headers must be in the form
>>> name/type/count.  "
>>> +		printf("Column headers must be in the form
>>> name/type/count/matrix_column.\n"
>>> +		       "Note: matrix_column is optional.\n"
>>>  		       "Got: %s\n",
>>>  		       text);
>>>  		piglit_report_result(PIGLIT_FAIL);
>>> @@ -179,7 +185,7 @@
>>> vertex_attrib_description::vertex_attrib_description(GLuint prog,
>>>  	std::string name(text, first_slash);
>>>  	const char *second_slash = strchr(first_slash + 1, '/');
>>>  	if (second_slash == NULL) {
>>> -		printf("Column headers must be in the form
>>> name/type/count.  "
>>> +		printf("Column headers must be in the form
>>> name/type/count/matrix_column.\n"
>>>  		       "Got: %s\n",
>>>  		       text);
>>>  		piglit_report_result(PIGLIT_FAIL);
>>> @@ -188,11 +194,28 @@
>>> vertex_attrib_description::vertex_attrib_description(GLuint prog,
>>>  	this->data_type = decode_type(type_str.c_str());
>>>  	char *endptr;
>>>  	this->count = strtoul(second_slash + 1, &endptr, 10);
>>> +
>>>  	if (*endptr != '\0') {
>>> -		printf("Column headers must be in the form
>>> name/type/count.  "
>>> -		       "Got: %s\n",
>>> -		       text);
>>> -		piglit_report_result(PIGLIT_FAIL);
>>> +		const char *third_slash = strchr(second_slash + 1,
>>> '/');
>>> +		this->matrix_index = strtoul(third_slash + 1,
>>> &endptr, 10);
>>> +
>>> +		if (this->matrix_index < 0 || this->matrix_index >
>>> 3) {
>>> +			printf("Matrix column index must be
>>> between 0 and 3.  Got: %lu\n",
>>> +				(unsigned long) this-
>>>> matrix_index);
>>> +			piglit_report_result(PIGLIT_FAIL);
>>> +		}
>>> +		/* Turn the column into an offset */
>>> +		this->matrix_index -= 1;
>> This leads to need to specify the column number starting from 1. The
>> commit message seems to suggest that it would start from 0.
>>
>> Or in other words, with the patch as it is, specifying a matrix  like
>> this:
>> position/float/3  matrix/float/3/0 matrix/float/3/1 matrix/float/3/2
>> -1.0 -1.0 0.0   0 0 0           1 1 1           2 2 2
>>
>> Leads to an error, because matrix_index -1 for the first column is
>> used.
>>
>> In my opinion that line is not needed, unless you wanted to specify
>> columns starting to count from 1.
>>
>> Additionally, piglit-vbo.cpp has a header explaining how to specify
>> vertex data. Probably it would be good to add some info about how to
>> use
>> matrices.
> Hi,
>
> Thanks for the review. Do you have a use for this patch? I think I may
> have made some small changes locally but I never pushed forward with
> this patch because my use case went away (was going to use it for
> testing component packing in ARB_enhanced_layouts but after filing a
> spec bug it was reveal matrices can't be packed).

We are working on ARB_vertex_attrib_64bit, and for example, right now
most of the things are working but matrices. In fact we are using your
parch locally in order to have tests with vertex attrib matrices.

> If you have a use for it and want to fix this up feel free and I'll
> gladly take a look but I don't think I will have any time to do so for
> a little bit.

Ok, I will do this next Monday. But fwiw, with the change I suggested
the patch is working fine.

> The other thing to consider is that the same functionality can be used
> for arrays of arrays so you could enable it to accept even more
> columns.

Well, but in this case we don't have a use for it, so I will let anyone
needing it proposing it in the future.

>
> Thanks,
> Tim

Thanks to you, for your patch.

>
>>> +
>>> +		if (*endptr != '\0') {
>>> +			printf("Column headers must be in the form
>>> name/type/matrix_column.\n"
>>> +			       "Note: matrix_column is
>>> optional.\n"
>>> +			       "Got: %s\n",
>>> +			       text);
>>> +			piglit_report_result(PIGLIT_FAIL);
>>> +		}
>>> +	} else {
>>> +		this->matrix_index = 0;
>>>  	}
>>>  
>>>  	GLint attrib_location = glGetAttribLocation(prog,
>>> name.c_str());
>>> @@ -293,7 +316,7 @@ vertex_attrib_description::setup(size_t
>>> *offset, size_t stride) const
>>>  	int attribute_size = ATTRIBUTE_SIZE;
>>>  	switch (this->data_type) {
>>>  	case GL_FLOAT:
>>> -		glVertexAttribPointer(this->index, this->count,
>>> +		glVertexAttribPointer(this->index + this-
>>>> matrix_index, this->count,
>>>  				      this->data_type, GL_FALSE,
>>> stride,
>>>  				      (void *) *offset);
>>>  		break;
>>> @@ -302,7 +325,7 @@ vertex_attrib_description::setup(size_t
>>> *offset, size_t stride) const
>>>  			fprintf(stderr,"vertex_attrib_description
>>> fail. no 64-bit float support\n");
>>>  			return;
>>>  		}
>>> -		glVertexAttribLPointer(this->index, this->count,
>>> +		glVertexAttribLPointer(this->index + this-
>>>> matrix_index, this->count,
>>>  				      this->data_type, stride,
>>>  				      (void *) *offset);
>>>  		attribute_size *= 2;
>>> @@ -312,12 +335,12 @@ vertex_attrib_description::setup(size_t
>>> *offset, size_t stride) const
>>>  			fprintf(stderr,"vertex_attrib_description
>>> fail. no int support\n");
>>>  			return;
>>>  		}
>>> -		glVertexAttribIPointer(this->index, this->count,
>>> +		glVertexAttribIPointer(this->index + this-
>>>> matrix_index, this->count,
>>>  				       this->data_type, stride,
>>>  				       (void *) *offset);
>>>  		break;
>>>  	}
>>> -	glEnableVertexAttribArray(index);
>>> +	glEnableVertexAttribArray(index + this->matrix_index);
>>>  	*offset += attribute_size * this->count;
>>>  }
>>>  
>> _______________________________________________
>> Piglit mailing list
>> Piglit at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/piglit



More information about the Piglit mailing list