Edit

IABSD.fr/xenocara/lib/mesa/docs/viewperf.rst

Branch :

  • Show log

    Commit

  • Author : jsg
    Date : 2022-02-24 01:51:18
    Hash : 50b4ee55
    Message : Import Mesa 21.3.7

  • lib/mesa/docs/viewperf.rst
  • Viewperf Issues
    ===============
    
    This page lists known issues with `SPEC Viewperf
    11 <https://www.spec.org/gwpg/gpc.static/vp11info.html>`__ and `SPEC
    Viewperf 12 <https://www.spec.org/gwpg/gpc.static/vp12info.html>`__ when
    running on Mesa-based drivers.
    
    The Viewperf data sets are basically GL API traces that are recorded
    from CAD applications, then replayed in the Viewperf framework.
    
    The primary problem with these traces is they blindly use features and
    OpenGL extensions that were supported by the OpenGL driver when the
    trace was recorded, but there's no checks to see if those features are
    supported by the driver when playing back the traces with Viewperf.
    
    These issues have been reported to the SPEC organization in the hope
    that they'll be fixed in the future.
    
    Viewperf 11
    -----------
    
    Some of the Viewperf 11 tests use a lot of memory. At least 2GB of RAM
    is recommended.
    
    Catia-03 test 2
    ~~~~~~~~~~~~~~~
    
    This test creates over 38000 vertex buffer objects. On some systems this
    can exceed the maximum number of buffer allocations. Mesa generates
    GL_OUT_OF_MEMORY errors in this situation, but Viewperf does no error
    checking and continues. When this happens, some drawing commands become
    no-ops. This can also eventually lead to a segfault either in Viewperf
    or the Mesa driver.
    
    Catia-03 tests 3, 4, 8
    ~~~~~~~~~~~~~~~~~~~~~~
    
    These tests use features of the
    `GL_NV_fragment_program2 <https://www.opengl.org/registry/specs/NV/fragment_program2.txt>`__
    and
    `GL_NV_vertex_program3 <https://www.opengl.org/registry/specs/NV/vertex_program3.txt>`__
    extensions without checking if the driver supports them.
    
    When Mesa tries to compile the vertex/fragment programs it generates
    errors (which Viewperf ignores). Subsequent drawing calls become no-ops
    and the rendering is incorrect.
    
    sw-02 tests 1, 2, 4, 6
    ~~~~~~~~~~~~~~~~~~~~~~
    
    These tests depend on the
    `GL_NV_primitive_restart <https://www.opengl.org/registry/specs/NV/primitive_restart.txt>`__
    extension.
    
    If the Mesa driver doesn't support this extension the rendering will be
    incorrect and the test will fail.
    
    Also, the color of the line drawings in test 2 seem to appear in a
    random color. This is probably due to some uninitialized state
    somewhere.
    
    sw-02 test 6
    ~~~~~~~~~~~~
    
    The lines drawn in this test appear in a random color. That's because
    texture mapping is enabled when the lines are drawn, but no texture
    image is defined (glTexImage2D() is called with pixels=NULL). Since GL
    says the contents of the texture image are undefined in that situation,
    we get a random color.
    
    Lightwave-01 test 3
    ~~~~~~~~~~~~~~~~~~~
    
    This test uses a number of mipmapped textures, but the textures are
    incomplete because the last/smallest mipmap level (1 x 1 pixel) is never
    specified.
    
    A trace captured with `API
    trace <https://github.com/apitrace/apitrace>`__ shows this sequences of
    calls like this:
    
    ::
    
       2504 glBindTexture(target = GL_TEXTURE_2D, texture = 55)
       2505 glTexImage2D(target = GL_TEXTURE_2D, level = 0, internalformat = GL_RGBA, width = 512, height = 512, border = 0, format = GL_RGB, type = GL_UNSIGNED_SHORT, pixels = blob(1572864))
       2506 glTexImage2D(target = GL_TEXTURE_2D, level = 1, internalformat = GL_RGBA, width = 256, height = 256, border = 0, format = GL_RGB, type = GL_UNSIGNED_SHORT, pixels = blob(393216))
       2507 glTexImage2D(target = GL_TEXTURE_2D, level = 2, internalformat = GL_RGBA, width = 128, height = 128, border = 0, format = GL_RGB, type = GL_UNSIGNED_SHORT, pixels = blob(98304))
       [...]
       2512 glTexImage2D(target = GL_TEXTURE_2D, level = 7, internalformat = GL_RGBA, width = 4, height = 4, border = 0, format = GL_RGB, type = GL_UNSIGNED_SHORT, pixels = blob(96))
       2513 glTexImage2D(target = GL_TEXTURE_2D, level = 8, internalformat = GL_RGBA, width = 2, height = 2, border = 0, format = GL_RGB, type = GL_UNSIGNED_SHORT, pixels = blob(24))
       2514 glTexParameteri(target = GL_TEXTURE_2D, pname = GL_TEXTURE_MIN_FILTER, param = GL_LINEAR_MIPMAP_LINEAR)
       2515 glTexParameteri(target = GL_TEXTURE_2D, pname = GL_TEXTURE_WRAP_S, param = GL_REPEAT)
       2516 glTexParameteri(target = GL_TEXTURE_2D, pname = GL_TEXTURE_WRAP_T, param = GL_REPEAT)
       2517 glTexParameteri(target = GL_TEXTURE_2D, pname = GL_TEXTURE_MAG_FILTER, param = GL_NEAREST)
    
    Note that one would expect call 2514 to be glTexImage(level=9, width=1,
    height=1) but it's not there.
    
    The minification filter is GL_LINEAR_MIPMAP_LINEAR and the texture's
    GL_TEXTURE_MAX_LEVEL is 1000 (the default) so a full mipmap is expected.
    
    Later, these incomplete textures are bound before drawing calls.
    According to the GL specification, if a fragment program or fragment
    shader is being used, the sampler should return (0,0,0,1) ("black") when
    sampling from an incomplete texture. This is what Mesa does and the
    resulting rendering is darker than it should be.
    
    It appears that NVIDIA's driver (and possibly AMD's driver) detects this
    case and returns (1,1,1,1) (white) which causes the rendering to appear
    brighter and match the reference image (however, AMD's rendering is
    *much* brighter than NVIDIA's).
    
    If the fallback texture created in \_mesa_get_fallback_texture() is
    initialized to be full white instead of full black the rendering appears
    correct. However, we have no plans to implement this work-around in
    Mesa.
    
    Maya-03 test 2
    ~~~~~~~~~~~~~~
    
    This test makes some unusual calls to glRotate. For example:
    
    .. code-block:: c
    
       glRotate(50, 50, 50, 1);
       glRotate(100, 100, 100, 1);
       glRotate(52, 52, 52, 1);
    
    These unusual values lead to invalid modelview matrices. For example,
    the last glRotate command above produces this matrix with Mesa:
    
    .. math::
    
       \begin{matrix}
       1.08536 \times 10^{24} & 2.55321 \times 10^{-23} & -0.000160389         & 0\\
       5.96937 \times 10^{25} & 1.08536 \times 10^{24}  & 103408               & 0\\
                       103408 & -0.000160389            & 1.74755\times 10^{9} & 0\\
       0                      &                       0 &                      0 & nan
       \end{matrix}
    
    and with NVIDIA's OpenGL:
    
    .. math::
    
       \begin{matrix}
       1.4013 \times 10^{-45} &                      0 &                   -nan & 0\\
                            0 & 1.4013 \times 10^{-45} & 1.4013 \times 10^{-45} & 0\\
       1.4013 \times 10^{-45} &                   -nan & 1.4013 \times 10^{-45} & 0\\
                            0 &                      0 &                      0 & 1.4013 \times 10^{-45}
       \end{matrix}
    
    This causes the object in question to be drawn in a strange orientation
    and with a semi-random color (between white and black) since GL_FOG is
    enabled.
    
    Proe-05 test 1
    ~~~~~~~~~~~~~~
    
    This uses depth testing but there's two problems:
    
    #. The glXChooseFBConfig() call doesn't request a depth buffer
    #. The test never calls glClear(GL_DEPTH_BUFFER_BIT) to initialize the
       depth buffer
    
    If the chosen visual does not have a depth buffer, you'll see the
    wireframe car model but it won't be rendered correctly.
    
    If (by luck) the chosen visual has a depth buffer, its initial contents
    will be undefined so you may or may not see parts of the model.
    
    Interestingly, with NVIDIA's driver most visuals happen to have a depth
    buffer and apparently the contents are initialized to 1.0 by default so
    this test just happens to work with their drivers.
    
    Finally, even if a depth buffer was requested and the
    glClear(GL_COLOR_BUFFER_BIT) calls were changed to
    glClear(GL_COLOR_BUFFER_BIT \| GL_DEPTH_BUFFER_BIT) the problem still
    wouldn't be fixed because GL_DEPTH_WRITEMASK=GL_FALSE when glClear is
    called so clearing the depth buffer would be a no-op anyway.
    
    Proe-05 test 6
    ~~~~~~~~~~~~~~
    
    This test draws an engine model with a two-pass algorithm. The first
    pass is drawn with polygon stipple enabled. The second pass is drawn
    without polygon stipple but with blending and GL_DEPTH_FUNC=GL_LEQUAL.
    If either of the two passes happen to use a software fallback of some
    sort, the Z values of fragments may be different between the two passes.
    This leads to incorrect rendering.
    
    For example, the VMware SVGA Gallium driver uses a special semi-fallback
    path for drawing with polygon stipple. Since the two passes are rendered
    with different vertex transformation implementations, the rendering
    doesn't appear as expected. Setting the SVGA_FORCE_SWTNL environment
    variable to 1 will force the driver to use the software vertex path all
    the time and clears up this issue.
    
    According to the OpenGL invariance rules, there's no guarantee that the
    pixels produced by these two rendering states will match. To achieve
    invariance, both passes should enable polygon stipple and blending with
    appropriate patterns/modes to ensure the same fragments are produced in
    both passes.
    
    Viewperf 12
    -----------
    
    Note that Viewperf 12 only runs on 64-bit Windows 7 or later.
    
    catia-04
    ~~~~~~~~
    
    One of the catia tests calls wglGetProcAddress() to get some
    GL_EXT_direct_state_access functions (such as glBindMultiTextureEXT) and
    some GL_NV_half_float functions (such as glMultiTexCoord3hNV). If the
    extension/function is not supported, wglGetProcAddress() can return
    NULL. Unfortunately, Viewperf doesn't check for null pointers and
    crashes when it later tries to use the pointer.
    
    Another catia test uses OpenGL 3.1's primitive restart feature. But when
    Viewperf creates an OpenGL context, it doesn't request version 3.1 If
    the driver returns version 3.0 or earlier all the calls related to
    primitive restart generate an OpenGL error. Some of the rendering is
    then incorrect.
    
    energy-01
    ~~~~~~~~~
    
    This test creates a 3D luminance texture of size 1K x 1K x 1K. If the
    OpenGL driver/device doesn't support a texture of this size the
    glTexImage3D() call will fail with GL_INVALID_VALUE or GL_OUT_OF_MEMORY
    and all that's rendered is plain white polygons. Ideally, the test would
    use a proxy texture to determine the max 3D texture size. But it does
    not do that.
    
    maya-04
    ~~~~~~~
    
    This test generates many GL_INVALID_OPERATION errors in its calls to
    glUniform(). Causes include:
    
    -  Trying to set float uniforms with glUniformi()
    -  Trying to set float uniforms with glUniform3f()
    -  Trying to set matrix uniforms with glUniform() instead of
       glUniformMatrix().
    
    Apparently, the indexes returned by glGetUniformLocation() were
    hard-coded into the application trace when it was created. Since
    different implementations of glGetUniformLocation() may return different
    values for any given uniform name, subsequent calls to glUniform() will
    be invalid since they refer to the wrong uniform variables. This causes
    many OpenGL errors and leads to incorrect rendering.
    
    medical-01
    ~~~~~~~~~~
    
    This test uses a single GLSL fragment shader which contains a GLSL 1.20
    array initializer statement, but it neglects to specify ``#version 120``
    at the top of the shader code. So, the shader does not compile and all
    that's rendered is plain white polygons.
    
    Also, the test tries to create a very large 3D texture that may exceed
    the device driver's limit. When this happens, the glTexImage3D call
    fails and all that's rendered is a white box.
    
    showcase-01
    ~~~~~~~~~~~
    
    This is actually a DX11 test based on Autodesk's Showcase product. As
    such, it won't run with Mesa.