Hello,
I would like to implement part of the logic within dcomp.dll in order to properly support applications that depend on it.
I found that Zhiyi Zhang has implemented some data structures and interface stubs:
https://gitlab.winehq.org/zhiyi/wine/-/commits/directcomposition?ref_type=heads
Among these, the only method with actual logic appears to be IDCompositionDevice::Commit.
However, after reviewing the implementation, I suspect there may be an issue with the current approach.
It seems that Zhiyi Zhang starts a separate thread for each IDCompositionDevice, and this thread runs at a fixed refresh rate.
But this approach appears to introduce a problem: from the window's (HWND) perspective, there are now two threads concurrently updating its device context.
This results in a frame sequence similar to the following (note: the frame intervals are illustrative only):
gdi_frame | dcomp_frame | gdi_frame | gdi_frame | dcomp_frame
In this model, GDI-generated frames and DComp-generated frames are interleaved.
Is my understanding correct?
If so, I believe this method may lead to inaccurate rendering results, although I am not entirely certain about the exact consequences (as I am not an expert in this area).
Therefore, I have decided to pursue an approach that produces a standardized frame stream like the following:
gdi_mix_dcomp_frame | ��gdi_mix_dcomp_frame | gdi_mix_dcomp_frame
�� In other words, I plan to merge GDI and DComp content before presenting each frame, ensuring consistency in the final output.
I���ve reviewed the normal GDI frame refresh process, and it seems to follow this path:��
I���m planning to insert the following logic inside x11drv_surface_flush:
}
However, there���s still a question regarding how to access the DComp data inside x11drv_surface_flush.
One option is to do the composition inside IDCompositionDevice::Commit() like this:
}
Another option is to directly call into DComp APIs from within x11drv to retrieve the surface data on demand.
However, both approaches feel somewhat unnatural, and from what I can tell, Windows seems to establish some kind of internal channel to pass the composed content to the compositor.
Is there a better or more canonical way to do this?
Any suggestions or guidance would be greatly appreciated.�� ��