void TranslatorGLSL::writeExtensionBehavior(TIntermNode *root) { TInfoSinkBase &sink = getInfoSink().obj; const TExtensionBehavior &extBehavior = getExtensionBehavior(); for (const auto &iter : extBehavior) { if (iter.second == EBhUndefined) { continue; } if (getOutputType() == SH_GLSL_COMPATIBILITY_OUTPUT) { // For GLSL output, we don't need to emit most extensions explicitly, // but some we need to translate in GL compatibility profile. if (iter.first == "GL_EXT_shader_texture_lod") { sink << "#extension GL_ARB_shader_texture_lod : " << getBehaviorString(iter.second) << "\n"; } if (iter.first == "GL_EXT_draw_buffers") { sink << "#extension GL_ARB_draw_buffers : " << getBehaviorString(iter.second) << "\n"; } } } // GLSL ES 3 explicit location qualifiers need to use an extension before GLSL 330 if (getShaderVersion() >= 300 && getOutputType() < SH_GLSL_330_CORE_OUTPUT && getShaderType() != GL_COMPUTE_SHADER) { sink << "#extension GL_ARB_explicit_attrib_location : require\n"; } // Need to enable gpu_shader5 to have index constant sampler array indexing if (getOutputType() != SH_ESSL_OUTPUT && getOutputType() < SH_GLSL_400_CORE_OUTPUT && getShaderVersion() == 100) { // Don't use "require" on to avoid breaking WebGL 1 on drivers that silently // support index constant sampler array indexing, but don't have the extension or // on drivers that don't have the extension at all as it would break WebGL 1 for // some users. sink << "#extension GL_ARB_gpu_shader5 : enable\n"; } TExtensionGLSL extensionGLSL(getOutputType()); root->traverse(&extensionGLSL); for (const auto &ext : extensionGLSL.getEnabledExtensions()) { sink << "#extension " << ext << " : enable\n"; } for (const auto &ext : extensionGLSL.getRequiredExtensions()) { sink << "#extension " << ext << " : require\n"; } }
void TranslatorESSL::writeExtensionBehavior() { TInfoSinkBase& sink = getInfoSink().obj; const TExtensionBehavior& extensionBehavior = getExtensionBehavior(); for (TExtensionBehavior::const_iterator iter = extensionBehavior.begin(); iter != extensionBehavior.end(); ++iter) { if (iter->second != EBhUndefined) { if (getResources().NV_draw_buffers && iter->first == "GL_EXT_draw_buffers") { sink << "#extension GL_NV_draw_buffers : " << getBehaviorString(iter->second) << "\n"; } else { sink << "#extension " << iter->first << " : " << getBehaviorString(iter->second) << "\n"; } } } }
void TranslatorESSL::writeExtensionBehavior() { TInfoSinkBase& sink = getInfoSink().obj; const TExtensionBehavior& extensionBehavior = getExtensionBehavior(); for (TExtensionBehavior::const_iterator iter = extensionBehavior.begin(); iter != extensionBehavior.end(); ++iter) { sink << "#extension " << iter->first << " : " << getBehaviorString(iter->second) << "\n"; } }
void TranslatorGLSL::writeExtensionBehavior() { TInfoSinkBase& sink = getInfoSink().obj; const TExtensionBehavior& extBehavior = getExtensionBehavior(); for (TExtensionBehavior::const_iterator iter = extBehavior.begin(); iter != extBehavior.end(); ++iter) { if (iter->second == EBhUndefined) continue; // For GLSL output, we don't need to emit most extensions explicitly, // but some we need to translate. if (iter->first == "GL_EXT_shader_texture_lod") { sink << "#extension GL_ARB_shader_texture_lod : " << getBehaviorString(iter->second) << "\n"; } } }
void TranslatorGLSL::writeExtensionBehavior(TIntermNode *root) { TInfoSinkBase& sink = getInfoSink().obj; const TExtensionBehavior& extBehavior = getExtensionBehavior(); for (const auto &iter : extBehavior) { if (iter.second == EBhUndefined) { continue; } // For GLSL output, we don't need to emit most extensions explicitly, // but some we need to translate. if (iter.first == "GL_EXT_shader_texture_lod") { sink << "#extension GL_ARB_shader_texture_lod : " << getBehaviorString(iter.second) << "\n"; } } // GLSL ES 3 explicit location qualifiers need to use an extension before GLSL 330 if (getShaderVersion() >= 300 && getOutputType() < SH_GLSL_330_CORE_OUTPUT) { sink << "#extension GL_ARB_explicit_attrib_location : require\n"; } TExtensionGLSL extensionGLSL(getOutputType()); root->traverse(&extensionGLSL); for (const auto &ext : extensionGLSL.getEnabledExtensions()) { sink << "#extension " << ext << " : enable\n"; } for (const auto &ext : extensionGLSL.getRequiredExtensions()) { sink << "#extension " << ext << " : require\n"; } }