It was caused by image threading safe commit and it was noticeable only on really multi-core CPU (like dual-socket Xeon stations), was not visible on core i7 machine. The reason of slowdown was spinlock around image buffer referencing, which lead to lots of cores waiting for single core and using image buffer after it was referenced was not so much longer than doing reference itself. The most clear solution here seemed to be introducing Image Pool which will contain list of loaded and referenced image buffers, so all threads could skip lock if the pool is used for reading only. Lock only needed in cases when buffer for requested image user is missing in the pool. This lock will happen only once per image so overall amount of locks is much less that it was before. To operate with pool: - BKE_image_pool_new() creates new pool - BKE_image_pool_free() destroys pool and dereferences all image buffers which were loaded to it - BKE_image_pool_acquire_ibuf() returns image buffer for given image and user. Pool could be NULL and in this case fallback to BKE_image_acquire_ibuf will happen. This helps to avoid lots to if(poll) checks in image sampling code. - BKE_image_pool_release_ibuf releases image buffer. In fact, it will only do something if pool is NULL, in all other case it'll equal to DoNothing operation.
64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
/*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
* All rights reserved.
|
|
*
|
|
* Contributor(s): 2004-2006, Blender Foundation, full recode
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
/** \file blender/render/intern/include/pixelshading.h
|
|
* \ingroup render
|
|
*
|
|
* These functions determine what actual color a pixel will have.
|
|
*/
|
|
|
|
#ifndef __PIXELSHADING_H__
|
|
#define __PIXELSHADING_H__
|
|
|
|
struct ImagePool;
|
|
|
|
/**
|
|
* Render the pixel at (x,y) for object ap. Apply the jitter mask.
|
|
* Output is given in float collector[4]. The type vector:
|
|
* t[0] - min. distance
|
|
* t[1] - face/halo index
|
|
* t[2] - jitter mask
|
|
* t[3] - type ZB_POLY or ZB_HALO
|
|
* t[4] - max. distance
|
|
* mask is pixel coverage in bits
|
|
* \return pointer to the object
|
|
*/
|
|
int shadeHaloFloat(HaloRen *har,
|
|
float *col, int zz,
|
|
float dist, float xn,
|
|
float yn, short flarec);
|
|
|
|
/**
|
|
* Render the sky at pixel (x, y).
|
|
*/
|
|
void shadeSkyPixel(float collector[4], float fx, float fy, short thread);
|
|
void shadeSkyView(float col_r[3], const float rco[3], const float view[3], const float dxyview[2], short thread);
|
|
void shadeAtmPixel(struct SunSky *sunsky, float *collector, float fx, float fy, float distance);
|
|
void shadeSunView(float col_r[3], const float view[3]);
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
#endif
|
|
|