* [Qemu-devel] [PATCH] Experimental patch providing accelerated OpenGL for Linux i386
@ 2007-02-10 13:30 Even Rouault
2007-02-10 23:15 ` Thiemo Seufer
0 siblings, 1 reply; 3+ messages in thread
From: Even Rouault @ 2007-02-10 13:30 UTC (permalink / raw)
To: qemu-devel
Here are some news. Apparently I'm unlucking with posting on this mailing list
since the message and patch I sent last night seems to have landed nowhere. I
have finally dropped the patch and associated comments onto qemu forum, into
the patch section :
http://qemu-forum.ipi.fi/viewtopic.php?t=2984
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] Experimental patch providing accelerated OpenGL for Linux i386
2007-02-10 13:30 [Qemu-devel] [PATCH] Experimental patch providing accelerated OpenGL for Linux i386 Even Rouault
@ 2007-02-10 23:15 ` Thiemo Seufer
0 siblings, 0 replies; 3+ messages in thread
From: Thiemo Seufer @ 2007-02-10 23:15 UTC (permalink / raw)
To: Even Rouault; +Cc: qemu-devel
Even Rouault wrote:
> Here are some news. Apparently I'm unlucking with posting on this mailing list
> since the message and patch I sent last night seems to have landed nowhere. I
> have finally dropped the patch and associated comments onto qemu forum, into
> the patch section :
Most likely due to its size.
> http://qemu-forum.ipi.fi/viewtopic.php?t=2984
Sorry, but that's just too big for me. :-)
Can you split it up in digestible pieces and post them separately?
Thiemo
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Qemu-devel] [PATCH] Experimental patch providing accelerated OpenGL for Linux i386
@ 2007-02-10 0:07 Even Rouault
0 siblings, 0 replies; 3+ messages in thread
From: Even Rouault @ 2007-02-10 0:07 UTC (permalink / raw)
To: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 13413 bytes --]
Hi list !
Here are some news.
----------------------------------------------------------------------------------------------------------
This file is an introduction to a patch trying to provide accelerated OpenGL
to QEMU.
Since the first release of the patch, things have improved a bit but its
status
must always be considered as experimental. There are still really many things
to
do.
Changes/Improvements since first patch
-------------------------------------
* More complete implementation of OpenGL enabling to execute real-life
programs.
* Communication protocol has been rewritten.
* More KQEMU friendly in terms of performances thanks to buffering of non
blocking
calls. Best performance is now achived with KQEMU enabled, which sounds
right,
doesn'it ?
* Code compiles with less warnings and with -O2 flag (though I still hit a GCC
bug that makes necessary this ugly my_strlen function pointer in
helper_opengl.c)
Architecture summary
--------------------
The patch is composed of three parts :
- a patch for QEMU itself that intercepts any call to 'int $0x99' which is the
interface I have chosen to dedicate to communication between guest user
programs and QEMU.
The modification of QEMU existing code is very slight.
This part is not very elegant as Fabrice Bellard noticed it. He proposed an
alternative that sound better, but I certainly lack of time and knowledge
of the related fields to go on that track.
- an OpenGL 'server' receiving OpenGL calls and executing them with the host
GL
library (preferably with accelerated drivers)
- an OpenGL-compliant (well, aiming to be...) library that must be installed
on the
guest virtual machine.
This library implements the OpenGL API and send the calls to the QEMU host.
Currently supported platforms
-----------------------------
For the moment, only GNU/Linux i386 on both host and guest sides.
This limitation is just the current state of the patch.
I'm pretty confident that the code can be adapted to support 32/64 bits
combinations, and maybe cross endianesses with more work and probably reduced
performance.
How to use it ? (ONLY on Linux i386 and with only i386-softmmu as target-list)
---------------
* Apply the patch and recompile QEMU (it applies cleanly on 10 feb 2007 CVS)
* Lauch QEMU with -enable-gl option
* Get the compiled libGL.so from ./i386-softmmu and copy it to the guest OS.
You may need to make a symlink between libGL.so.1 and libGL.so
* In the guest OS : LD_LIBRARY_PATH=/path/to/replacement/libGL.so glxgears
Debugging infrastructure
------------------------
I found very valuable and time-saving to add the two following small
utilities.
* An OpenGL TCP/IP server (opengl_server.c), that has the same
role as QEMU. It works together with the OpenGL client library, recompiled
with
the '#define TCP_COMMUNICATION' macro that replaces the 'int $0x99'
communication by a TCP connection to the server. You can then debug very
easily the pure OpenGL part of the mechanism.
(Please note, the server is actually a poor server since you must kill it each
time one of the client has terminated and it won't work with more than one
client connected at a time).
The server accepts two commandline arguments :
* '-debug' that displays all OpenGL function names that are sent by the
client
* '-save' that saves all the data in the /tmp/debug_gl.bin file
Since a few weeks, I've been working almost 99% of the time only with that
TCP/IP stuff, so QEMU integration is still way behind. I've noticed that
there are crashes when playing with QEMU that are not found when playing with
TCP/IP stuff. So the qemu specific communication protocol may still be buggy.
* An OpenGL player (opengl_player.c). This one plays a file
recorded either by QEMU host side when the environment variable WRITE_GL is
activated on the guest side, either by opengl_server when it's launched with
the argument '-save'. Very useful to replay a sequence that has made crash
the server.
Status of the Open-GL implementation
------------------------------------
Well, quite a few things are implemented, but I can't honestly say if it's
100%
OpenGL 1.0 (I'm pretty sure it's not), 90% OpenGL 1.1, etc... But I consider
that most usefull OpenGL calls are now more or less implemented. There are
still
extensions missing of course. When you run parse_gl_h, you can see the list of
what is missing.
I wouldn't also bet too much on the correctness of what is implemented today.
Indeed, I've implemented the API on a very pragmatic approach, each time it
was required by tested applications.
There are quite many 'shortcuts' in the implementation because
I'm sometimes too lazy too fully implement the whole specification.
The implementation of some OpenGL calls has been specifically tuned to be
non-blocking, since it reduces the number of client/server round-trips and
improves largely performance (the same applies with the KQEMU case). As above,
it has been done only one a case-by-case rational.
(By the way, I'll be very happy if someone could explain me why client/server
round-trips seem to cost a 40ms delay even on the 127.0.0.1 interface...)
Known-to-work (and-not-work) programs
----------------------
(Host computer : Athlon 64 3200+, 512 MB RAM, Ubuntu Edgy 32 bits,
ATI X300 with ATI proprietary drivers
Virtual computer : Fedora Core 5)
* Many programs in 'Mesa-6.5.1/progs/demos' that runs natively on my computer,
that is to say :
- arbfplight 85 fps QEMU/KQEMU , 824 fps native
- arbfslight 100 fps QEMU/KQEMU, 900 fps native
- arbocclude Make QEMU/KQEMU crash, OpenGL server OK (8 fps)
(would require asynchronous glGetQueryObjectivARB
and glGetQueryObjectuivARB for good performance)
- bounce OK
- bufferobj Make QEMU/KQEMU crash, OpenGL server OK
(and it has just corrupted my FC5 image right now... grrr, so the next
tests are just done with the TCP/IP server.)
- clearspd OK
- cubemap KO on host computer ('<glutCreateWindow> called
without
first calling 'glutInit')
- drawpix KO (something wrong with glBitmap implementation)
- engine OK (would require asynchronous glIsEnabled for good
performance)
- fire OK
- fogcoord OK
- fplight KO on host computer('Sorry, this demo requires
GL_NV_vertex_program')
- gamma KO : nothing drawn in the window
- gearbox OK
- gears OK
- geartrain KO on host computer ('<glutCreateWindow> called
without
first calling 'glutInit')
- glinfo OK
- gloss OK
- glslnoise OK (though very poor performance on native hardware,
probably due to a fallback execution of shaders)
- gltestperf KO on host computer ('<glutCreateWindow> called
without
first calling 'glutInit')
- glutfx OK (though fullscreen prevents mouse events to be
sent...)
- ipers OK
- isosurf KO on host computer ('<glutCreateWindow> called
without
first calling 'glutInit')
- loadbias OK
- morph3d OK (would require asynchronous glGenLists for better
performance)
- multiarb OK
- paltex KO on host computer ('Sorry, GL_EXT_paletted_texture
not supported')
- pointblast OK
- ray OK
- readpix OK
- reflect OK
- renormal OK
- shadowtex OK
- singlebuffer OK
- spectex OK
- spriteblast OK
- stex3d OK
- teapot OK
- terrain OK
- tessdemo KO (no handling of several gl contexts)
- texcyl OK
- texdown OK
- texenv OK
- texobj KO (Assertion `glIsTexture(TexObj[0])' failed)
- trispd OK
- tunnel OK
- tunnel2 KO (the two windows are superposed)
- vao_demo KO on host computer ('Sorry, this program requires
GL_APPLE_vertex_array_object')
- winpos KO on host computer ('<glutCreateWindow> called
without
first calling 'glutInit')
(wow, that's the first time I test the whole set of programs. I'm pleased
to see that some of them work without fix or additions to the code ;-))
* fgl_glxgears with and without -fbo. OK in KQEMU/QEMU with very good
performance
Now, funnier stuff :
* ppracer : very good performance in KQEMU/QEMU : 40 FPS
host computer : 60 FPS
* openquartz-glx : good performance with with TCP/IP server.
Doesn't work in KQEMU/QEMU (even with Mesa rendering)
* darkplaces-linux-686-glx (same game as previous one but different 3D engine)
* googleearth : good performance with TCP/IP server. not tried in QEMU
* ww2d : good performance with TCP/IP server. not tried in QEMU
* earth3d : works. performance not very good even on native hardware.
not tried in QEMU
* doom3-demo : good performance with TCP/IP server. not tried in QEMU
* Mandriva 2007 Live CD : didn't manage to make XGL work, but the drak3d
program
seemed to believe that there was real 3D hardware.
TODO LIST (almost all long as first time)
---------
- implement correctly full OpenGL API
- integrate in a better way the window that popups on the guest side with the
main qemu window. I've tried a bit to make OpenGL drawing in the SDL window,
but I didn't come to a satisfactory result. I didn't try very hard though.
There are several challenges to make it work : do proper viewport/matrix
stuff
to draw only on the part of the SDL window that corresponds to the client GL
window, display the mouse pointer, etc...
- integrate it properly into QEMU build system
- fix how the end of the guest process is detected / enable several gl
contexts at the same time / enable several guest OS processes to use OpenGL
at the same time / thread safety of the client library...
- much testing and debugging
- clean the code / code review
- more optimizations to reduce the number of necessary round-trips
- improve the way OpenGL extensions are handled, and do what is necessary to
only require OpenGL 1.0 symbols for host side linking with the host OpenGL
library. (we could also all symbols dynamically).
- make parse_gl_h.c parse mesa headers instead of /usr/include GL headers ??
(this would enable us to have the same generated code and ease binary
compatibility of the communication protocol between hosts. To be clear, if
Alice compiles QEMU on her machine and sends the )
- make it run on x86_64, and allowing any combination guest x86/x86_64 and
host x86/x86_64, other archs. That means a complete scan of the code and
think each time if it's really a int, long, void*, etc etc....
- improve security if possible (preventing malicious guest code from crashing
host qemu)
- port it to other UNIX-like OS with X11
- port it to Windows platform (first OpenGL / WGL, then D3D through Wine
libs ?)
- (make a patch to Valgrind to make it happy with 'int $0x99' when running on
guest side ?)
SECURITY/ROBUSTNESS ISSUES
--------------------------
Security is really a huge challenge. It's really easy for guest code to make
QEMU/OpenGL crash, most of the time due to implementation bugs of mine of
course,
but also because of some "features" (to be polite) of some host OpenGL drivers
themselves... During my repeated tests, I have even managed to make my X
server
crash from time to time.
I don't really see how we can ensure that QEMU won't crash even when we'll
have
corrected most bugs on our side. One way is certainly to execute OpenGL calls
in an external process, like the opengl_server. But in that case, how to do
the
integration in QEMU window ?
FILE LIST
---------
target-i386/
- opengl_client.c : the OpenGL guest library
- helper_opengl.c : decoding of OpenGL calls in QEMU
- opengl_exec.c : execution of OpenGL calls on host/server side
- gl_func.h, server_stub.c, client_stub.c : files generated by parse_gl_h.c
from gl.h parsing
- glgetv_cst.h : file generated by parse_mesa_get_c.c
- gl_func_perso.h, opengl_func.h : hand-written "prototypes"
- opengl_player.c : see above
- opengl_server.c : see above
- mesa_gl.h, mesa_gl_ext.h, mesa_get.c, mesa_enums.c :
directly taken from MESA project and just renamed with mesa_
prefix.
Needed by parse_mesa_get_c
CONTRIBUTING
------------
I hope I've not discouraged people of good will to contribute to. The TODO
list
is certainly a good start. In the short term, for example, I'd appreciate help
for
integration in qemu window.
~~~~~~~~~~~~
Maybe time to stop chating and go back to code or bed... Have fun!
~~~~~~~~~~~~
[-- Attachment #2: qemu_opengl_20070210.patch.tar.bz2 --]
[-- Type: application/x-tbz, Size: 137889 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-02-10 23:25 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-10 13:30 [Qemu-devel] [PATCH] Experimental patch providing accelerated OpenGL for Linux i386 Even Rouault
2007-02-10 23:15 ` Thiemo Seufer
-- strict thread matches above, loose matches on Subject: below --
2007-02-10 0:07 Even Rouault
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.