This directory contains the host-side modules related to hardware OpenGL ES
emulation. The guest-side modules are in
$ANDROID_BUILD_TOP/device/generic/goldfish/opengl

I. Overview of components:
==========================

The 'emugen' tool is used to generate several source files related to the
EGL/GLES command stream used between the guest and the host during emulation.

  host/tools/emugen   -> emugen program

Note that emugen is capable of generating, from a single set of specification
files, three types of auto-generated sources:

  - sources to encode commands into a byte stream.
  - sources to decode the byte stream into commands.
  - sources to wrap normal procedural EGL/GLES calls into context-aware ones.

Modules under the system/ directory corresponds to code that runs on the
guest, and implement the marshalling of EGL/GLES commands into a stream of
bytes sent to the host through a fast pipe mechanism.

   system/GLESv1_enc        -> encoder for GLES 1.1 commands
   system/GLESv2_enc        -> encoder for GLES 2.0 commands
   system/renderControl_enc -> encoder for rendering control commands
   system/egl               -> emulator-specific guest EGL library
   system/GLESv1            -> emulator-specific guest GLES 1.1 library
   system/gralloc           -> emulator-specific gralloc module
   system/OpenglSystemCommon -> library of common routines

Modules under the host/ directory corresponds to code that runs on the
host, and implement the decoding of the command stream, translation of
EGL/GLES commands into desktop GL 2.0 ones, and rendering to an off-screen
buffer.

  host/libs/GLESv1_dec        -> decoder for GLES 1.1 commands
  host/libs/GLESv2_dec        -> decoder for GLES 2.0 commands
  host/libs/renderControl_dec -> decoder for rendering control commands

  host/libs/Translator/EGL    -> translator for EGL commands
  host/libs/Translator/GLES_CM -> translator for GLES 1.1 commands
  host/libs/Translator/GLES_V2 -> translator for GLES 2.0 commands
  host/libs/Translator/GLcommon -> library of common translation routines

  host/libs/libOpenglRender -> rendering library (uses all host libs above)
                               can be used by the 'renderer' program below,
                               or directly linked into the emulator UI program.

  host/renderer/ -> stand-alone renderer program executable.
                    this can run in head-less mode and receive requests from
                    several emulators at the same time. It is the receiving
                    end of all command streams.

Modules under the test/ directory correspond to test programs that are useful
to debug the various modules described above:

  tests/EGL_host_wrapper  -> a small library used to dynamically load the
                             desktop libEGL.so or a replacement named by the
                             ANDROID_EGL_LIB environment variable. This lib
                             provides all EGL entry points.

  tests/emulator_test_renderer -> a small program to run the rendering library
                                  in a single SDL window on the host desktop.

  tests/gles_android_wrapper -> guest EGL / GLES libraries that are run on
                                the device to run some tests. Replace the
                                system/egl and system/GLESv1 modules for now.

  tests/translator_tests/GLES_CM -> desktop GLESv1 translation unit test
  tests/translator_tests/GLES_V2 -> desktop GLESv2 translation unit test
  tests/translator_tests/MacCommon -> used by translation tests on Mac only.

  tests/ut_rendercontrol_enc -> guest library used by tests/ut_renderer
  tests/ut_rendercontrol_dec -> host library used by tests/ut_renderer
  tests/ut_renderer          -> unit-test for render control and rendering library.

                                
II. Build system considerations:
--------------------------------

The dependencies on the more than 20 components described in the previous
section are pretty sophisticated, involving lots of auto-generated code and
non-trivial placement for guest/device libraries.

To simplify the development and maintenance of these modules, a set of
helper GNU Make function is defined in common.mk, and included from the
Android.mk in this directory.

These functions all begin with the "emugl-" prefix, and can be used to
declare modules, what information they export to other modules, or import
from them, and also what kind of auto-generated sources they depend on.

Look at the comments inside common.mk and the Android.mk of the modules
to better understand what's happening.

