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)