[4/5] WineD3D: Implement manual fencing with GL_APPLE_flush_buffer_range

Henri Verbeet hverbeet at gmail.com
Tue Jan 5 04:50:35 CST 2010

2010/1/4 Stefan Dösinger <stefan at codeweavers.com>:
> +    if(This->query.context) context_free_event_query(&This->query);
> +    This->query.context = NULL;
context_free_event_query() already clears the context field.

> +            if(This->resource.device->adapter->gl_info.supported[APPLE_FENCE])
You already have a gl_info pointer in buffer_create_buffer_object(),
you're using it a few lines up.
I'm not sure you can test for APPLE_fence to determine if event
queries are available.

> +static inline void buffer_sync_apple(struct wined3d_buffer *This, struct wined3d_context *context, DWORD flags)
Do you have a good reason for adding that inline? I think it mostly
just causes the compiler to not notice when the function is unused.

> +        /* TODO: Test and implement D3DLOCK_DONOTWAIT */
> +        GL_EXTCALL(glFinishFenceAPPLE(This->query.id));
> +        checkGLcall("glFinishFenceAPPLE(This->query.id)");
The buffer code can't assume an event query is implemented with APPLE_fence.

> +                GL_EXTCALL(glSetFenceAPPLE(cur->query.id));
> +                checkGLcall("glSetFenceAPPLE(cur->query.id)");
...and neither can the draw code. The assumption is currently true of
course, but that's just an accident of the code order in
context_alloc_event_query(). Adding e.g. ARB_sync support to event
queries will break that.

More information about the wine-devel mailing list