| Re: [AD] Locking Behaviour | 
[ Thread Index | 
Date Index
| More lists.liballeg.org/allegro-developers Archives
] 
Paul Suntsov wrote:
Thirdly, if the second point is implemented, both the destination and the source bitmaps should remain
> locked, I think.
More generally, here's how I'd imagine myself these things working: memory routines and such that
> require locked bitmaps will first check to see if the regions they want to 
draw to are locked, locking
> them if they are not. When they are done, they leave them locked. Now, the 
routines that require unlocked
> bitmaps (all hardware accelerated ones, at least) check if their required 
bitmaps are locked or not, and
> unlock them themselves if they are. al_flip_display, for example, will make 
sure to unlock the back and
> front buffers. I think this sort of behaviour would be optimal in terms of 
the number of required
> locks/unlocks (I believe this is the sort of strategy A4 used for 
release/acquire functions). Now,
> I know this violates the leave-global-state-as-it-was-when-you-got-it 
strategy, but I think it makes
> sense in this situation. Right now the functions are too fail-happy for my 
liking.
Routines don't require locked or unlocked bitmaps - drawing method is chosen 
based on the locked state of a bitmap. You are proposing to make it the other 
way around. I'm not saying that your proposal is flawed, just want to make it 
clear that things are how they are because someone has designed them this way.
This way the user gets to choose whether to use SW or HW routines, by locking or 
not locking the bitmap. If you are going to perform many al_get_pixel() 
operations on a bitmap you'd better lock that bitmap because reading single 
pixels from (display) bitmaps is slow is most cases.
One thing I don't understand though, if we have both hardware and software 
implementation for each drawing routine, what do you mean by "routines that 
require locked/unlocked bitmap"?
Now, about al_lock_bitmap_region itself, right now it fails if the bitmap is locked already:
if (bitmap->locked)
   return NULL;
Would it perhaps be better to unlock the bitmap in this case, and re-lock it as usual? Just seems like less
> of a hassle this way (I can't imagine any situation when you wouldn't want to 
do that upon failure anyway,
> that couldn't be handled via al_is_bitmap_locked check).
Yeah, I would like that. It could be further optimized to not perform full 
unlock/lock if the regions overlap. We don't need bitmap_is_locked() then.
--
Milan Mimica
http://sparklet.sf.net