It doesn't necessarily need to exist as an object, but it simplifies things. For instance, in `d3d9_device_QueryInterface` we can check if the IDirect3D9 instance was created with D3D9On12 enabled by simply checking if struct d3d9on12 is not NULL.
We can just make that an explicit boolean field. See how we handle IID_IDirect3D9Ex.
In that function, we are also checking if pD3D12Device in struct d3d9on12 matches the d3d9 device. In this case, we can access the relative struct easily:
if (!device->d3d_parent->d3d9on12->override_list->pD3D12Device == *d3d9device*)
If struct d3d9on12 is not in struct d3d9 and instead only IDirect3DDevice9On12 is present then we would need to add a helper function to get that value.
Well, we aren't actually checking anything; we're printing a FIXME. But moreover I don't understand what there is to check. What does it mean for a d3d12 device to "match" the d3d9 device?