void Filt::TexParameter(const RegalContext &ctx, GLenum target, GLenum pname, GLfloat param) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); UNUSED_PARAMETER(pname); UNUSED_PARAMETER(param); #if REGAL_SYS_ES2 || REGAL_SYS_GL if (ctx.isCore() || ctx.isES2()) switch(pname) { case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_WRAP_R: switch(int(param)) { case GL_CLAMP: Warning("Regal does not support GL_CLAMP wrap mode for core or ES 2.0 profiles - skipping."); filtered = true; default: break; } default: break; } #endif }
void Init::shareContext(RegalSystemContext a, RegalSystemContext b) { init(); RegalContext *contextA = getContext(a); RegalContext *contextB = getContext(b); RegalAssert(contextA); RegalAssert(contextB); // Either of the groups of contexts needs to be uninitialized. // In principle Regal might be able to merge the shared // containers together, but that's not currently implemented. if (contextA->groupInitializedContext() && contextB->groupInitializedContext()) { Warning("Regal can't share initialized context groups."); RegalAssert(false); return; } // Share all the Regal contexts in b into a std::list<RegalContext *> tmp = *contextB->shareGroup; for (std::list<RegalContext *>::iterator i = tmp.begin(); i!=tmp.end(); ++i) { RegalAssert(*i); contextA->shareGroup->push_back(*i); (*i)->shareGroup = contextA->shareGroup; } }
void Init::destroyContext(RegalSystemContext sysCtx) { if (_init && sysCtx) { RegalContext *context = getContext(sysCtx); if (context) { RegalAssert(context->sysCtx==sysCtx); Thread::ScopedLock thLock(th2rcMutex); Thread::ScopedLock scLock(sc2rcMutex); th2rc.erase(context->thread); sc2rc.erase(sysCtx); // TODO - clear TLS for other threads too? if (context==Thread::CurrentContext()) { context->Cleanup(); setContextTLS(NULL); } delete context; } } }
bool Filt::FilterTexParameter(const RegalContext &ctx, GLenum target, GLenum pname, GLfloat param, GLfloat &newParam) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); if (!ctx.isES2() && !ctx.isCore()) return false; switch (pname) { case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_WRAP_R: switch (int(param)) { case GL_CLAMP: Warning("Regal does not support GL_CLAMP wrap mode for core or ES 2.0 profiles - remapping to equivalent GL_CLAMP_TO_EDGE"); newParam = GL_CLAMP_TO_EDGE; return true; default: break; } default: break; } return false; }
void Filt::PolygonMode(const RegalContext &ctx, GLenum face, GLenum mode) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(face); UNUSED_PARAMETER(mode); #if REGAL_SYS_GL if (ctx.isCore()) { if (face!=GL_FRONT_AND_BACK) { Warning("Regal does not support ", GLenumToString(face), " in glPolygonMode for core profile, only GL_FRONT_AND_BACK is supported - skipping."); filtered = true; } } #endif #if REGAL_SYS_ES2 if (ctx.isES2()) { Warning("Regal does not support glPolygonMode for ES 2.0 - skipping."); filtered = true; } #endif }
void Filt::RenderMode(const RegalContext &ctx, GLenum mode) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(mode); #if REGAL_SYS_ES2 || REGAL_SYS_GL if (ctx.isCore() || ctx.isES2()) if (mode!=GL_RENDER) { Warning("Regal does not support ", GLenumToString(mode), " render mode for core or ES 2.0 profiles, only GL_RENDER is supported in those profiles - skipping."); filtered = true; } #endif }
bool Filt::RenderMode(const RegalContext &ctx, GLenum mode) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(mode); if (ctx.isCore() || ctx.isES2()) if (mode!=GL_RENDER) { Warning("Regal does not support ", GLenumToString(mode), " render mode for core or ES 2.0 profiles, only GL_RENDER is supported in those profiles - skipping."); return true; } return false; }
bool Filt::TexImage2D(const RegalContext &ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); UNUSED_PARAMETER(level); UNUSED_PARAMETER(internalformat); UNUSED_PARAMETER(width); UNUSED_PARAMETER(height); UNUSED_PARAMETER(border); UNUSED_PARAMETER(format); UNUSED_PARAMETER(type); UNUSED_PARAMETER(data); if (ctx.isES2()) { switch ( target ) { case GL_PROXY_TEXTURE_CUBE_MAP: Warning( "Regal does not support PROXY_TEXTURE_CUBE_MAP as target for TexImage2D for ES 2.0 profile" ); return true; default: break; } } return false; }
bool Filt::GenerateMipmap(const RegalContext &ctx, GLenum target) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); if (!ctx.isES2()) return false; switch (target) { case GL_TEXTURE_2D: case GL_TEXTURE_CUBE_MAP: break; case GL_TEXTURE_2D_ARRAY: if (!ctx.info->gl_nv_texture_array) { Warning("glGenerateMipmap(GL_TEXTURE_2D_ARRAY) not supported for ES 2.0 without NV_texture_array."); return true; } break; default: Warning("glGenerateMipmap(", GLenumToString(target), ") not supported for ES 2.0."); return true; } return false; }
void TexC::Init( RegalContext& ctx ) { RegalContext* sharingWith = ctx.groupInitializedContext(); if ( sharingWith != NULL ) { mapTextureToTextureState = sharingWith->texc->mapTextureToTextureState; } Reset_(); }
Init::makeCurrent(RegalSystemContext sysCtx) #endif { init(); Internal("Init::makeCurrent","thread=",::boost::print::hex(Thread::threadId())," sysCtx=",sysCtx); if (sysCtx) { RegalContext *context = getContext(sysCtx); RegalAssert(context); // Do RegalContext initialization, if necessary. if (!context->initialized) { // Set regal context TLS for initialization purposes // This is needed for Thread::CurrentContext on Mac OSX setContextTLS(context); #if REGAL_SYS_PPAPI context->ppapiResource = sysCtx; context->ppapiES2 = interface; #endif // RegalContextInfo init makes GL calls, need an // active OpenGL context. context->Init(); RegalAssert(context->initialized); } setContext(context); return; } setContext(NULL); setContextTLS(NULL); // Need to do this in addition to setContext? }
bool Filt::ReadBuffer(const RegalContext &ctx, GLenum src) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(src); if (!ctx.isES2() || !ctx.info->gl_nv_read_buffer) return false; switch (src) { // These two should always be supported w/o additional extensions case GL_COLOR_ATTACHMENT0: case GL_BACK: break; // GL_FRONT may require NV_read_buffer_front, depending whether the context is // double buffered. Let's output a warning but still pass it through case GL_FRONT: if (!ctx.info->gl_nv_read_buffer_front) Warning("glReadBuffer(GL_FRONT) may not work on ES 2 without NV_read_buffer_front, depending on context buffering."); break; case GL_COLOR_ATTACHMENT1: case GL_COLOR_ATTACHMENT2: case GL_COLOR_ATTACHMENT3: case GL_COLOR_ATTACHMENT4: case GL_COLOR_ATTACHMENT5: case GL_COLOR_ATTACHMENT6: case GL_COLOR_ATTACHMENT7: case GL_COLOR_ATTACHMENT8: case GL_COLOR_ATTACHMENT9: case GL_COLOR_ATTACHMENT10: case GL_COLOR_ATTACHMENT11: case GL_COLOR_ATTACHMENT12: case GL_COLOR_ATTACHMENT13: case GL_COLOR_ATTACHMENT14: case GL_COLOR_ATTACHMENT15: if (!ctx.info->gl_nv_draw_buffers) { Warning("glReadBuffer(GL_COLOR_ATTACHMENT1+) not supported for ES 2 without NV_draw_buffers."); return true; } break; default: Warning("glReadBuffer(", GLenumToString(src), ") not supported for ES 2.\n"); return true; } return false; }
bool Filt::PolygonMode(const RegalContext &ctx, GLenum face, GLenum mode) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(face); UNUSED_PARAMETER(mode); if (ctx.isCore()) { if (face!=GL_FRONT_AND_BACK) { Warning("Regal does not support ", GLenumToString(face), " in glPolygonMode for core profile, only GL_FRONT_AND_BACK is supported - skipping."); return true; } } if (ctx.isES2()) { Warning("Regal does not support glPolygonMode for ES 2.0 - skipping."); return true; } return false; }
bool Filt::FramebufferTexture2D(const RegalContext &ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); UNUSED_PARAMETER(attachment); UNUSED_PARAMETER(textarget); UNUSED_PARAMETER(texture); UNUSED_PARAMETER(level); if (!FramebufferAttachmentSupported(ctx, attachment)) { return true; } if (!ctx.isES2()) return false; if ((level > 0) && !ctx.info->gl_oes_fbo_render_mipmap) { Warning("glFramebufferTexture2D with level > 0 not supported for ES 2.0 without OES_fbo_render_mipmap."); return true; } if (texture > 0) { switch (textarget) { case GL_TEXTURE_2D: case GL_TEXTURE_CUBE_MAP_POSITIVE_X: case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: break; default: Warning("glFramebufferTexture2D with ", GLenumToString(target), ") not supported for ES 2.0."); return true; } } return false; }
bool Filt::DrawBuffers(const RegalContext &ctx, GLsizei n, const GLenum *bufs) { UNUSED_PARAMETER(ctx); if (!ctx.isES2()) return false; for (GLsizei i = 0; i < n; ++i) { if (bufs[i] == GL_NONE || (bufs[i] >= GL_COLOR_ATTACHMENT0 && bufs[i] <= GL_COLOR_ATTACHMENT15)) continue; Warning( "Regal does not support ", GLenumToString( bufs[i] ), " as target for glDrawBuffers for ES 2.0 profile - skipping." ); return true; } return false; }
bool Filt::BindTexture(const RegalContext &ctx, GLenum target, GLuint name) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); UNUSED_PARAMETER(name); if (ctx.isES2()) { switch ( target ) { case GL_TEXTURE_1D: case GL_TEXTURE_3D: Warning( "Regal does not support ", GLenumToString( target ), " as target for glBindTexture for ES 2.0 profile - skipping." ); return true; default: break; } } return false; }
void Filt::BindTexture(const RegalContext &ctx, GLenum target, GLuint name) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); UNUSED_PARAMETER(name); #if REGAL_SYS_ES2 if (ctx.isES2()) { switch( target ) { case GL_TEXTURE_1D: case GL_TEXTURE_3D: Warning( "Regal does not support ", GLenumToString( target ), " as target for glBindTexture for ES 2.0 profile - skipping." ); filtered = true; default: break; } } #endif }
bool Filt::GetTexParameteriv(const RegalContext &ctx, GLenum target, GLenum pname, GLint *params) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(target); UNUSED_PARAMETER(pname); UNUSED_PARAMETER(params); if (!ctx.isES2()) return false; switch (target) { case GL_PROXY_TEXTURE_CUBE_MAP: Warning( "Regal does not support PROXY_TEXTURE_CUBE_MAP as target for ES 2.0 profile" ); // Regal does not have the infrastructure for generating GL errors. Hence, pass the error to the lower layer so that the application is notified of the error. return false; default: break; } return false; }
bool Filt::FramebufferAttachmentSupported(const RegalContext &ctx, GLenum attachment) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(attachment); // If we're running on a non-ES context, then all attachments from EXT_framebuffer_object // are supported if (!ctx.isES2()) return true; // COLOR_ATTACHMENT1 and up not supported in base ES 2.0. Need either // NV_fbo_color_attachments, or EXT_draw_buffers (not yet checked by Regal) if ((attachment > GL_COLOR_ATTACHMENT0) && (attachment <= GL_COLOR_ATTACHMENT15) && !(ctx.info->gl_nv_fbo_color_attachments /*|| ctx.info->gl_ext_draw_buffers*/)) { Warning("GL_COLOR_ATTACHMENT1+ not supported for ES 2.0 without NV_fbo_color_attachments or EXT_draw_buffers."); return false; } return true; }
bool Filt::TexParameter(const RegalContext &ctx, GLenum target, GLenum pname) { UNUSED_PARAMETER(target); RegalAssert(ctx.info.get()); // ES 2.0 does not support GL_TEXTURE_WRAP_R, filter it out // See: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml if (ctx.isES2()) switch (pname) { case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: break; // sRGB is supported for Tegra 4 onwards case GL_TEXTURE_SRGB_DECODE_EXT: if (ctx.info->gl_ext_texture_srgb_decode) return false; // GL_EXT_shadow_samplers for Tegra 4 // http://www.khronos.org/registry/gles/extensions/EXT/EXT_shadow_samplers.txt case GL_TEXTURE_COMPARE_MODE_EXT: case GL_TEXTURE_COMPARE_FUNC_EXT: if (ctx.info->gl_ext_shadow_samplers) return false; default: Warning("glTexParameter ",GLenumToString(pname)," not supported for ES 2.0."); return true; } return false; }
void Output(const Mode mode, const char *file, const int line, const char *prefix, const char *delim, const char *name, const string &str) { if (initialized && str.length()) { string m = message(prefix,delim,name,str); // TODO - optional Regal source line numbers. #if 1 UNUSED_PARAMETER(file); UNUSED_PARAMETER(line); #else m = print_string(file,":",line," ",m); #endif #if REGAL_LOG_ONCE if (once) switch (mode) { case LOG_WARNING: { Thread::ScopedLock lock(uniqueMutex); if (uniqueWarnings.find(m)!=uniqueWarnings.end()) return; uniqueWarnings.insert(m); break; } case LOG_ERROR: { Thread::ScopedLock lock(uniqueMutex); if (uniqueErrors.find(m)!=uniqueErrors.end()) return; uniqueErrors.insert(m); break; } default: break; } #endif RegalContext *rCtx = NULL; #if !REGAL_SYS_WGL && !REGAL_NO_TLS if (Thread::currentContextKey && pthread_getspecific(Thread::currentContextKey)) rCtx = REGAL_GET_CONTEXT(); #else rCtx = REGAL_GET_CONTEXT(); #endif #if REGAL_LOG_CALLBACK if (callback && rCtx && rCtx->logCallback) rCtx->logCallback(GL_LOG_INFO_REGAL, (GLsizei) m.length(), m.c_str(), reinterpret_cast<void *>(rCtx->sysCtx)); #endif #if REGAL_SYS_WGL OutputDebugStringA(m.c_str()); #elif REGAL_SYS_ANDROID // ANDROID_LOG_INFO // ANDROID_LOG_WARN // ANDROID_LOG_ERROR __android_log_write(ANDROID_LOG_INFO, REGAL_LOG_TAG, m.c_str()); #endif #if REGAL_LOG_JSON && !REGAL_NO_JSON if (json && jsonOutput) { string m = jsonObject(prefix,name,str) + ",\n"; fwrite(m.c_str(),m.length(),1,jsonOutput); } #endif #if REGAL_LOG if (log && logOutput) { #if REGAL_SYS_ANDROID #else fprintf(logOutput, "%s", m.c_str()); fflush(logOutput); #endif } #endif append(m); } }
bool Filt::PixelStorei(const RegalContext &ctx, GLenum pname, GLint param) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(pname); UNUSED_PARAMETER(param); if (ctx.isES2()) { switch (pname) { case GL_PACK_ALIGNMENT: case GL_UNPACK_ALIGNMENT: break; case GL_UNPACK_ROW_LENGTH_EXT: case GL_UNPACK_SKIP_ROWS_EXT: case GL_UNPACK_SKIP_PIXELS_EXT: if (!ctx.info->gl_ext_unpack_subimage) { Warning("glPixelStorei ", GLenumToString(pname), " not supported for ES 2.0 without EXT_unpack_subimage."); return true; } break; case GL_UNPACK_SKIP_IMAGES_NV: case GL_UNPACK_IMAGE_HEIGHT_NV: if (!ctx.info->gl_ext_unpack_subimage || !ctx.info->gl_nv_texture_array) { Warning("glPixelStorei ", GLenumToString(pname), " not supported for ES 2.0 without EXT_unpack_subimage and NV_texture_array."); return true; } break; case GL_PACK_ROW_LENGTH_NV: case GL_PACK_SKIP_ROWS_NV: case GL_PACK_SKIP_PIXELS_NV: if (!ctx.info->gl_nv_pack_subimage) { Warning("glPixelStorei ", GLenumToString(pname), " not supported for ES 2.0 without NV_pack_subimage."); return true; } break; case GL_PACK_IMAGE_HEIGHT: case GL_PACK_SKIP_IMAGES: if (!ctx.info->gl_nv_pack_subimage || !ctx.info->gl_nv_texture_array) { Warning("glPixelStorei ", GLenumToString(pname), " not supported for ES 2.0 without NV_pack_subimage and NV_texture_array."); return true; } break; default: Warning("glPixelStorei ", GLenumToString(pname), " not supported for ES 2.0."); return true; } } return false; }
bool Filt::FilterGet(const RegalContext &ctx, GLenum pname, int &retVal) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(pname); bool filtered = false; if (ctx.isCore() || ctx.isES2()) { filtered = true; switch (pname ) { case GL_MAX_PIXEL_MAP_TABLE: retVal = 256; break; case GL_MAX_NAME_STACK_DEPTH: retVal = 128; break; case GL_MAX_LIST_NESTING: retVal = 64; break; case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH: retVal = ctx.emuInfo->gl_max_client_attrib_stack_depth; break; case GL_MAX_ATTRIB_STACK_DEPTH: retVal = ctx.emuInfo->gl_max_attrib_stack_depth; break; case GL_DEPTH_BITS: retVal = 24; break; case GL_MAX_EVAL_ORDER: retVal = 4; break; case GL_RED_BITS: case GL_GREEN_BITS: case GL_BLUE_BITS: case GL_ALPHA_BITS: case GL_STENCIL_BITS: retVal = 8; break; case GL_INDEX_MODE: case GL_UNPACK_LSB_FIRST: case GL_UNPACK_SWAP_BYTES: case GL_PACK_LSB_FIRST: case GL_PACK_SWAP_BYTES: retVal = 0; break; default: filtered = false; break; } if (filtered) { Warning( "Regal does not support ", GLenumToString(pname), " as pname for glGet for core or ES 2.0 profiles - skipping." ); return true; } } if (ctx.isCore()) { filtered = true; #if 0 switch (pname ) { /* just a test case GL_UNPACK_ALIGNMENT: retVal = 0; break; */ default: filtered = false; break; } #else filtered = false; #endif if (filtered) { Warning( "Regal does not support ", GLenumToString(pname), " as pname for glGet for core profile - skipping." ); return true; } } if (ctx.isES2()) { filtered = true; switch (pname) { case GL_MAX_COLOR_ATTACHMENTS: if (ctx.info->gl_nv_fbo_color_attachments) filtered = false; else retVal = 1; break; case GL_PACK_ROW_LENGTH_NV: case GL_PACK_SKIP_ROWS_NV: case GL_PACK_SKIP_PIXELS_NV: if (ctx.info->gl_nv_pack_subimage) filtered = false; else retVal = 0; break; case GL_PACK_IMAGE_HEIGHT: case GL_PACK_SKIP_IMAGES: if (ctx.info->gl_nv_pack_subimage && ctx.info->gl_nv_texture_array) filtered = false; else retVal = 0; break; case GL_UNPACK_ROW_LENGTH_EXT: case GL_UNPACK_SKIP_ROWS_EXT: case GL_UNPACK_SKIP_PIXELS_EXT: if (ctx.info->gl_ext_unpack_subimage) filtered = false; else retVal = 0; break; case GL_UNPACK_IMAGE_HEIGHT_NV: case GL_UNPACK_SKIP_IMAGES_NV: if (ctx.info->gl_ext_unpack_subimage && ctx.info->gl_nv_texture_array) filtered = false; else retVal = 0; break; // need to filter on ES2.0 since this query returns an // INVALID_ENUM if no FBO is currently active case GL_DRAW_BUFFER0: case GL_DRAW_BUFFER1: case GL_DRAW_BUFFER2: case GL_DRAW_BUFFER3: case GL_DRAW_BUFFER4: case GL_DRAW_BUFFER5: case GL_DRAW_BUFFER6: case GL_DRAW_BUFFER7: case GL_DRAW_BUFFER8: case GL_DRAW_BUFFER9: case GL_DRAW_BUFFER10: case GL_DRAW_BUFFER11: case GL_DRAW_BUFFER12: case GL_DRAW_BUFFER13: case GL_DRAW_BUFFER14: case GL_DRAW_BUFFER15: if (ctx.info->gl_nv_draw_buffers) { if (fboID == 0) retVal = GL_NONE; else filtered = false; } else retVal = GL_NONE; break; // GL_CONTEXT_PROFILE_MASK not relevant for ES 2.0 case GL_CONTEXT_PROFILE_MASK: retVal = GL_NONE; filtered = true; break; default: filtered = false; break; } if (filtered) { Warning( "Regal does not support ", GLenumToString(pname), " as pname for glGet for ES 2.0 profile - skipping." ); return true; } } return false; }
void Filt::FilterGet(const RegalContext &ctx, GLenum pname) { UNUSED_PARAMETER(ctx); UNUSED_PARAMETER(pname); #if REGAL_SYS_ES2 || REGAL_SYS_GL if (ctx.isCore() || ctx.isES2()) { filtered = true; switch (pname ) { case GL_MAX_TEXTURE_SIZE: retVal = 1024; break; case GL_MAX_PIXEL_MAP_TABLE: retVal = 256; break; case GL_MAX_NAME_STACK_DEPTH: retVal = 128; break; case GL_MAX_LIST_NESTING: retVal = 64; break; case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH: case GL_MAX_ATTRIB_STACK_DEPTH: retVal = 16; break; case GL_DEPTH_BITS: retVal = 24; break; case GL_RED_BITS: case GL_GREEN_BITS: case GL_BLUE_BITS: case GL_ALPHA_BITS: case GL_STENCIL_BITS: case GL_SUBPIXEL_BITS: retVal = 8; break; case GL_INDEX_MODE: case GL_UNPACK_ROW_LENGTH: case GL_UNPACK_SKIP_ROWS: case GL_UNPACK_SKIP_PIXELS: case GL_UNPACK_LSB_FIRST: case GL_UNPACK_SWAP_BYTES: case GL_PACK_ROW_LENGTH: case GL_PACK_SKIP_ROWS: case GL_PACK_SKIP_PIXELS: case GL_PACK_LSB_FIRST: case GL_PACK_SWAP_BYTES: retVal = 0; break; default: filtered = false; break; } if (filtered) { Warning( "Regal does not support ", GLenumToString(pname), " as pname for glGet for core or ES 2.0 profiles - skipping." ); return; } } #endif #if REGAL_SYS_GL if (ctx.isCore()) { filtered = true; switch (pname ) { /* just a test case GL_UNPACK_ALIGNMENT: retVal = 0; break; */ default: filtered = false; break; } if (filtered) { Warning( "Regal does not support ", GLenumToString(pname), " as pname for glGet for core profile - skipping." ); return; } } #endif #if REGAL_SYS_ES2 if (ctx.isES2()) { filtered = true; switch (pname ) { case GL_PACK_ALIGNMENT: retVal = 1; break; default: filtered = false; break; } if (filtered) { Warning( "Regal does not support ", GLenumToString(pname), " as pname for glGet for ES 2.0 profile - skipping." ); return; } } #endif }