[virglrenderer-devel] State on Desktop GL on GLES and possible directions from here

Gert Wollny gert.wollny at collabora.com
Tue Mar 19 09:48:15 UTC 2019


Dear all, 

now that with the latest patches we are actually able to expose GL 4.1
on GLES hosts I thought that it is time to look at the limitations
(apart from our lying about fp64) and consider ways how to deal with
them.

When running piglits, the CTS for OpenGL 3.3, 4.0, and 4.1, and some
applications and games the following limitations came to light:
    
Not supported on GLES: 
 - glPolygonMode, could be emulated but it would need unpacking
   the geometry etc. If a shader program doesn't have a GS shader one 
   could probably do the work there. 
 - glPointSize, could be passed as uniform and assigned to gl_PointSize
 - provoking vertex, it may be possible to handle this in the client 
   by reordering the vertices
 - GL_ARB_seamless_cube_map, could be emulated by a normal 2D texture 
   but this is probably not worth the effort 
 - shadow1DArray lookup with bias is not supported: we emulate 1D
   texture arrays by using 2D texture arrays, and there is no 
   equivalent for float texture(sampler1DArrayShadow, vec3, float)
   with a 2D shadow array sampeler (Maybe 1D texture arrays could be
   emulated by using a 2D texture)
 - nonperspective (linear) interpolation for shader inputs is not 
   supported (one might be able to emulate this by setting z=const 
   in VS, pass the real Z on)
 - transform feedback 3 is not available, so we can only use the 
   default stream (0), 
   * ARB_gpu_shader5 (GL 4.0) requires a minimum of 4 streams 
   * ARB_transform_feedback3 actually allows MAX_VERTEX_STREAMS=1, but
     this must be communicated to the guest (fix: [1,2]).
 - imageLoad and imageStore on the same image work only for r32f,
   r32ui, r32i, all other image types must be declared either as
   readonly or writeonly on GLES.  The result  with the CTS and piglit
   is that tests with rgba32* images fail because the shaders don't
   compile. A possible workaround could be to emulate rgba32* image by
   using r32* images with "width*4" and rewriting the access code, the
   question is whether this is actually worth the effort.
 - LogicOps are not supported, but they can be emulated when 
   EXT_framebuffer_fetch(_non_coherent) is available [3]
 - With ARB_texture_rg tests are failing because it is not supported
   as read-back format (Erik is currently looking into problems with 
   reading back from textures in GLES and is also touching this area)
 - everything involving depth blits with a multisample target seems
   close to impossible to be implemented correctly because it needs
   the GL fallback path and resolving multisample for depth textures
   requires information about how the depth is stored (linear or 
   inverse and in the latter case also zNear and zFar), and  Gallium 
   doesn't provide this information and likely doesn't even have 
   access to it. 
 - gl_ClipVertex is not supported, and the virglrenderer workaround to 
   translate this to gl_ClipDistance doesn't seem to cover what the 
   game "The Talos Principle" is using them for.
 - some applications seem to have a very weird sRGB-linear handling, 
   namely Valve titles like Portal, HL2, and L4D2 all render too dark
   on GLES (but work correctly on GL with [4] applied). It might be 
   possible to fix this by digging even deeper into it, but it seems 
   to be a real time sink, one "fix" I found regresses tests and 
   breaks other applications. On the other  hand, these games are 
   high profile and should probably be fixed somehow.
 - for occlusion query, GL_SAMPLES_PASSED is not supported, it can be 
   faked by using GL_ANY_SAMPLES_PASSED and returning some scaled up 
   value [5], but this value may have to be tuned on a per application 
   basis. 

The last two points raise the question whether it would make sense to
implement some possibility to add application specific tweaks to
virglrenderer. On the guest side we could make use of drirc [6] and
then send this information application dependent to the host as a
string similar to how the debug flags are passed. 

In addition, I wonder whether we should set up some kind of database of
tested applications (similar to winehq)? This could be done either in-
tree, in the wiki, or in another repo were non-developers could also
contribute and it would also give us some more direction in considering
which general workarounds and application dependend tweaks are worth
implementing.

many thanks for your input,
Gert 

[1] h
ttps://gitlab.freedesktop.org/virgl/virglrenderer/merge_requests/188
[2] https://gitlab.freedesktop.org/mesa/mesa/merge_requests/444
[3] 
https://gitlab.freedesktop.org/virgl/virglrenderer/merge_requests/196
[4] 
https://gitlab.freedesktop.org/virgl/virglrenderer/merge_requests/173
[5] 
https://gitlab.freedesktop.org/virgl/virglrenderer/merge_requests/172
[6] https://dri.freedesktop.org/wiki/ConfigurationInfrastructure/



More information about the virglrenderer-devel mailing list