Metal: Implement ANGLE_polygon_mode

Bug: angleproject:1791
Change-Id: Iea1e10751ad8e853b4fb209952488211cfa4bac4
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4497909
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
diff --git a/src/libANGLE/renderer/metal/ContextMtl.h b/src/libANGLE/renderer/metal/ContextMtl.h
index 3e06039..0f99bce 100644
--- a/src/libANGLE/renderer/metal/ContextMtl.h
+++ b/src/libANGLE/renderer/metal/ContextMtl.h
@@ -496,7 +496,6 @@
     void updateScissor(const gl::State &glState);
     void updateCullMode(const gl::State &glState);
     void updateFrontFace(const gl::State &glState);
-    void updateDepthBias(const gl::State &glState);
     void updateDrawFrameBufferBinding(const gl::Context *context);
     void updateProgramExecutable(const gl::Context *context);
     void updateVertexArray(const gl::Context *context);
@@ -536,6 +535,7 @@
         DIRTY_BIT_SCISSOR,
         DIRTY_BIT_DRAW_FRAMEBUFFER,
         DIRTY_BIT_CULL_MODE,
+        DIRTY_BIT_FILL_MODE,
         DIRTY_BIT_WINDING,
         DIRTY_BIT_RENDER_PIPELINE,
         DIRTY_BIT_UNIFORM_BUFFERS_BINDING,
diff --git a/src/libANGLE/renderer/metal/ContextMtl.mm b/src/libANGLE/renderer/metal/ContextMtl.mm
index 0b5efd4..8eefe80 100644
--- a/src/libANGLE/renderer/metal/ContextMtl.mm
+++ b/src/libANGLE/renderer/metal/ContextMtl.mm
@@ -1273,7 +1273,7 @@
                 break;
             case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
             case gl::State::DIRTY_BIT_POLYGON_OFFSET:
-                updateDepthBias(glState);
+                mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
                 break;
             case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
                 mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD);
@@ -1402,6 +1402,13 @@
             case gl::State::EXTENDED_DIRTY_BIT_DEPTH_CLAMP_ENABLED:
                 mDirtyBits.set(DIRTY_BIT_DEPTH_CLIP_MODE);
                 break;
+            case gl::State::EXTENDED_DIRTY_BIT_POLYGON_MODE:
+                mDirtyBits.set(DIRTY_BIT_FILL_MODE);
+                mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
+                break;
+            case gl::State::EXTENDED_DIRTY_BIT_POLYGON_OFFSET_LINE_ENABLED:
+                mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
+                break;
             default:
                 break;
         }
@@ -2178,11 +2185,6 @@
     mDirtyBits.set(DIRTY_BIT_WINDING);
 }
 
-void ContextMtl::updateDepthBias(const gl::State &glState)
-{
-    mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
-}
-
 // Index rewrite is required if:
 // Provkoing vertex mode is 'last'
 // Program has at least one 'flat' attribute
@@ -2583,6 +2585,11 @@
             case DIRTY_BIT_CULL_MODE:
                 mRenderEncoder.setCullMode(mCullMode);
                 break;
+            case DIRTY_BIT_FILL_MODE:
+                mRenderEncoder.setTriangleFillMode(mState.getPolygonMode() == gl::PolygonMode::Fill
+                                                       ? MTLTriangleFillModeFill
+                                                       : MTLTriangleFillModeLines);
+                break;
             case DIRTY_BIT_WINDING:
                 mRenderEncoder.setFrontFacingWinding(mWinding);
                 break;
@@ -2638,7 +2645,7 @@
         angle::Bit<size_t>(DIRTY_BIT_DEPTH_BIAS) | angle::Bit<size_t>(DIRTY_BIT_STENCIL_REF) |
         angle::Bit<size_t>(DIRTY_BIT_BLEND_COLOR) | angle::Bit<size_t>(DIRTY_BIT_VIEWPORT) |
         angle::Bit<size_t>(DIRTY_BIT_SCISSOR) | angle::Bit<size_t>(DIRTY_BIT_CULL_MODE) |
-        angle::Bit<size_t>(DIRTY_BIT_WINDING);
+        angle::Bit<size_t>(DIRTY_BIT_FILL_MODE) | angle::Bit<size_t>(DIRTY_BIT_WINDING);
 
     mDirtyBits &= ~kUnneededBits;
 }
@@ -2843,7 +2850,7 @@
 {
     const gl::RasterizerState &rasterState = mState.getRasterizerState();
     ASSERT(mRenderEncoder.valid());
-    if (!mState.isPolygonOffsetFillEnabled())
+    if (!mState.isPolygonOffsetEnabled())
     {
         mRenderEncoder.setDepthBias(0, 0, 0);
     }
diff --git a/src/libANGLE/renderer/metal/DisplayMtl.mm b/src/libANGLE/renderer/metal/DisplayMtl.mm
index 264291c..202bd3f 100644
--- a/src/libANGLE/renderer/metal/DisplayMtl.mm
+++ b/src/libANGLE/renderer/metal/DisplayMtl.mm
@@ -929,6 +929,7 @@
     mNativeExtensions.framebufferBlitANGLE          = true;
     mNativeExtensions.framebufferBlitNV             = true;
     mNativeExtensions.framebufferMultisampleANGLE   = true;
+    mNativeExtensions.polygonModeANGLE              = true;
     mNativeExtensions.polygonOffsetClampEXT         = true;
     mNativeExtensions.stencilTexturingANGLE         = true;
     mNativeExtensions.copyTextureCHROMIUM           = true;