diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-08-31 03:49:38 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-08-31 03:49:38 +0400 |
commit | 29f6616d609fbd92cf313b0fdec555c2fcb4ede0 (patch) | |
tree | e0c9500368c5210071cb841ea86f5674b0cf6f25 /intern/cycles/device/device_opencl.cpp | |
parent | 60ff60dcdc9f43891fb8a19e10f9bb7964a539bf (diff) |
Cycles: viewport render now takes scene color management settings into account,
except for curves, that's still missing from the OpenColorIO GLSL shader.
The pixels are stored in a half float texture, converterd from full float with
native GPU instructions and SIMD on the CPU, so it should be pretty quick.
Using a GLSL shader is useful for GPU render because it avoids a copy through
CPU memory.
Diffstat (limited to 'intern/cycles/device/device_opencl.cpp')
-rw-r--r-- | intern/cycles/device/device_opencl.cpp | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp index e800b3f6442..d723df70c89 100644 --- a/intern/cycles/device/device_opencl.cpp +++ b/intern/cycles/device/device_opencl.cpp @@ -321,7 +321,8 @@ public: cl_device_id cdDevice; cl_program cpProgram; cl_kernel ckPathTraceKernel; - cl_kernel ckFilmConvertKernel; + cl_kernel ckFilmConvertByteKernel; + cl_kernel ckFilmConvertHalfFloatKernel; cl_kernel ckShaderKernel; cl_int ciErr; @@ -431,7 +432,8 @@ public: cqCommandQueue = NULL; cpProgram = NULL; ckPathTraceKernel = NULL; - ckFilmConvertKernel = NULL; + ckFilmConvertByteKernel = NULL; + ckFilmConvertHalfFloatKernel = NULL; ckShaderKernel = NULL; null_mem = 0; device_initialized = false; @@ -762,7 +764,11 @@ public: if(opencl_error(ciErr)) return false; - ckFilmConvertKernel = clCreateKernel(cpProgram, "kernel_ocl_tonemap", &ciErr); + ckFilmConvertByteKernel = clCreateKernel(cpProgram, "kernel_ocl_convert_to_byte", &ciErr); + if(opencl_error(ciErr)) + return false; + + ckFilmConvertHalfFloatKernel = clCreateKernel(cpProgram, "kernel_ocl_convert_to_half_float", &ciErr); if(opencl_error(ciErr)) return false; @@ -788,8 +794,10 @@ public: if(ckPathTraceKernel) clReleaseKernel(ckPathTraceKernel); - if(ckFilmConvertKernel) - clReleaseKernel(ckFilmConvertKernel); + if(ckFilmConvertByteKernel) + clReleaseKernel(ckFilmConvertByteKernel); + if(ckFilmConvertHalfFloatKernel) + clReleaseKernel(ckFilmConvertHalfFloatKernel); if(cpProgram) clReleaseProgram(cpProgram); if(cqCommandQueue) @@ -980,17 +988,17 @@ public: return err; } - void tonemap(DeviceTask& task, device_ptr buffer, device_ptr rgba) + void film_convert(DeviceTask& task, device_ptr buffer, device_ptr rgba_byte, device_ptr rgba_half) { /* cast arguments to cl types */ cl_mem d_data = CL_MEM_PTR(const_mem_map["__data"]->device_pointer); - cl_mem d_rgba = CL_MEM_PTR(rgba); + cl_mem d_rgba = (rgba_byte)? CL_MEM_PTR(rgba_byte): CL_MEM_PTR(rgba_half); cl_mem d_buffer = CL_MEM_PTR(buffer); cl_int d_x = task.x; cl_int d_y = task.y; cl_int d_w = task.w; cl_int d_h = task.h; - cl_int d_sample = task.sample; + cl_float d_sample_scale = 1.0f/(task.sample + 1); cl_int d_offset = task.offset; cl_int d_stride = task.stride; @@ -998,6 +1006,8 @@ public: cl_uint narg = 0; ciErr = 0; + cl_kernel ckFilmConvertKernel = (rgba_byte)? ckFilmConvertByteKernel: ckFilmConvertHalfFloatKernel; + ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_data), (void*)&d_data); ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_rgba), (void*)&d_rgba); ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_buffer), (void*)&d_buffer); @@ -1006,7 +1016,7 @@ public: ciErr |= set_kernel_arg_mem(ckFilmConvertKernel, &narg, #name); #include "kernel_textures.h" - ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_sample), (void*)&d_sample); + ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_sample_scale), (void*)&d_sample_scale); ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_x), (void*)&d_x); ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_y), (void*)&d_y); ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_w), (void*)&d_w); @@ -1052,8 +1062,8 @@ public: void thread_run(DeviceTask *task) { - if(task->type == DeviceTask::TONEMAP) { - tonemap(*task, task->buffer, task->rgba); + if(task->type == DeviceTask::FILM_CONVERT) { + film_convert(*task, task->buffer, task->rgba_byte, task->rgba_half); } else if(task->type == DeviceTask::SHADER) { shader(*task); |