Commit Graph

213 Commits

Author SHA1 Message Date
Jesse Hall
08d643e5eb EmuGL: Deliver every frame to a callback
To enable multi-touch on a tethered device, allow a callback to be
registered with the OpenGL renderer. On every frame, the framebuffer
is read into system memory and provided to the callback, so it can be
mirrored to the device.

This change is co-dependent on Idae3b026d52ed8dd666cbcdc3f3af80175c90ad3
in external/qemu.

Change-Id: I03c49bc55ed9e66ffb59462333181f77e7e46035
2012-03-22 13:29:00 -07:00
Andrew Hsieh
a3f456f459 Added rules to build 64-bit libraries for 64-bit emulator
All ten libraries can now be built in 64-bit named "lib64*" (*)
in addition to the original 32-bit form named "lib*".

Also, dlopen "lib64*so" in 64-bit.

(*) eg. In Ubuntu, all can be built with the following command:
  make out/host/linux-x86/lib/lib64OpenglRender.so \
       out/host/linux-x86/lib/lib64EGL_translator.so \
       out/host/linux-x86/lib/lib64GLES_CM_translator.so \
       out/host/linux-x86/lib/lib64GLES_V2_translator.so

Rules to build static libraries lib64log.a, lib64cutils.a and lib64utils.a
they depend were added in other CLs.

Change-Id: I3afb64de6dda1d55dbd1b4443d2dbc78a683b19f
2012-03-13 22:40:33 -07:00
Jesse Hall
a308d5ff8e Merge "Add/fix copyright notices" 2012-03-07 07:24:21 -08:00
Jesse Hall
f4a20e58aa Add/fix copyright notices
Several EmuGL files were missing copyright notices; added them. Others
had them but below other code, which makes checking for them more
difficult -- I moved these to the top of the file.

These files were all created by GraphTech as a work for hire for AOSP.

Change-Id: Iee67bcf1c9b54ad5aa8a9288ded0382a974c32cb
2012-03-06 16:13:03 -08:00
Jesse Hall
2478dfd351 Work around a y-invert bug on Macs w/ Intel GPU
On Macs running OS X 10.6 and 10.7 with Intel HD Graphics 3000, some
screens or parts of the screen are displayed upside down. The exact
conditions/sequence that triggers this aren't known yet; I haven't
been able to reproduce it in a standalone test. This also means I
don't know whether it is a driver bug, or a bug in the OpenglRender or
Translator code that just happens to work elsewhere.

Thanks to zhiyuan.li@intel.com for a patch this change is based on.

Change-Id: I04823773818d3b587a6951be48e70b03804b33d0
2012-03-06 16:09:06 -08:00
Jesse Hall
54934b06f1 Delete dead code.
Change-Id: I5b87fac4e2140a903221a1f68b16fa6a96e5effc
2012-03-06 16:09:06 -08:00
Andrew Hsieh
b100b6fd6a Fixed crash and 64-bit porting issues
1. "emugen" generates four *dec.cpp files containing code like this
   to decode offset to pointer in stream

   tmp = *(T *)(ptr + 8 + 4 + 4 + 4 + *(size_t *)(ptr +8 + 4 + 4));

   If *dec.cpp are compiled in 64-bit, size_t is 8-byte and dereferencing of
   it is likley to get wild offset for dereferencing of *(T *) to crash the
   code.  Solution is to define tsize_t for "target size_t" instead
   of using host size_t.

2. Cast pointer to "uintptr_t" instead of "unsigned int" for 2nd param of
   ShareGroup::getGlobalName(NamedObjectType, ObjectLocalName/*64bit*/).
3. Instance of EGLSurface, EGLContext and EGLImageKHR are used as 32-bit
   key for std::map< unsigned int, * > SurfacesHndlMap, ContextsHndlMap,
   and ImagesHndlMap, respectively.  Cast pointer to uintptr_t and assert
   upper 32-bit is zero before passing to map::find().
4. Instance of GLeglImageOES is used to eglAttachEGLImage() which expect
   "unsigned int".  Cast it to uintptr_t and assert upper 32-bit is zero.
5. The 5th param to GLEScontext::setPointer is GLvoid* but contains 32-bit
   offset to vbo if bufferName exists.  Cast it to uintptr_t and assert
   upper 32-bit is zero.
6. Use %zu instead of %d to print size_t
7. Cast pointer to (uintptr_t) in many other places

Change-Id: Iba6e5bda08c43376db5b011e9d781481ee1f5a12
2012-02-29 15:54:06 -08:00
Jesse Hall
ac018fe3f6 EmuGL: refcount ColorBuffers on the host
The gralloc API assumes system-wide reference counting of gralloc
buffers. The host-GL accelerated gralloc maps buffers to host-side
ColorBuffer objects, but was destroying them unconditionally in
gralloc_free(), ignoring any additional references from
gralloc_register_buffer().

This affected the SurfaceTexture gralloc buffers used by the
Browser/WebView. For some reason these buffers are actually allocated
by SurfaceFlinger and passed back to the WebView through Binder. But
since SurfaceFlinger doesn't actually need the buffer for anything,
sometime after the WebView has called gralloc_register_buffer()
SurfaceFlinger calls gralloc_free() on it. This caused the host
ColorBuffer to be destroyed long before the WebView is done using it.

Change-Id: I33dbee887a48a6907041cf19e9f38a1f6c983eff
2012-02-21 11:13:20 -08:00
Jesse Hall
91d4e8e195 GLESv2 translator: don't delete EGLImage textures
Copy changes faaf1553cf and
f37a7ed6c5 from the GLESv1 translator to
the GLESv2 translator. After this, both translators use the same logic
for glEGLImageTargetTexture2DOES().

Change-Id: I0a95bf2301df7b7428abc593f38170edf4cbda30
2012-02-21 11:13:19 -08:00
Jesse Hall
5bad48a65e EmuGL: handle NULL data in glBufferData
The data pointer argument to glBufferData can be NULL; this
[re]allocates the buffer while leaving the contents undefined.

Bug: 5833436

Change-Id: Ia1ddf62e2cd2c59d3d631e01d23d7c557ca5a52e
2012-01-11 15:40:29 -08:00
Jesse Hall
f0baef2fed Merge "EmuGL: misc small cleanups" into ics-mr1 2012-01-09 15:52:15 -08:00
Jesse Hall
a592d9c043 EmuGL: misc small cleanups
* Disable verbose debug spam.
* Add missing GL enum to utility function. The default case was
  returning the correct size, so this doesn't fix any bugs, just
  removes some logcat spam.
* Comment and whitespace corrections.

Change-Id: I83fb8644331ae1072d6a8dae9c041da92073089f
2012-01-05 10:50:01 -08:00
Jesse Hall
a4fb8a60b1 EmuGL: fix GL view position in window on OS X
The code that creates the GL-accelerated screen view wasn't converting
the upper-left-relative coordinates used within the emulator to the
lower-left coordinates used by the Cocoa APIs on OS X. Since most
skins have the screen view centered vertically this often just
happened to work.

Bug: 5782118
Change-Id: I2f96ee181e850df5676d10a82d86c94421149b40
2012-01-04 15:03:39 -08:00
Jesse Hall
f37a7ed6c5 GLES translator: don't delete EGLImage textures
When remapping a GLES texture to a different GL texture in
glEGLImageTargetTexture2DOES(), the GLES texture's previous GL texture was
deleted unconditionally. This is bad when it came from an EGLImage and is
therefore owned by (and will continue to be used by) some other object.

The code now skips deleting the old GL texture if it came from an EGLImage.
This mirrors the logic in glDeleteTextures().

Change-Id: I5b650334a7019d824517c2915b1f23961fbbd809
2011-11-21 13:14:19 -08:00
Jesse Hall
faaf1553cf EmuGL: set texture info from EGLImage
The EGL->GL translator implementation of glEGLImageTargetTexture2DOES was
properly replacing uses of the target texture object with the texture object
associated with the EGLImage in the host GL library, but wasn't updating its
own info about the texture (dimensions, etc.). This broke places where the
translator relied on knowing this, e.g. when implementing the GLES glDrawTexi
call on top of GL glDrawArrays.

Change-Id: Ia4aefd89852a2609221c56da76bfac927464c0b2
2011-11-18 14:11:49 -08:00
David 'Digit' Turner
3abd13d4d6 emulator: opengl: Support named pipes on Win32
This patch adds support for Win32 named pipes for the communication
channel between the Opengl renderer library and its clients.

Named pipes should be much faster than local TCP sockets on this
platform. Note that by default, TCP sockets are still used. The
emulator needs to call setStreamMode(STREAM_MODE_PIPE) to be able
to use these.

Change-Id: I86d36624cf2b7fdd50f41e1e43c908348dca4657
2011-09-13 14:04:49 +02:00
David 'Digit' Turner
3d76ec1e3c emulator: opengl: Add support for unix sockets.
This patch allows the OpenGLES rendering library to use Unix
sockets instead of TCP ones when communicating with its clients.
On certain benchmarks (e.g. 0xBench teapot), this provides a
noticeable improvement (x1.05 fps) without any other changes.

On practice, Unix sockets are faster than TCP sockets, even
local ones. Also, this introduces a moderate amount of
abstraction that will allow us to use Win32 named pipes
on Windows (where TCP sockets are much slower than they
are on Unix).

Note that by default, TCP streams are still used.
The client (emulator) must call the new API 'setStreamMode'
to change it to STREAM_MODE_UNIX between 'initLibrary' and
'startOpenglRenderer' calls.

+ Adjust callers / user appropriately.

Change-Id: I4105bbf07541f3146b50a58d1a5b51e8cf044fab
2011-09-13 14:03:32 +02:00
David 'Digit' Turner
6ba16ba752 Merge "emulator: opengl: add initLibrary function to render library" 2011-08-29 08:01:42 -07:00
David 'Digit' Turner
5d1e8b2f28 emulator: opengl: add initLibrary function to render library
This adds an initLibrary() function to libOpenglRender.

It will be used by the emulator to fallback on software rendering
if the library cannot be initialized properly, e.g. if it is not
possible to load the host EGL/GLES libraries.

Change-Id: I41e8ad73a315166e4a15cbee1db72c2552370f46
2011-08-29 16:57:38 +02:00
David 'Digit' Turner
91572d15eb emulator: opengl: use bilinear filtering
This patch changes the filter used to scale the GL window
in the rendering library. Instead of nearest-neighbour, use
bi-linear, which will provide for much more pleasant results
when scaling the emulator UI window, or toggling to full-screen
mode.

Change-Id: If2d9e1300fa4878c25e1221eaedb565b9150431a
2011-08-26 17:31:58 +02:00
David 'Digit' Turner
20d5b0a857 emulator: oops, really fix the build
Change-Id: Id8de1b6a069cdc462681cf44bf8ebd84bbd1e6f0
2011-08-25 22:14:29 +02:00
David 'Digit' Turner
3f88bea9a8 emulator: opengl: Open libGL.dylib as a framework on Mac
This patch modifies GLDispatch.cpp in the translator libraries
to open the Darwin GL library as a framework. Using a hard-coded
system path prevents the requirement to modify LD_LIBRARY_PATH
or DYLD_LIBRARY_PATH to point to the directory that contains the
library.

In this specific case, this is equivalent to

/System/Frameworks/OpenGL.framework/Libraries/libGL.dylib

But is the "kosher" way to open it the library.

Change-Id: Iccd6568d36fc97200617c268f05d7b4ea85f918e
2011-08-25 14:40:43 +02:00
David 'Digit' Turner
47cbdfb291 emulator: opengl: remove debug traces.
You can still re-enable them by uncommenting one line in
development/tools/emulator/opengl/Android.mk

Change-Id: Ie0a640b6f3359b437aba40b124da0892defb00ef
2011-08-24 16:06:21 +02:00
David 'Digit' Turner
cecb6a0e36 emulator: opengl: Make host decoder libraries static
These libraries are only used by libOpenglRender, so make them
static so that their code is included in this shared library
instead. This reduces the shared library dependencies that
will be required from the emulator.

Change-Id: I24438932f0d6b40852b515140ea6950c04124fdd
2011-08-24 16:06:21 +02:00
David 'Digit' Turner
0008793af3 emulator: opengl: fix Windows build
Change-Id: I6953feee41cb2e27f884629104ff6b3b9cccabbc
2011-08-24 16:00:55 +02:00
Liran
f7e7e467ce opengles emulator- check framebuffer status fix
add drawValidate when calling glCheckFramebufferStatus
in the draw validate, a color attachement will be added to the
framebuffer if there is no target attached to COLOR_ATTACHMENT
of the framebuffer.
opengl does not allow framebuffer with no color attachement
so CheckFramebufferStatus would return INCOMPLETE status.

We already call drawValidate before any draw, the call was
missing at glCheckFramebufferStatus.

Change-Id: I94b930024c3076ac5fe0f8662d11884729c4f953
2011-08-22 14:11:45 +02:00
Guy Zadickario
4629d2412b opengles emulator: fixes flashing effect on Mac
There is a flashing effect we see on Mac when switching between
drawables (pbuffer and a window) on the same context.
This change make the FrameBuffer object in the renderer to use
two different OpenGL contexts, one which is used while the pbuffer
drawable is bound and another which is used when the subwindow is
bounded during swap. The two contexts share textures so both contexts
have access to all allocated color buffers.

While this fixes the flashing effect on Mac, it should be more effective on
other platforms as well.

Change-Id: I63b49f0cdae8e2785765503750bbf5fbd4d963a1
2011-08-18 13:36:38 +03:00
Guy Zadickario
bdf4c1f436 opengles emulator: fixed EGL sharing context
Wrong share group was set up when two user contexts are sharing !
That means that shared context was not really worked before, now it does.

Change-Id: Ia4edbba0441e309902b2c48c44865342410bae3d
2011-08-18 13:36:38 +03:00
Guy Zadickario
b9a5baf42b opengles emulator: code cleanup removing dead code
This change removes the 'blitFromPbuffer' path in the renderer
which uses binding pbuffer to texture. This path does not work
on all platforms and is not relavent any more. It simplifies
a lot the FBConfig filtering code.

Also, added a check to fail the renderer initialization if
the translator plugin does not support EGL_KHR_gl_texture_2d_image
and GL_OES_EGL_IMAGE (by both GLES implementations [1 and 2])
since our implementation requires it.

Change-Id: Ifd4c66943a8da56308cfb7e38914c962b4f5befe
2011-08-16 12:14:02 +03:00
Guy Zadickario
8c962dce6c opengles emulator: replace the readback at end of frame with blit
That replaces the readback to host we do at the end of each frame
with two blits on the GPU, one to copy the pixels into a texture
and another to render the texture to another in order to flip
the image.

Change-Id: I7e0e10493d38944d0b613e245023f34236d3dfc4
2011-08-16 10:52:19 +03:00
Yochai Shefi Simchon
a6b033d19e opengles emulator: do single display connection for all subwindow
This is a workaround to a driver bug on Intel/Linux, when destroying
a subwindow do not close the X display connection, keep it for the
next call to createSubWindow. It happens that the intel/linux driver
caches the display connection for each window ID and use it during
swap or something similar. Using the same display connection for
all subwindows workaround the problem.

Also added a wait loop to wait until the window becomes mapped
instead of just calling XSync after calling XMapWindow. This
is more accurate and make sure we do not miss the first window
refresh.

Change-Id: I63c69d736df433666a8c79d71127afe72776e89f
2011-08-15 19:03:53 +02:00
Yochai Shefi Simchon
2a581c9cb2 EGL translator : fix windows egl for handling device contexts
on eglCreateContext the translator created a window for the
specified config with a matching pixelformat and saved it's
device context for future use.
however when the thread exited the window was destroyed by windows
and the handle saved became invalid.
the next call to wglCreateContext with the handle saved failed.

fixed the problem by creating windows per thread and not in a
global pool.
each thread will create its own window for each config when asked
the window will be destroyed when the thread exits.

Change-Id: I63668a20e8c30c42c4cfcaca664938683600b28e
2011-08-15 19:03:53 +02:00
Guy Zadickario
617416e693 opengles emulator: support display rotation and resize
Changes the render_api to support re-creating the display
sub-window and the ability to rotate the displayed framebuffer
image.
That currently works only when the renderer runs as a thread
and not as seperate process. Therefore we setup the library
to run the renderer as thread(s) inside the calling process
on *all* platforms for now.

Change-Id: Ifd009db903759042a7edcf89866d3c3fe076cae9
2011-08-11 17:36:20 +03:00
Guy Zadickario
9dcac079ce opengles emulator: mac support binding context to pbuffer
On Mac it happens that when a context is bound to a pbuffer
and you want to bind it to a window (NSView) instead you must
release it from the pbuffer before binding the window by calling
clearDrawable handle of NSOpenGLContext.
This change added an override of NSOpenGLContext in order to track
to which drawable type the context was previously bound and
call clearDrawable when necessary.

Change-Id: Iece5ab16a46aa0d107ccb773986a6b280d09d181
2011-08-11 17:36:20 +03:00
Yochai Shefi Simchon
f79a58ed62 opengles emulator: fix shader parser precision qualifiers
Workaround to intel/linux driver issue.

Desktop OpenGL does not support precision qulifiers in shaders,
so we remove them by defining "precision" "mediump" "lowp" and
"highp" to blank.
That translates the line "precision mediump float;" to "float;" which
is a valid command according to the GLSL spec however it fails
to compile using the intel/linux driver.

This change adds a parser which removes completely the
precision command from the shader source.

Change-Id: I29a16bb78ac0000d624aa2f83e93ef5c6ad60345
2011-08-11 17:36:20 +03:00
Guy Zadickario
13b3da879b opengles emulator: added FPS statistics printout
Make the renderer print FPS statistics every 1 second.
Need to set SHOW_FPS_STATS=1

Change-Id: I69e8c43a779e685ae0b34974d1ef33ad75e7a7e4
2011-08-11 17:36:13 +03:00
Amit Feller
bc9d37e3c9 opengles emulator: fix shader/program info log functions
on some platforms info log length of programs and shaders was
not returned correctly, we now cache the info log for these objects
and calculate info log length intenrally to be both correct and
compliant to the spec and conformance tests.

Change-Id: I017932482ba36f9e2e1858fe372683f7ac3a98ca
2011-08-11 17:26:27 +03:00
Yochai Shefi Simchon
97fa8de7a2 opengles emulator: Support current value for attribute 0
In GLES, a vertex shader attribute can be at location 0 and have
a current value. In OpenGL, the spec is not clear, resulting in
absurdities like the ATI driver binding an attribute to location
0, does not give an erro when you set it, but gives an error when
you try to get it back. And it doesn't actually set the value in
the shader.

So, in this patch we:

  1. Track attribute 0 value internally, setting and getting it
     as necessary.

  2. Upon glDrawArrays and glDrawElements, if attribute 0 is not
     "array enabled" (that is, it should use a current value) we
     create a dummy array, fill it with the intended current value,
     and attach and enable it. After the draw, we disable it.

Change-Id: I35f3e8a924e6fba236f4f4d85423b04ae448dad4
2011-08-10 11:00:10 +02:00
Amit Feller
c9d192691e opengles emulator: GLESv2: adding more params validation.
adding more params validations to some GL functions
which the OpenGL layer below us should check , but using Intel
Graphic driver those checks are ignored

Change-Id: I3ca2a891f1d9f988a7b662d6bc32b81e12cc333d
2011-08-10 11:00:10 +02:00
Amit Feller
af777c27ef opengles emulator: check OES_standard_derivatives support
fixin a bug when we declared that our implementation supports
OES_standard_derivatives without checking that the
openGL layer below supports this extention

Change-Id: Ic74f18eb753f0cfe067e23c3bf83905e40b17665
2011-08-10 11:00:10 +02:00
Liran
50c0fb0eff opengles emulator: GLES2 translator / codec
fix glGetAttachedShaders
NULL is allowed in count parameter
fix problem with nvidia driver which returned invalid count

Change-Id: Icfaa5688b04325de2890486eb87b163babaddf30
2011-08-10 10:53:06 +02:00
Liran
0fd3ee21c8 opengles emulator: GLES fix memory leaks
fix some memory leaks and potential risks
detected using valgrind

Change-Id: I0f69cf4d4b4ba5eeb9c735f6712c301bcd4d3d36
2011-08-10 10:53:06 +02:00
Guy Zadickario
f6b9241094 opengles emulator: support glEGLImageTargetRenderbufferStorageOES
needed changes to support glEGLImageTargetRenderbufferStorageOES,
added implementation in egl and added tokens to renderControl.

Also fixed function pointers returned by eglGetProcAddress to
return functions that works independant of the current context,
see system/egl/ClientAPIExts.cpp

That makes the egl_image conformance test to pass on the guest.

Change-Id: I580cda82ba0fb44f12b75aa0bbacf5cd9f15f744
2011-08-10 10:53:06 +02:00
Guy Zadickario
f1d98dd318 opengles emulator: filter-out non-RGB configs
some applications and conformance tests expects to have
non-zero bit counts for all red,green and blue channels.
The translator expose all EGL compliant configs, including
monochrome and RG configs.
We now filter those out and expose to the guest only the RGB
configs.

Change-Id: I9a293675359135a548ce1c089f31a48ea2b7f46e
2011-08-10 10:53:06 +02:00
Yochai Shefi Simchon
29994cba1a opengles emulator: make glFramebufferTexture2D work
The GLES and OpenGL specs for glFramebufferTexture2D are different, which
caused valid GLES calls to fail when moved over to OpenGL. Specifically,
a framebuffer in OpenGL must have a color attachment in order to be valid
for draw, while in GLES it doesn't. So add a validate function, and call
it from each drawing API call.
This patch also contains a workaround for a bug in the ATI driver, where
changing the framebuffer attachments requires a rebind of the framebuffer.

Change-Id: I011fbe0e2b1c66564322268868a24a9d5958a434
2011-08-10 10:43:25 +02:00
Yochai Shefi Simchon
aac306dfbb opengles emulator: Separate FramebufferData to header and source files
Change-Id: I5baefa87fb086d6250c29fa55e58ad129bc8f02a
2011-08-10 10:43:25 +02:00
Yochai Shefi Simchon
14d40b879d opengles emulator: GLESv2: glGetShaderPrecision
to overcome a bug in intel driver which returnes incorrect precision
and range for integers. query the driver for precision format only
for floats. for integers, we return values defined in gles spec.

Change-Id: Idfec2826d811220873c18f301cf4268fc54dabee
2011-08-10 10:41:20 +02:00
Yochai Shefi Simchon
142ed5bf31 opengles emulator: fix initialization of vertex attribute
fix the default values of vertex attrib array to match gles spec
size should be initialized to 4, and type should be initialized to GL_FLOAT

Change-Id: If23b3aec574ca660181be2ef1c91de1de2b07a70
2011-08-10 10:41:20 +02:00
Yochai Shefi Simchon
aaac179eb5 opengles emulator: object name manager name generation
genName in the globalNameSpace now calls the glGen* function of opengl
to generate a global name instead of inventing one.
this is to overcome a bug in intel driver which raises glError when
binding a framebuffer/renderbuffer with a name that was not generated
by opengl.

Change-Id: Ia0c2fefbf3538c185c380ba62d74eb94f2b28254
2011-08-10 10:41:20 +02:00
Guy Zadickario
62c6532937 opengles emulator: handle window surface resize
resize the internal pbuffer we use for a WindowSurface
when a color buffer of different size is attached to the "window".
That fixes "Glyder 2 by glu" application view while loading.

Change-Id: I8f235f428e93077d57bd200f10b45b9a92f1a9d3
2011-08-10 10:13:38 +02:00