Something I've been stuck on for a while is the part of the low-level video subsystem that relates to creating/deleting resources and handling memory transfers between the CPU and GPU. There are lots of resources for the submission, batching and drawing itself but never anything about how those buffers, textures, etc. got there in the first place or how the API for resource management is designed. Note that I'm not talking about loading and caching resource files from disk. This is concerned with the low-level aspects of memory and resource management across processors.
One idea I had was a layered API loosely based off of D3D11, where you separate the memory itself (buffer, texture) from how it's going to be used (view). This way, for example, you can allocate a texture and use it as both a render target and a sampler target. Of course, this also brings up the issue of making sure access is "exclusive", i.e. you can't sample from it and render to it at the same time. Another issue I'm interested in is making the API thread-safe. While this is relatively trivial to do with D3D11 thanks to the Device/Context separation, with OpenGL it's more complicated since you have to deal with context sharing and currency.
Basically I'm just looking for some advice, ideas, open-source code to look at, or anything else that can help me see how this stuff has been taken care of before.