Sorry to bump an old thread.
However I found something on EOS that may interest you.
https://www.magiclantern.fm/forum/index.php?topic=26024.msg244043#msg244043
A few days ago I was able to achieve this. Full double-buffered ML menu with hardware indexed rgb -> RGBA rendering on Zico.
While old method felt "laggy" and was prone to rendering glitches, this is so damn fast. Feels exactly like using 5D3.
This is all thanks to a single Zico function - GrypDsCoreDrawImageToVramForEqualPhase.
Caveats? Of course they are caveats Camera likes to randomly lock up (literally lock, UART output hangs mid-print) on Canon main menu enter.
This happens on R, I wasn't able to trigger it on 80D (D6) and 77D (D7). No other models were tested yet.
typedef struct Region{
uint32_t x;
uint32_t y;
uint32_t w;
uint32_t h;
} Region;
extern uint32_t mzrm_GrypDsCoreDrawImageToVramForEqualPhase
(struct MARV*, struct Region*,
uint32_t target_x, uint32_t target_y,
void * buf, uint32_t bits_per_pixel, uint32_t source_w, uint32_t source_h,
uint32_t source_cut_x, uint32_t source_cut_y, uint32_t source_cut_w, uint32_t source_cut_h,
uint32_t isTransparent);
uint8_t * pIndexedBuffer = some_indexed_rgb_buffer;
mzrm_GrypDsCoreDrawImageToVramForEqualPhase(pRgbaBuffer, NULL, 0, 0, pIndexedBuffer, 8, 960, 270, 0, 0, 960, 270, 1);
pIndexedBuffer+= 960*270;
mzrm_GrypDsCoreDrawImageToVramForEqualPhase(pRgbaBuffer, NULL, 0, 270, pIndexedBuffer, 8, 960, 270, 0, 0, 960, 270, 1);
This code allows hardware-accelerated indexed RGB -> RGBA conversion. I did it in two passes (top and bottom part of the buffer) as I wasn't able to make it process more than 960x500 at once (and target is 960x540). I tried to explore Zico code but found no direct explanation on that.
Anyway, this was tested on 80D, 77D, R (D6,D7,D8) models. Method is unstable on D8 (camera hard locks in some cases, D8 is out of context for CHDK anyway), seems to work fine but slow on D6/7.
If that works for you, then likely you can have single indexed RGB backend for all models, with just a little extra code to wrap it up on D67.
I found that this arg with Region struct pointer is ignored Zico-side, so it can be just nullptr. bits_per_pixel can be either 8 for colour and 1 for black and white image. Other values are ignored. RGBA buffer may need 0x100 alignment, but if you draw directly to Canon buffers they should be already aligned properly.