Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 410435 | Differences between
and this patch

Collapse All | Expand All

(-)a/src/vdpau_wrapper.c (-24 / +64 lines)
Lines 40-45 typedef void SetDllHandle( Link Here
40
    void * driver_dll_handle
40
    void * driver_dll_handle
41
);
41
);
42
42
43
static void * _vdp_backend_dll;
44
static void * _vdp_trace_dll;
45
static void * _vdp_driver_dll;
46
static VdpDeviceCreateX11 * _vdp_imp_device_create_x11_proc;
47
48
#if defined(__GNUC__)
49
50
static void _vdp_close_driver(void) __attribute__((destructor));
51
52
#endif
53
43
#if DEBUG
54
#if DEBUG
44
55
45
static void _vdp_wrapper_error_breakpoint(char const * file, int line, char const * function)
56
static void _vdp_wrapper_error_breakpoint(char const * file, int line, char const * function)
Lines 87-109 static char * _vdp_get_driver_name_from_dri2( Link Here
87
    return driver_name;
98
    return driver_name;
88
}
99
}
89
100
90
VdpStatus vdp_device_create_x11(
101
static VdpStatus _vdp_open_driver(
91
    Display *             display,
102
    Display *             display,
92
    int                   screen,
103
    int                   screen)
93
    /* output parameters follow */
94
    VdpDevice *           device,
95
    VdpGetProcAddress * * get_proc_address
96
)
97
{
104
{
98
    char const * vdpau_driver;
105
    char const * vdpau_driver;
99
    char * vdpau_driver_dri2 = NULL;
106
    char * vdpau_driver_dri2 = NULL;
100
    char         vdpau_driver_lib[PATH_MAX];
107
    char         vdpau_driver_lib[PATH_MAX];
101
    void *       backend_dll;
102
    char const * vdpau_trace;
108
    char const * vdpau_trace;
103
    char const * func_name;
109
    char const * func_name;
104
110
105
    VdpDeviceCreateX11 * vdp_imp_device_create_x11;
106
107
    vdpau_driver = getenv("VDPAU_DRIVER");
111
    vdpau_driver = getenv("VDPAU_DRIVER");
108
    if (!vdpau_driver) {
112
    if (!vdpau_driver) {
109
        vdpau_driver = vdpau_driver_dri2 =
113
        vdpau_driver = vdpau_driver_dri2 =
Lines 125-137 VdpStatus vdp_device_create_x11( Link Here
125
        return VDP_STATUS_NO_IMPLEMENTATION;
129
        return VDP_STATUS_NO_IMPLEMENTATION;
126
    }
130
    }
127
131
128
    backend_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL);
132
    _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL);
129
    if (!backend_dll) {
133
    if (!_vdp_driver_dll) {
130
        /* Try again using the old path, which is guaranteed to fit in PATH_MAX
134
        /* Try again using the old path, which is guaranteed to fit in PATH_MAX
131
         * if the complete path fit above. */
135
         * if the complete path fit above. */
132
        snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), DRIVER_LIB_FORMAT,
136
        snprintf(vdpau_driver_lib, sizeof(vdpau_driver_lib), DRIVER_LIB_FORMAT,
133
                 "", vdpau_driver, "");
137
                 "", vdpau_driver, "");
134
        backend_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL);
138
        _vdp_driver_dll = dlopen(vdpau_driver_lib, RTLD_NOW | RTLD_GLOBAL);
135
    }
139
    }
136
140
137
    if (vdpau_driver_dri2) {
141
    if (vdpau_driver_dri2) {
Lines 139-164 VdpStatus vdp_device_create_x11( Link Here
139
        vdpau_driver_dri2 = NULL;
143
        vdpau_driver_dri2 = NULL;
140
    }
144
    }
141
145
142
    if (!backend_dll) {
146
    if (!_vdp_driver_dll) {
143
        fprintf(stderr, "Failed to open VDPAU backend %s\n", dlerror());
147
        fprintf(stderr, "Failed to open VDPAU backend %s\n", dlerror());
144
        _VDP_ERROR_BREAKPOINT();
148
        _VDP_ERROR_BREAKPOINT();
145
        return VDP_STATUS_NO_IMPLEMENTATION;
149
        return VDP_STATUS_NO_IMPLEMENTATION;
146
    }
150
    }
147
151
152
    _vdp_backend_dll = _vdp_driver_dll;
153
148
    vdpau_trace = getenv("VDPAU_TRACE");
154
    vdpau_trace = getenv("VDPAU_TRACE");
149
    if (vdpau_trace && atoi(vdpau_trace)) {
155
    if (vdpau_trace && atoi(vdpau_trace)) {
150
        void *         trace_dll;
151
        SetDllHandle * set_dll_handle;
156
        SetDllHandle * set_dll_handle;
152
157
153
        trace_dll = dlopen(VDPAU_MODULEDIR "/libvdpau_trace.so.1", RTLD_NOW | RTLD_GLOBAL);
158
        _vdp_trace_dll = dlopen(VDPAU_MODULEDIR "/libvdpau_trace.so.1",
154
        if (!trace_dll) {
159
                                RTLD_NOW | RTLD_GLOBAL);
160
        if (!_vdp_trace_dll) {
155
            fprintf(stderr, "Failed to open VDPAU trace library %s\n", dlerror());
161
            fprintf(stderr, "Failed to open VDPAU trace library %s\n", dlerror());
156
            _VDP_ERROR_BREAKPOINT();
162
            _VDP_ERROR_BREAKPOINT();
157
            return VDP_STATUS_NO_IMPLEMENTATION;
163
            return VDP_STATUS_NO_IMPLEMENTATION;
158
        }
164
        }
159
165
160
        set_dll_handle = (SetDllHandle*)dlsym(
166
        set_dll_handle = (SetDllHandle*)dlsym(
161
            trace_dll,
167
            _vdp_trace_dll,
162
            "vdp_trace_set_backend_handle"
168
            "vdp_trace_set_backend_handle"
163
        );
169
        );
164
        if (!set_dll_handle) {
170
        if (!set_dll_handle) {
Lines 167-175 VdpStatus vdp_device_create_x11( Link Here
167
            return VDP_STATUS_NO_IMPLEMENTATION;
173
            return VDP_STATUS_NO_IMPLEMENTATION;
168
        }
174
        }
169
175
170
        set_dll_handle(backend_dll);
176
        set_dll_handle(_vdp_backend_dll);
171
177
172
        backend_dll = trace_dll;
178
        _vdp_backend_dll = _vdp_trace_dll;
173
179
174
        func_name = "vdp_trace_device_create_x11";
180
        func_name = "vdp_trace_device_create_x11";
175
    }
181
    }
Lines 177-193 VdpStatus vdp_device_create_x11( Link Here
177
        func_name = "vdp_imp_device_create_x11";
183
        func_name = "vdp_imp_device_create_x11";
178
    }
184
    }
179
185
180
    vdp_imp_device_create_x11 = (VdpDeviceCreateX11*)dlsym(
186
    _vdp_imp_device_create_x11_proc = (VdpDeviceCreateX11*)dlsym(
181
        backend_dll,
187
        _vdp_backend_dll,
182
        func_name
188
        func_name
183
    );
189
    );
184
    if (!vdp_imp_device_create_x11) {
190
    if (!_vdp_imp_device_create_x11_proc) {
185
        fprintf(stderr, "%s\n", dlerror());
191
        fprintf(stderr, "%s\n", dlerror());
186
        _VDP_ERROR_BREAKPOINT();
192
        _VDP_ERROR_BREAKPOINT();
187
        return VDP_STATUS_NO_IMPLEMENTATION;
193
        return VDP_STATUS_NO_IMPLEMENTATION;
188
    }
194
    }
189
195
190
    return vdp_imp_device_create_x11(
196
    return VDP_STATUS_OK;
197
}
198
199
static void _vdp_close_driver(void)
200
{
201
    if (_vdp_driver_dll) {
202
        dlclose(_vdp_driver_dll);
203
        _vdp_driver_dll = NULL;
204
    }
205
    if (_vdp_trace_dll) {
206
        dlclose(_vdp_trace_dll);
207
        _vdp_trace_dll = NULL;
208
    }
209
    _vdp_backend_dll = NULL;
210
    _vdp_imp_device_create_x11_proc = NULL;
211
}
212
213
VdpStatus vdp_device_create_x11(
214
    Display *             display,
215
    int                   screen,
216
    /* output parameters follow */
217
    VdpDevice *           device,
218
    VdpGetProcAddress * * get_proc_address
219
)
220
{
221
    VdpStatus status;
222
223
    if (!_vdp_imp_device_create_x11_proc) {
224
        status = _vdp_open_driver(display, screen);
225
        if (status != VDP_STATUS_OK) {
226
            _vdp_close_driver();
227
            return status;
228
        }
229
    }
230
231
    return _vdp_imp_device_create_x11_proc(
191
        display,
232
        display,
192
        screen,
233
        screen,
193
        device,
234
        device,
194
-

Return to bug 410435