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;