video and usb driver (rk3588)
Michael Grunditz
michael.grunditz at gmail.com
Thu Jan 19 17:04:39 CET 2023
>
> It might be easier to (1) calculate both the start offset and the end
> offset, then (2) truncate the start offset to the cache-line size, (3)
> round the end offset to the cache-line size, (4) calculate the size
> argument by subtracting the start from the end offset.
>
> Regarding (2), when calculating the end offset via surface.w()*rect.y2()
> + rect.x2(), it will refer to the pixel at the lower-right corner of the
> dirty rectangle. You have to add 1 to this offset value, so that the
> subsequent subtraction yields the number of covered pixels, not the
> difference. E.g., think of a rectangle of only one pixel where p1 == p2.
> Here we want to flush the cache line around this pixel. The difference
> between the start and end offsets would be zero. But the number of
> covered pixels is one.
I have tried with 16,32 and 64. Same result. Movement y wise makes
traces with mouse and bigger artifacts for windows.
These sorts of things are really my weak spot.
int a=0;
int r=0;
a=64;
Genode::addr_t invalid =
(rect.x1()+(rect.y1()*(size.w())))*sizeof(Pixel);
log("unaligned invalid: ",invalid);
invalid = invalid&~63;
Genode::addr_t endoffset =
(1+(size.w()*rect.y2())+ rect.x2())*sizeof(Pixel);
log("endoffset: ",endoffset);
r = endoffset%a;
endoffset = r? endoffset + (a - r) : endoffset;
log("invalid: ",invalid);
log("invalidz: ",endoffset);
Genode::addr_t xxx = (Genode::addr_t)surface.addr();
cache_clean_invalidate_data(xxx+invalid,endoffset-invalid);
More information about the users
mailing list