ES{2,3}: Clamp the x, y location of the viewport's bottom-left corner
authorAnuj Phogat <anuj.phogat@intel.com>
Fri, 30 Sep 2016 17:46:49 +0000 (10:46 -0700)
committerPyry Haulos <phaulos@google.com>
Tue, 17 Jan 2017 22:43:53 +0000 (22:43 +0000)
Affected tests:
dEQP-GLES2.functional.state_query.integers.viewport_getfloat
dEQP-GLES2.functional.state_query.integers.viewport_getinteger
dEQP-GLES3.functional.state_query.integers.viewport_getfloat
dEQP-GLES3.functional.state_query.integers.viewport_getinteger
dEQP-GLES3.functional.state_query.integers.viewport_getinteger64

Above CTS tests are not clamping the x, y location of the viewport's
bottom-left corner as recommended by ARB_viewport_array and
OES_viewport_array.
Tests later compare the clamped x, y values read back from the driver
with reference unclamped  x, y values resulting in to false failures.

From OES_viewport_array:
"The location of the viewport's bottom-left corner, given by (x,y), are
clamped to be within the implementation-dependent viewport bounds range.
The viewport bounds range [min, max] tuple may be determined by calling
GetFloatv with the symbolic constant VIEWPORT_BOUNDS_RANGE_OES"

Bug: 34349411

modules/gles2/functional/es2fIntegerStateQueryTests.cpp
modules/gles3/functional/es3fIntegerStateQueryTests.cpp

index 245cf21..2b736d7 100644 (file)
@@ -869,7 +869,15 @@ public:
                de::Random rnd(0xabcdef);
 
                GLint maxViewportDimensions[2] = {0};
+               GLfloat viewportBoundsRange[2] = {0.0f};
+               GLboolean hasViewportArray = false;
                glGetIntegerv(GL_MAX_VIEWPORT_DIMS, maxViewportDimensions);
+               hasViewportArray = m_context.getContextInfo().isExtensionSupported("GL_OES_viewport_array") ||
+                                                  m_context.getContextInfo().isExtensionSupported("GL_NV_viewport_array");
+               if (hasViewportArray)
+               {
+                       glGetFloatv(GL_VIEWPORT_BOUNDS_RANGE, viewportBoundsRange);
+               }
 
                // verify initial value of first two values
                m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, 0, 0, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight());
@@ -884,7 +892,19 @@ public:
                        GLsizei height  = rnd.getInt(0, maxViewportDimensions[1]);
 
                        glViewport(x, y, width, height);
-                       m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, x, y, width, height);
+
+                       if (hasViewportArray)
+                       {
+                               m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT,
+                                                                                  de::clamp(x, deFloorFloatToInt32(viewportBoundsRange[0]), deFloorFloatToInt32(viewportBoundsRange[1])),
+                                                                                  de::clamp(y, deFloorFloatToInt32(viewportBoundsRange[0]), deFloorFloatToInt32(viewportBoundsRange[1])),
+                                                                                  width, height);
+                       }
+                       else
+                       {
+                               m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, x, y, width, height);
+                       }
+
                        expectError(GL_NO_ERROR);
                }
        }
index 518d608..4837128 100644 (file)
@@ -1148,7 +1148,15 @@ public:
                de::Random rnd(0xabcdef);
 
                GLint maxViewportDimensions[2] = {0};
+               GLfloat viewportBoundsRange[2] = {0.0f};
+               GLboolean hasViewportArray = false;
                glGetIntegerv(GL_MAX_VIEWPORT_DIMS, maxViewportDimensions);
+               hasViewportArray = m_context.getContextInfo().isExtensionSupported("GL_OES_viewport_array") ||
+                                                  m_context.getContextInfo().isExtensionSupported("GL_NV_viewport_array");
+               if (hasViewportArray)
+               {
+                       glGetFloatv(GL_VIEWPORT_BOUNDS_RANGE, viewportBoundsRange);
+               }
 
                // verify initial value of first two values
                m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, 0, 0, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight());
@@ -1163,7 +1171,19 @@ public:
                        GLsizei height  = rnd.getInt(0, maxViewportDimensions[1]);
 
                        glViewport(x, y, width, height);
-                       m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, x, y, width, height);
+
+                       if (hasViewportArray)
+                       {
+                               m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT,
+                                                                                  de::clamp(x, deFloorFloatToInt32(viewportBoundsRange[0]), deFloorFloatToInt32(viewportBoundsRange[1])),
+                                                                                  de::clamp(y, deFloorFloatToInt32(viewportBoundsRange[0]), deFloorFloatToInt32(viewportBoundsRange[1])),
+                                                                                  width, height);
+                       }
+                       else
+                       {
+                               m_verifier->verifyInteger4(m_testCtx, GL_VIEWPORT, x, y, width, height);
+                       }
+
                        expectError(GL_NO_ERROR);
                }
        }