Skip to content

Commit

Permalink
Main: ScriptTranslator - allow multi-language programs
Browse files Browse the repository at this point in the history
  • Loading branch information
paroj committed Aug 12, 2020
1 parent 72cfd69 commit 565185b
Show file tree
Hide file tree
Showing 21 changed files with 102 additions and 937 deletions.
14 changes: 14 additions & 0 deletions Docs/src/high-level-programs.md
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,20 @@ geometry_program Ogre/GPTest/Swizzle_GP_GLSL glsl

With GL3+ these values are specified using the `layout` modifier.

# Multi-language Programs {#multi-language-programs}

Basic programs, like the `example.frag` stated above, are compatible with GLSL and GLSLES. To avoid duplicating the whole
program declaration, you can simply specify all the language types the program is compatible with as:

```cpp
fragment_program myFragmentShader glsl glsles
{
source example.frag
}
```

If you use the built-in defines like @c OGRE_HLSL, you can even write programs compatible with both HLSL and GLSL. In fact, you can use `#include <OgreUnifiedShader.h>` in the shader which provides cross-language macros to help with this.

# Unified High-level Programs {#Unified-High_002dlevel-Programs}

As mentioned above, it can often be useful to write both HLSL and GLSL programs to specifically target each platform, but if you do this via multiple material techniques this can cause a bloated material definition when the only difference is the program language. Well, there is another option. You can ’wrap’ multiple programs in a ’unified’ program definition, which will automatically choose one of a series of ’delegate’ programs depending on the rendersystem and hardware support.
Expand Down
103 changes: 6 additions & 97 deletions Media/ShadowVolume/ShadowVolumeExtude.program
Original file line number Diff line number Diff line change
Expand Up @@ -2,127 +2,36 @@
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at https://www.ogre3d.org/licensing.

vertex_program Ogre/ShadowBlendVP_hlsl hlsl
vertex_program Ogre/ShadowBlendVP glsl glsles hlsl
{
source ShadowBlend.vert
target vs_2_0
}
vertex_program Ogre/ShadowBlendVP_glsl glsl
{
source ShadowBlend.vert
}
vertex_program Ogre/ShadowBlendVP_glsles glsles
{
source ShadowBlend.vert
}
vertex_program Ogre/ShadowBlendVP unified
{
delegate Ogre/ShadowBlendVP_glsl
delegate Ogre/ShadowBlendVP_glsles
delegate Ogre/ShadowBlendVP_hlsl

default_params
{
param_named_auto worldViewProj worldviewproj_matrix
}
}

fragment_program Ogre/ShadowBlendFP_hlsl hlsl
{
source ShadowBlend.frag
target ps_2_0
}
fragment_program Ogre/ShadowBlendFP_glsles glsles
fragment_program Ogre/ShadowBlendFP glsl glsles hlsl
{
source ShadowBlend.frag
}
fragment_program Ogre/ShadowBlendFP_glsl glsl
{
source ShadowBlend.frag
}
fragment_program Ogre/ShadowBlendFP unified
{
delegate Ogre/ShadowBlendFP_glsl
delegate Ogre/ShadowBlendFP_glsles
delegate Ogre/ShadowBlendFP_hlsl
}

vertex_program Ogre/ShadowExtrudePointLight_hlsl hlsl
{
source ShadowExtrudePointLight.vert
target vs_2_0
}
vertex_program Ogre/ShadowExtrudePointLight_glsl glsl
{
source ShadowExtrudePointLight.vert
}
vertex_program Ogre/ShadowExtrudePointLight_glsles glsles
vertex_program Ogre/ShadowExtrudePointLight glsl glsles hlsl
{
source ShadowExtrudePointLight.vert
}
vertex_program Ogre/ShadowExtrudePointLight unified
{
delegate Ogre/ShadowExtrudePointLight_glsl
delegate Ogre/ShadowExtrudePointLight_glsles
delegate Ogre/ShadowExtrudePointLight_hlsl
}

vertex_program Ogre/ShadowExtrudeDirLight_hlsl hlsl
vertex_program Ogre/ShadowExtrudeDirLight glsl glsles hlsl
{
source ShadowExtrudeDirLight.vert
target vs_2_0
}
vertex_program Ogre/ShadowExtrudeDirLight_glsl glsl
{
source ShadowExtrudeDirLight.vert
}
vertex_program Ogre/ShadowExtrudeDirLight_glsles glsles
{
source ShadowExtrudeDirLight.vert
}
vertex_program Ogre/ShadowExtrudeDirLight unified
{
delegate Ogre/ShadowExtrudeDirLight_glsl
delegate Ogre/ShadowExtrudeDirLight_glsles
delegate Ogre/ShadowExtrudeDirLight_hlsl
}

vertex_program Ogre/ShadowExtrudePointLightFinite_hlsl hlsl
{
source ShadowExtrudePointLightFinite.vert
target vs_2_0
}
vertex_program Ogre/ShadowExtrudePointLightFinite_glsl glsl
{
source ShadowExtrudePointLightFinite.vert
}
vertex_program Ogre/ShadowExtrudePointLightFinite_glsles glsles
vertex_program Ogre/ShadowExtrudePointLightFinite glsl glsles hlsl
{
source ShadowExtrudePointLightFinite.vert
}
vertex_program Ogre/ShadowExtrudePointLightFinite unified
{
delegate Ogre/ShadowExtrudePointLightFinite_glsl
delegate Ogre/ShadowExtrudePointLightFinite_glsles
delegate Ogre/ShadowExtrudePointLightFinite_hlsl
}

vertex_program Ogre/ShadowExtrudeDirLightFinite_hlsl hlsl
{
source ShadowExtrudeDirLightFinite.vert
target vs_2_0
}
vertex_program Ogre/ShadowExtrudeDirLightFinite_glsl glsl
{
source ShadowExtrudeDirLightFinite.vert
}
vertex_program Ogre/ShadowExtrudeDirLightFinite_glsles glsles
vertex_program Ogre/ShadowExtrudeDirLightFinite glsl glsles hlsl
{
source ShadowExtrudeDirLightFinite.vert
}
vertex_program Ogre/ShadowExtrudeDirLightFinite unified
{
delegate Ogre/ShadowExtrudeDirLightFinite_glsl
delegate Ogre/ShadowExtrudeDirLightFinite_glsles
delegate Ogre/ShadowExtrudeDirLightFinite_hlsl
}
14 changes: 11 additions & 3 deletions OgreMain/src/OgreScriptTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3548,10 +3548,18 @@ namespace Ogre{

// Get the language
String language;
if(!getString(obj->values.front(), &language))
for(const auto& lnode : obj->values)
{
compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, obj->file, obj->line);
return;
if(!getString(lnode, &language))
{
compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, obj->file, obj->line);
return;
}

if (language == "asm")
break; // always supported
if (HighLevelGpuProgramManager::getSingleton().isLanguageSupported(language))
break;
}

translateGpuProgram(compiler, obj, language);
Expand Down
38 changes: 3 additions & 35 deletions Samples/Media/DeferredShadingMedia/deferred_post.program
Original file line number Diff line number Diff line change
Expand Up @@ -51,57 +51,35 @@ fragment_program DeferredShading/post/ShowNormal_ps unified
{
delegate DeferredShading/post/ShowNormal_ps_pGLSL
delegate DeferredShading/post/ShowNormal_ps_pCg
delegate DeferredShading/post/ShowNormal_ps_pGLSLES
}
fragment_program DeferredShading/post/ShowNormal_ps_pCg hlsl
{
source ShowNormal_ps.cg
target ps_2_0
}
fragment_program DeferredShading/post/ShowNormal_ps_pGLSL glsl
fragment_program DeferredShading/post/ShowNormal_ps_pGLSL glsl glsles
{
source ShowNormal_ps.glsl
default_params
{
param_named Tex1 int 1
}
}
fragment_program DeferredShading/post/ShowNormal_ps_pGLSLES glsles
{
source ShowNormal_ps.glsl
syntax glsles
default_params
{
param_named Tex0 int 0
param_named Tex1 int 1
}
}

// ShowDS_ps
fragment_program DeferredShading/post/ShowDS_ps unified
{
delegate DeferredShading/post/ShowDS_ps_pGLSL
delegate DeferredShading/post/ShowDS_ps_pCg
delegate DeferredShading/post/ShowDS_ps_pGLSLES
}
fragment_program DeferredShading/post/ShowDS_ps_pCg hlsl
{
source ShowDS_ps.cg
target ps_2_0
}
fragment_program DeferredShading/post/ShowDS_ps_pGLSL glsl
{
source ShowDS_ps.glsl
default_params
{
param_named Tex0 int 0
param_named Tex1 int 1
}
}
fragment_program DeferredShading/post/ShowDS_ps_pGLSLES glsles
fragment_program DeferredShading/post/ShowDS_ps_pGLSL glsl glsles
{
source ShowDS_ps.glsl
syntax glsles
default_params
{
param_named Tex0 int 0
Expand All @@ -114,30 +92,20 @@ fragment_program DeferredShading/post/ShowColour_ps unified
{
delegate DeferredShading/post/ShowColour_ps_pGLSL
delegate DeferredShading/post/ShowColour_ps_pCg
delegate DeferredShading/post/ShowColour_ps_pGLSLES
}
fragment_program DeferredShading/post/ShowColour_ps_pCg hlsl
{
source ShowColour_ps.cg
target ps_2_0
}
fragment_program DeferredShading/post/ShowColour_ps_pGLSL glsl
fragment_program DeferredShading/post/ShowColour_ps_pGLSL glsl glsles
{
source ShowColour_ps.glsl
default_params
{
param_named Tex0 int 0
}
}
fragment_program DeferredShading/post/ShowColour_ps_pGLSLES glsles
{
source ShowColour_ps.glsl
syntax glsles
default_params
{
param_named Tex0 int 0
}
}
// Auxiliary lights
// cg
vertex_program DeferredShading/post/LightMaterial_vs unified
Expand Down
30 changes: 2 additions & 28 deletions Samples/Media/PBR/pbr.program
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
vertex_program glTF2/PBR_vs_glsl glsl
vertex_program glTF2/PBR_vs hlsl glsl glsles
{
source pbr-vert.glsl
preprocessor_defines HAS_NORMALS,HAS_TANGENTS,HAS_UV
Expand All @@ -10,41 +10,15 @@ fragment_program glTF2/PBR_fs_glsl glsl
preprocessor_defines MANUAL_SRGB,SRGB_FAST_APPROXIMATION,HAS_NORMALS,HAS_TANGENTS,HAS_BASECOLORMAP,HAS_NORMALMAP,HAS_EMISSIVEMAP,HAS_METALROUGHNESSMAP,HAS_OCCLUSIONMAP,USE_IBL,USE_TEX_LOD
}

vertex_program glTF2/PBR_vs_glsles glsles
{
source pbr-vert.glsl
preprocessor_defines HAS_NORMALS,HAS_TANGENTS,HAS_UV
}

fragment_program glTF2/PBR_fs_glsles glsles
{
source pbr-frag.glsl
preprocessor_defines MANUAL_SRGB,SRGB_FAST_APPROXIMATION,HAS_NORMALS,HAS_TANGENTS,HAS_BASECOLORMAP,HAS_NORMALMAP,HAS_EMISSIVEMAP,HAS_METALROUGHNESSMAP,HAS_OCCLUSIONMAP,USE_IBL
}

vertex_program glTF2/PBR_vs_hlsl hlsl
{
source pbr-vert.glsl
preprocessor_defines HAS_NORMALS,HAS_TANGENTS,HAS_UV
}

fragment_program glTF2/PBR_fs_hlsl hlsl
fragment_program glTF2/PBR_fs_hlsl hlsl glsles
{
source pbr-frag.glsl
target ps_2_a
preprocessor_defines MANUAL_SRGB,SRGB_FAST_APPROXIMATION,HAS_NORMALS,HAS_TANGENTS,HAS_BASECOLORMAP,HAS_NORMALMAP,HAS_EMISSIVEMAP,HAS_METALROUGHNESSMAP,HAS_OCCLUSIONMAP,USE_IBL
}

vertex_program glTF2/PBR_vs unified
{
delegate glTF2/PBR_vs_glsl
delegate glTF2/PBR_vs_glsles
delegate glTF2/PBR_vs_hlsl
}

fragment_program glTF2/PBR_fs unified
{
delegate glTF2/PBR_fs_glsl
delegate glTF2/PBR_fs_glsles
delegate glTF2/PBR_fs_hlsl
}
8 changes: 1 addition & 7 deletions Samples/Media/materials/scripts/BlackAndWhite.material
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,14 @@ fragment_program Ogre/Compositor/B&W_Cg_FP cg
profiles ps_4_0 ps_4_0_level_9_1 ps_4_0_level_9_3 ps_2_0 arbfp1
}

fragment_program Ogre/Compositor/B&W_GLSLES_FP glsles
{
source GrayScale.glsl
}

fragment_program Ogre/Compositor/B&W_GLSL_FP glsl
fragment_program Ogre/Compositor/B&W_GLSL_FP glsl glsles
{
source GrayScale.glsl
}

fragment_program Ogre/Compositor/B&W_FP unified
{
delegate Ogre/Compositor/B&W_GLSL_FP
delegate Ogre/Compositor/B&W_GLSLES_FP
delegate Ogre/Compositor/B&W_Cg_FP
}

Expand Down
Loading

0 comments on commit 565185b

Please sign in to comment.