add gles2 extensions

implement extensions for gles2
add missing entry point for gles1 EGLImage extension

Change-Id: I7cf0118fdf69f3fb2a7023cf97134efd6aabbf59
This commit is contained in:
Liran
2011-05-19 11:42:42 +03:00
committed by Guy Zadikario
parent d94a2efe6a
commit da84d440c6
11 changed files with 124 additions and 9 deletions

View File

@@ -95,13 +95,14 @@ static __translatorMustCastToProperFunctionPointerType getProcAddress(const char
else else
s_glesExtensions->clear(); s_glesExtensions->clear();
(*s_glesExtensions)["glEGLImageTargetTexture2DOES"] = (__translatorMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES; (*s_glesExtensions)["glEGLImageTargetTexture2DOES"] = (__translatorMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES;
(*s_glesExtensions)["glEGLImageTargetRenderbufferStorageOES"]=(__translatorMustCastToProperFunctionPointerType)glEGLImageTargetRenderbufferStorageOES;
(*s_glesExtensions)["glBlendEquationSeparateOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendEquationSeparateOES; (*s_glesExtensions)["glBlendEquationSeparateOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendEquationSeparateOES;
(*s_glesExtensions)["glBlendFuncSeparateOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendFuncSeparateOES; (*s_glesExtensions)["glBlendFuncSeparateOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendFuncSeparateOES;
(*s_glesExtensions)["glBlendEquationOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendEquationOES; (*s_glesExtensions)["glBlendEquationOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendEquationOES;
if (ctx->getCaps()->GL_ARB_MATRIX_PALETTE && ctx->getCaps()->GL_ARB_VERTEX_BLEND) { if (ctx->getCaps()->GL_ARB_MATRIX_PALETTE && ctx->getCaps()->GL_ARB_VERTEX_BLEND) {
(*s_glesExtensions)["glCurrentPaletteMatrixOES"] = (__translatorMustCastToProperFunctionPointerType)glCurrentPaletteMatrixOES; (*s_glesExtensions)["glCurrentPaletteMatrixOES"] = (__translatorMustCastToProperFunctionPointerType)glCurrentPaletteMatrixOES;
(*s_glesExtensions)["glLoadPaletteFromModelViewMatrixOES"] = (__translatorMustCastToProperFunctionPointerType)glLoadPaletteFromModelViewMatrixOES; (*s_glesExtensions)["glLoadPaletteFromModelViewMatrixOES"]=(__translatorMustCastToProperFunctionPointerType)glLoadPaletteFromModelViewMatrixOES;
(*s_glesExtensions)["glMatrixIndexPointerOES"] = (__translatorMustCastToProperFunctionPointerType)glMatrixIndexPointerOES; (*s_glesExtensions)["glMatrixIndexPointerOES"] = (__translatorMustCastToProperFunctionPointerType)glMatrixIndexPointerOES;
(*s_glesExtensions)["glWeightPointerOES"] = (__translatorMustCastToProperFunctionPointerType)glWeightPointerOES; (*s_glesExtensions)["glWeightPointerOES"] = (__translatorMustCastToProperFunctionPointerType)glWeightPointerOES;
} }
@@ -1452,6 +1453,13 @@ GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOE
} }
} }
GL_API void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
{
GET_CTX()
//not supported by EGL
SET_ERROR_IF(false,GL_INVALID_OPERATION);
}
/* GL_OES_blend_subtract*/ /* GL_OES_blend_subtract*/
GL_API void GL_APIENTRY glBlendEquationOES(GLenum mode) { GL_API void GL_APIENTRY glBlendEquationOES(GLenum mode) {
GET_CTX() GET_CTX()

View File

@@ -21,6 +21,7 @@ void GLESv2Context::init() {
if(!m_initialized) { if(!m_initialized) {
s_glDispatch.dispatchFuncs(GLES_2_0); s_glDispatch.dispatchFuncs(GLES_2_0);
initCapsLocked(s_glDispatch.glGetString(GL_EXTENSIONS)); initCapsLocked(s_glDispatch.glGetString(GL_EXTENSIONS));
initExtensionString();
for(int i=0; i < s_glSupport.maxVertexAttribs;i++){ for(int i=0; i < s_glSupport.maxVertexAttribs;i++){
m_map[i] = new GLESpointer(); m_map[i] = new GLESpointer();
@@ -48,3 +49,14 @@ void GLESv2Context::convertArrs(GLESFloatArrays& fArrs,GLint first,GLsizei count
void GLESv2Context::sendArr(GLvoid* arr,GLenum arrayType,GLint size,GLsizei stride,int index) { void GLESv2Context::sendArr(GLvoid* arr,GLenum arrayType,GLint size,GLsizei stride,int index) {
s_glDispatch.glVertexAttribPointer(arrayType,size,GL_FLOAT,GL_FALSE,stride,arr); s_glDispatch.glVertexAttribPointer(arrayType,size,GL_FLOAT,GL_FALSE,stride,arr);
} }
void GLESv2Context::initExtensionString() {
*s_glExtensions = "GL_OES_EGL_image GL_OES_depth24 GL_OES_depth32 GL_OES_element_index_uint "
"GL_OES_standard_derivatives GL_OES_texture_float GL_OES_texture_float_linear ";
if (s_glSupport.GL_ARB_HALF_FLOAT_PIXEL || s_glSupport.GL_NV_HALF_FLOAT)
*s_glExtensions+="GL_OES_texture_half_float GL_OES_texture_half_float_linear ";
if (s_glSupport.GL_NV_PACKED_DEPTH_STENCIL)
*s_glExtensions+="GL_OES_packed_depth_stencil ";
if (s_glSupport.GL_ARB_HALF_FLOAT_VERTEX)
*s_glExtensions+="GL_OES_vertex_half_float ";
}

View File

@@ -30,6 +30,7 @@ public:
void convertArrs(GLESFloatArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct); void convertArrs(GLESFloatArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct);
private: private:
void sendArr(GLvoid* arr,GLenum arrayType,GLint size,GLsizei stride,int pointsIndex = -1); void sendArr(GLvoid* arr,GLenum arrayType,GLint size,GLsizei stride,int pointsIndex = -1);
void initExtensionString();
}; };

View File

@@ -19,6 +19,7 @@
#define GL_APICALL __declspec(dllexport) #define GL_APICALL __declspec(dllexport)
#endif #endif
#define GL_GLEXT_PROTOTYPES
#include <stdio.h> #include <stdio.h>
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#include <GLES2/gl2ext.h> #include <GLES2/gl2ext.h>
@@ -38,6 +39,12 @@ static __translatorMustCastToProperFunctionPointerType getProcAddress(const char
} }
/************************************** GLES EXTENSIONS *********************************************************/
//extentions descriptor
typedef std::map<std::string, __translatorMustCastToProperFunctionPointerType> ProcTableMap;
ProcTableMap *s_glesExtensions = NULL;
/****************************************************************************************************************/
static EGLiface* s_eglIface = NULL; static EGLiface* s_eglIface = NULL;
static GLESiface s_glesIface = { static GLESiface s_glesIface = {
createGLESContext:createGLESContext, createGLESContext:createGLESContext,
@@ -71,7 +78,25 @@ static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp) {
} }
static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName) { static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName) {
return NULL; GET_CTX_RET(NULL)
ctx->getGlobalLock();
static bool proc_table_initialized = false;
if (!proc_table_initialized) {
proc_table_initialized = true;
if (!s_glesExtensions)
s_glesExtensions = new ProcTableMap();
else
s_glesExtensions->clear();
(*s_glesExtensions)["glEGLImageTargetTexture2DOES"] = (__translatorMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES;
(*s_glesExtensions)["glEGLImageTargetRenderbufferStorageOES"]=(__translatorMustCastToProperFunctionPointerType)glEGLImageTargetRenderbufferStorageOES;
}
__translatorMustCastToProperFunctionPointerType ret=NULL;
ProcTableMap::iterator val = s_glesExtensions->find(procName);
if (val!=s_glesExtensions->end())
ret = val->second;
ctx->releaseGlobalLock();
return ret;
} }
GL_APICALL GLESiface* __translator_getIfaces(EGLiface* eglIface){ GL_APICALL GLESiface* __translator_getIfaces(EGLiface* eglIface){
@@ -1011,6 +1036,8 @@ GL_APICALL void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint inte
texData->internalFormat = internalformat; texData->internalFormat = internalformat;
} }
} }
if (type==GL_HALF_FLOAT_OES)
type = GL_HALF_FLOAT_NV;
ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels); ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels);
} }
@@ -1042,6 +1069,8 @@ GL_APICALL void GL_APIENTRY glTexSubImage2D(GLenum target, GLint level, GLint x
GLESv2Validate::pixelFrmt(ctx,format)&& GLESv2Validate::pixelFrmt(ctx,format)&&
GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM); GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM);
SET_ERROR_IF(!GLESv2Validate::pixelOp(format,type),GL_INVALID_OPERATION); SET_ERROR_IF(!GLESv2Validate::pixelOp(format,type),GL_INVALID_OPERATION);
if (type==GL_HALF_FLOAT_OES)
type = GL_HALF_FLOAT_NV;
ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels); ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
@@ -1194,6 +1223,8 @@ GL_APICALL void GL_APIENTRY glVertexAttrib4fv(GLuint indx, const GLfloat* value
GL_APICALL void GL_APIENTRY glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr){ GL_APICALL void GL_APIENTRY glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr){
GET_CTX(); GET_CTX();
if (type==GL_HALF_FLOAT_OES)
type = GL_HALF_FLOAT;
const GLvoid* data = ctx->setPointer(indx,size,type,stride,ptr); const GLvoid* data = ctx->setPointer(indx,size,type,stride,ptr);
if(type != GL_FIXED) ctx->dispatcher().glVertexAttribPointer(indx,size,type,normalized,stride,ptr); if(type != GL_FIXED) ctx->dispatcher().glVertexAttribPointer(indx,size,type,normalized,stride,ptr);
} }
@@ -1202,3 +1233,37 @@ GL_APICALL void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei
GET_CTX(); GET_CTX();
ctx->dispatcher().glViewport(x,y,width,height); ctx->dispatcher().glViewport(x,y,width,height);
} }
GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
{
GET_CTX();
SET_ERROR_IF(!GLESv2Validate::textureTargetLimited(target),GL_INVALID_ENUM);
EglImage *img = s_eglIface->eglAttachEGLImage((unsigned int)image);
if (img) {
// Create the texture object in the underlying EGL implementation,
// flag to the OpenGL layer to skip the image creation and map the
// current binded texture object to the existing global object.
if (thrd->shareGroup.Ptr()) {
unsigned int tex = ctx->getBindedTexture();
unsigned int oldGlobal = thrd->shareGroup->getGlobalName(TEXTURE, tex);
// Delete old texture object
if (oldGlobal) {
ctx->dispatcher().glDeleteTextures(1, &oldGlobal);
}
// replace mapping and bind the new global object
thrd->shareGroup->replaceGlobalName(TEXTURE, tex,img->globalTexName);
ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName);
TextureData *texData = getTextureData();
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
texData->sourceEGLImage = (unsigned int)image;
texData->eglImageDetach = s_eglIface->eglDetachEGLImage;
}
}
}
GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
{
GET_CTX()
//not supported by EGL
SET_ERROR_IF(false,GL_INVALID_OPERATION);
}

View File

@@ -86,7 +86,7 @@ bool GLESv2Validate::hintTargetMode(GLenum target,GLenum mode){
break; break;
default: return false; default: return false;
} }
return target == GL_GENERATE_MIPMAP_HINT; return target == GL_GENERATE_MIPMAP_HINT || target == GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES;
} }
bool GLESv2Validate::capability(GLenum cap){ bool GLESv2Validate::capability(GLenum cap){

View File

@@ -18,6 +18,7 @@
*/ */
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLcommon/GLESvalidate.h> #include <GLcommon/GLESvalidate.h>
struct GLESv2Validate:public GLESvalidate{ struct GLESv2Validate:public GLESvalidate{

View File

@@ -397,6 +397,15 @@ void GLEScontext::initCapsLocked(const GLubyte * extensionString)
if (strstr(cstring,"GL_OES_read_format ")!=NULL) if (strstr(cstring,"GL_OES_read_format ")!=NULL)
s_glSupport.GL_OES_READ_FORMAT = true; s_glSupport.GL_OES_READ_FORMAT = true;
if (strstr(cstring,"GL_ARB_half_float_pixel ")!=NULL)
s_glSupport.GL_ARB_HALF_FLOAT_PIXEL = true;
if (strstr(cstring,"GL_NV_half_float ")!=NULL)
s_glSupport.GL_NV_HALF_FLOAT = true;
if (strstr(cstring,"GL_ARB_half_float_vertex ")!=NULL)
s_glSupport.GL_ARB_HALF_FLOAT_VERTEX = true;
//init extension string //init extension string
s_glExtensions = new std::string(""); s_glExtensions = new std::string("");
} }

View File

@@ -1,6 +1,8 @@
#include<GLcommon/GLESvalidate.h> #include<GLcommon/GLESvalidate.h>
#include<GLES/gl.h> #include<GLES/gl.h>
#include<GLES/glext.h> #include<GLES/glext.h>
#include<GLES2/gl2.h>
#include<GLES2/gl2ext.h>
bool GLESvalidate::textureEnum(GLenum e,unsigned int maxTex) { bool GLESvalidate::textureEnum(GLenum e,unsigned int maxTex) {
@@ -8,15 +10,21 @@ bool GLESvalidate::textureEnum(GLenum e,unsigned int maxTex) {
} }
bool GLESvalidate::pixelType(GLEScontext * ctx, GLenum type) { bool GLESvalidate::pixelType(GLEScontext * ctx, GLenum type) {
if (ctx && ctx->getCaps()->GL_NV_PACKED_DEPTH_STENCIL) { if ((ctx && ctx->getCaps()->GL_NV_PACKED_DEPTH_STENCIL) &&
if (type == GL_UNSIGNED_INT_24_8_OES) (type == GL_UNSIGNED_INT_24_8_OES) )
return true; return true;
}
if (ctx &&
(ctx->getCaps()->GL_ARB_HALF_FLOAT_PIXEL || ctx->getCaps()->GL_NV_HALF_FLOAT) &&
(type == GL_HALF_FLOAT_OES))
return true;
switch(type) { switch(type) {
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1: case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_FLOAT:
return true; return true;
} }
return false; return false;

View File

@@ -26,7 +26,9 @@ struct GLSupport {
GLSupport():maxLights(0),maxVertexAttribs(0),maxClipPlane(0),maxTexUnits(0),maxTexSize(0) , \ GLSupport():maxLights(0),maxVertexAttribs(0),maxClipPlane(0),maxTexUnits(0),maxTexSize(0) , \
GL_EXT_TEXTURE_FORMAT_BGRA8888(false), GL_EXT_FRAMEBUFFER_OBJECT(false), \ GL_EXT_TEXTURE_FORMAT_BGRA8888(false), GL_EXT_FRAMEBUFFER_OBJECT(false), \
GL_ARB_VERTEX_BLEND(false), GL_ARB_MATRIX_PALETTE(false), \ GL_ARB_VERTEX_BLEND(false), GL_ARB_MATRIX_PALETTE(false), \
GL_NV_PACKED_DEPTH_STENCIL(false) , GL_OES_READ_FORMAT(false) {} ; GL_NV_PACKED_DEPTH_STENCIL(false) , GL_OES_READ_FORMAT(false), \
GL_ARB_HALF_FLOAT_PIXEL(false), GL_NV_HALF_FLOAT(false), \
GL_ARB_HALF_FLOAT_VERTEX(false) {} ;
int maxLights; int maxLights;
int maxVertexAttribs; int maxVertexAttribs;
int maxClipPlane; int maxClipPlane;
@@ -38,6 +40,10 @@ struct GLSupport {
bool GL_ARB_MATRIX_PALETTE; bool GL_ARB_MATRIX_PALETTE;
bool GL_NV_PACKED_DEPTH_STENCIL; bool GL_NV_PACKED_DEPTH_STENCIL;
bool GL_OES_READ_FORMAT; bool GL_OES_READ_FORMAT;
bool GL_ARB_HALF_FLOAT_PIXEL;
bool GL_NV_HALF_FLOAT;
bool GL_ARB_HALF_FLOAT_VERTEX;
}; };
struct GLESFloatArrays struct GLESFloatArrays

View File

@@ -23,3 +23,5 @@ typedef double GLdouble; /* double precision float */
#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
#define GL_TRANSFORM_BIT 0x00001000 #define GL_TRANSFORM_BIT 0x00001000
#define GL_INT 0x1404 #define GL_INT 0x1404
#define GL_HALF_FLOAT_NV 0x140B
#define GL_HALF_FLOAT 0x140B

View File

@@ -169,6 +169,7 @@ size_t glUtilsParamSize(GLenum param)
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
case GL_TEXTURE_BINDING_2D: case GL_TEXTURE_BINDING_2D:
case GL_TEXTURE_BINDING_CUBE_MAP: case GL_TEXTURE_BINDING_CUBE_MAP:
case GL_TEXTURE_BINDING_EXTERNAL_OES:
case GL_TEXTURE_COORD_ARRAY: case GL_TEXTURE_COORD_ARRAY:
case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING: case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
case GL_TEXTURE_COORD_ARRAY_SIZE: case GL_TEXTURE_COORD_ARRAY_SIZE:
@@ -244,6 +245,8 @@ size_t glUtilsParamSize(GLenum param)
case GL_MAX_FRAGMENT_UNIFORM_VECTORS: case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
case GL_MAX_RENDERBUFFER_SIZE: case GL_MAX_RENDERBUFFER_SIZE:
case GL_MAX_TEXTURE_IMAGE_UNITS: case GL_MAX_TEXTURE_IMAGE_UNITS:
case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
s = 1; s = 1;
break; break;
case GL_ALIASED_LINE_WIDTH_RANGE: case GL_ALIASED_LINE_WIDTH_RANGE: