Fix shader compilation on UE4
diff --git a/renderer/d3d/pls_render_context_d3d_impl.cpp b/renderer/d3d/pls_render_context_d3d_impl.cpp index f68ed0c..7f8f20b 100644 --- a/renderer/d3d/pls_render_context_d3d_impl.cpp +++ b/renderer/d3d/pls_render_context_d3d_impl.cpp
@@ -79,7 +79,9 @@ { D3DCapabilities d3dCapabilities; D3D11_FEATURE_DATA_D3D11_OPTIONS2 d3d11Options2; - if (SUCCEEDED(gpu->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS2, + + if (gpu->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_1 && + SUCCEEDED(gpu->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS2, &d3d11Options2, sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS2)))) {
diff --git a/renderer/shaders/advanced_blend.glsl b/renderer/shaders/advanced_blend.glsl index 76430bd..bd4fc18 100644 --- a/renderer/shaders/advanced_blend.glsl +++ b/renderer/shaders/advanced_blend.glsl
@@ -172,14 +172,14 @@ case BLEND_MODE_COLORDODGE: // ES3 spec, 4.5.1 Range and Precision: dividing a non-zero by 0 results in the // appropriately signed IEEE Inf. - f = mix(min(dst.rgb / (1. - src.rgb), make_half3(1, 1, 1)), + f = (half)mix(min(dst.rgb / (1. - src.rgb), make_half3(1, 1, 1)), make_half3(0, 0, 0), lessThanEqual(dst.rgb, make_half3(0, 0, 0))); break; case BLEND_MODE_COLORBURN: // ES3 spec, 4.5.1 Range and Precision: dividing a non-zero by 0 results in the // appropriately signed IEEE Inf. - f = mix(1. - min((1. - dst.rgb) / src.rgb, 1.), + f = (half)mix(1. - min((1. - dst.rgb) / src.rgb, 1.), make_half3(1, 1, 1), greaterThanEqual(dst.rgb, make_half3(1, 1, 1))); break; @@ -204,7 +204,7 @@ f[i] = dst[i] + (2. * src[i] - 1.) * dst[i] * ((16. * dst[i] - 12.) * dst[i] + 3.); else - f[i] = dst[i] + (2. * src[i] - 1.) * (sqrt(dst[i]) - dst[i]); + f[i] = dst[i] + (2. * src[i] - 1.) * ((half)sqrt(dst[i]) - dst[i]); } break; }
diff --git a/renderer/shaders/atomic_draw.glsl b/renderer/shaders/atomic_draw.glsl index d6d4bfa..c721121 100644 --- a/renderer/shaders/atomic_draw.glsl +++ b/renderer/shaders/atomic_draw.glsl
@@ -129,7 +129,7 @@ if (aaRadiusX >= .5) { vertexPosition.x = .5; - v_edgeCoverage *= .5 / aaRadiusX; + v_edgeCoverage *= (half)(.5 / aaRadiusX); } else { @@ -139,7 +139,7 @@ if (aaRadiusY >= .5) { vertexPosition.y = .5; - v_edgeCoverage *= .5 / aaRadiusY; + v_edgeCoverage *= (half)(.5 / aaRadiusY); } else { @@ -301,10 +301,10 @@ uint to_fixed(float x) { return uint(x * FIXED_COVERAGE_FACTOR + FIXED_COVERAGE_ZERO); } -float from_fixed(uint x) +half from_fixed(uint x) { - return float(x) * FIXED_COVERAGE_INVERSE_FACTOR + - (-FIXED_COVERAGE_ZERO * FIXED_COVERAGE_INVERSE_FACTOR); + return (half)(float(x) * FIXED_COVERAGE_INVERSE_FACTOR + + (-FIXED_COVERAGE_ZERO * FIXED_COVERAGE_INVERSE_FACTOR)); } // Return the color of the path at index 'pathID' at location '_fragCoord'. @@ -316,7 +316,7 @@ half coverage = abs(coverageCount); #ifdef @ENABLE_EVEN_ODD if ((paintData.x & PAINT_FLAG_EVEN_ODD) != 0u) - coverage = 1. - abs(fract(coverage * .5) * 2. + -1.); + coverage = 1. - (half)abs(fract(coverage * .5) * 2. + -1.); #endif // ENABLE_EVEN_ODD coverage = min(coverage, make_half(1)); // This also caps stroke coverage, which can be >1. #ifdef @ENABLE_CLIPPING @@ -574,7 +574,7 @@ // get resolved later like other draws because the @imageTexture binding is liable to change, // and furthermore in the case of imageMeshes, we can't calculate UV coordinates based on // fragment position. - half4 imageColor = TEXTURE_SAMPLE(@imageTexture, imageSampler, v_texCoord); + half4 imageColor = (half4)TEXTURE_SAMPLE(@imageTexture, imageSampler, v_texCoord); half meshCoverage = 1.; #ifdef @DRAW_IMAGE_RECT meshCoverage = min(v_edgeCoverage, meshCoverage); @@ -611,7 +611,7 @@ meshCoverage = min(meshCoverage, clipCoverage); } #endif // ENABLE_CLIPPING - imageColor.a *= meshCoverage * imageDrawUniforms.opacity; + imageColor.a *= meshCoverage * (half)imageDrawUniforms.opacity; #ifdef @ENABLE_ADVANCED_BLEND if (lastColor.a != .0 || imageColor.a != .0)
diff --git a/renderer/shaders/draw_path.glsl b/renderer/shaders/draw_path.glsl index 8b4909d..bad28e3 100644 --- a/renderer/shaders/draw_path.glsl +++ b/renderer/shaders/draw_path.glsl
@@ -360,7 +360,7 @@ half coverage = abs(coverageCount); #ifdef @ENABLE_EVEN_ODD if (v_pathID < .0 /*even-odd*/) - coverage = 1. - abs(fract(coverage * .5) * 2. + -1.); + coverage = 1. - (half)abs(fract(coverage * .5) * 2. + -1.); #endif coverage = min(coverage, make_half(1)); // This also caps stroke coverage, which can be >1.
diff --git a/renderer/shaders/draw_path_common.glsl b/renderer/shaders/draw_path_common.glsl index 2d4d088..807455f 100644 --- a/renderer/shaders/draw_path_common.glsl +++ b/renderer/shaders/draw_path_common.glsl
@@ -291,7 +291,7 @@ float2x2 M = make_float2x2(uintBitsToFloat(STORAGE_BUFFER_LOAD4(@pathBuffer, o_pathID * 2u))); uint4 pathData = STORAGE_BUFFER_LOAD4(@pathBuffer, o_pathID * 2u + 1u); float2 translate = uintBitsToFloat(pathData.xy); - o_windingWeight = float(floatBitsToInt(triangleVertex.z) >> 16) * sign(determinant(M)); + o_windingWeight = half(floatBitsToInt(triangleVertex.z) >> 16) * (half)sign(determinant(M)); return MUL(M, triangleVertex.xy) + translate; } #endif // @DRAW_INTERIOR_TRIANGLES
diff --git a/renderer/shaders/hlsl.glsl b/renderer/shaders/hlsl.glsl index e741a57..eeea827 100644 --- a/renderer/shaders/hlsl.glsl +++ b/renderer/shaders/hlsl.glsl
@@ -43,22 +43,22 @@ #endif $typedef float3 packed_float3; -#define make_half float -#define make_half2 float2 -#define make_half3 float3 -#define make_half4 float4 +#define make_half half +#define make_half2 half2 +#define make_half3 half3 +#define make_half4 half4 -$typedef $min16int short; -#define make_short $min16int -#define make_short2 $min16int2 -#define make_short3 $min16int3 -#define make_short4 $min16int4 +$typedef $int short; +#define make_short $int +#define make_short2 $int2 +#define make_short3 $int3 +#define make_short4 $int4 -$typedef $min16uint ushort; -#define make_ushort $min16uint -#define make_ushort2 $min16uint2 -#define make_ushort3 $min16uint3 -#define make_ushort4 $min16uint4 +$typedef $uint ushort; +#define make_ushort $uint +#define make_ushort2 $uint2 +#define make_ushort3 $uint3 +#define make_ushort4 $uint4 #define make_half3x4 $half3x4 @@ -306,7 +306,7 @@ INLINE half4 unpackUnorm4x8(uint u) { uint4 vals = uint4(u & 0xffu, (u >> 8) & 0xffu, (u >> 16) & 0xffu, u >> 24); - return float4(vals) * (1. / 255.); + return half4(vals) * (1. / 255.); } INLINE uint packUnorm4x8(half4 color)