Hi,

I took a look at the wgl code and I think the problem is that MakeCurrent fails if the pixel format of the context and the pbuffer don't match. The main window is double-buffered, so I guess the context is also double-buffered, but the pbuffers are single-buffered and they have no depth or stencil buffers. I had a similar problem with KOTOR on Linux (Wine), and the solution was to relax this restriction, see commit aad8707b288b03b26c1afde8b6280674e327115d.

TBH I still don't fully understand why the context has to have a pixelformat/visual at all. Originally I wanted to get rid of it in my KOTOR patch series, but Ian explained that ES compatibility and configless contexts require some magic, so ctx->Visual had to stay.

MM

On 27/03/17 12:33, Jose Fonseca wrote:
The trace shows are a lot of wgl calls failing:

$ apitrace dump swkotor_s3tc.trace | grep wgl.*FALSE | grep -v wglChoosePixelFormatARB
499 wglMakeCurrent(hdc = 0x50010fe2, hglrc = 0x20000) = FALSE
510 wglMakeCurrent(hdc = 0xc20117ba, hglrc = 0x20000) = FALSE
521 wglMakeCurrent(hdc = 0x3e010301, hglrc = 0x20000) = FALSE
532 wglMakeCurrent(hdc = 0xb50102b3, hglrc = 0x20000) = FALSE
543 wglMakeCurrent(hdc = 0x77010ecb, hglrc = 0x20000) = FALSE
554 wglMakeCurrent(hdc = 0xe60107d1, hglrc = 0x20000) = FALSE
565 wglMakeCurrent(hdc = 0xcf010af3, hglrc = 0x20000) = FALSE
1414888 wglMakeContextCurrentARB(hDrawDC = 0xb50102b3, hReadDC = 0xb50102b3, hglrc = 0x20000) = FALSE 1414972 wglMakeContextCurrentARB(hDrawDC = 0x3e010301, hReadDC = 0x3e010301, hglrc = 0x20000) = FALSE
1414987 wglBindTexImageARB(hPbuffer = 0xc1ddb8, iBuffer = 8323) = FALSE
1415013 wglMakeContextCurrentARB(hDrawDC = 0xc20117ba, hReadDC = 0xc20117ba, hglrc = 0x20000) = FALSE
1415028 wglBindTexImageARB(hPbuffer = 0xc1dc50, iBuffer = 8323) = FALSE
1415054 wglMakeContextCurrentARB(hDrawDC = 0x50010fe2, hReadDC = 0x50010fe2, hglrc = 0x20000) = FALSE
1415069 wglBindTexImageARB(hPbuffer = 0xc1db60, iBuffer = 8323) = FALSE
1415119 wglMakeContextCurrentARB(hDrawDC = 0xe60107d1, hReadDC = 0xe60107d1, hglrc = 0x20000) = FALSE
1415134 wglBindTexImageARB(hPbuffer = 0xc1dcc8, iBuffer = 8323) = FALSE
1415142 wglBindTexImageARB(hPbuffer = 0xc1dcc8, iBuffer = 8323) = FALSE
1415150 wglBindTexImageARB(hPbuffer = 0xc1dcc8, iBuffer = 8323) = FALSE
1415158 wglBindTexImageARB(hPbuffer = 0xc1dcc8, iBuffer = 8323) = FALSE
1415547 wglBindTexImageARB(hPbuffer = 0xc1dbd8, iBuffer = 8323) = FALSE

In particular, failing wglMakeCurrent/wglMakeContextCurrentARB means that the following GL calls are not with no GL context bound what so ever. This would cause a segfault on Linux, but Microsoft OPENGL32.DLL will chug along, simply all those calls.

Howwever this also means all glGet* calls return Garbagge:

$ apitrace dump -v -v swkotor_s3tc.trace  | tail -25
1419691 glGetError() = GL_NO_ERROR
1419692 glGetIntegerv(pname = GL_UNPACK_ROW_LENGTH, params = &0)
1419693 glGetError() = GL_NO_ERROR
1419694 glGetIntegerv(pname = GL_UNPACK_SKIP_ROWS, params = &0)
1419695 glGetError() = GL_NO_ERROR
1419696 glGetIntegerv(pname = GL_UNPACK_SKIP_PIXELS, params = &0)
1419697 glGetError() = GL_NO_ERROR
1419698 glGetIntegerv(pname = GL_UNPACK_LSB_FIRST, params = &0)
1419699 glGetError() = GL_NO_ERROR
1419700 glGetIntegerv(pname = GL_UNPACK_SWAP_BYTES, params = &0)
1419701 glGetError() = GL_NO_ERROR
1419702 glGetIntegerv(pname = GL_PACK_ALIGNMENT, params = &0)
1419703 glGetError() = GL_NO_ERROR
1419704 glGetIntegerv(pname = GL_PACK_ROW_LENGTH, params = &0)
1419705 glGetError() = GL_NO_ERROR
1419706 glGetIntegerv(pname = GL_PACK_SKIP_ROWS, params = &0)
1419707 glGetError() = GL_NO_ERROR
1419708 glGetIntegerv(pname = GL_PACK_SKIP_PIXELS, params = &0)
1419709 glGetError() = GL_NO_ERROR
1419710 glGetIntegerv(pname = GL_PACK_LSB_FIRST, params = &0)
1419711 glGetError() = GL_NO_ERROR
1419712 glGetIntegerv(pname = GL_PACK_SWAP_BYTES, params = &0)
1419713 glGetError() = GL_NO_ERROR
1419714 glGetIntegerv(pname = GL_MAX_TEXTURE_SIZE, params = &0)
1419715 glGetError() = GL_NO_ERROR

And that's why GLU crashes with division by zero.


In short, I would almost bet that if you get wglMake*Current* to work without failing, the zero glGets and the GLU division by zero will go away.


And looking at the traces, it looks like it might be related to PBuffers

498 wglGetPbufferDCARB(hPbuffer = 0xc1dcc8) = 0x50010fe2
499 wglMakeCurrent(hdc = 0x50010fe2, hglrc = 0x20000) = FALSE
500 glGenTextures(n = 1, textures = &0)
--
509 wglGetPbufferDCARB(hPbuffer = 0xc1db60) = 0xc20117ba
510 wglMakeCurrent(hdc = 0xc20117ba, hglrc = 0x20000) = FALSE
511 glGenTextures(n = 1, textures = &0)
--
520 wglGetPbufferDCARB(hPbuffer = 0xc1dc50) = 0x3e010301
521 wglMakeCurrent(hdc = 0x3e010301, hglrc = 0x20000) = FALSE
522 glGenTextures(n = 1, textures = &0)
--
531 wglGetPbufferDCARB(hPbuffer = 0xc1ddb8) = 0xb50102b3
532 wglMakeCurrent(hdc = 0xb50102b3, hglrc = 0x20000) = FALSE
533 glGenTextures(n = 1, textures = &0)
--
542 wglGetPbufferDCARB(hPbuffer = 0xc1df98) = 0x77010ecb
543 wglMakeCurrent(hdc = 0x77010ecb, hglrc = 0x20000) = FALSE
544 glGenTextures(n = 1, textures = &0)
--
553 wglGetPbufferDCARB(hPbuffer = 0xc1dbd8) = 0xe60107d1
554 wglMakeCurrent(hdc = 0xe60107d1, hglrc = 0x20000) = FALSE
555 glGenTextures(n = 1, textures = &0)
--
564 wglGetPbufferDCARB(hPbuffer = 0x5587760) = 0xcf010af3
565 wglMakeCurrent(hdc = 0xcf010af3, hglrc = 0x20000) = FALSE
566 glGenTextures(n = 1, textures = &0)
--
1414887 glEnable(cap = GL_BLEND)
1414888 wglMakeContextCurrentARB(hDrawDC = 0xb50102b3, hReadDC = 0xb50102b3, hglrc = 0x20000) = FALSE
1414889 glDrawBuffer(mode = GL_FRONT)
--
1414971 wglMakeContextCurrentARB(hDrawDC = 0x120105bd, hReadDC = 0x120105bd, hglrc = 0x20000) = TRUE 1414972 wglMakeContextCurrentARB(hDrawDC = 0x3e010301, hReadDC = 0x3e010301, hglrc = 0x20000) = FALSE
1414973 glEnable(cap = GL_BLEND)
--
1415012 glFlush()
1415013 wglMakeContextCurrentARB(hDrawDC = 0xc20117ba, hReadDC = 0xc20117ba, hglrc = 0x20000) = FALSE
1415014 glEnable(cap = GL_BLEND)
--
1415053 glFlush()
1415054 wglMakeContextCurrentARB(hDrawDC = 0x50010fe2, hReadDC = 0x50010fe2, hglrc = 0x20000) = FALSE
1415055 glEnable(cap = GL_BLEND)
--
1415118 glActiveTextureARB(texture = GL_TEXTURE0)
1415119 wglMakeContextCurrentARB(hDrawDC = 0xe60107d1, hReadDC = 0xe60107d1, hglrc = 0x20000) = FALSE
1415120 glEnable(cap = GL_BLEND)

I'm afraid I don't have time to install and repro SWKOTOR though. You'll have to attach the debugger during one of those failings make current calls and figure out why the failure.


Jose


On 27/03/17 06:47, Federico Dossena wrote:
Hi, thanks for the suggestions ;)

I was using opengl32.dll as a drop-in replacement. I followed your
instructions to properly load mesa as an opengl driver and got pretty
much the same crash, but on top of that, the game can't change the
resolution, only the desktop resolution seems to be available. As a side
effect, the nvidia driver did not like it and I had to reinstall it.

I got 2 traces for you: one is with s3tc compressed textures, and the
other one is with the uncompressed one, since the crash is slightly
different (divide by zero with uncompressed textures, null pointer with
s3tc ones, both inside glu32.dll).
https://drive.google.com/file/d/0B6qj91UlSYlYVi1zLVQtRUFJSVk/view?usp=sharing


I also tried to replace windows's opengl32.dll, just to see if changed
anything, no effect.

Let me know if there is anything else you want to try, or if you want a
copy of kotor.


Il 2017-03-27 00:08, Jose Fonseca ha scritto:
On 25/03/17 05:50, Federico Dossena wrote:
Hmm, that didn't work. Turning off GL_ATI_fragment_shader makes the game
glitch (see attached screenshot), forces framebuffer effects and soft
shadows to off, and makes the game look worse because the extension is
used for a lot of stuff like water, characters, and more.
Besides, the guy who implemented the extension (Miklos Mate I think it
was) did it specifically for KOTOR.

Just to be 100% sure, I would like to compile that GLU that you have in your repos, since the error is genrated inside windows's own glu32.dll,
it might work better with Mesa's. I can't find build instructions
though, what do I need besides mesa, make and gcc?

That's a dead end.  I never header anybody using anything but
Microsoft GLU32.DLL .  Even if I thought it was a worthwhile endeavor,
I have idea how to build it for Windows, or even if it can be built.
Probably nobody does.


If there's a divide by zero inside glu32.dll then probably that's
because Mesa is return zero where it shouldn't.


It might be worth trying to get an apitrace.  It should trace all
calls done by GLU32 -> OPENGL32.DLL, so you might find the odd one by
inspecting the calls immediately before the crash.


How are you using Mesa opengl32.dll?  Are you just putting it on the
same dir as the game?  I think that.

Most of the testing we do is via Microsoft OpenGL ICD interface:

            WGL                ICD
   APP.EXE ----> OPENGL32.DLL ---> DRIVER.DLL
                 (Microsoft)       Mesa


But when put Mesa's opengl32.dll into the game dir, you're actually
using Mesa's WGL -> ICD "shim", which is fairly imcomplete and not
throughly tests.


My recommendation is for you to crate a Windows VM without any 3D
enabled, then follow the mesa/doc/llvmpipe.html registry instructions
to use Mesa's opengl32.dll as an ICD driver.


Jose




Il 2017-03-24 22:42, Brian Paul ha scritto:
I'm going to re-post my recent wgl patches (verified to work now) for
review before committing to master.

Looking at some other notes in our code, there's another issue with
KOTOR.  Try setting the following env var:

MESA_EXTENSION_OVERRIDE=-GL_ATI_fragment_shader

The '-' means disable the GL_ATI_fragment_shader extension.

-Brian

On 03/16/2017 12:39 PM, Federico Dossena wrote:
I managed to fix the patch and apply it to mesa master, but I'm
getting
the same result as with my stub. The crash is still the same, in
glu32.dll, I wonder if the GLU that you guys have in your repo will
work
any better. I tried to crosscompile it but without luck, any
instructions?

Still, I want to thank all of you for helping me out on this one. I've
been fixing old games for years but this one has always been my
nemesis.


Il 2017-03-16 19:04, Brian Paul ha scritto:
Patch for implementing WGL_ARB_make_current_read attached.  I can’t
test it at the moment since I’m not near my Windows development
environment. Let me know what you find.

-Brian




On Mar 15, 2017, at 12:26 PM, Federico
Dossena<dossenu...@gmail.com>  wrote:

That's good, can't wait to see your implementation.

I have tried to simply return wglMakeCurrent(hReadDC,hglrc); but
then I get a crash in gluBuild2DMipmaps (not mesa, glu32.dll).
According to the specification, it should work, or at least draw
some glitches.
Looking at the parameters passed by the game to
wglMakeContextCurrentARB, I see that hReadDC and hDrawDC are the
same so I guess they intended to use it as a replacement for
wglMakeCurrent, but still, it's not working. So, does
wglMakeContextCurrentARB do something else in addition to that?


Il 2017-03-15 15:50, Jose Fonseca ha scritto:
VMware maintains a Windows OpenGL driver based off Mesa source.

We typically open source most of our modifications, but these
haven't been yet open sourced.  No particular reason I believe.
We've been just busy with other stuff.

The simplest shim would be to invoke wglMakeCurrent from
wglMakeContextCurrentARB, ignoring exttra arg.


Jose

On 15/03/17 14:31, Federico Dossena wrote:
Where can I find that implementation?

Also, is there an alternative to that function? As in a snippet
of code
that does the same thing and can be used to create a "shim"?
It's so old, I can barely find documentation about it...

On March 15, 2017 2:42:35 PM GMT+01:00, Jose Fonseca
<jfons...@vmware.com>  wrote:

    It looks like wglMakeContextCurrentARB too has been
implemented
    internally but not yet crossported.

    It's far from trivial (especially because Microsoft ICD
interface never
    was designed to allow implementations to provide alternative
    imlpementations of functions like wglMakeCurrent or
wglCreateContext)
    though in the way you're using it, it's less important, as
the original
    opengl32.dll is never used.

    I don't know how much effort / time it takes to crossport
this and other
    outstanding patches to master, but my guess is that it would
be more
    effective to wait a bit.

    Jose

    On 15/03/17 06:35, Federico Dossena wrote:

        I have created a simple stub for
wglMakeContextCurrentARB in
        stw_wgl.c
and stw_getprocaddress.c. It simply returns TRUE, but the
good
        thing is
        that now the game no longer crashes because the function
is missing!
        However I get a divide by zero in glu32.dll, presumably
because
        the stub
        doesn't do jack.
        I tried returning FALSE but the game has no fallback, it
just
        ignores
        the return values and assumes that everything is fine.

        From what I've seen, there is no need to override the
system's
        opengl32.dll like you did for
wglCreateContext/wglDeleteContext,
        so it
        shouldn't be too tricky to implement the function.
However, I
        can't seem
        to find any real documentation about what it's supposed
to do. I
        found
        this at
https://urldefense.proofpoint.com/v2/url?u=https-3A__www.khronos.org_registry_OpenGL_extensions_ARB_WGL-5FARB-5Fmake-5Fcurrent-5Fread.txt&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=SWh6lT89FsLAyTgJ-rsJ9RAojPix3V1ZDKyBjIR31pI&s=fUdpS5GuTWuLy5BFTEQD_f8_MfXcrh7ZeLWr6WDKvk0&e=

but it's pretty vague:

        The function wglMakeContextCurrentARB associates the
context <hglrc>
        with the device <hDrawDC> for draws and the device
<hReadDC> for
        reads. All subsequent OpenGL calls made by the calling
thread are
        drawn on the device identified by <hDrawDC> and read on
the device
        identified by <hReadDC>.

        How do I do that? Do I have to copy the frame buffer? Or
just the
        pointer? Or am I completely off road?


        Thanks for helping me out ;)



        Il 2017-03-14 03:44, Brian Paul ha scritto:

Looks like my KOTOR patch never made it to master. I'm
            attaching it
            below so you can try it. I should commit it master.
In any
            case, let
            me know if it helps.

            -Brian

            On 03/13/2017 10:55 AM, Federico Dossena wrote:

Hi Jose, thanks for replying, I've seen your name
inside
                many files in
                mesa ;)

                I have tried mesa master (previously I was using
17.0.1)
                but it still
                crashes for the same null pointer.
Do you have a link to that patch you've mentioned
for kotor?

                I have used apitrace and took traces of both the
nvidia
                driver (which
                runs kotor) and mesa (up until the crash).
                Here's a link to them:
https://urldefense.proofpoint.com/v2/url?u=https-3A__drive.google.com_file_d_0B6qj91UlSYlYa3dIM0FtaHNULW8_view-3Fusp-3Dsharing&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=SWh6lT89FsLAyTgJ-rsJ9RAojPix3V1ZDKyBjIR31pI&s=wIA0rhmz7LTqJQNdsTCWPhjT8WafJsNAPOxM5IYqZg0&e=


<https://urldefense.proofpoint.com/v2/url?u=https-3A__drive.google.com_file_d_0B6qj91UlSYlYa3dIM0FtaHNULW8_view-3Fusp-3Dsharing&d=DwMDaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=u9OxTt6a0b4XxAVoFjjG7RmQNYLAIe3smaD2NtY0mhE&s=h5NDyV1_DsR1WIruLOfH3IDrWkYTa8VEHeC3vIiucF4&e=>




                I tried reading them with the dump function but
it's way
                above my
                comprehension.

                I know that some applications use
wglGetProcAddress to
                check if an
extension if available, but I've seen KOTOR check
for the
                WGL_ARB_render_texture, and when it's present it
enables
                frame buffer
                effects and soft shadows, which use
                wglMakeContextCurrentARB (not
                wglBindTexImageARB, I was wrong in my previous
mail),
                which for some
                reason is a null pointer.

                ////


                Il 2017-03-13 14:39, Jose Fonseca ha scritto:

                    On 13/03/17 11:09, Emil Velikov wrote:

                        On 11 March 2017 at 11:51, Federico
Dossena
<dossenu...@gmail.com>
                        wrote:

                            In the last week I've been trying to
bring
                            an "old" game back to
                            life, Star
                            Wars Knights of the old republic
(KOTOR, for
                            short). It's from 2003
                            and uses
                            OpenGL 1.4.

I have used Mesa, libtxc_dxtn and some
                            trickery to decompress the
                            textures
to boost performance, and right now I
have
                            it up and running
                            smoothly with
                            Gallium on LLVMPipe, compiled on
Windows. (I
                            can upload a copy if
                            someone is
                            interested). This took me about 2
days of
                            compiling and figuring out
                            stuff.

                            Here's where the weirdness begins:
Turning on framebuffer effects or soft
                            shadows make the game crash
                            right
                            after the menu. Using a
disassembler and
                            debugger and what little
                            knowledge
                            I have of reverse engineering, I
managed to
                            track down the issue to a
function which uses wglGetProcAddress
to get
                            the addresses of
                            several OpenGL
functions. Some of these calls return
a null
                            pointer (even if there
                            is a
valid context and it is current), and
when
                            the game tries to call
                            them, it
                            crashes. The first one that makes it
crash
                            is a pointer to
                            wglBindTexImageARB, but there are a
few
                            others. NOPing the offending
                            instructions did not work, and
returning a
                            nop function just makes
                            the game
                            display artifacts.


                        Strange - afaict mesa (st/wgl) exposes
both
                        wglBindTexImageARB and the
                        WGL_ARB_render_texture extension.
                        You can break on DrvGetProcAddress and
trace
                        where/how we end up with
                        NULL function pointer.

                        -Emil
------------------------------------------------------------------------



                        mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=SWh6lT89FsLAyTgJ-rsJ9RAojPix3V1ZDKyBjIR31pI&s=SPL0EPazpw03JE7fy8hsKkGEZG_dXNpI6E1b0xrG2S4&e=




                    Federico,

                    You should be using latest master for this.
There
                    have been recent
                    changes/fixes to our WGL implementation.


                    Last fall Brian Paul fixed an issue with WGL
                    extension seen on KOTOR.
                    I'm not sure the the issue has been
crossported to
                    Mesa master yet,
                    and it might be unrelated.


                    Generally speaking, wglGetProcAddress
returning NULL
                    by itself is not
                    a problem. Many games wrongly rely on
                    wglGetProcAddress NULL results
                    to detect whether an GL/WGL extension is
present
                    (which goes against
                    the spec). Other libraries try to bindly get
every
                    possible
                    entrypoint through wglGetProcAddress, then
check
                    which ones to use
                    based on supported extensions (which is
actually
                    fine by the spec.)


For the record, getting an apitrace is usually
                    useful to debug this
                    sort of issues. One can use apitrace straigh
from
                    windows or with
                    WINE
--https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_apitrace_apitrace_wiki_WINE&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=SWh6lT89FsLAyTgJ-rsJ9RAojPix3V1ZDKyBjIR31pI&s=Dqed5TB98LDF0BfqxZagu3S40Um8dCPYfCVeBmIEytU&e=



                    Jose




------------------------------------------------------------------------



                mesa-dev mailing list
                mesa-dev@lists.freedesktop.org
https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=u9OxTt6a0b4XxAVoFjjG7RmQNYLAIe3smaD2NtY0mhE&s=jnsrLdbWwBr7d8cUeUr_dxHK8sN25_6TfLQjoVbMCj8&e=









--
Sent from my Android device with K-9 Mail. Please excuse my
brevity.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=Ie7_encNUsqxbSRbqbNgofw0ITcfE8JKfaUjIQhncGA&m=SWh6lT89FsLAyTgJ-rsJ9RAojPix3V1ZDKyBjIR31pI&s=SPL0EPazpw03JE7fy8hsKkGEZG_dXNpI6E1b0xrG2S4&e=








_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to