From d18e93ba4c71285c0715c0473d6d1c9ab63bb9e0 Mon Sep 17 00:00:00 2001 From: Yochai Shefi Simchon Date: Wed, 15 Jun 2011 17:05:16 +0300 Subject: [PATCH] Translator 1.1 conformance: fix ARRAY related gets There is a set of glGets which query the client state of the binded arrays. The data exists in the translator context and is not passed to GL, so the glGets should be handled internaly. This is done by implementing four glGet*v methods in GLEScontext, which return a boolean value indicating whether we have set the return value or not, and are called by the glGet*v functions in GLEScmImp. Two of the glGets are handled by GLEScontext, and the other 15 by GLEScmContext since they are specific to GLES 1.1. The same should be done for 2.0 specific glGets in a later patch. Also. bufferName is now saved in GLESPointer in to allow the GL_*_ARRAY_BUFFER_BINDING get. --- .../libs/Translator/GLES_CM/GLEScmContext.cpp | 112 ++++++++++++++++++ .../libs/Translator/GLES_CM/GLEScmContext.h | 5 + .../libs/Translator/GLES_CM/GLEScmImp.cpp | 28 ++++- .../libs/Translator/GLcommon/GLEScontext.cpp | 59 ++++++++- .../libs/Translator/GLcommon/GLESpointer.cpp | 9 +- .../Translator/include/GLcommon/GLEScontext.h | 4 + .../Translator/include/GLcommon/GLESpointer.h | 4 +- 7 files changed, 217 insertions(+), 4 deletions(-) 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; };