heya,
there’s no such thing as an image struct that is handed around. there is a cache darktable/pixelpipe_cache.h at master · darktable-org/darktable · GitHub that stores pretty much float*
for use in a ping-pong buffer pattern throughout the pipeline. as pointed out before, these aren’t full size, but may be cropped regions of interest and also scaled to usually smaller than full resolution.
the image operations themselves can work through various code paths, using SSE or not, and potentially the GPU using opencl (which involves a fair bit of buffer copying and management in general). all of this is done in an ever growing function here: darktable/pixelpipe_hb.c at master · darktable-org/darktable · GitHub which recursively goes through the list of modules and processes buffers.
it was long and winding to begin with and has grown substantially with all the features that have been added in hindsight. as hanno pointed out, processing arrays of buffers instead of buffers sounds like the sort of change that would likely be on par with multiinstance/reordering in terms of code complexity and potentially introduced bugs.
best of luck with your project, given a fair bit of patience it can probably be done. maybe you can find a way to pass around these buffers in some other way, at least that will likely make sure to not introduce bugs/interference with the other features of the pipeline.
that pipeline is one of the reasons why i worked on an experimental rewrite of this core functionality, based on a node graph instead of the linear pipe. one of my use cases was an alignment algorithm that would take several raw images as input and merge them into one aligned output. it fact it might be interesting to try this machinery on one of the pixel shift dng.