The new init mechanism always uses GetInstanceProcAddr
to query the next layer's CreateInstance or CreateDevice
function. Thus no reason to cache those function pointers
in the instance dispatch table.
New layer init method requires the construction of
Link information for CreateInstance and CreateDevice
that is accessible to layers via the CreateInfo.pNext pointer.
The layer can then use the Get*ProcAddr from the Link
structure to initialize their dispatch table if the
call down the chain returns successfully.
This removes the need to do special initialization work
at Get*ProcAddr time.
Layer Get*ProcAddr now return their internal function
pointers regardless of the value of instance or device.
Only need to have valid instance & device when looking
up extensions or when passing the request down the chain.
This mechanism allows us to remove object wrapping used
by the loader previously. Also simplifies the dispatch table
setup.
Conflicts:
layers/device_limits.cpp
layers/draw_state.cpp
loader/loader.c
loader/trampoline.c
These structures will be used to extend CreateInstance
and CreateDevice to support layers. The loader will
create a chain of these structures - one per layer -
that tells the layer the Get*ProcAddr for the next
lower part.
It took a few commits (squashed down into 1) to get it correct. Includes:
Use loader_heap_{alloc|free}().
Try to deal correctly with initializing the vkCreate*SurfaceKHR()'s.
GetInstancePorcAddr() is specified to return trampoline entrypoints for all
Vulkan core and extension entrypoints that are dispatched on an instance object
or a child of that instance object. However, typically, device extensions would
be unknown to the loader (don't want to rev the loader everytime an IHV creates
a new device extension).
This patch allows loader to dynamically discover device extension entrypoints
and configure generic trampoline code for these discovered device extensions.