Submission is not completion
A CPU function returning from command submission does not mean the device has finished using every referenced buffer, image, or descriptor. Draw the CPU and device timelines separately, with a resource-use interval that extends beyond the submitting call.
A CPU worker join proves the joined CPU work has finished. It says nothing by itself about commands already submitted to a GPU. Similarly, a shared_ptr reaching its final CPU owner does not establish device completion unless that owner is connected to a backend retirement policy.
The supplied engineering companion is CPU only and creates no GPU objects or fences. This chapter is a design model for your later graphics API work. Use actual backend documentation and validation tools when implementing it; a simulated completed counter is not a fence.
Draw an upload owner, a submitted draw, a later completion event, and the earliest safe destruction point. Mark which events the CPU companion can and cannot observe.
