[Piglit] [PATCH] for gles v1 extension oes_query_matrix
Ian Romanick
idr at freedesktop.org
Mon Dec 23 12:53:56 PST 2013
On 12/18/2013 07:54 AM, Brian Paul wrote:
> On 12/17/2013 07:06 PM, Huang, JunX A wrote:
>> Hi Paul,
>>
>> Thanks for your correcting!
>> But I still can not follow your following saying, could you be more
>> specific?
>> "Also, maybe it should be structured so that the floating point matrix
>> is first constructed from the mantisa & exponent arrays first. Then,
>> compare that matrix to the expected result."
>> And here is the update file:
>
> See below.
>
>
>>
>> /*
>> * Copyright © 2013 Intel Corporation
>> *
>> * Permission is hereby granted, free of charge, to any person
>> obtaining a
>> * copy of this software and associated documentation files (the
>> "Software"),
>> * to deal in the Software without restriction, including without
>> limitation
>> * the rights to use, copy, modify, merge, publish, distribute,
>> sublicense,
>> * and/or sell copies of the Software, and to permit persons to whom the
>> * Software is furnished to do so, subject to the following conditions:
>> *
>> * The above copyright notice and this permission notice (including
>> the next
>> * paragraph) shall be included in all copies or substantial portions
>> of the
>> * Software.
>> *
>> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> EXPRESS OR
>> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY,
>> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
>> SHALL
>> * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
>> OR OTHER
>> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> ARISING
>> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> OTHER DEALINGS
>> * IN THE SOFTWARE.
>> */
>>
>> /**
>> * @file
>> * @brief Test GL_OES_query_matrix with types of operation in OpenGL
>> ES 1.1.
>> *
>> * It uses the GL_FIXED data type.
>> *
>> */
>>
>> #include "piglit-util-gl-common.h"
>> #include "piglit-util-egl.h"
>>
>>
>> struct sub_test
>> {
>> const char *name;
>> const GLfloat matrix[16];
>> };
>>
>> PIGLIT_GL_TEST_CONFIG_BEGIN config.supports_gl_es_version = 11;
>> PIGLIT_GL_TEST_CONFIG_END static PFNGLQUERYMATRIXXOESPROC
>> glQueryMatrixxOES;
>> static char sOut[256] = {0}, sTmp[256] = {0};
>>
>> static bool
>> verifyQuery(struct sub_test
>> test, GLbitfield status)
>
> Unneeded line break.
>
>
>> {
>> const GLfloat * matrix = test.matrix;
>> GLfloat (*m)[4] = (void *) matrix;
>
> That cast looks suspicious. I don't know why you need 'm' at all. See
> below.
>
>
>> GLint i, j, k;
>> bool functionPass = true;
>> GLbitfield querystatus;
>> GLfixed fMan[16];
>> GLint iExp[16];
>> GLfloat fQueryresult, fLimit, fDiff;
>
> We usually put a blank line here between the declarations and code.
>
>> sOut[0] = '\0';
>> strcat(sOut, sTmp);
>> querystatus = glQueryMatrixxOES(fMan, iExp);
>> functionPass = piglit_check_gl_error(GL_NO_ERROR) && functionPass;
>> snprintf(sTmp, sizeof(sTmp), "0x%x,0x%x, VerifyQuery:\n",
>> status, querystatus);
>> strcat(sOut, sTmp);
>>
>> for(i = 0; i < 4; i++){
>> for(j = 0; j < 4; j++){
>> k = j * 4 + i;
>> strcat(sOut, "\t\t");
>> fQueryresult = 1.0 * fMan[k] * (exp2 (iExp[k]) / (1 << 16));
>> fLimit = 0.01 * (fabs(fQueryresult) + 1);
>> fDiff = m[i][j] - fQueryresult;
>> if((querystatus & (1 << k)) != 0 && (status & (1 << k)) != 0)
>> strcat(sOut, "sameNA");
>> else if(abs(fDiff) <= fLimit){
>> strcat(sOut, "sameValue");
>> }else{
>> if(!(fDiff <= fLimit)){
>> snprintf(sTmp, sizeof(sTmp),
>> "should:%f<%f", (float) fDiff, (float)
>> fLimit);
>> strcat(sOut, sTmp);
>> }else if(!(fDiff >= (-fLimit))){
>> snprintf(sTmp, sizeof(sTmp),
>> "should:%f>%f", (float) fDiff, (float)
>> (-fLimit));
>> strcat(sOut, sTmp);
>> }else{
>> snprintf(sTmp, sizeof(sTmp),
>> "should:%f=%f,%i=%i", fQueryresult, m[i][j],
>> querystatus & (1 << k), status & (1 << k));
>> strcat(sOut, sTmp);
>> }
>> functionPass = false;
>> }
>> }
>> strcat(sOut, "\n");
>> }
>
> I'd replace the above code with two loops. First, construct the matrix
> from the mantissa/exponent info:
I would like some flavor of Brian's suggestion.
> GLfloat mat[4];
^ 16
> for (k = 0; k < 16; k++) {
^^ ARRAY_SIZE(mat)
> mat[k] = 1.0 * fMan[k] * (exp2 (iExp[k]) / (1 << 16));
Or
mat[k] = ldexp(fMan[k], iExp[k] - 16);
...assuming ldexp is available in MSVC.
> }
>
> Then, do the loops which check the values in the matrix:
>
> for (k = 0; k < 16; k++) {
> fLimit = .01 * (fabs(mat[k]) + 1);
> fDiff = matrix[k] - mat[k];
> if (fDiff indicates wrong value) {
> printf("Bad matrix value at position %d,"
> " expected %f, found %f\n",
> k, mat[k], matrix[k]);
> pass = false;
> }
> }
>
> Also, all the snprintf(), strcat() code seems complicated. What's the
> purpose of that? Why not use a simple printf() when a problem is found?
>
>
>
>
>> strcat(sOut, "\n");
>> sTmp[0] = '\0';
>> piglit_report_subtest_result(
>> functionPass ? PIGLIT_PASS : PIGLIT_FAIL, test.name);
>> return functionPass ? true : false;
>> }
>>
>>
>> /* new window size or exposure */
>> static bool
>> tests()
>
> tests(void)
>
>
>> {
>> bool pass = true;
>> GLint maxexp;
>> GLfixed maxman;
>> struct sub_test basedm = {
>
> const?
>
>> "based",
>> {
>> 1, 0, 0, 0 ,
>> 0, 1, 0, 0,
>> 0, 0, 1, 0,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm1 = {
>> "transformedm1",
>> {
>> 6.666626, 0, 0, 0,
>> 0, 5, 0, 0,
>> 0, 0, -1.181793, -10.908936,
>> 0, 0, -1, 0
>> }},
>>
>> transformedm2 = {
>> "transformedm2",
>> {
>> 0.444443, 0, 0, 0,
>> 0, 0.333328, 0, 0,
>> 0, 0, -0.666656, 0.333328,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm3 = {
>> "transformedm3",
>> {
>> 2, 0, 0,0,
>> 0, 3, 0, 0,
>> 0, 0, 0.500000, 0,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm4 = {
>> "transformedm4",
>> {
>> 2, 0, 0, 2,
>> 0, 3, 0, 6,
>> 0, 0, 0.500000, -3,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm5 = {
>> "transformedm5",
>> {
>> 1.999939, -0.002892, 0.005826, 0,
>> 0.002926, 2.999878, -0.017427, 0,
>> -0.002905, 0.002913, 0.499977, 0,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm6 = {
>> "transformedm6",
>> {
>> 2, 0, 0, 0 ,
>> 0, 0, 0, 0,
>> 0, 0, 3.4E38, 0,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm7 = {
>> "transformedm7",
>> {
>> 1, 0, 0, 2,
>> 0, 1, 0, 0,
>> 0, 0, 1, 3.4E38,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm8 = {
>> "transformedm8",
>> {
>> 1, 0, 0, 2,
>> 0, 1, 0, 0,
>> 0, 0, 1, 3.4E38,
>> 0, 0, 0, 1
>> }},
>>
>> transformedm9 = {
>> "transformedm9",
>> {
>> 2, 0, 0, 2,
>> 0, 0, 0, 0,
>> 0, 0, 3.4E38, 3.4E38,
>> 0, 0, 0, 1
>> }};
>>
>> GLfloat ar = 3.0f / 4.0f;
>>
>> glMatrixMode(GL_PROJECTION);
>> glLoadIdentity();
>> glPushMatrix();
>>
>> snprintf(sTmp, sizeof(sTmp), "Identity:\n");
>> pass = verifyQuery(basedm, 0) && pass;
>>
>> glFrustumf(-ar, ar, -1, 1, 5.0, 60.0);
>> snprintf(sTmp, sizeof(sTmp), "Frustum:\n");
>> pass = verifyQuery(transformedm1, 0) && pass;
>>
>>
>>
>> glPopMatrix();
>> pass = verifyQuery(basedm, 0) && pass;
>>
>> glOrthof(-3.0 * ar, 3.0 * ar, -3.0, 3.0, -2.0, 1.0);
>>
>> pass = verifyQuery(transformedm2, 0) && pass;
>>
>>
>> glMatrixMode(GL_MODELVIEW);
>> glLoadIdentity();
>> glScalef(2.0, 3.0, 0.5);
>>
>> pass = verifyQuery(transformedm3, 0) && pass;
>>
>> snprintf(sTmp, sizeof(sTmp), "Push,Translate:\n");
>
> What is all the snprintf() code for? The sTmp variable is never used
> AFAICT.
>
>
>> glPushMatrix();
>> glTranslatef(1.0, 2.0, -6.0);
>>
>> pass = verifyQuery(transformedm4, 0) && pass;
>>
>>
>> snprintf(sTmp, sizeof(sTmp), "pop:%5Cn");
>> glPopMatrix();
>> pass = verifyQuery(transformedm3, 0) && pass;
>>
>>
>> snprintf(sTmp, sizeof(sTmp), "Rotate:\n");
>> glRotatef(0.5, 1.0, 1.0, 0.5);
>>
>> pass = verifyQuery(transformedm5, 0) && pass;
>>
>>
>
> The following code needs comments to explain what it's doing. In fact,
> the whole test has no comments at all. Please look at other piglit
> tests to get an idea of how comments should be used.
>
>
>> snprintf(sTmp, sizeof(sTmp), "overflow by max of GLfixed:\n");
>> glLoadIdentity();
>> maxexp = (1 << (8 * sizeof(GLint) - 1)) ^ (GLint) (-1);
>> maxman = (1 << (8 * sizeof(GLfixed) - 1)) ^ (GLfixed) (-1);
>> glTranslatef(1.0, 2.0, 1.0 * maxman * (exp2 (maxexp) / (1 << 16)));
>>
>> pass = verifyQuery(basedm, 0xf000) && pass;
>>
>> snprintf(sTmp, sizeof(sTmp), "invalid bits still:\n");
>> glScalef(2.0, 3.0, 0.5);
>>
>> pass = verifyQuery(transformedm3, 0xf000) && pass;
>>
>> snprintf(sTmp, sizeof(sTmp),
>> "revalid bits. glScalef with max and min of
>> GLfloat:\n");
>
> revalid?
>
>
>> glLoadIdentity();
>> glScalef(2.0, 3.4E-38, 3.4E38);
>> pass = verifyQuery(transformedm6, 0) && pass;
>>
>>
>> snprintf(sTmp, sizeof(sTmp),
>> "glTranslatef with max and min of GLfloat:\n");
>> glLoadIdentity();
>> glTranslatef(2.0, 3.4E-38, 3.4E38);
>> pass = verifyQuery(transformedm7, 0) && pass;
>>
>>
>> snprintf(sTmp, sizeof(sTmp), "glRotatef a circle:\n");
>> glRotatef(360, 0, 0, 0);
>>
>> pass = verifyQuery(transformedm7, 0) && pass;
>>
>>
>> snprintf(sTmp, sizeof(sTmp), "glRotatef with max and min of
>> GLfloat:\n");
>> glRotatef(360, 2.0, 3.4E-38, 3.4E38);
>> pass = verifyQuery(transformedm8, 0) && pass;
>>
>>
>> snprintf(sTmp, sizeof(sTmp),
>> "glScalef again with max and min of GLfloat:\n");
>> glScalef(2.0, 3.4E-38, 3.4E38);
>> pass = verifyQuery(transformedm9, 0) && pass;
>>
>>
>> if(pass != true)
>
> if (!pass)
>
>
>> fprintf (stderr, "%s\nVerify Query Fail\n", sOut);
>> return pass;
>> }
>>
>> enum piglit_result
>> piglit_display(void)
>> {
>> /* UNREACHED */
>> return PIGLIT_FAIL;
>> }
>>
>> void
>> piglit_init(int argc, char **argv)
>> {
>> piglit_require_extension("GL_OES_query_matrix");
>> glQueryMatrixxOES = (PFNGLQUERYMATRIXXOESPROC)
>> eglGetProcAddress("glQueryMatrixxOES");
Do *NOT* name the function pointer the same as the function. Use
piglit_QueryMatrixxOES and have a #define for glQueryMatrixxOES instead.
>> if(!glQueryMatrixxOES)
>> piglit_report_result(PIGLIT_FAIL);
>> if(!piglit_check_gl_error(GL_NO_ERROR)){
>> /* Should be no error at this point. If there is, report
>> failure */
>> piglit_report_result(PIGLIT_FAIL);
>> }
>> piglit_report_result(tests() ? PIGLIT_PASS : PIGLIT_FAIL);
>> }
>>
>>
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
>
More information about the Piglit
mailing list