예제 #1
0
파일: dri3.c 프로젝트: sarnex/wine
BOOL
DRI2FallbackCheckSupport(Display *dpy)
{
    struct DRI2priv *priv;
    int fd;
    if (!DRI2FallbackInit(dpy, &priv))
        return FALSE;
    DRI2FallbackDestroy(priv);
    if (!DRI2FallbackOpen(dpy, DefaultScreen(dpy), &fd))
        return FALSE;
    close(fd);
    return TRUE;
}
예제 #2
0
파일: SDL_nine.c 프로젝트: EoD/Xnine
HRESULT
d3dadapter9_new( BOOL ex, Display *dpy,
                 IDirect3D9Ex **ppOut )
{
    static void * WINAPI (*pD3DAdapter9GetProc)(const char *) = NULL;
    static BOOL StaticInitDone = FALSE;

    // load dynamic library and retrieve "D3DAdapter9GetProc" symbol.
    if (!StaticInitDone) {
        StaticInitDone = TRUE;

        if (!PRESENTCheckExtension(dpy, 1, 0)) {
            ERR("Unable to query PRESENT.\n");
            return D3DERR_NOTAVAILABLE;
        }

        if (!DRI3CheckExtension(dpy, 1, 0)) {
#if !D3DADAPTER9_WITHDRI2
            ERR("Unable to query DRI3.\n");
            return D3DERR_NOTAVAILABLE;
#else
            ERR("Unable to query DRI3. Trying DRI2 fallback (slower performance).\n");
            is_dri2_fallback = 1;
            if (!DRI2FallbackCheckSupport(dpy)) {
                ERR("DRI2 fallback unsupported\n");
                return D3DERR_NOTAVAILABLE;
            }
#endif
        }


        void * handle = dlopen(D3DADAPTERPATH, RTLD_LOCAL | RTLD_NOW);
        if (!handle) {
            ERR("Failed to load d3d9 lib: %s\n", dlerror());
            return D3DERR_NOTAVAILABLE;
        }

        pD3DAdapter9GetProc = dlsym(handle, "D3DAdapter9GetProc");
        if (!pD3DAdapter9GetProc) {
            ERR("Failed to load d3d9 lib symbols\n");
            return D3DERR_NOTAVAILABLE;
        }
    }

    int fd;
#if D3DADAPTER9_WITHDRI2
    if (!is_dri2_fallback && !DRI3Open(dpy, DefaultScreen(dpy), &fd)) {
#else
    if (!DRI3Open(dpy, DefaultScreen(dpy), &fd)) {
#endif
        ERR("DRI3Open failed (fd=%d)\n", fd);
        return D3DERR_NOTAVAILABLE;
    }
#if D3DADAPTER9_WITHDRI2
    if (is_dri2_fallback && !DRI2FallbackOpen(dpy, DefaultScreen(dpy), &fd)) {
        ERR("DRI2Open failed (fd=%d)\n", fd);
        return D3DERR_NOTAVAILABLE;
    }
#endif

    const struct D3DAdapter9DRM *d3d9_drm = pD3DAdapter9GetProc(D3DADAPTER9DRM_NAME);
    if (!d3d9_drm || d3d9_drm->major_version != D3DADAPTER9DRM_MAJOR)
    {
        ERR("Your display driver doesn't support native D3D9 adapters.\n");
        return D3DERR_NOTAVAILABLE;
    }

    ID3DAdapter9* adapter = NULL;
    HRESULT hr = d3d9_drm->create_adapter(fd, &adapter);
    if (FAILED(hr)) {
        ERR("Unable to create ID3DAdapter9 (fd=%d)\n", fd);
        return hr;
    }

    struct d3dadapter9 *This = calloc(1, sizeof(struct d3dadapter9));
    if (!This) {
        ERR("Out of memory.\n");
        return E_OUTOFMEMORY;
    }

    This->vtable = &d3dadapter9_vtable;
    This->refs = 1;
    This->ex = ex;
    This->adapter = adapter;

    *ppOut = (IDirect3D9Ex *)This;
    FIXME("\033[1;32m\nNative Direct3D 9 is active."
          "\nFor more information visit https://wiki.ixit.cz/d3d9\033[0m\n");
    return D3D_OK;
}


// --------------------------------------------------------------------

static IDirect3D9Ex* SDL_Direct3DCreate9Ex_common(BOOL ex, SDL_Window *win )
{
    SDL_SysWMinfo info;
    SDL_VERSION(&info.version);
    SDL_bool Ok = SDL_GetWindowWMInfo(win, &info);
    if (!Ok) {
        ERR("SDL_GetWindowWMInfo failed.");
        return NULL;
    }

    IDirect3D9Ex *pD3D9Ex = NULL;
    HRESULT hr = d3dadapter9_new( ex, info.info.x11.display, &pD3D9Ex );
    if (FAILED(hr)) {
        return NULL;
    }

    return pD3D9Ex;
}