Added support for glArrayElement(EXT|) to the immediate mode layer.
Support NUM_EXTENSIONS in glGet(Integer|Float|Double|Boolean|Integer64)v(EXT|)
Added interception for glGetStringi and glGetIntergerv
Improve loading of GLES and EGL libraries on Android
Various bug fixes...
Merged pull requests:
#131 NaCL Pepper now uses GLES2 prefix for ES2.0 functions, rather than gl
#130 Copyright bump to 2014
#129 NaCL-related build tweaks for regaltest, nacl example and pnacl.
#128 GLEW refresh
#126 boost::print fix for mapping 'long' and 'long long' to 32-bit or 64-bit for length purposes
#125 Resolve clang compilation error: lookup of 'Depth' in member access expression is ambiguous
#124 Add Makefile support for gcc-4.4, gcc-4.6 and clang toolchains on Linux.
#116 Make it compile with Visual Studio 2013 (VC12)
771 lines
23 KiB
Python
771 lines
23 KiB
Python
#!/usr/bin/python -B
|
|
|
|
#
|
|
# Filter or remap calls that don't exist for ES 2.0
|
|
#
|
|
# This is the last layer of the emulation dispatch.
|
|
#
|
|
|
|
# TODO List
|
|
#
|
|
# - Partial list of entries not supported for ES 2.0
|
|
# Can we do something more systematic for ES 2.0?
|
|
# Perhaps for the Regal.cpp entry points, rather than
|
|
# enlarging the emulation dispatch layer excessively?
|
|
# Compile-time support for REGAL_SYS_ES2, etc would be
|
|
# helpful too, in a desktop OpenGL situation.
|
|
#
|
|
# - Partial GL_ARB_shader_objects remapping to OpenGL 2.0 / ES
|
|
# Could be extended to a complete GL_ARB_shader_objects emulation layer?
|
|
#
|
|
# - GL_ARB_vertex_program filtering for ES 2.0 isn't complete
|
|
# In addition to matching by entry-point name, could we match
|
|
# according to extension name too?
|
|
|
|
formulae = {
|
|
|
|
# Skip calls that ES 2.0 and/or core do not support
|
|
# Issues: This list is not complete
|
|
|
|
'filterOutES2' : {
|
|
'entries' : [
|
|
'glClientActiveTexture',
|
|
'glGenSamplers', # Sampler object emulation
|
|
'glGetTexImage',
|
|
'glTexImage(1|3)D',
|
|
'glGetTexLevelParameter(f|i)v',
|
|
'glBlitFramebufferANGLE' # Emulate glBlitFramebuffer?
|
|
],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' Warning("Regal does not support ${name} for ES 2.0 - skipping.");',
|
|
' #if REGAL_BREAK',
|
|
' Break::Filter();',
|
|
' #endif',
|
|
' return ${dummyretval};',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'filterOutCore' : {
|
|
'entries' : [ 'glLineWidth', ],
|
|
'impl' : [
|
|
'if (_context->isCore())',
|
|
'{',
|
|
' Warning("Regal does not support ${name} for core profile - skipping.");',
|
|
' #if REGAL_BREAK',
|
|
' Break::Filter();',
|
|
' #endif',
|
|
' return ${dummyretval};',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'filterOutES2AndCore' : {
|
|
'entries' : [
|
|
'glAccum',
|
|
'glBitmap',
|
|
'glCallList',
|
|
'glClearAccum',
|
|
'glCopyPixels',
|
|
'glDeleteLists',
|
|
'glDrawPixels',
|
|
'glEdgeFlag',
|
|
'glEndList',
|
|
'glEvalCoord(1|2)(d|f)(v|)',
|
|
'glEvalMesh(1|2)',
|
|
'glEvalPoint(1|2)',
|
|
'glGenLists',
|
|
'glLineStipple',
|
|
'glMap(1|2)(d|f)',
|
|
'glMapGrid(1|2)(d|f)',
|
|
'glNewList',
|
|
'glPixelStoref',
|
|
'glPixelTransfer(f|i)',
|
|
'glPixelZoom',
|
|
'glRasterPos(2|3|4)(d|f|i|s)(v|)',
|
|
'glRect(d|f|i|s)',
|
|
'glShadeModel',
|
|
'glWindowPos(2|3)(d|f|i|s)(v|)',
|
|
],
|
|
'impl' : [
|
|
'if (_context->isES2() || _context->isCore())',
|
|
'{',
|
|
' Warning("Regal does not support ${name} for core or ES2 profiles - skipping.");',
|
|
' #if REGAL_BREAK',
|
|
' Break::Filter();',
|
|
' #endif',
|
|
' return ${dummyretval};',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
|
|
'filterArgs' : {
|
|
'entries' : [
|
|
'gl(BindTexture)',
|
|
'gl(FramebufferTexture2D)',
|
|
'gl(GenerateMipmap)',
|
|
'gl(Get)(Boolean|Double|Float|Integer|Integer64)v',
|
|
'gl(GetTexParameteriv)',
|
|
'gl(PixelStorei)',
|
|
'gl(PolygonMode)',
|
|
'gl(RenderMode)',
|
|
'gl(TexImage2D)',
|
|
],
|
|
'impl' : [
|
|
'if (_context->filt->${m1}(*_context, ${arg0plus}))',
|
|
'{',
|
|
' #if REGAL_BREAK',
|
|
' Break::Filter();',
|
|
' #endif',
|
|
' return ${dummyretval};',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'texParameter' : {
|
|
'entries' : [
|
|
'glTexParameter(i|f)',
|
|
],
|
|
'impl' : '''
|
|
DispatchTableGL *_next = _context->dispatcher.emulation.next();
|
|
RegalAssert(_next);
|
|
if (_context->filt->TexParameter(*_context, ${arg0}, ${arg1}))
|
|
return;
|
|
GLfloat newparam;
|
|
if (_context->filt->FilterTexParameter(*_context, ${arg0}, ${arg1}, static_cast<GLfloat>(${arg2}), newparam))
|
|
_next->call(&_next->glTexParameterf)(${arg0}, ${arg1}, newparam);
|
|
else
|
|
_next->call(&_next->glTexParameter${m1})(${arg0plus});
|
|
return;'''
|
|
},
|
|
|
|
'texParameterv' : {
|
|
'entries' : [
|
|
'glTexParameter(i|f)v',
|
|
],
|
|
'impl' : '''
|
|
DispatchTableGL *_next = _context->dispatcher.emulation.next();
|
|
RegalAssert(_next);
|
|
if (_context->filt->TexParameter(*_context, ${arg0}, ${arg1}))
|
|
return;
|
|
GLfloat newparam;
|
|
if (${arg2} && _context->filt->FilterTexParameter(*_context, ${arg0}, ${arg1}, static_cast<GLfloat>(${arg2}[0]), newparam))
|
|
_next->call(&_next->glTexParameterf)(${arg0}, ${arg1}, newparam);
|
|
else
|
|
_next->call(&_next->glTexParameter${m1}v)(${arg0plus});
|
|
return;'''
|
|
},
|
|
|
|
# Remap glBlitFramebuffer calls to GL_NV_framebuffer_blit
|
|
# http://www.khronos.org/registry/gles/extensions/NV/GL_NV_framebuffer_blit.txt
|
|
|
|
'blitFBO' : {
|
|
'entries' : [ 'glBlitFramebuffer' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' if (_context->info->gl_nv_framebuffer_blit) return _next->call(&_next->${m0}NV)(${arg0plus});',
|
|
' if (_context->info->gl_ext_framebuffer_blit) return _next->call(&_next->${m0}EXT)(${arg0plus});',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# Filter out glDrawBuffer unless GL_NV_framebuffer_blit
|
|
# or GL_EXT_framebuffer_blit is available
|
|
|
|
'blitDrawRead' : {
|
|
'entries' : [ 'glDrawBuffer' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' if (_context->info->gl_nv_framebuffer_blit || _context->info->gl_ext_framebuffer_blit)',
|
|
' return _next->call(&_next->${m0})(${arg0plus});',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# Convert DrawRangeElements to ES DrawElements, ignoring second and third arguments
|
|
|
|
'glDrawRangeElements' : {
|
|
'entries' : [ 'glDrawRangeElements' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' return _next->call(&_next->glDrawElements)(${arg0}, ${arg3plus});',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# Convert DrawRangeElementsBaseVertex to DrawElements iff baseVertex == 0
|
|
# GL_ARB_draw_elements_base_vertex
|
|
# http://www.opengl.org/registry/specs/ARB/draw_elements_base_vertex.txt
|
|
|
|
'glDrawRangeElementsBaseVertex' : {
|
|
'entries' : [ 'glDrawRangeElementsBaseVertex' ],
|
|
'impl' : [
|
|
'// WAR: Our Tegra driver GL 4 core profile supports DrawRangeElementsBaseVertex but does not',
|
|
'// advertise ARB_draw_elements_base_vertex in the extension list so here we check whether the',
|
|
'// driver has glDrawRangeElementsBaseVertex instead of looking for the extension flag.',
|
|
'// (leaving original line here, just commented out)',
|
|
'// if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_arb_draw_elements_base_vertex)',
|
|
'if (REGAL_FORCE_ES2_PROFILE || !_context->dispatcher.driver.glDrawRangeElementsBaseVertex)',
|
|
'{',
|
|
' if (basevertex==0)',
|
|
' {',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' return _next->call(&_next->glDrawElements)(${arg0}, ${arg3}, ${arg4}, ${arg5});',
|
|
' }',
|
|
' else',
|
|
' {',
|
|
' Warning("Regal does not support ${name} (GL_ARB_draw_elements_base_vertex extension not available) for basevertex!=0 - skipping.");',
|
|
' return;',
|
|
' }',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glDrawBuffers' : {
|
|
'entries' : [ 'glDrawBuffers' ],
|
|
'impl' : [
|
|
'if (_context->filt->DrawBuffers(*_context, ${arg0plus}))',
|
|
'{',
|
|
' #if REGAL_BREAK',
|
|
' Break::Filter();',
|
|
' #endif',
|
|
' return ${dummyretval};',
|
|
'}',
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' if (_context->info->gl_nv_draw_buffers)',
|
|
' {',
|
|
' _next->call(&_next->${name}NV)(${arg0plus});',
|
|
' return;',
|
|
' }',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# http://www.opengl.org/registry/specs/ATI/draw_buffers.txt
|
|
'GL_ATI_draw_buffers' : {
|
|
'entries' : [ 'glDrawBuffersATI' ],
|
|
'impl' : [
|
|
'if (!_context->info->gl_ati_draw_buffers)',
|
|
'{',
|
|
' DispatchTableGL &_table = _context->dispatcher.emulation;',
|
|
' _context->emuLevel++;',
|
|
' _table.call(&_table.glDrawBuffers)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# http://www.opengl.org/registry/specs/ARB/draw_buffers.txt
|
|
'GL_ARB_draw_buffers' : {
|
|
'entries' : [ 'glDrawBuffersARB'],
|
|
'impl' : [
|
|
'if (!_context->info->gl_arb_draw_buffers)',
|
|
'{',
|
|
' DispatchTableGL &_table = _context->dispatcher.emulation;',
|
|
' _context->emuLevel++;',
|
|
' _table.call(&_table.glDrawBuffers)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# http://www.opengl.org/registry/specs/ARB/vertex_program.txt
|
|
# ARB assembly programs not supported or emulated for ES 2.0 (yet)
|
|
|
|
'GL_ARB_vertex_program' : {
|
|
'entries' : [ 'glGenProgramsARB', 'glBindProgramARB', 'glGetProgramivARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' Warning("Regal does not support ${name} (GL_ARB_vertex_program) for ES 2.0 context - skipping.");',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glProgramStringARB' : {
|
|
'entries' : [ 'glProgramStringARB' ],
|
|
'impl' : [
|
|
'// nothing to do if len <= 0 so just return',
|
|
'if (${arg2} <= 0)',
|
|
' return;',
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' Warning("Regal does not support ${name} (GL_ARB_vertex_program) for ES 2.0 context - skipping.");',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# Remap GL_ARB_shader_objects to GL 2.0 API
|
|
# http://www.opengl.org/registry/specs/ARB/shader_objects.txt
|
|
#
|
|
# TODO - Is this complete for GL_ARB_shader_objects API?
|
|
|
|
# 'glCreateShaderObjectARB' : {
|
|
# 'entries' : [ 'glCreateShaderObjectARB' ],
|
|
# 'impl' : [
|
|
# '#if !REGAL_FORCE_ES2_PROFILE',
|
|
# 'if (_context->info->es2)',
|
|
# '#endif',
|
|
# '{',
|
|
# ' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
# ' RegalAssert(_next);',
|
|
# ' return _next->call(&_next->glCreateShader)(${arg0plus});',
|
|
# '}'
|
|
# ]
|
|
# },
|
|
|
|
'glCreateProgramObjectARB' : {
|
|
'entries' : [ 'glCreateProgramObjectARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' return _next->call(&_next->glCreateProgram)(${arg0plus});',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# 'glShaderSourceARB' : {
|
|
# 'entries' : [ 'glShaderSourceARB' ],
|
|
# 'impl' : [
|
|
# '#if !REGAL_FORCE_ES2_PROFILE',
|
|
# 'if (_context->info->es2)',
|
|
# '#endif',
|
|
# '{',
|
|
# ' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
# ' RegalAssert(_next);',
|
|
# ' _next->call(&_next->glShaderSource)(${arg0plus});',
|
|
# ' return;',
|
|
# '}'
|
|
# ]
|
|
# },
|
|
|
|
'glCompileShaderARB' : {
|
|
'entries' : [ 'glCompileShaderARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glCompileShader)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glActiveTextureARB' : {
|
|
'entries' : [ 'glActiveTextureARB' ],
|
|
'impl' : [
|
|
'if (!_context->info->gl_arb_multitexture)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glActiveTexture)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glClientActiveTextureARB' : {
|
|
'entries' : [ 'glClientActiveTextureARB' ],
|
|
'impl' : [
|
|
'if (!_context->info->gl_arb_multitexture)',
|
|
'{',
|
|
' DispatchTableGL &_table = _context->dispatcher.emulation;',
|
|
' _context->emuLevel++;',
|
|
' _table.call(&_table.glClientActiveTexture)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glAttachObjectARB' : {
|
|
'entries' : [ 'glAttachObjectARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glAttachShader)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glBindAttribLocationARB' : {
|
|
'entries' : [ 'glBindAttribLocationARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glBindAttribLocation)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glGetUniformLocationARB' : {
|
|
'entries' : [ 'glGetUniformLocationARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' return _next->call(&_next->glGetUniformLocation)(${arg0plus});',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glUniform1iARB' : {
|
|
'entries' : [ 'glUniform1iARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glUniform1i)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glGetObjectParameterivARB' : {
|
|
'entries' : [ 'glGetObjectParameterivARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' if (_next->call(&_next->glIsProgram)(obj))',
|
|
' _next->call(&_next->glGetProgramiv)(${arg0plus});',
|
|
' else',
|
|
' _next->call(&_next->glGetShaderiv)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glGetInfoLogARB' : {
|
|
'entries' : [ 'glGetInfoLogARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2() || !_context->info->gl_arb_shader_objects)',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' if (_next->call(&_next->glIsProgram)(obj))',
|
|
' _next->call(&_next->glGetProgramInfoLog)(${arg0plus});',
|
|
' else',
|
|
' _next->call(&_next->glGetShaderInfoLog)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# Remap glBlendEquationEXT for ES 2.0
|
|
|
|
'glBlendEquationEXT' : {
|
|
'entries' : [ 'glBlendEquationEXT' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glBlendEquation)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# Remap glBlendColorEXT for ES 2.0
|
|
|
|
'glBlendColorEXT' : {
|
|
'entries' : [ 'glBlendColorEXT' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glBlendColor)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt
|
|
# Map to GL_OES_mapbuffer for ES 2.0
|
|
|
|
'MapUnmap' : {
|
|
'entries' : [ 'gl(Map|Unmap)Buffer(ARB|)' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' return _next->call(&_next->gl${m1}BufferOES)(${arg0plus});',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glBufferDataARB' : {
|
|
'entries' : [ 'glBufferDataARB' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glBufferData)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# http://www.opengl.org/registry/specs/ARB/framebuffer_object.txt
|
|
# Force target = GL_FRAMEBUFFER for ES 2.0
|
|
|
|
'glBindFramebuffer' : {
|
|
'entries' : [ 'glBindFramebuffer','glBindFramebufferOES' ],
|
|
'impl' : [
|
|
'if (_context->isES2())',
|
|
'{',
|
|
' const bool hasFBBlit = _context->info->gl_ext_framebuffer_blit || _context->info->gl_nv_framebuffer_blit || _context->info->gl_version_major >= 3;',
|
|
' if (!hasFBBlit && (target==GL_DRAW_FRAMEBUFFER || target==GL_READ_FRAMEBUFFER)) target = GL_FRAMEBUFFER;',
|
|
'}',
|
|
'if (_context->filt->BindFramebuffer(*_context, ${arg0plus}))',
|
|
'{',
|
|
' #if REGAL_BREAK',
|
|
' Break::Filter();',
|
|
' #endif',
|
|
' return ${dummyretval};',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# Check for unsupported GL_COLOR_ATTACHMENT1+ on ES 2.0
|
|
|
|
'framebuffer_object_attachment' : {
|
|
'entries' : [ 'glFramebuffer(Texture1D|Texture3D|Renderbuffer)' ],
|
|
'impl' : [
|
|
'DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
'RegalAssert(_next);',
|
|
'if (_context->filt->FramebufferAttachmentSupported(*_context, ${arg1}))',
|
|
' _next->call(&_next->glFramebuffer${m1})(${arg0plus});',
|
|
'return;'
|
|
]
|
|
},
|
|
|
|
# Check for unsupported GL_COLOR_ATTACHMENT1+ on ES 2.0
|
|
# FIXME - also filter out FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET?
|
|
|
|
'glGetFramebufferAttachmentParameteriv' : {
|
|
'entries' : [ 'glGetFramebufferAttachmentParameteriv' ],
|
|
'impl' : [
|
|
'DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
'RegalAssert(_next);',
|
|
'if (!_context->filt->FramebufferAttachmentSupported(*_context, ${arg1}))',
|
|
' *${arg3} = 0;',
|
|
'else',
|
|
' _next->call(&_next->glGetFramebufferAttachmentParameteriv)(${arg0plus});',
|
|
'return;'
|
|
]
|
|
},
|
|
|
|
# http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt
|
|
#
|
|
# Note we deliberately call the target (non-extension) functions at the same
|
|
# emulation level so that we can do any necessary parameter filtering in
|
|
# fewer places.
|
|
|
|
'EXT_framebuffer_object' : {
|
|
'entries' : [ 'gl(BindRenderbuffer|DeleteRenderbuffers|GenRenderbuffers)EXT',
|
|
'gl(GetRenderbufferParameteriv|RenderbufferStorage)EXT',
|
|
'gl(DeleteFramebuffers|GenFramebuffers|BindFramebuffer)EXT',
|
|
'gl(GenerateMipmap|GetFramebufferAttachmentParameteriv)EXT',
|
|
'gl(FramebufferTexture1D|FramebufferTexture2D|FramebufferTexture3D)EXT',
|
|
'gl(FramebufferRenderbuffer)EXT'
|
|
],
|
|
'impl' : [
|
|
'if (!_context->info->gl_ext_framebuffer_object)',
|
|
'{',
|
|
' DispatchTableGL &_table = _context->dispatcher.emulation;',
|
|
' _context->emuLevel++;',
|
|
' _table.call(&_table.gl${m1})(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'EXT_framebuffer_object_returning' : {
|
|
'entries' : [ 'gl(CheckFramebufferStatus|IsFramebuffer|IsRenderbuffer)EXT' ],
|
|
'impl' : [
|
|
'if (!_context->info->gl_ext_framebuffer_object)',
|
|
'{',
|
|
' DispatchTableGL &_table = _context->dispatcher.emulation;',
|
|
' _context->emuLevel++;',
|
|
' return _table.call(&_table.gl${m1})(${arg0plus});',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# http://www.opengl.org/registry/specs/EXT/framebuffer_blit.txt
|
|
|
|
'glBlitFramebufferEXT' : {
|
|
'entries' : [ 'glBlitFramebufferEXT' ],
|
|
'impl' : [
|
|
'if (!_context->info->gl_ext_framebuffer_blit)',
|
|
'{',
|
|
' DispatchTableGL &_table = _context->dispatcher.emulation;',
|
|
' _context->emuLevel++;',
|
|
' _table.call(&_table.glBlitFramebuffer)(${arg0plus});',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
# glReadBuffer
|
|
|
|
'glReadBuffer' : {
|
|
'entries' : [ 'glReadBuffer' ],
|
|
'impl' : [
|
|
'DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
'RegalAssert(_next);',
|
|
'if (_context->filt->ReadBuffer(*_context, ${arg0plus}))',
|
|
'{',
|
|
' #if REGAL_BREAK',
|
|
' Break::Filter();',
|
|
' #endif',
|
|
' return ${dummyretval};',
|
|
'}',
|
|
'if (_context->isES2() && _context->info->gl_nv_read_buffer)',
|
|
' _next->call(&_next->glReadBufferNV)(${arg0plus});',
|
|
'else',
|
|
' _next->call(&_next->glReadBuffer)(${arg0plus});',
|
|
'return;'
|
|
]
|
|
},
|
|
|
|
|
|
|
|
#
|
|
# http://www.opengl.org/registry/specs/ARB/draw_buffers.txt
|
|
# http://www.opengl.org/registry/specs/EXT/draw_buffers2.txt
|
|
#
|
|
# Without MRT, limit calls to DRAW_BUFFER0_ARB for ES 2.0
|
|
#
|
|
|
|
'glColorMaskIndexedEXT' : {
|
|
'entries' : [ 'glColorMaskIndexedEXT' ],
|
|
'impl' : [
|
|
'if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_ext_draw_buffers2)',
|
|
'{',
|
|
' if (!buf)'
|
|
' {',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glColorMask)(${arg1plus});',
|
|
' }',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glGetBooleanIndexedvEXT' : {
|
|
'entries' : [ 'glGetBooleanIndexedvEXT' ],
|
|
'impl' : [
|
|
'if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_ext_draw_buffers2)',
|
|
'{',
|
|
' if (!index)'
|
|
' {',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glGetBooleanv)(${arg0},${arg2});',
|
|
' }',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glGetIntegerIndexedvEXT' : {
|
|
'entries' : [ 'glGetIntegerIndexedvEXT' ],
|
|
'impl' : [
|
|
'if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_ext_draw_buffers2)',
|
|
'{',
|
|
' if (!index)'
|
|
' {',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glGetIntegerv)(${arg0},${arg2});',
|
|
' }',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glEnableIndexedEXT' : {
|
|
'entries' : [ 'glEnableIndexedEXT' ],
|
|
'impl' : [
|
|
'if (${arg0}==GL_BLEND && (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_ext_draw_buffers2))',
|
|
'{',
|
|
' if (!index)'
|
|
' {',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glEnable)(${arg0});',
|
|
' }',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glDisableIndexedEXT' : {
|
|
'entries' : [ 'glDisableIndexedEXT' ],
|
|
'impl' : [
|
|
'if (${arg0}==GL_BLEND && (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_ext_draw_buffers2))',
|
|
'{',
|
|
' if (!index)'
|
|
' {',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' _next->call(&_next->glDisable)(${arg0});',
|
|
' }',
|
|
' return;',
|
|
'}'
|
|
]
|
|
},
|
|
|
|
'glIsEnabledIndexedEXT' : {
|
|
'entries' : [ 'glIsEnabledIndexedEXT' ],
|
|
'impl' : [
|
|
'if (${arg0}==GL_BLEND && !_context->info->gl_ext_draw_buffers2)',
|
|
'{',
|
|
' if (!index)'
|
|
' {',
|
|
' DispatchTableGL *_next = _context->dispatcher.emulation.next();',
|
|
' RegalAssert(_next);',
|
|
' return _next->call(&_next->glIsEnabled)(${arg0});',
|
|
' }',
|
|
' return GL_FALSE;',
|
|
'}'
|
|
]
|
|
}
|
|
|
|
}
|