[Piglit] [PATCH 1/3] util: add piglit_array_texture() function

Brian Paul brianp at vmware.com
Tue Aug 5 12:11:19 PDT 2014


On 08/05/2014 10:49 AM, Roland Scheidegger wrote:
> Am 01.08.2014 17:07, schrieb Brian Paul:
>> For creating 1D/2D array textures.  Each slice of the array is a
>> solid color (red, green, blue, white, etc.)
>> ---
>>   tests/util/piglit-util-gl.c |   97 ++++++++++++++++++++++++++++++++++++++++---
>>   tests/util/piglit-util-gl.h |    1 +
>>   2 files changed, 92 insertions(+), 6 deletions(-)
>>
>> diff --git a/tests/util/piglit-util-gl.c b/tests/util/piglit-util-gl.c
>> index 1a8ee18..bbea519 100644
>> --- a/tests/util/piglit-util-gl.c
>> +++ b/tests/util/piglit-util-gl.c
>> @@ -35,6 +35,13 @@
>>    */
>>   static const char **gl_extensions = NULL;
>>
>> +static const float color_wheel[4][4] = {
>> +	{1, 0, 0, 1}, /* red */
>> +	{0, 1, 0, 1}, /* green */
>> +	{0, 0, 1, 1}, /* blue */
>> +	{1, 1, 1, 1}, /* white */
>> +};
>> +
>>   bool piglit_is_core_profile;
>>
>>   bool piglit_is_gles(void)
>> @@ -2012,12 +2019,6 @@ piglit_miptree_texture()
>>   	GLfloat *data;
>>   	int size, i, level;
>>   	GLuint tex;
>> -	const float color_wheel[4][4] = {
>> -		{1, 0, 0, 1}, /* red */
>> -		{0, 1, 0, 1}, /* green */
>> -		{0, 0, 1, 1}, /* blue */
>> -		{1, 1, 1, 1}, /* white */
>> -	};
>>
>>   	glGenTextures(1, &tex);
>>   	glBindTexture(GL_TEXTURE_2D, tex);
>> @@ -2376,6 +2377,90 @@ piglit_depth_texture(GLenum target, GLenum internalformat, int w, int h, int d,
>>   }
>>
>>   /**
>> + * Create 1D or 2D array texture in which each slice is a different color.
>> + * the color pattern is red, green, blue, white, red, green, ...
>> + */
>> +GLuint
>> +piglit_array_texture(GLenum target, GLenum internalformat,
>> +		     int w, int h, int d, GLboolean mip)
>> +{
>> +	float *data;
>> +	int size, i, level, layer;
>> +	GLuint tex;
>> +	GLenum type = GL_FLOAT, format = GL_RGBA;
>> +
>> +	if (target == GL_TEXTURE_1D_ARRAY) {
>> +		assert(h == 1);
>> +	}
>> +	else {
>> +		assert(target == GL_TEXTURE_2D_ARRAY);
>> +	}
>> +
>> +	glGenTextures(1, &tex);
>> +	glBindTexture(target, tex);
>> +	glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
>> +	glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
>> +	if (mip) {
>> +		glTexParameteri(target, GL_TEXTURE_MAG_FILTER,
>> +				GL_LINEAR);
>> +		glTexParameteri(target, GL_TEXTURE_MIN_FILTER,
>> +				GL_LINEAR_MIPMAP_NEAREST);
>> +	} else {
>> +		glTexParameteri(target, GL_TEXTURE_MAG_FILTER,
>> +				GL_NEAREST);
>> +		glTexParameteri(target, GL_TEXTURE_MIN_FILTER,
>> +				GL_NEAREST);
>> +	}
> Is that on purpose that the mip case does linear filtering but the no
> mip case does nearest filtering? Since it is a solid color though it
> really shouldn't matter anyway.

I was just following the example of the other texture-builder functions.

-Brian

>
>> +	data = malloc(w * h * 4 * sizeof(GLfloat));
>> +
>> +	size = w > h ? w : h;
>> +
>> +	for (level = 0; size > 0; level++, size >>= 1) {
>> +
>> +		/* Create mipmap level */
>> +		if (target == GL_TEXTURE_1D_ARRAY) {
>> +			glTexImage2D(target, level, internalformat,
>> +				     w, d, 0, format, type, NULL);
>> +		}
>> +		else {
>> +			glTexImage3D(target, level, internalformat,
>> +				     w, h, d, 0, format, type, NULL);
>> +		}
>> +
>> +		for (layer = 0; layer < d; layer++) {
>> +			/* Set whole layer to one color */
>> +			for (i = 0; i < w * h; i++) {
>> +				memcpy(data + 4 * i,
>> +				       color_wheel[layer %
>> +						   ARRAY_SIZE(color_wheel)],
>> +				       sizeof(color_wheel[0]));
>> +			}
>> +
>> +			if (target == GL_TEXTURE_1D_ARRAY) {
>> +				glTexSubImage2D(target, level,
>> +						0, layer, w, 1,
>> +						format, type, data);
>> +			}
>> +			else {
>> +				glTexSubImage3D(target, level,
>> +						0, 0, layer, w, h, 1,
>> +						format, type, data);
>> +			}
>> +		}
>> +
>> +		if (!mip)
>> +			break;
>> +
>> +		if (w > 1)
>> +			w >>= 1;
>> +		if (h > 1)
>> +			h >>= 1;
>> +	}
>> +	free(data);
>> +	return tex;
>> +}
>> +
>> +/**
>>    * Require transform feedback.
>>    *
>>    * Transform feedback may either be provided by GL 3.0 or
>> diff --git a/tests/util/piglit-util-gl.h b/tests/util/piglit-util-gl.h
>> index 73b658e..fcd8988 100644
>> --- a/tests/util/piglit-util-gl.h
>> +++ b/tests/util/piglit-util-gl.h
>> @@ -203,6 +203,7 @@ GLfloat *piglit_rgbw_image(GLenum internalFormat, int w, int h,
>>   GLuint piglit_rgbw_texture(GLenum internalFormat, int w, int h, GLboolean mip,
>>   		    GLboolean alpha, GLenum basetype);
>>   GLuint piglit_depth_texture(GLenum target, GLenum format, int w, int h, int d, GLboolean mip);
>> +GLuint piglit_array_texture(GLenum target, GLenum format, int w, int h, int d, GLboolean mip);
>>   extern float piglit_tolerance[4];
>>   void piglit_set_tolerance_for_bits(int rbits, int gbits, int bbits, int abits);
>>   extern void piglit_require_transform_feedback(void);
>>
>
> For the series:
> Reviewed-by: Roland Scheidegger <sroland at vmware.com>
>



More information about the Piglit mailing list