unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Third <alan@idiocy.org>
To: Aaron Jensen <aaronjensen@gmail.com>
Cc: Po Lu <luangruo@yahoo.com>, Kai Ma <justksqsf@gmail.com>,
	Eli Zaretskii <eliz@gnu.org>,
	63187@debbugs.gnu.org
Subject: bug#63187: 30.0.50; Tail of longer lines painted after end of nearby lines on macOS
Date: Sat, 24 Jun 2023 22:29:54 +0100	[thread overview]
Message-ID: <ZJdgUkcSDw7QXPGk@idiocy.org> (raw)
In-Reply-To: <CAHyO48yBuUyeKnK8VbAcuAQBDnP=7HOyNT6ZhhdSJ38=XiU5yg@mail.gmail.com>

On Sat, Jun 24, 2023 at 12:05:45PM -0400, Aaron Jensen wrote:
> > But if that's the case, why would removing the asynchronous call to
> > getContext fix so many problems?
> 
> It's possible we have two very different problems that only appear related:
> 1. The one i'm seeing, which is sort of ghosting of other lines into
> the whitespace of nearby lines. The getContext call removal did not
> fix this for me, I saw it happen once.
> 2. The one Kai is seeing, that is exacerbated by decreasing the
> polling interval, but seems to be helped by removing the getContext
> call.

Yes, it might be two different things.

> > Something perhaps worth trying... Since removing the asynchronous call
> > to getContext fixes the problems, perhaps we need to think about the
> > "lazy" way we get the next buffer when the current one is displayed.
> > At the moment it just forgets about it until we want to draw to the
> > screen, at which point we call getContext and it creates the buffer if
> > necessary and copies the old one to the new one.
> >
> > Maybe we should get the new buffer and do the copy when we set the
> > current buffer for display...
> >
> > IIRC I avoided that because there isn't always time for the buffer to
> > have been sent to VRAM and unlocked before the *next* call to display,
> > so I wanted to leave it as long as possible between display and
> > getting the next buffer, but maybe this is just the wrong way to do
> > it.
> >
> > So I suppose putting a call to getContext right after "currentSurface
> > == NULL" in display might be a quick and dirty way to test that.
> 
> My problem is that at this point it happens so infrequently and I have
> no idea if that's because of the patches I'm trying or some other
> environmental thing or just luck. I'm going to try running without the
> async getContext and without the setNeedsDisplay for a while and see
> if it happens. Perhaps the setNeedsDisplay is somehow causing an issue
> and that's why changing it from source to dest seemed to help but it
> didn't alleviate it.

OK

> If I see it again, I'll add the sync getContext call in, though I'll
> admit I do not understand your paragraph above starting with IIRC. Are
> you suspecting a potential problem with reading from the surface that
> is in the process of being copied to vram?

Maybe... I'm really not sure what might be going on.

My suspicion is that if we try to swap between the buffers too fast,
something is going wrong between the process of flushing the drawing
to the pixel buffer and copying the pixel buffer to the next one.

So, we have two buffers, A and B. We draw to A, but before we're done
the system calls display. We send off the incomplete buffer A to VRAM,
and then take a copy of that incomplete buffer for B. At some point
the system decides to flush the graphics context to the buffer, but
it's flushing to A, and we've *already* copied A to B.

This would possibly explain why Kai lowering the polling interval
induces the issue, as it may increase the frequency at which the
screen is updated beyond the point where we're able to keep up.

To be honest though, I feel it should all be pretty linear and this
idea implies things are happening out-of-order. So I'm not convinced
I'm right.


Who knows. Maybe all we need to do is make sure we don't try to draw
to the screen while emacs is drawing to the buffer... Something like
this:

modified src/nsterm.m @@ -10622,7 +10622,7 @@ - (void) display
 {
   NSTRACE_WHEN (NSTRACE_GROUP_FOCUS, "[EmacsLayer display]");
 
-  if (context)
+  if (context && context != [NSGraphicsContext currentContext])
     {
       [self releaseContext];


...

Actually...

That change should probably be made anyway. If the NS run loop kicks
in between an ns_focus call and an ns_unfocus call, it could call
display and our display function will happily destroy the existing
context without creating a new one, so any *subsequent* drawing
operations, up until ns_unfocus, will be lost.

I'm not sure if that's a legitimate concern... 😕


I've got too many ideas about how to fix it and no way to actually try
them out, never mind the difficulty of inducing the issue if I did.

-- 
Alan Third





  reply	other threads:[~2023-06-24 21:29 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <m2fs8histt.fsf@gmail.com>
2023-04-30 10:33 ` bug#63187: 30.0.50; Tail of longer lines painted after end of nearby lines on macOS Eli Zaretskii
2023-04-30 10:46   ` Aaron Jensen
2023-04-30 13:25 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-04-30 14:25   ` Aaron Jensen
2023-04-30 14:42     ` Eli Zaretskii
2023-04-30 14:57       ` Aaron Jensen
2023-04-30 15:26         ` Eli Zaretskii
2023-04-30 16:48           ` Aaron Jensen
2023-04-30 19:04             ` Eli Zaretskii
2023-04-30 23:58     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-01 12:40       ` Eli Zaretskii
2023-05-01 13:18         ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-01 13:25           ` Eli Zaretskii
2023-05-01 13:47             ` Aaron Jensen
2023-05-01 13:52               ` Eli Zaretskii
2023-05-01 13:55                 ` Aaron Jensen
2023-05-01 14:06                   ` Aaron Jensen
2023-05-09  3:07               ` Aaron Jensen
2023-05-09  5:39                 ` Eli Zaretskii
2023-05-13 13:54                   ` Eli Zaretskii
2023-05-13 14:23                     ` Aaron Jensen
2023-05-18 11:21                       ` Eli Zaretskii
2023-05-18 15:59                         ` Aaron Jensen
2023-06-08  5:40                           ` Kai Ma
2023-06-08  7:33                             ` Kai Ma
2023-06-08 12:51                               ` Alan Third
2023-06-08 13:42                                 ` Kai Ma
2023-06-08 14:57                                   ` Kai Ma
2023-06-08 17:22                                     ` Alan Third
2023-06-09  2:42                                       ` Kai Ma
2023-06-09  2:47                                         ` Aaron Jensen
2023-06-09  3:12                                           ` Kai Ma
2023-06-09 18:27                                             ` Alan Third
2023-06-09 18:46                                               ` Aaron Jensen
2023-06-09 20:00                                                 ` Alan Third
2023-06-12 13:04                                                   ` Aaron Jensen
2023-06-16  2:17                                                     ` Aaron Jensen
2023-06-19 15:46                                                       ` Aaron Jensen
2023-06-24  4:17                                                         ` Kai Ma
2023-06-24 13:34                                                           ` Aaron Jensen
2023-06-24 14:14                                                             ` Alan Third
2023-06-24 14:52                                                               ` Aaron Jensen
2023-06-24 15:08                                                                 ` Eli Zaretskii
2023-06-24 15:41                                                                 ` Alan Third
2023-06-24 16:05                                                                   ` Aaron Jensen
2023-06-24 21:29                                                                     ` Alan Third [this message]
2023-06-24 21:43                                                                       ` Aaron Jensen
2023-06-25 12:46                                                                         ` Alan Third
2023-06-25 17:07                                                                           ` Aaron Jensen
2023-06-25 18:17                                                                             ` Alan Third
2023-06-25 19:07                                                                               ` Aaron Jensen
2023-06-25 21:18                                                                                 ` Alan Third
2023-06-25 22:33                                                                                   ` Aaron Jensen
2023-06-26  7:27                                                                           ` Kai Ma
2023-06-28 19:53                                                                             ` Alan Third
2023-07-21  2:02                                                                               ` Aaron Jensen
2023-07-23 11:20                                                                                 ` Alan Third
2023-07-23 13:01                                                                                   ` Aaron Jensen
2023-07-25 14:47                                                                                     ` Aaron Jensen
2023-07-25 15:45                                                                                       ` Eli Zaretskii
2023-06-23  8:48                                                       ` Alan Third
2023-06-23 11:54                                                         ` Aaron Jensen
2023-05-01 17:26             ` Alan Third
2023-05-01 22:40               ` Aaron Jensen
2023-05-02 10:14                 ` Alan Third
2023-05-02 12:21                   ` Eli Zaretskii
2023-05-02 22:36                     ` Alan Third
2023-05-03  8:11                       ` Daniel Martín via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-03 13:08                       ` Eli Zaretskii
2023-05-02  0:07               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-02  0:32                 ` Aaron Jensen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZJdgUkcSDw7QXPGk@idiocy.org \
    --to=alan@idiocy.org \
    --cc=63187@debbugs.gnu.org \
    --cc=aaronjensen@gmail.com \
    --cc=eliz@gnu.org \
    --cc=justksqsf@gmail.com \
    --cc=luangruo@yahoo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).