From 0a1c67de145602db46c544d70db07bbb70b92554 Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 18 Feb 2018 13:30:19 -0800 Subject: HLSL2GLSL converter: reworked outer tessellation level handling to avoid using .length() on an array that does not work on some GLES devices --- .../include/GLSLDefinitions.h | 36 ++++++++++++++++++++-- .../include/GLSLDefinitions_inc.h | 36 ++++++++++++++++++++-- .../src/HLSL2GLSLConverterImpl.cpp | 4 +-- 3 files changed, 70 insertions(+), 6 deletions(-) (limited to 'Graphics') diff --git a/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions.h b/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions.h index fc26cc66..adacd0bc 100644 --- a/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions.h +++ b/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions.h @@ -1095,7 +1095,23 @@ out gl_PerVertex #define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position) #define _SET_GL_POSITION(Pos)gl_out[gl_InvocationID].gl_Position=_ExpandVector(Pos) -#define _SET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)gl_TessLevelOuter[i] = OuterLevel[i] + +void _SetGLTessLevelOuter(float OuterLevel[2]) +{ + for(int i=0; i < 2; ++i) + gl_TessLevelOuter[i] = OuterLevel[i]; +} +void _SetGLTessLevelOuter(float OuterLevel[3]) +{ + for(int i=0; i < 3; ++i) + gl_TessLevelOuter[i] = OuterLevel[i]; +} +void _SetGLTessLevelOuter(float OuterLevel[4]) +{ + for(int i=0; i < 4; ++i) + gl_TessLevelOuter[i] = OuterLevel[i]; +} + void _SetGLTessLevelInner(float InnerLevel[2]) { @@ -1128,7 +1144,23 @@ out gl_PerVertex }; #define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position) -#define _GET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)OuterLevel[i] = gl_TessLevelOuter[i] + +void _GetGLTessLevelOuter(out float OuterLevel[2]) +{ + for(int i=0; i < 2; ++i) + OuterLevel[i] = gl_TessLevelOuter[i]; +} +void _GetGLTessLevelOuter(out float OuterLevel[3]) +{ + for(int i=0; i < 3; ++i) + OuterLevel[i] = gl_TessLevelOuter[i]; +} +void _GetGLTessLevelOuter(out float OuterLevel[4]) +{ + for(int i=0; i < 4; ++i) + OuterLevel[i] = gl_TessLevelOuter[i]; +} + void _GetGLTessLevelInner(out float InnerLevel[2]) { InnerLevel[0] = gl_TessLevelInner[0]; diff --git a/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions_inc.h b/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions_inc.h index 0c69ccda..b12790d9 100644 --- a/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions_inc.h +++ b/Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions_inc.h @@ -1095,7 +1095,23 @@ "#define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position)\n" "\n" "#define _SET_GL_POSITION(Pos)gl_out[gl_InvocationID].gl_Position=_ExpandVector(Pos)\n" -"#define _SET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)gl_TessLevelOuter[i] = OuterLevel[i]\n" +"\n" +"void _SetGLTessLevelOuter(float OuterLevel[2])\n" +"{\n" +" for(int i=0; i < 2; ++i)\n" +" gl_TessLevelOuter[i] = OuterLevel[i];\n" +"}\n" +"void _SetGLTessLevelOuter(float OuterLevel[3])\n" +"{\n" +" for(int i=0; i < 3; ++i)\n" +" gl_TessLevelOuter[i] = OuterLevel[i];\n" +"}\n" +"void _SetGLTessLevelOuter(float OuterLevel[4])\n" +"{\n" +" for(int i=0; i < 4; ++i)\n" +" gl_TessLevelOuter[i] = OuterLevel[i];\n" +"}\n" +"\n" "\n" "void _SetGLTessLevelInner(float InnerLevel[2])\n" "{\n" @@ -1128,7 +1144,23 @@ "};\n" "\n" "#define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position)\n" -"#define _GET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)OuterLevel[i] = gl_TessLevelOuter[i]\n" +"\n" +"void _GetGLTessLevelOuter(out float OuterLevel[2])\n" +"{\n" +" for(int i=0; i < 2; ++i)\n" +" OuterLevel[i] = gl_TessLevelOuter[i];\n" +"}\n" +"void _GetGLTessLevelOuter(out float OuterLevel[3])\n" +"{\n" +" for(int i=0; i < 3; ++i)\n" +" OuterLevel[i] = gl_TessLevelOuter[i];\n" +"}\n" +"void _GetGLTessLevelOuter(out float OuterLevel[4])\n" +"{\n" +" for(int i=0; i < 4; ++i)\n" +" OuterLevel[i] = gl_TessLevelOuter[i];\n" +"}\n" +"\n" "void _GetGLTessLevelInner(out float InnerLevel[2])\n" "{\n" " InnerLevel[0] = gl_TessLevelInner[0];\n" diff --git a/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp b/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp index 5b5e2a20..8cc26f39 100644 --- a/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp +++ b/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp @@ -723,11 +723,11 @@ HLSL2GLSLConverterImpl::HLSL2GLSLConverterImpl() DEFINE_VARIABLE(HSInd, InVar, "sv_primitiveid", "_GET_GL_PRIMITIVE_ID"); DEFINE_VARIABLE(HSInd, InVar, "sv_position", "_GET_GL_POSITION"); DEFINE_VARIABLE(HSInd, OutVar, "sv_position", "_SET_GL_POSITION"); - DEFINE_VARIABLE(HSInd, OutVar, "sv_tessfactor", "_SET_GL_TESS_LEVEL_OUTER"); + DEFINE_VARIABLE(HSInd, OutVar, "sv_tessfactor", "_SetGLTessLevelOuter"); DEFINE_VARIABLE(HSInd, OutVar, "sv_insidetessfactor", "_SetGLTessLevelInner"); DEFINE_VARIABLE(DSInd, InVar, "sv_position", "_GET_GL_POSITION"); - DEFINE_VARIABLE(DSInd, InVar, "sv_tessfactor", "_GET_GL_TESS_LEVEL_OUTER"); + DEFINE_VARIABLE(DSInd, InVar, "sv_tessfactor", "_GetGLTessLevelOuter"); DEFINE_VARIABLE(DSInd, InVar, "sv_insidetessfactor", "_GetGLTessLevelInner"); DEFINE_VARIABLE(DSInd, InVar, "sv_domainlocation", "_GET_GL_TESS_COORD"); DEFINE_VARIABLE(DSInd, InVar, "sv_primitiveid", "_GET_GL_PRIMITIVE_ID"); -- cgit v1.2.3