[Piglit] [PATCH] Test glStencilMaskSeparate too.

Brian Paul brianp at vmware.com
Tue Oct 30 13:01:33 PDT 2012


On 10/30/2012 01:47 PM, jfonseca at vmware.com wrote:
> From: José Fonseca<jose.r.fonseca at gmail.com>
>
> ---
>   src/glean/tstencil2.cpp |  154 ++++++++++++++++++++++++++++++++++++++++-------
>   src/glean/tstencil2.h   |   19 +++++-
>   2 files changed, 151 insertions(+), 22 deletions(-)
>
> diff --git a/src/glean/tstencil2.cpp b/src/glean/tstencil2.cpp
> index 7db3a06..9440c6f 100644
> --- a/src/glean/tstencil2.cpp
> +++ b/src/glean/tstencil2.cpp
> @@ -280,8 +280,12 @@ Stencil2Test::set_stencil_state(int method,
>   				GLenum backZPass,
>   				GLenum frontFunc,
>   				GLenum backFunc,
> -				GLint ref,
> -				GLuint mask)
> +				GLint frontRef,
> +				GLint backRef,
> +				GLuint frontMask,
> +				GLuint backMask,
> +				GLuint frontWriteMask,
> +				GLuint backWriteMask)
>   {
>   	GLint get_frontStencilFail;
>   	GLint get_backStencilFail;
> @@ -291,12 +295,20 @@ Stencil2Test::set_stencil_state(int method,
>   	GLint get_backZPass;
>   	GLint get_frontFunc;
>   	GLint get_backFunc;
> -	GLint get_ref;
> -	GLint get_mask;
> +	GLint get_frontRef;
> +	GLint get_backRef;
> +	GLint get_frontMask;
> +	GLint get_backMask;
> +	GLint get_frontWriteMask;
> +	GLint get_backWriteMask;
>   	GLint twoEnabled;
>
>   	switch (method) {
>   	case ATI:
> +		assert(frontRef == backRef);
> +		assert(frontMask == backMask);
> +		assert(frontWriteMask == backWriteMask);
> +
>   		// set state
>   		glStencilOpSeparateATI_func(GL_FRONT,
>   					    frontStencilFail,
> @@ -308,20 +320,26 @@ Stencil2Test::set_stencil_state(int method,
>   					    backZFail,
>   					    backZPass);
>
> -		glStencilFuncSeparateATI_func(frontFunc, backFunc, ref, mask);
> +		glStencilFuncSeparateATI_func(frontFunc, backFunc, frontRef, frontMask);
> +
> +		glStencilMask(frontWriteMask);
>
>   		// get state
>   		glGetIntegerv(GL_STENCIL_FAIL,&get_frontStencilFail);
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL,&get_frontZFail);
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS,&get_frontZPass);
>   		glGetIntegerv(GL_STENCIL_FUNC,&get_frontFunc);
> -		glGetIntegerv(GL_STENCIL_REF,&get_ref);
> -		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_mask);
> +		glGetIntegerv(GL_STENCIL_REF,&get_frontRef);
> +		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_frontMask);
> +		glGetIntegerv(GL_STENCIL_WRITEMASK,&get_frontWriteMask);
>
>   		glGetIntegerv(GL_STENCIL_BACK_FUNC_ATI,&get_backFunc);
>   		glGetIntegerv(GL_STENCIL_BACK_FAIL_ATI,&get_backStencilFail);
>   		glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI,&get_backZFail);
>   		glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI,&get_backZPass);
> +		get_backRef = get_frontRef;
> +		get_backMask = get_frontMask;
> +		get_backWriteMask = get_frontWriteMask;
>   		twoEnabled = GL_TRUE;
>   		break;
>
> @@ -331,11 +349,13 @@ Stencil2Test::set_stencil_state(int method,
>
>   		glActiveStencilFaceEXT_func(GL_FRONT);
>   		glStencilOp(frontStencilFail, frontZFail, frontZPass);
> -		glStencilFunc(frontFunc, ref, mask);
> +		glStencilFunc(frontFunc, frontRef, frontMask);
> +		glStencilMask(frontWriteMask);
>
>   		glActiveStencilFaceEXT_func(GL_BACK);
>   		glStencilOp(backStencilFail, backZFail, backZPass);
> -		glStencilFunc(backFunc, ref, mask);
> +		glStencilFunc(backFunc, backRef, backMask);
> +		glStencilMask(backWriteMask);
>
>   		// get state
>   		glActiveStencilFaceEXT_func(GL_FRONT);
> @@ -343,15 +363,17 @@ Stencil2Test::set_stencil_state(int method,
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL,&get_frontZFail);
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS,&get_frontZPass);
>   		glGetIntegerv(GL_STENCIL_FUNC,&get_frontFunc);
> -		glGetIntegerv(GL_STENCIL_REF,&get_ref);
> -		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_mask);
> +		glGetIntegerv(GL_STENCIL_REF,&get_frontRef);
> +		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_frontMask);
> +		glGetIntegerv(GL_STENCIL_WRITEMASK,&get_frontWriteMask);
>   		glActiveStencilFaceEXT_func(GL_BACK);
>   		glGetIntegerv(GL_STENCIL_FAIL,&get_backStencilFail);
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL,&get_backZFail);
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS,&get_backZPass);
>   		glGetIntegerv(GL_STENCIL_FUNC,&get_backFunc);
> -		glGetIntegerv(GL_STENCIL_REF,&get_ref);
> -		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_mask);
> +		glGetIntegerv(GL_STENCIL_REF,&get_backRef);
> +		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_backMask);
> +		glGetIntegerv(GL_STENCIL_WRITEMASK,&get_backWriteMask);
>   		glGetIntegerv(GL_STENCIL_TEST_TWO_SIDE_EXT,&twoEnabled);
>   		break;
>
> @@ -365,21 +387,27 @@ Stencil2Test::set_stencil_state(int method,
>   					 backStencilFail,
>   					 backZFail,
>   					 backZPass);
> -		glStencilFuncSeparate_func(GL_FRONT, frontFunc, ref, mask);
> -		glStencilFuncSeparate_func(GL_BACK, backFunc, ref, mask);
> +		glStencilFuncSeparate_func(GL_FRONT, frontFunc, frontRef, frontMask);
> +		glStencilFuncSeparate_func(GL_BACK, backFunc, backRef, backMask);
> +		glStencilMaskSeparate_func(GL_FRONT, frontWriteMask);
> +		glStencilMaskSeparate_func(GL_BACK, backWriteMask);
>
>   		// get state
>   		glGetIntegerv(GL_STENCIL_FAIL,&get_frontStencilFail);
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL,&get_frontZFail);
>   		glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS,&get_frontZPass);
>   		glGetIntegerv(GL_STENCIL_FUNC,&get_frontFunc);
> -		glGetIntegerv(GL_STENCIL_REF,&get_ref);
> -		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_mask);
> +		glGetIntegerv(GL_STENCIL_REF,&get_frontRef);
> +		glGetIntegerv(GL_STENCIL_VALUE_MASK,&get_frontMask);
> +		glGetIntegerv(GL_STENCIL_WRITEMASK,&get_frontWriteMask);
>
>   		glGetIntegerv(GL_STENCIL_BACK_FUNC,&get_backFunc);
>   		glGetIntegerv(GL_STENCIL_BACK_FAIL,&get_backStencilFail);
>   		glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_FAIL,&get_backZFail);
>   		glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_PASS,&get_backZPass);
> +		glGetIntegerv(GL_STENCIL_BACK_REF,&get_backRef);
> +		glGetIntegerv(GL_STENCIL_BACK_VALUE_MASK,&get_backMask);
> +		glGetIntegerv(GL_STENCIL_BACK_WRITEMASK,&get_backWriteMask);
>   		twoEnabled = GL_TRUE;
>   		break;
>
> @@ -388,8 +416,14 @@ Stencil2Test::set_stencil_state(int method,
>   	}
>
>   	// mask off bits we don't care about
> -	get_mask&= stencilMax;
> -	mask&= stencilMax;
> +	get_frontMask&= stencilMax;
> +	frontMask&= stencilMax;
> +	get_backMask&= stencilMax;
> +	backMask&= stencilMax;
> +	get_frontWriteMask&= stencilMax;
> +	frontWriteMask&= stencilMax;
> +	get_backWriteMask&= stencilMax;
> +	backWriteMask&= stencilMax;
>
>   	GLenum err = glGetError();
>   	if (err != GL_NO_ERROR) {
> @@ -432,10 +466,28 @@ Stencil2Test::set_stencil_state(int method,
>   			   "back stencil func"))
>   		return false;
>
> -	if (!compare_state(method, get_ref, ref, "stencil ref"))
> +	if (!compare_state(method, get_frontRef, frontRef,
> +		           "front stencil ref"))
> +		return false;
> +
> +	if (!compare_state(method, get_backRef, backRef,
> +		           "back stencil ref"))
> +		return false;
> +
> +	if (!compare_state(method, get_frontMask, frontMask,
> +		           "front stencil mask"))
>   		return false;
>
> -	if (!compare_state(method, get_mask, mask, "stencil mask"))
> +	if (!compare_state(method, get_backMask, backMask,
> +		           "back stencil mask"))
> +		return false;
> +
> +	if (!compare_state(method, get_frontWriteMask, frontWriteMask,
> +		           "front stencil writemask"))
> +		return false;
> +
> +	if (!compare_state(method, get_backWriteMask, backWriteMask,
> +		           "back stencil writemask"))
>   		return false;
>
>   	if (!compare_state(method, twoEnabled, GL_TRUE, "two-side enable"))
> @@ -445,6 +497,38 @@ Stencil2Test::set_stencil_state(int method,
>   }
>
>
> +bool
> +Stencil2Test::set_stencil_state(int method,
> +				GLenum frontStencilFail,
> +				GLenum backStencilFail,
> +				GLenum frontZFail,
> +				GLenum backZFail,
> +				GLenum frontZPass,
> +				GLenum backZPass,
> +				GLenum frontFunc,
> +				GLenum backFunc,
> +				GLint ref,
> +				GLuint mask,
> +				GLuint writeMask)
> +{
> +	return set_stencil_state(method,
> +				 frontStencilFail,
> +				 backStencilFail,
> +				 frontZFail,
> +				 backZFail,
> +				 frontZPass,
> +				 backZPass,
> +				 frontFunc,
> +				 backFunc,
> +				 ref, // frontRef
> +				 ref, // backRef
> +				 mask, // frontMask
> +				 mask, // backMask
> +				 writeMask, // frontWriteMask
> +				 writeMask); // backWriteMask
> +}
> +
> +
>   void
>   Stencil2Test::reset_stencil_state(int method)
>   {
> @@ -535,6 +619,34 @@ Stencil2Test::test_stencil(int method)
>   	if (!pass)
>   		return false;
>
> +	if (method != ATI) {
> +		// if front!=10, keep, else decr
> +		// if back<10, keep, else incr
> +		// final: front=6, back=1
> +		pass = set_stencil_state(method,
> +					 GL_DECR, GL_INCR,  // stencil fail
> +					 GL_KEEP, GL_KEEP,  // z fail
> +					 GL_REPLACE, GL_REPLACE,  // z pass
> +					 GL_ALWAYS, GL_ALWAYS,  // stencil func
> +					 0xf6, 0xf1, // ref
> +					 0xff, 0xff, // mask
> +					 0x60, 0x10); // writeMask
> +		if (pass)
> +			pass = render_test(0x66, 0x11);
> +		reset_stencil_state(method);
> +		if (!pass)
> +			return false;
> +	}
> +
> +	// reset write mask for clear
> +	set_stencil_state(method,
> +			  GL_KEEP, GL_KEEP,  // stencil fail
> +			  GL_KEEP, GL_KEEP,  // z fail
> +			  GL_REPLACE, GL_REPLACE,  // z pass
> +			  GL_ALWAYS, GL_ALWAYS,  // stencil func
> +			  0, 0,
> +			  ~0, ~0,
> +			  ~0, ~0);
>
>   	//============================================================
>   	// Now begin tests with depth test
> diff --git a/src/glean/tstencil2.h b/src/glean/tstencil2.h
> index 8c332cd..cd6da7f 100644
> --- a/src/glean/tstencil2.h
> +++ b/src/glean/tstencil2.h
> @@ -80,8 +80,25 @@ private:
>   			       GLenum backZPass,
>   			       GLenum frontFunc,
>   			       GLenum backFunc,
> +			       GLint frontRef,
> +			       GLint backRef,
> +			       GLuint frontMask,
> +			       GLuint backMask,
> +			       GLuint frontWriteMask,
> +			       GLuint backWriteMask);
> +
> +	bool set_stencil_state(int method,
> +			       GLenum frontStencilFail,
> +			       GLenum backStencilFail,
> +			       GLenum frontZFail,
> +			       GLenum backZFail,
> +			       GLenum frontZPass,
> +			       GLenum backZPass,
> +			       GLenum frontFunc,
> +			       GLenum backFunc,
>   			       GLint ref,
> -			       GLuint mask);
> +			       GLuint mask,
> +			       GLuint writeMask = ~0);
>
>   	void reset_stencil_state(int method);
>


Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the Piglit mailing list