[Bf-blender-cvs] [92ec4863c22] master: Code refactor: simplify image device memory allocation.
Brecht Van Lommel
noreply at git.blender.org
Sat Oct 21 21:13:46 CEST 2017
Commit: 92ec4863c22f249a21a5b5224d91fcab5c602100
Author: Brecht Van Lommel
Date: Fri Oct 20 04:20:37 2017 +0200
Branches: master
https://developer.blender.org/rB92ec4863c22f249a21a5b5224d91fcab5c602100
Code refactor: simplify image device memory allocation.
===================================================================
M intern/cycles/render/image.cpp
M intern/cycles/render/image.h
M intern/cycles/render/mesh.cpp
M intern/cycles/render/mesh.h
M intern/cycles/render/scene.cpp
M intern/cycles/render/scene.h
===================================================================
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index bb94b9bb82a..c9fbd237010 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -364,6 +364,7 @@ int ImageManager::add_image(const string& filename,
img->extension = extension;
img->users = 1;
img->use_alpha = use_alpha;
+ img->mem = NULL;
images[type][slot] = img;
@@ -696,7 +697,6 @@ bool ImageManager::file_load_image(Image *img,
}
void ImageManager::device_load_image(Device *device,
- DeviceScene *dscene,
Scene *scene,
ImageDataType type,
int slot,
@@ -717,26 +717,27 @@ void ImageManager::device_load_image(Device *device,
/* Slot assignment */
int flat_slot = type_index_to_flattened_slot(slot, type);
-
string name = string_printf("__tex_image_%s_%03d", name_from_type(type).c_str(), flat_slot);
- if(type == IMAGE_DATA_TYPE_FLOAT4) {
- if(dscene->tex_float4_image[slot] == NULL)
- dscene->tex_float4_image[slot] = new device_vector<float4>();
- device_vector<float4>& tex_img = *dscene->tex_float4_image[slot];
+ /* Free previous texture in slot. */
+ if(img->mem) {
+ thread_scoped_lock device_lock(device_mutex);
+ device->tex_free(*img->mem);
+ delete img->mem;
+ img->mem = NULL;
+ }
- if(tex_img.device_pointer) {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_free(tex_img);
- }
+ /* Create new texture. */
+ if(type == IMAGE_DATA_TYPE_FLOAT4) {
+ device_vector<float4> *tex_img = new device_vector<float4>();
if(!file_load_image<TypeDesc::FLOAT, float>(img,
type,
texture_limit,
- tex_img))
+ *tex_img))
{
/* on failure to load, we set a 1x1 pixels pink image */
- float *pixels = (float*)tex_img.resize(1, 1);
+ float *pixels = (float*)tex_img->resize(1, 1);
pixels[0] = TEX_IMAGE_MISSING_R;
pixels[1] = TEX_IMAGE_MISSING_G;
@@ -744,60 +745,34 @@ void ImageManager::device_load_image(Device *device,
pixels[3] = TEX_IMAGE_MISSING_A;
}
- {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_alloc(name.c_str(),
- tex_img,
- img->interpolation,
- img->extension);
- }
+ img->mem = tex_img;
}
else if(type == IMAGE_DATA_TYPE_FLOAT) {
- if(dscene->tex_float_image[slot] == NULL)
- dscene->tex_float_image[slot] = new device_vector<float>();
- device_vector<float>& tex_img = *dscene->tex_float_image[slot];
-
- if(tex_img.device_pointer) {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_free(tex_img);
- }
+ device_vector<float> *tex_img = new device_vector<float>();
if(!file_load_image<TypeDesc::FLOAT, float>(img,
type,
texture_limit,
- tex_img))
+ *tex_img))
{
/* on failure to load, we set a 1x1 pixels pink image */
- float *pixels = (float*)tex_img.resize(1, 1);
+ float *pixels = (float*)tex_img->resize(1, 1);
pixels[0] = TEX_IMAGE_MISSING_R;
}
- {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_alloc(name.c_str(),
- tex_img,
- img->interpolation,
- img->extension);
- }
+ img->mem = tex_img;
}
else if(type == IMAGE_DATA_TYPE_BYTE4) {
- if(dscene->tex_byte4_image[slot] == NULL)
- dscene->tex_byte4_image[slot] = new device_vector<uchar4>();
- device_vector<uchar4>& tex_img = *dscene->tex_byte4_image[slot];
-
- if(tex_img.device_pointer) {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_free(tex_img);
- }
+ device_vector<uchar4> *tex_img = new device_vector<uchar4>();
if(!file_load_image<TypeDesc::UINT8, uchar>(img,
type,
texture_limit,
- tex_img))
+ *tex_img))
{
/* on failure to load, we set a 1x1 pixels pink image */
- uchar *pixels = (uchar*)tex_img.resize(1, 1);
+ uchar *pixels = (uchar*)tex_img->resize(1, 1);
pixels[0] = (TEX_IMAGE_MISSING_R * 255);
pixels[1] = (TEX_IMAGE_MISSING_G * 255);
@@ -805,58 +780,32 @@ void ImageManager::device_load_image(Device *device,
pixels[3] = (TEX_IMAGE_MISSING_A * 255);
}
- {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_alloc(name.c_str(),
- tex_img,
- img->interpolation,
- img->extension);
- }
+ img->mem = tex_img;
}
- else if(type == IMAGE_DATA_TYPE_BYTE){
- if(dscene->tex_byte_image[slot] == NULL)
- dscene->tex_byte_image[slot] = new device_vector<uchar>();
- device_vector<uchar>& tex_img = *dscene->tex_byte_image[slot];
-
- if(tex_img.device_pointer) {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_free(tex_img);
- }
+ else if(type == IMAGE_DATA_TYPE_BYTE) {
+ device_vector<uchar> *tex_img = new device_vector<uchar>();
if(!file_load_image<TypeDesc::UINT8, uchar>(img,
type,
texture_limit,
- tex_img)) {
+ *tex_img)) {
/* on failure to load, we set a 1x1 pixels pink image */
- uchar *pixels = (uchar*)tex_img.resize(1, 1);
+ uchar *pixels = (uchar*)tex_img->resize(1, 1);
pixels[0] = (TEX_IMAGE_MISSING_R * 255);
}
- {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_alloc(name.c_str(),
- tex_img,
- img->interpolation,
- img->extension);
- }
+ img->mem = tex_img;
}
- else if(type == IMAGE_DATA_TYPE_HALF4){
- if(dscene->tex_half4_image[slot] == NULL)
- dscene->tex_half4_image[slot] = new device_vector<half4>();
- device_vector<half4>& tex_img = *dscene->tex_half4_image[slot];
-
- if(tex_img.device_pointer) {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_free(tex_img);
- }
+ else if(type == IMAGE_DATA_TYPE_HALF4) {
+ device_vector<half4> *tex_img = new device_vector<half4>();
if(!file_load_image<TypeDesc::HALF, half>(img,
type,
texture_limit,
- tex_img)) {
+ *tex_img)) {
/* on failure to load, we set a 1x1 pixels pink image */
- half *pixels = (half*)tex_img.resize(1, 1);
+ half *pixels = (half*)tex_img->resize(1, 1);
pixels[0] = TEX_IMAGE_MISSING_R;
pixels[1] = TEX_IMAGE_MISSING_G;
@@ -864,47 +813,38 @@ void ImageManager::device_load_image(Device *device,
pixels[3] = TEX_IMAGE_MISSING_A;
}
- {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_alloc(name.c_str(),
- tex_img,
- img->interpolation,
- img->extension);
- }
+ img->mem = tex_img;
}
- else if(type == IMAGE_DATA_TYPE_HALF){
- if(dscene->tex_half_image[slot] == NULL)
- dscene->tex_half_image[slot] = new device_vector<half>();
- device_vector<half>& tex_img = *dscene->tex_half_image[slot];
-
- if(tex_img.device_pointer) {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_free(tex_img);
- }
+ else if(type == IMAGE_DATA_TYPE_HALF) {
+ device_vector<half> *tex_img = new device_vector<half>();
if(!file_load_image<TypeDesc::HALF, half>(img,
type,
texture_limit,
- tex_img)) {
+ *tex_img)) {
/* on failure to load, we set a 1x1 pixels pink image */
- half *pixels = (half*)tex_img.resize(1, 1);
+ half *pixels = (half*)tex_img->resize(1, 1);
pixels[0] = TEX_IMAGE_MISSING_R;
}
- {
- thread_scoped_lock device_lock(device_mutex);
- device->tex_alloc(name.c_str(),
- tex_img,
- img->interpolation,
- img->extension);
- }
+ img->mem = tex_img;
}
+ /* Copy to device. */
+ if(img->mem) {
+ thread_scoped_lock device_lock(device_mutex);
+ device->tex_alloc(name.c_str(),
+ *img->mem,
+ img->interpolation,
+ img->extension);
+ }
+
+
img->need_load = false;
}
-void ImageManager::device_free_image(Device *device, DeviceScene *dscene, ImageDataType type, int slot)
+void ImageManager::device_free_image(Device *device, ImageDataType type, int slot)
{
Image *img = images[type][slot];
@@ -915,105 +855,20 @@ void ImageManager::device_free_image(Device *device, DeviceScene *dscene, ImageD
((OSL::TextureSystem*)osl_texture_system)->invalidate(filename);
#endif
}
- else {
- device_memory *tex_img = NULL;
- switch(type) {
- case IMAGE_DATA_TYPE_FLOAT4:
- if(slot >= dscene->tex_float4_image.size()) {
- break;
- }
- tex_img = dscene->tex_float4_image[slot];
- dscene->tex_float4_image[slot] = NULL;
- break;
- case IMAGE_DATA_TYPE_BYTE4:
- if(slot >= dscene->tex_byte4_image.size()) {
- break;
- }
- tex_img = dscene->tex_byte4_image[slot];
- dscene->tex_byte4_image[slot]= NULL;
- break;
- case IMAGE_DATA_TYPE_HALF4:
- if(slot >= dscene->tex_half4_image.size()) {
- break;
- }
- tex_img = dscene->tex_half4_image[slot];
- dscene->tex_half4_image[slot]= NULL;
- break;
- case IMAGE_DATA_TYPE_FLOAT:
- if(slot >= dscene->tex_float_image.size()) {
- break;
- }
- tex_img = dscene->tex_float_image[slot];
- dscene->tex_float_image[slot] = NULL;
- break;
- case IMAGE_DATA_TYPE_BYTE:
- if(slot >= dscene->tex_byte_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list