Skip to content

Commit 0a1c67d

Browse files
HLSL2GLSL converter: reworked outer tessellation level handling to avoid using .length() on an array that does not work on some GLES devices
1 parent 4ffabe8 commit 0a1c67d

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed

Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions.h

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,7 +1095,23 @@ out gl_PerVertex
10951095
#define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position)
10961096

10971097
#define _SET_GL_POSITION(Pos)gl_out[gl_InvocationID].gl_Position=_ExpandVector(Pos)
1098-
#define _SET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)gl_TessLevelOuter[i] = OuterLevel[i]
1098+
1099+
void _SetGLTessLevelOuter(float OuterLevel[2])
1100+
{
1101+
for(int i=0; i < 2; ++i)
1102+
gl_TessLevelOuter[i] = OuterLevel[i];
1103+
}
1104+
void _SetGLTessLevelOuter(float OuterLevel[3])
1105+
{
1106+
for(int i=0; i < 3; ++i)
1107+
gl_TessLevelOuter[i] = OuterLevel[i];
1108+
}
1109+
void _SetGLTessLevelOuter(float OuterLevel[4])
1110+
{
1111+
for(int i=0; i < 4; ++i)
1112+
gl_TessLevelOuter[i] = OuterLevel[i];
1113+
}
1114+
10991115

11001116
void _SetGLTessLevelInner(float InnerLevel[2])
11011117
{
@@ -1128,7 +1144,23 @@ out gl_PerVertex
11281144
};
11291145

11301146
#define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position)
1131-
#define _GET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)OuterLevel[i] = gl_TessLevelOuter[i]
1147+
1148+
void _GetGLTessLevelOuter(out float OuterLevel[2])
1149+
{
1150+
for(int i=0; i < 2; ++i)
1151+
OuterLevel[i] = gl_TessLevelOuter[i];
1152+
}
1153+
void _GetGLTessLevelOuter(out float OuterLevel[3])
1154+
{
1155+
for(int i=0; i < 3; ++i)
1156+
OuterLevel[i] = gl_TessLevelOuter[i];
1157+
}
1158+
void _GetGLTessLevelOuter(out float OuterLevel[4])
1159+
{
1160+
for(int i=0; i < 4; ++i)
1161+
OuterLevel[i] = gl_TessLevelOuter[i];
1162+
}
1163+
11321164
void _GetGLTessLevelInner(out float InnerLevel[2])
11331165
{
11341166
InnerLevel[0] = gl_TessLevelInner[0];

Graphics/HLSL2GLSLConverterLib/include/GLSLDefinitions_inc.h

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,7 +1095,23 @@
10951095
"#define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position)\n"
10961096
"\n"
10971097
"#define _SET_GL_POSITION(Pos)gl_out[gl_InvocationID].gl_Position=_ExpandVector(Pos)\n"
1098-
"#define _SET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)gl_TessLevelOuter[i] = OuterLevel[i]\n"
1098+
"\n"
1099+
"void _SetGLTessLevelOuter(float OuterLevel[2])\n"
1100+
"{\n"
1101+
" for(int i=0; i < 2; ++i)\n"
1102+
" gl_TessLevelOuter[i] = OuterLevel[i];\n"
1103+
"}\n"
1104+
"void _SetGLTessLevelOuter(float OuterLevel[3])\n"
1105+
"{\n"
1106+
" for(int i=0; i < 3; ++i)\n"
1107+
" gl_TessLevelOuter[i] = OuterLevel[i];\n"
1108+
"}\n"
1109+
"void _SetGLTessLevelOuter(float OuterLevel[4])\n"
1110+
"{\n"
1111+
" for(int i=0; i < 4; ++i)\n"
1112+
" gl_TessLevelOuter[i] = OuterLevel[i];\n"
1113+
"}\n"
1114+
"\n"
10991115
"\n"
11001116
"void _SetGLTessLevelInner(float InnerLevel[2])\n"
11011117
"{\n"
@@ -1128,7 +1144,23 @@
11281144
"};\n"
11291145
"\n"
11301146
"#define _GET_GL_POSITION(Pos)_ResizeVector(Pos, gl_in[i].gl_Position)\n"
1131-
"#define _GET_GL_TESS_LEVEL_OUTER(OuterLevel)for(int i=0; i < OuterLevel.length(); ++i)OuterLevel[i] = gl_TessLevelOuter[i]\n"
1147+
"\n"
1148+
"void _GetGLTessLevelOuter(out float OuterLevel[2])\n"
1149+
"{\n"
1150+
" for(int i=0; i < 2; ++i)\n"
1151+
" OuterLevel[i] = gl_TessLevelOuter[i];\n"
1152+
"}\n"
1153+
"void _GetGLTessLevelOuter(out float OuterLevel[3])\n"
1154+
"{\n"
1155+
" for(int i=0; i < 3; ++i)\n"
1156+
" OuterLevel[i] = gl_TessLevelOuter[i];\n"
1157+
"}\n"
1158+
"void _GetGLTessLevelOuter(out float OuterLevel[4])\n"
1159+
"{\n"
1160+
" for(int i=0; i < 4; ++i)\n"
1161+
" OuterLevel[i] = gl_TessLevelOuter[i];\n"
1162+
"}\n"
1163+
"\n"
11321164
"void _GetGLTessLevelInner(out float InnerLevel[2])\n"
11331165
"{\n"
11341166
" InnerLevel[0] = gl_TessLevelInner[0];\n"

Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -723,11 +723,11 @@ HLSL2GLSLConverterImpl::HLSL2GLSLConverterImpl()
723723
DEFINE_VARIABLE(HSInd, InVar, "sv_primitiveid", "_GET_GL_PRIMITIVE_ID");
724724
DEFINE_VARIABLE(HSInd, InVar, "sv_position", "_GET_GL_POSITION");
725725
DEFINE_VARIABLE(HSInd, OutVar, "sv_position", "_SET_GL_POSITION");
726-
DEFINE_VARIABLE(HSInd, OutVar, "sv_tessfactor", "_SET_GL_TESS_LEVEL_OUTER");
726+
DEFINE_VARIABLE(HSInd, OutVar, "sv_tessfactor", "_SetGLTessLevelOuter");
727727
DEFINE_VARIABLE(HSInd, OutVar, "sv_insidetessfactor", "_SetGLTessLevelInner");
728728

729729
DEFINE_VARIABLE(DSInd, InVar, "sv_position", "_GET_GL_POSITION");
730-
DEFINE_VARIABLE(DSInd, InVar, "sv_tessfactor", "_GET_GL_TESS_LEVEL_OUTER");
730+
DEFINE_VARIABLE(DSInd, InVar, "sv_tessfactor", "_GetGLTessLevelOuter");
731731
DEFINE_VARIABLE(DSInd, InVar, "sv_insidetessfactor", "_GetGLTessLevelInner");
732732
DEFINE_VARIABLE(DSInd, InVar, "sv_domainlocation", "_GET_GL_TESS_COORD");
733733
DEFINE_VARIABLE(DSInd, InVar, "sv_primitiveid", "_GET_GL_PRIMITIVE_ID");

0 commit comments

Comments
 (0)