Hi,
You are right, there is some problem here.
I think that the code originates from times when this codepath in colorfill was only entered when iface == device->render_targets[0], or when Clear didn't set any draw buffer itself. But you have spotted correctly, if iface is the device's front buffer, then the colorfill will fail.
device-isInDraw is not correct for this, because Clear() can never be called during a draw; DrawPrimitive doesn't call it, and another thread can't call it because the critical section is held. Installing a similar variable is possible, but hacky.
Another way would be to reverse the mapping, and make Clear() call colorfill; That would run through the whole find-the-surface code however, and be more overhead than a SetRenderTarget; Furthermore it is un-d3d9ish. Also, Clear() takes a few parameters into account that colorfill doesn't
GetRenderTarget and SetRenderTarget is a useable way to solve this. SetRenderTarget currently calls ActivateContext itself, but this call should be removed. I added it during the context management introduction to lower the propability of regressions. A lot of code in WineD3D avoids the getters and setters, and just accesses the implementation structure. While any object oriented programmer screams when doing that, we need it for performance reasons. Currently we spend 10 to 20 per cent of the CPU time spent in WineD3D just in surface::GetContainer and its callees, if we'd use Getters and Setters everywhere then goodbye performance(I want to replace GetContainer somewhen). However, GetRenderTarget and SetRenderTarget do a bit of setup and refcounting, so bypassing that certainly has an impact on maintainability. I'd be fine with direct impl access in this case, but it is a corner case.
A last option is to move the biggest part of Clear() into a subroutine, call the ActivateContext in Clear and BltOverride, and perform the rest of the job in the subroutine. The drawback of this is that d3d8 and d3d9 clears run through an extra call, but it avoids the SetRenderTarget/GetRenderTarget overhead and direct implementation access. The function could be inlined as well, but I am not sure if that works across .c files.