diff --git a/tools/emulator/opengl/host/libs/renderControl_dec/Android.mk b/tools/emulator/opengl/host/libs/renderControl_dec/Android.mk new file mode 100644 index 000000000..373d2f437 --- /dev/null +++ b/tools/emulator/opengl/host/libs/renderControl_dec/Android.mk @@ -0,0 +1,36 @@ + +LOCAL_PATH := $(call my-dir) + +### renderControl Decoder ########################################### +include $(CLEAR_VARS) + +emulatorOpengl := $(LOCAL_PATH)/../../.. +EMUGEN := $(BUILD_OUT_EXECUTABLES)/emugen + +LOCAL_IS_HOST_MODULE := true +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_TAGS := debug +LOCAL_MODULE := lib_renderControl_dec +LOCAL_SRC_FILES := +#LOCAL_CFLAGS += -DDEBUG_PRINTOUT -O0 -g +intermediates := $(local-intermediates-dir) + +LOCAL_STATIC_LIBRARIES := \ + libOpenglCodecCommon \ + liblog +LOCAL_C_INCLUDES += $(emulatorOpengl)/shared/OpenglCodecCommon \ + $(emulatorOpengl)/host/include/libOpenglRender \ + $(emulatorOpengl)/system/renderControl_enc + +#we use only *_dec.h as a sentinel for the other generated headers +GEN := $(intermediates)/renderControl_dec.cpp $(intermediates)/renderControl_dec.h +$(GEN): PRIVATE_PATH := $(LOCAL_PATH) +$(GEN): PRIVATE_CUSTOM_TOOL := $(EMUGEN) -D $(intermediates) -i $(emulatorOpengl)/system/renderControl_enc renderControl +$(GEN): $(EMUGEN) \ + $(emulatorOpengl)/system/renderControl_enc/renderControl.attrib \ + $(emulatorOpengl)/system/renderControl_enc/renderControl.in \ + $(emulatorOpengl)/system/renderControl_enc/renderControl.types + $(transform-generated-source) + +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_HOST_SHARED_LIBRARY) diff --git a/tools/emulator/opengl/system/renderControl_enc/Android.mk b/tools/emulator/opengl/system/renderControl_enc/Android.mk new file mode 100644 index 000000000..497ec8157 --- /dev/null +++ b/tools/emulator/opengl/system/renderControl_enc/Android.mk @@ -0,0 +1,38 @@ +LOCAL_PATH := $(call my-dir) + +emulatorOpengl := $(LOCAL_PATH)/../.. +EMUGEN := $(HOST_OUT_EXECUTABLES)/emugen +#### renderControl #### +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := +LOCAL_MODULE_TAGS := debug +LOCAL_MODULE := lib_renderControl_enc +LOCAL_PRELINK_MODULE := false +LOCAL_MODULE_CLASS := SHARED_LIBRARIES + +rc_intermediates := $(local-intermediates-dir) + +LOCAL_C_INCLUDES += $(emulatorOpengl)/shared/OpenglCodecCommon \ + $(emulatorOpengl)/host/include/libOpenglRender + +LOCAL_STATIC_LIBRARIES := \ + libOpenglCodecCommon +LOCAL_SHARED_LIBRARIES := libcutils + +RC_GEN := \ + $(rc_intermediates)/renderControl_enc.cpp \ + $(rc_intermediates)/renderControl_enc.h + +$(RC_GEN) : PRIVATE_PATH = $(LOCAL_PATH) +$(RC_GEN) : PRIVATE_CUSTOM_TOOL := \ + $(EMUGEN) -i $(PRIVATE_PATH) -E $(rc_intermediates) renderControl +$(RC_GEN) : $(EMUGEN) \ + $(LOCAL_PATH)/renderControl.in \ + $(LOCAL_PATH)/renderControl.attrib \ + $(LOCAL_PATH)/renderControl.types + $(transform-generated-source) + +LOCAL_GENERATED_SOURCES += $(RC_GEN) +include $(BUILD_SHARED_LIBRARY) + diff --git a/tools/emulator/opengl/system/renderControl_enc/README b/tools/emulator/opengl/system/renderControl_enc/README new file mode 100644 index 000000000..41bb66969 --- /dev/null +++ b/tools/emulator/opengl/system/renderControl_enc/README @@ -0,0 +1,118 @@ +The renderControl.in file in this directory defines an API which is decoded +on the android guest into a stream and get decoded and executed on the host. +It is used in order to query the host renderer as well as send the host renderer +control commands. + +The following describes each of the entries defined by this renderControl API. + + +GLint rcGetRendererVersion(); + This function queries the host renderer version number. + +EGLint rcGetEGLVersion(EGLint* major, EGLint* minor); + This function queries the host renderer for the EGL version + it supports. returns EGL_FALSE on failure. + +EGLint rcQueryEGLString(EGLenum name, void* buffer, EGLint bufferSize); + This function queries the host for EGL string (.i.e EGL_EXTENSIONS). + if buffer is NULL or the bufferSize is not big enough the return value + is the negative number of bytes required to store the string value + otherwise the string value is copied to buffer and its size is + returned. + +EGLint rcGetNumConfigs(uint32_t* numAttribs); + queries the host for the number of supported EGL configs. + The function returns the number of supported configs and returns in + numAttribs the number of attributes available for each config. + +EGLint rcGetConfigs(uint32_t bufSize, GLuint* buffer); + This function queries the host for the all set of supported configs + with their attribute values. + bufSize is the size of buffer, the size should be at least equal to + (numConfigs + 1) * numAttribs * sizeof(GLuint) + where numConfigs and numAttribs are the values returned in + rcGetNumConfigs. if bufSize is not big enough then the negative number + of required bytes is returned otherwise the function returns the number + of configs and buffer is filled as follows: The first 'numAttribs' + integer values are filled with the EGL enumerant describing a config + attribute, next for each config there are 'numAttribs' integer values + holding the attribute values for that config, the values are specified + in the same order as the attribute vector. + +EGLint rcGetFBParam(EGLint param); + queries the host for framebuffer parameter, see renderControl_types.h + for possible values of 'param'. + +uint32_t rcCreateContext(uint32_t config, uint32_t share, uint32_t glVersion); + This function creates a rendering context on the host and returns its + handle. config is the config index for the context, share is either zero + or a handle to a sharing context. glVersion is either 1 or 2 for GLES1 + or GLES2 context respectively. + + +void rcDestroyContext(uint32_t context); + This function destroys a rendering context on the host. + context is a handle returned in rcCreateContext. + +uint32_t rcCreateWindowSurface(uint32_t config, uint32_t width, uint32_t height); + This function creates a 'window' surface on the host which can be then + bind for rendering through rcMakeCurrent. + The function returns a handle to the created window surface. + +void rcDestroyWindowSurface(uint32_t windowSurface); + This function destoys a window surface. + +uint32_t rcCreateColorBuffer(uint32_t width, uint32_t height, GLenum internalFormat); + This function creates a colorBuffer object on the host which can be then + be specified as a render target for a window surface through + rcSetWindowColorBuffer or to be displayed on the framebuffer window + through rcFBPost. + The function returns a handle to the colorBuffer object. + +void rcDestroyColorBuffer(uint32_t colorbuffer); + destroyes a colorBuffer object. + +void rcSetWindowColorBuffer(uint32_t windowSurface, uint32_t colorBuffer); + This set the target color buffer for a windowSurface, when set the + previous target colorBuffer gets updated before switching to the new + colorBuffer. + +EGLint rcMakeCurrent(uint32_t context, uint32_t drawSurf, uint32_t readSurf); + Binds a windowSurface(s) and current rendering context for the + calling thread. + +void rcFBPost(uint32_t colorBuffer); + This function causes the content of the colorBuffer object to be + displayed on the host framebuffer window. The function returns + immediatly, the buffer will be displayed at the next swap interval. + +void rcFBSetSwapInterval(EGLint interval); + Sets the swap interval for the host framebuffer window. + +void rcBindTexture(uint32_t colorBuffer); + This function instruct the host to bind the content of the specified + colorBuffer to the current binded texture object of the calling thread. + This function should be used to implement eglBindTexImage. + +EGLint rcColorBufferCacheFlush(uint32_t colorbuffer, EGLint postCount, int forRead); + This function returns only after all rendering requests for the specified + colorBuffer rendering target has been processed and after all 'postCount' + posts for the buffer requested previously through rcFBPost has been + processed. + if 'forRead' is not-zero, the function returns positive value in case + there was rendering done to the buffer since the last CacheFlush request + with non-zero 'forRead' value, otherwise the function returns zero or + negative value on failure. + +void rcReadColorBuffer(uint32_t colorbuffer, GLint x, GLint y, + GLint width, GLint height, GLenum format, + GLenum type, void* pixels); + This function queries the host for the pixel content of a colorBuffer's + subregion. It act the same as OpenGL glReadPixels however pixels + are always packed with alignment of 1. + +void rcUpdateColorBuffer(uint32_t colorbuffer, GLint x, GLint y, + GLint width, GLint height, GLenum format, + GLenum type, void* pixels); + Updates the content of a subregion of a colorBuffer object. + pixels are always unpacked with alignment of 1. diff --git a/tools/emulator/opengl/system/renderControl_enc/renderControl.attrib b/tools/emulator/opengl/system/renderControl_enc/renderControl.attrib new file mode 100644 index 000000000..310d3d065 --- /dev/null +++ b/tools/emulator/opengl/system/renderControl_enc/renderControl.attrib @@ -0,0 +1,29 @@ +GLOBAL + base_opcode 10000 + encoder_headers "glUtils.h" + +rcGetEGLVersion + dir major out + len major sizeof(EGLint) + dir minor out + len minor sizeof(EGLint) + +rcQueryEGLString + dir buffer out + len buffer bufferSize + +rcGetNumConfigs + dir numAttribs out + len numAttribs sizeof(uint32_t) + +rcGetConfigs + dir buffer out + len buffer bufSize + +rcReadColorBuffer + dir pixels out + len pixels (((glUtilsPixelBitSize(format, type) * width) >> 3) * height) + +rcUpdateColorBuffer + dir pixels in + len pixels (((glUtilsPixelBitSize(format, type) * width) >> 3) * height) diff --git a/tools/emulator/opengl/system/renderControl_enc/renderControl.in b/tools/emulator/opengl/system/renderControl_enc/renderControl.in new file mode 100644 index 000000000..db23c5b48 --- /dev/null +++ b/tools/emulator/opengl/system/renderControl_enc/renderControl.in @@ -0,0 +1,20 @@ +GL_ENRTY(GLint, rcGetRendererVersion) +GL_ENTRY(EGLint, rcGetEGLVersion, EGLint *major, EGLint *minor) +GL_ENTRY(EGLint, rcQueryEGLString, EGLenum name, void *buffer, EGLint bufferSize) +GL_ENTRY(EGLint, rcGetNumConfigs, uint32_t *numAttribs) +GL_ENTRY(EGLint, rcGetConfigs, uint32_t bufSize, GLuint *buffer) +GL_ENTRY(EGLint, rcGetFBParam, EGLint param) +GL_ENTRY(uint32_t, rcCreateContext, uint32_t config, uint32_t share, uint32_t glVersion) +GL_ENTRY(void, rcDestroyContext, uint32_t context) +GL_ENTRY(uint32_t, rcCreateWindowSurface, uint32_t config, uint32_t width, uint32_t height) +GL_ENTRY(void, rcDestroyWindowSurface, uint32_t windowSurface) +GL_ENTRY(uint32_t, rcCreateColorBuffer, uint32_t width, uint32_t height, GLenum internalFormat) +GL_ENTRY(void, rcDestroyColorBuffer, uint32_t colorbuffer) +GL_ENTRY(void, rcSetWindowColorBuffer, uint32_t windowSurface, uint32_t colorBuffer) +GL_ENTRY(EGLint, rcMakeCurrent, uint32_t context, uint32_t drawSurf, uint32_t readSurf) +GL_ENTRY(void, rcFBPost, uint32_t colorBuffer) +GL_ENTRY(void, rcFBSetSwapInterval, EGLint interval) +GL_ENTRY(void, rcBindTexture, uint32_t colorBuffer) +GL_ENTRY(EGLint, rcColorBufferCacheFlush, uint32_t colorbuffer, EGLint postCount,int forRead) +GL_ENTRY(void, rcReadColorBuffer, uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void *pixels) +GL_ENTRY(void, rcUpdateColorBuffer, uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void *pixels) diff --git a/tools/emulator/opengl/system/renderControl_enc/renderControl.types b/tools/emulator/opengl/system/renderControl_enc/renderControl.types new file mode 100644 index 000000000..a7d96abf8 --- /dev/null +++ b/tools/emulator/opengl/system/renderControl_enc/renderControl.types @@ -0,0 +1,11 @@ +uint32_t 32 0x%08x false +EGLint 32 0x%08x false +GLint 32 0x%08x false +GLuint 32 0x%08x false +GLenum 32 0x%08x false +EGLenum 32 0x%08x false +uint32_t* 32 0x%08x true +EGLint* 32 0x%08x true +GLint* 32 0x%08x true +GLuint* 32 0x%08x true +void* 32 0x%08x true diff --git a/tools/emulator/opengl/system/renderControl_enc/renderControl_types.h b/tools/emulator/opengl/system/renderControl_enc/renderControl_types.h new file mode 100644 index 000000000..cb8e41652 --- /dev/null +++ b/tools/emulator/opengl/system/renderControl_enc/renderControl_types.h @@ -0,0 +1,12 @@ +#include +#include +#include "glUtils.h" + +// values for 'param' argument of rcGetFBParam +#define FB_WIDTH 1 +#define FB_HEIGHT 2 +#define FB_XDPI 3 +#define FB_YDPI 4 +#define FB_FPS 5 +#define FB_MIN_SWAP_INTERVAL 6 +#define FB_MAX_SWAP_INTERVAL 7