diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp index f40525d9c..c26fb8d99 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp @@ -17,6 +17,7 @@ #include "GLEScmContext.h" #include "GLEScmUtils.h" #include +#include #include #include #include @@ -285,3 +286,114 @@ void GLEScmContext::initExtensionString() { int GLEScmContext::getMaxTexUnits() { return getCaps()->maxTexUnits; } + +bool GLEScmContext::glGetBooleanv(GLenum pname, GLboolean *params) +{ + GLint iParam; + + if(glGetIntegerv(pname, &iParam)) + { + *params = (iParam != 0); + return true; + } + + return false; +} + +bool GLEScmContext::glGetFixedv(GLenum pname, GLfixed *params) +{ + GLint iParam; + + if(glGetIntegerv(pname, &iParam)) + { + *params = I2X(iParam); + return true; + } + + return false; +} + +bool GLEScmContext::glGetFloatv(GLenum pname, GLfloat *params) +{ + GLint iParam; + + if(glGetIntegerv(pname, &iParam)) + { + *params = (GLfloat)iParam; + return true; + } + + return false; +} + +bool GLEScmContext::glGetIntegerv(GLenum pname, GLint *params) +{ + if(GLEScontext::glGetIntegerv(pname, params)) + return true; + + const GLESpointer* ptr = NULL; + + switch(pname){ + case GL_VERTEX_ARRAY_BUFFER_BINDING: + case GL_VERTEX_ARRAY_SIZE: + case GL_VERTEX_ARRAY_STRIDE: + case GL_VERTEX_ARRAY_TYPE: + ptr = getPointer(GL_VERTEX_ARRAY_POINTER); + break; + + case GL_NORMAL_ARRAY_BUFFER_BINDING: + case GL_NORMAL_ARRAY_STRIDE: + case GL_NORMAL_ARRAY_TYPE: + ptr = getPointer(GL_NORMAL_ARRAY_POINTER); + break; + + case GL_COLOR_ARRAY_BUFFER_BINDING: + case GL_COLOR_ARRAY_SIZE: + case GL_COLOR_ARRAY_STRIDE: + case GL_COLOR_ARRAY_TYPE: + ptr = getPointer(GL_COLOR_ARRAY_POINTER); + break; + + case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING: + case GL_TEXTURE_COORD_ARRAY_SIZE: + case GL_TEXTURE_COORD_ARRAY_STRIDE: + case GL_TEXTURE_COORD_ARRAY_TYPE: + ptr = getPointer(GL_TEXTURE_COORD_ARRAY_POINTER); + break; + + default: + return false; + } + + switch(pname) + { + case GL_VERTEX_ARRAY_BUFFER_BINDING: + case GL_NORMAL_ARRAY_BUFFER_BINDING: + case GL_COLOR_ARRAY_BUFFER_BINDING: + case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING: + *params = ptr ? ptr->getBufferName() : 0; + break; + + case GL_VERTEX_ARRAY_STRIDE: + case GL_NORMAL_ARRAY_STRIDE: + case GL_COLOR_ARRAY_STRIDE: + case GL_TEXTURE_COORD_ARRAY_STRIDE: + *params = ptr ? ptr->getStride() : 0; + break; + + case GL_VERTEX_ARRAY_SIZE: + case GL_COLOR_ARRAY_SIZE: + case GL_TEXTURE_COORD_ARRAY_SIZE: + *params = ptr ? ptr->getSize() : 0; + break; + + case GL_VERTEX_ARRAY_TYPE: + case GL_NORMAL_ARRAY_TYPE: + case GL_COLOR_ARRAY_TYPE: + case GL_TEXTURE_COORD_ARRAY_TYPE: + *params = ptr ? ptr->getType() : 0; + break; + } + + return true; +} diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.h b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.h index 7ba496796..2bc08c0b4 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.h +++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.h @@ -44,6 +44,11 @@ public: virtual const GLESpointer* getPointer(GLenum arrType); int getMaxTexUnits(); + virtual bool glGetIntegerv(GLenum pname, GLint *params); + virtual bool glGetBooleanv(GLenum pname, GLboolean *params); + virtual bool glGetFloatv(GLenum pname, GLfloat *params); + virtual bool glGetFixedv(GLenum pname, GLfixed *params); + ~GLEScmContext(); protected: diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp index 27c9c8cc1..41ad17505 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp @@ -662,6 +662,11 @@ GL_API void GL_APIENTRY glGenTextures( GLsizei n, GLuint *textures) { GL_API void GL_APIENTRY glGetBooleanv( GLenum pname, GLboolean *params) { GET_CTX() + if(ctx->glGetBooleanv(pname, params)) + { + return; + } + GLint i; switch(pname) @@ -734,6 +739,11 @@ GL_API void GL_APIENTRY glGetClipPlanex( GLenum pname, GLfixed eqn[4]) { GL_API void GL_APIENTRY glGetFixedv( GLenum pname, GLfixed *params) { GET_CTX() + if(ctx->glGetFixedv(pname, params)) + { + return; + } + size_t nParams = glParamSize(pname); GLfloat fParams[16]; GLint i; @@ -782,6 +792,11 @@ GL_API void GL_APIENTRY glGetFixedv( GLenum pname, GLfixed *params) { GL_API void GL_APIENTRY glGetFloatv( GLenum pname, GLfloat *params) { GET_CTX() + if(ctx->glGetFloatv(pname, params)) + { + return; + } + GLint i; switch(pname) @@ -819,6 +834,12 @@ GL_API void GL_APIENTRY glGetFloatv( GLenum pname, GLfloat *params) { GL_API void GL_APIENTRY glGetIntegerv( GLenum pname, GLint *params) { GET_CTX() + + if(ctx->glGetIntegerv(pname, params)) + { + return; + } + switch(pname) { case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: @@ -912,7 +933,12 @@ GL_API void GL_APIENTRY glGetPointerv( GLenum pname, void **params) { GET_CTX() const GLESpointer* p = ctx->getPointer(pname); if(p) { - *params = const_cast( p->getArrayData()); + if(p->isVBO()) + { + *params = (void*)(p->getBufferOffset()); + }else{ + *params = const_cast( p->getArrayData()); + } } else { ctx->setGLerror(GL_INVALID_ENUM); } diff --git a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp index 72089d212..51cdc6f5e 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp @@ -163,7 +163,7 @@ const GLvoid* GLEScontext::setPointer(GLenum arrType,GLint size,GLenum type,GLsi if(bufferName) { unsigned int offset = reinterpret_cast(data); GLESbuffer* vbo = static_cast(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr()); - m_map[arrType]->setBuffer(size,type,stride,vbo,offset,normalize); + m_map[arrType]->setBuffer(size,type,stride,vbo,bufferName,offset,normalize); return static_cast(vbo->getData()) + offset; } m_map[arrType]->setArray(size,type,stride,data,normalize); @@ -514,3 +514,60 @@ bool GLEScontext::isTextureUnitEnabled(GLenum unit) { return false; } +bool GLEScontext::glGetBooleanv(GLenum pname, GLboolean *params) +{ + GLint iParam; + + if(glGetIntegerv(pname, &iParam)) + { + *params = (iParam != 0); + return true; + } + + return false; +} + +bool GLEScontext::glGetFixedv(GLenum pname, GLfixed *params) +{ + GLint iParam; + + if(glGetIntegerv(pname, &iParam)) + { + *params = I2X(iParam); + return true; + } + + return false; +} + +bool GLEScontext::glGetFloatv(GLenum pname, GLfloat *params) +{ + GLint iParam; + + if(glGetIntegerv(pname, &iParam)) + { + *params = (GLfloat)iParam; + return true; + } + + return false; +} + +bool GLEScontext::glGetIntegerv(GLenum pname, GLint *params) +{ + switch(pname) + { + case GL_ARRAY_BUFFER_BINDING: + *params = m_arrayBuffer; + break; + + case GL_ELEMENT_ARRAY_BUFFER_BINDING: + *params = m_elementBuffer; + break; + + default: + return false; + } + + return true; +} diff --git a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp index a68f8ad41..b7fe9b002 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp @@ -23,6 +23,7 @@ GLESpointer::GLESpointer():m_size(0), m_normalize(false), m_data(NULL), m_buffer(NULL), + m_bufferName(0), m_buffOffset(0), m_isVBO(false){}; @@ -55,6 +56,10 @@ void GLESpointer::redirectPointerData(){ m_data = getBufferData(); } +GLuint GLESpointer::getBufferName() const { + return m_bufferName; +} + unsigned int GLESpointer::getBufferOffset() const { return m_buffOffset; @@ -82,16 +87,18 @@ void GLESpointer::setArray(GLint size,GLenum type,GLsizei stride,const GLvoid* d m_stride = stride; m_data = data; m_buffer = NULL; + m_bufferName = 0; m_normalize = normalize; m_isVBO = false; } -void GLESpointer::setBuffer(GLint size,GLenum type,GLsizei stride,GLESbuffer* buf,int offset,bool normalize) { +void GLESpointer::setBuffer(GLint size,GLenum type,GLsizei stride,GLESbuffer* buf,GLuint bufferName,int offset,bool normalize) { m_size = size; m_type = type; m_stride = stride; m_data = NULL; m_buffer = buf; + m_bufferName = bufferName; m_buffOffset = offset; m_normalize = normalize; m_isVBO = true; diff --git a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h index 1ed7f2c04..03efdd7aa 100644 --- a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h +++ b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h @@ -134,6 +134,10 @@ public: static int getMaxTexSize(){return s_glSupport.maxTexSize;} static Version glslVersion(){return s_glSupport.glslVersion;} + virtual bool glGetIntegerv(GLenum pname, GLint *params); + virtual bool glGetBooleanv(GLenum pname, GLboolean *params); + virtual bool glGetFloatv(GLenum pname, GLfloat *params); + virtual bool glGetFixedv(GLenum pname, GLfixed *params); protected: virtual bool needConvert(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLESpointer* p,GLenum array_id) = 0; diff --git a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h index 7f3b3969f..b39c1032f 100644 --- a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h +++ b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h @@ -29,13 +29,14 @@ public: GLsizei getStride() const; const GLvoid* getArrayData() const; GLvoid* getBufferData() const; + GLuint getBufferName() const; const GLvoid* getData() const; unsigned int getBufferOffset() const; void redirectPointerData(); void getBufferConversions(const RangeList& rl,RangeList& rlOut); bool bufferNeedConversion(){ return !m_buffer->fullyConverted();} void setArray (GLint size,GLenum type,GLsizei stride,const GLvoid* data,bool normalize = false); - void setBuffer(GLint size,GLenum type,GLsizei stride,GLESbuffer* buf,int offset,bool normalize = false); + void setBuffer(GLint size,GLenum type,GLsizei stride,GLESbuffer* buf,GLuint bufferName,int offset,bool normalize = false); bool isEnable() const; bool isNormalize() const; bool isVBO() const; @@ -49,6 +50,7 @@ private: bool m_normalize; const GLvoid* m_data; GLESbuffer* m_buffer; + GLuint m_bufferName; unsigned int m_buffOffset; bool m_isVBO; };