diff options
author | Stuart Carnie <stuart.carnie@gmail.com> | 2024-09-20 15:11:08 +1000 |
---|---|---|
committer | Stuart Carnie <stuart.carnie@gmail.com> | 2024-09-20 15:16:31 +1000 |
commit | e826ab9ba90595007b698df36622b725697ec26c (patch) | |
tree | c5275070a288b5fa63cb2cb05fb455a6424e34e6 /drivers | |
parent | 0a4aedb36065f66fc7e99cb2e6de3e55242f9dfb (diff) | |
download | redot-engine-e826ab9ba90595007b698df36622b725697ec26c.tar.gz |
[2D,Metal]: Fix subpixel blending; fix inconsistent blend state in Metal
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/metal/metal_objects.h | 7 | ||||
-rw-r--r-- | drivers/metal/metal_objects.mm | 4 |
2 files changed, 11 insertions, 0 deletions
diff --git a/drivers/metal/metal_objects.h b/drivers/metal/metal_objects.h index 97f33bb1e8..030b353ee8 100644 --- a/drivers/metal/metal_objects.h +++ b/drivers/metal/metal_objects.h @@ -318,6 +318,13 @@ public: dirty.set_flag(DirtyFlag::DIRTY_UNIFORMS); } + _FORCE_INLINE_ void mark_blend_dirty() { + if (!blend_constants.has_value()) { + return; + } + dirty.set_flag(DirtyFlag::DIRTY_BLEND); + } + MTLScissorRect clip_to_render_area(MTLScissorRect p_rect) const { uint32_t raLeft = render_area.position.x; uint32_t raRight = raLeft + render_area.size.width; diff --git a/drivers/metal/metal_objects.mm b/drivers/metal/metal_objects.mm index d3c3d2b232..1d08a10781 100644 --- a/drivers/metal/metal_objects.mm +++ b/drivers/metal/metal_objects.mm @@ -143,6 +143,9 @@ void MDCommandBuffer::bind_pipeline(RDD::PipelineID p_pipeline) { if (render.pipeline != nullptr && render.pipeline->depth_stencil != rp->depth_stencil) { render.dirty.set_flag(RenderState::DIRTY_DEPTH); } + if (rp->raster_state.blend.enabled) { + render.dirty.set_flag(RenderState::DIRTY_BLEND); + } render.pipeline = rp; } } else if (p->type == MDPipelineType::Compute) { @@ -301,6 +304,7 @@ void MDCommandBuffer::render_clear_attachments(VectorView<RDD::AttachmentClear> render.mark_viewport_dirty(); render.mark_scissors_dirty(); render.mark_vertex_dirty(); + render.mark_blend_dirty(); } void MDCommandBuffer::_render_set_dirty_state() { |