[OpenJDK 2D-Dev] <Swing Dev> [14] RFR: JDK-8223158: Docked MacBook cannot start any Java Swing applications
Philip Race
philip.race at oracle.com
Fri Oct 11 13:39:06 UTC 2019
Ok by me.
-phil
On 10/10/19, 11:34 PM, Prasanta Sadhukhan wrote:
> Hi Phil, Sergey
>
> Then, is http://cr.openjdk.java.net/~psadhukhan/8223158/webrev.2/ good
> to check-in?
>
> Regards
> Prasanta
> On 11-Oct-19 2:28 AM, Sergey Bylokhov wrote:
>> On 10/10/19 1:35 pm, Phil Race wrote:
>>> > I guess at a minimum we can align this list to the list used by
>>> the JavaFX.
>>>
>>> If by the minimum you mean make the list as short as possible that
>>> is probably OK
>>> but if you want the lowest risk fix you want the minimum change :-)
>>>
>>> I'd prefer to do the latter right now.
>>
>> I am fine, I can drop them in JDK-8232086 and do not backport it to
>> 11 for some amount of time.
>>
>>>
>>> -phil.
>>>
>>> On 10/10/19 12:14 PM, Sergey Bylokhov wrote:
>>>> On 10/9/19 11:05 pm, Prasanta Sadhukhan wrote:
>>>>>> In that case, OK. this simplifies things, but I still don't
>>>>>> understand why
>>>>>> when what we are doing looks to be correct that the call fails.
>>>>>>
>>>>> I do not have any definite answer to this but it seems getting
>>>>> display mask from DisplayLink driver for a docked display might be
>>>>> wrong so |NSOpenGLPixelFormat#init fails as that mask is probably
>>>>> not supported.|
>>>>
>>>> I just got the similar bug:
>>>> https://bugs.openjdk.java.net/browse/JDK-8232086
>>>>
>>>> I cannot reproduce that, but I guess the reason is the same, so I
>>>> looked to the list
>>>> of requirements and I think that some of them are unused as well.
>>>> NSOpenGLPFAWindow - is not needed because we never render to the
>>>> window directly.
>>>> NSOpenGLPFAPixelBuffer - is not needed because we never render to
>>>> the pixel buffer.
>>>> NSOpenGLPFADoubleBuffer - we use our own texture as a backbuffer
>>>>
>>>> I guess at a minimum we can align this list to the list used by the
>>>> JavaFX.
>>>>
>>>>
>>>>>
>>>>> |Regards|
>>>>> |Prasanta
>>>>> |
>>>>>> -phil.
>>>>>>
>>>>>> On 10/9/19 1:06 AM, Prasanta Sadhukhan wrote:
>>>>>>> Hi Sergey,
>>>>>>>
>>>>>>> On 27-Sep-19 2:58 AM, Sergey Bylokhov wrote:
>>>>>>>> Hi, Prasanta.
>>>>>>>> On 9/25/19 11:13 pm, Prasanta Sadhukhan wrote:
>>>>>>>>>> 2) I guess we don't need to free "attrs" or "attrs1" since it
>>>>>>>>>> is stack allocated ..
>>>>>>>>>> Unfortunate that we have to repeat the entire initialisation
>>>>>>>>>> minus glMask.
>>>>>>>>>> Can you think of a better way to do this ?
>>>>>>>>>>
>>>>>>>>> As per
>>>>>>>>> https://developer.apple.com/documentation/appkit/nsopenglpixelformat/1436219-initwithattributes?language=objc
>>>>>>>>>
>>>>>>>>> |/* Check if initWithAttributes succeeded. */ if(pixFmt ==
>>>>>>>>> nil) { /* initWithAttributes failed. Try to alloc/init with a
>>>>>>>>> different list of attributes. */ } it is appropriate to try
>>>>>>>>> with another list, which is what I tried here. Regards Prasanta |
>>>>>>>>
>>>>>>>> NSOpenGLPFAScreenMask attribute and its usage it is quite
>>>>>>>> interesting. It is used only once
>>>>>>>> mostly at startup to initialize the "sharedPixelFormat" and
>>>>>>>> "sharedContext". Later we create
>>>>>>>> context per GraphicsConfig on top of these "sharedPixelFormat"
>>>>>>>> and "sharedContext".
>>>>>>>>
>>>>>>>> In the single monitor configuration this logic is clear, we
>>>>>>>> request "sharedPixelFormat"
>>>>>>>> which supports "NSOpenGLPFAScreenMask" for the main display and
>>>>>>>> it just work.
>>>>>>>>
>>>>>>>> But how it should work when the new screen will be attached
>>>>>>>> dynamically, and/or old
>>>>>>>> screen for which we requested NSOpenGLPFAScreenMask will be
>>>>>>>> detached.
>>>>>>>>
>>>>>>>> For example in the test case for this bug:
>>>>>>>> - If the screen via dock is attached before start of the app,
>>>>>>>> we get an exception because
>>>>>>>> we cannot initialize the "sharedContext".
>>>>>>>> - If the screen via dock is attached after start of the app,
>>>>>>>> it works, right?
>>>>>>>>
>>>>>>> Yes, since we do not have the required docked hardware, had to
>>>>>>> ask customer to test this and they confirm app does work if
>>>>>>> screen via dock is attached after they start the app.
>>>>>>>>
>>>>>>>> It looks like we "ignore" this attribute most of the time in
>>>>>>>> the multi-monitor config,
>>>>>>>> probably we can drop if completely?
>>>>>>>>
>>>>>>> Modified webrev ignoring this NSOpenGLPFAScreenMask attribute.
>>>>>>> Normal working on primary display is not affected and I have
>>>>>>> given a fix to the customer to test in their environment and
>>>>>>> they confirmed it is working for them with external monitor.
>>>>>>>
>>>>>>> http://cr.openjdk.java.net/~psadhukhan/8223158/webrev.2/
>>>>>>>
>>>>>>> Regards
>>>>>>> Prasanta
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> -phil.
>>>>>>>>>>
>>>>>>>>>> On 9/25/19, 3:49 AM, Prasanta Sadhukhan wrote:
>>>>>>>>>>>
>>>>>>>>>>> Hi All,
>>>>>>>>>>>
>>>>>>>>>>> Please review a fix for an issue where it is seen that if a
>>>>>>>>>>> MacBookPro is attached to an external monitor via dock and
>>>>>>>>>>> macbook lid is closed,
>>>>>>>>>>> no Java swing applications will start.
>>>>>>>>>>>
>>>>>>>>>>> It was found
>>>>>>>>>>> GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration()
>>>>>>>>>>> is returning null in this particular setup.
>>>>>>>>>>>
>>>>>>>>>>> Since it was difficult to reproduce locally, enabling
>>>>>>>>>>> tracing reveals that CGLGraphicsConfig#getCGLConfigInfo()
>>>>>>>>>>> was failing in NSOpenGLPixelFormat.initWithAttributes()
>>>>>>>>>>>
>>>>>>>>>>> Appkit documentation
>>>>>>>>>>> https://developer.apple.com/documentation/appkit/nsopenglpixelformat/1436219-initwithattributes?language=objc
>>>>>>>>>>> says that it will return "|nil| if an object with the
>>>>>>>>>>> desired attributes could not be initialized".
>>>>>>>>>>> Now, when the main display is closed, the
>>>>>>>>>>> CGDisplayIDToOpenGLDisplayMask(displayID)
>>>>>>>>>>> is returning 2 as glMask which when passed as an attribute
>>>>>>>>>>> to NSOpenGLPixelFormat, it fails to initialize.
>>>>>>>>>>> Normally, with main Display being used, glMask is 1.
>>>>>>>>>>>
>>>>>>>>>>> Proposed fix is to see if first initialization fails, then
>>>>>>>>>>> retry initialization without the offending glMask value for
>>>>>>>>>>> NSOpenGLPFAScreenMask attributes,
>>>>>>>>>>> as documentation
>>>>>>>>>>> https://developer.apple.com/documentation/appkit/1436213-opengl_pixel_format_attributes/nsopenglpfascreenmask?language=objc
>>>>>>>>>>> says "All screens specified in the bit mask are guaranteed
>>>>>>>>>>> to be supported by the pixel format.", so if it is not
>>>>>>>>>>> guranteed to be supported, initAttributes() might fail.
>>>>>>>>>>>
>>>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8223158
>>>>>>>>>>>
>>>>>>>>>>> webrev:
>>>>>>>>>>> http://cr.openjdk.java.net/~psadhukhan/8223158/webrev.0/
>>>>>>>>>>>
>>>>>>>>>>> Regards
>>>>>>>>>>> Prasanta
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>>>
>>>
>>
>>
More information about the 2d-dev
mailing list