Commit: 53025e92604c8749332ad17d8b8b24f989923b0e Author: Antony Riakiotakis Date: Wed Jul 9 23:28:28 2014 +0300 https://developer.blender.org/rB53025e92604c8749332ad17d8b8b24f989923b0e
Use spinlocks for tile initialization. =================================================================== M source/blender/editors/sculpt_paint/paint_image.c M source/blender/editors/sculpt_paint/paint_image_proj.c M source/blender/editors/sculpt_paint/paint_intern.h =================================================================== diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 2a206e1..9524a94 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -122,6 +122,17 @@ typedef struct UndoImageTile { * Maybe it should be exposed as part of the * paint operation, but for now just give a public interface */ static ImagePaintPartialRedraw imapaintpartial = {0, 0, 0, 0, 0}; +static SpinLock undolock; + +void image_undo_init_locks() +{ + BLI_spin_init(&undolock); +} + +void image_undo_end_locks() +{ + BLI_spin_end(&undolock); +} ImagePaintPartialRedraw *get_imapaintpartial(void) { @@ -259,13 +270,13 @@ void *image_undo_push_tile(Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int x_tile, undo_copy_tile(tile, *tmpibuf, ibuf, COPY); if (proj) - BLI_lock_thread(LOCK_CUSTOM1); + BLI_spin_lock(&undolock); undo_paint_push_count_alloc(UNDO_PAINT_IMAGE, allocsize); BLI_addtail(lb, tile); if (proj) - BLI_unlock_thread(LOCK_CUSTOM1); + BLI_spin_unlock(&undolock); return tile->rect.pt; } diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c index 570cf32..80c4d45 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.c +++ b/source/blender/editors/sculpt_paint/paint_image_proj.c @@ -295,6 +295,8 @@ typedef struct ProjPaintState { bool need_redraw; BlurKernel *blurkernel; + + SpinLock *tile_lock; } ProjPaintState; typedef union pixelPointer { @@ -340,7 +342,7 @@ typedef struct ProjPixelClone { /* undo tile pushing */ typedef struct { - bool threaded; + SpinLock *lock; bool masked; unsigned short tile_width; ImBuf **tmpibuf; @@ -1343,14 +1345,14 @@ static int project_paint_undo_subtiles(const TileInfo *tinf, int tx, int ty) /* double check lock to avoid locking */ if (UNLIKELY(!pjIma->undoRect[tile_index])) { - if (tinf->threaded) - BLI_lock_thread(LOCK_CUSTOM1); + if (tinf->lock) + BLI_spin_lock(tinf->lock); if (LIKELY(!pjIma->undoRect[tile_index])) { pjIma->undoRect[tile_index] = TILE_PENDING; generate_tile = true; } - if (tinf->threaded) - BLI_unlock_thread(LOCK_CUSTOM1); + if (tinf->lock) + BLI_spin_unlock(tinf->lock); } @@ -1365,7 +1367,12 @@ static int project_paint_undo_subtiles(const TileInfo *tinf, int tx, int ty) pjIma->ibuf->userflags |= IB_BITMAPDIRTY; /* tile ready, publish */ + if (tinf->lock) + BLI_spin_lock(tinf->lock); pjIma->undoRect[tile_index] = undorect; + if (tinf->lock) + BLI_spin_unlock(tinf->lock); + } return tile_index; @@ -2238,9 +2245,10 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i MemArena *arena = ps->arena_mt[thread_index]; LinkNode **bucketPixelNodes = ps->bucketRect + bucket_index; LinkNode *bucketFaceNodes = ps->bucketFaces[bucket_index]; + bool threaded = (ps->thread_tot > 1); TileInfo tinf = { - (ps->thread_tot > 1), + ps->tile_lock, ps->do_masking, IMAPAINT_TILE_NUMBER(ibuf->x), tmpibuf, @@ -2267,7 +2275,6 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i float pixelScreenCo[4]; bool do_3d_mapping = ps->brush->mtex.brush_map_mode == MTEX_MAP_MODE_3D; - bool threaded = (ps->thread_tot > 1); rcti bounds_px; /* ispace bounds */ /* vars for getting uvspace bounds */ @@ -3210,6 +3217,13 @@ static void project_paint_begin(ProjPaintState *ps) if (reset_threads) ps->thread_tot = 1; + if (ps->thread_tot > 1) { + ps->tile_lock = MEM_mallocN(sizeof(SpinLock), "projpaint_tile_lock"); + BLI_spin_init(ps->tile_lock); + } + + image_undo_init_locks(); + for (a = 0; a < ps->thread_tot; a++) { ps->arena_mt[a] = BLI_memarena_new(MEM_SIZE_OPTIMAL(1 << 16), "project paint arena"); } @@ -3464,6 +3478,11 @@ static void project_paint_end(ProjPaintState *ps) MEM_freeN(ps->dm_mtface); if (ps->do_layer_clone) MEM_freeN(ps->dm_mtface_clone); + if (ps->thread_tot > 1) { + BLI_spin_end(ps->tile_lock); + MEM_freeN((void *)ps->tile_lock); + } + image_undo_end_locks(); #ifndef PROJ_DEBUG_NOSEAMBLEED if (ps->seam_bleed_px > 0.0f) { diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h index 97ed1c8..0d82294 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.h +++ b/source/blender/editors/sculpt_paint/paint_intern.h @@ -150,6 +150,9 @@ int image_texture_paint_poll(struct bContext *C); void *image_undo_find_tile(struct Image *ima, struct ImBuf *ibuf, int x_tile, int y_tile, unsigned short **mask, bool validate); void *image_undo_push_tile(struct Image *ima, struct ImBuf *ibuf, struct ImBuf **tmpibuf, int x_tile, int y_tile, unsigned short **, bool **valid, bool proj); void image_undo_remove_masks(void); +void image_undo_init_locks(void); +void image_undo_end_locks(void); + void imapaint_image_update(struct SpaceImage *sima, struct Image *image, struct ImBuf *ibuf, short texpaint); struct ImagePaintPartialRedraw *get_imapaintpartial(void); void set_imapaintpartial(struct ImagePaintPartialRedraw *ippr); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs