[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59678] trunk/blender/intern/cycles: Cycles: viewport render now takes scene color management settings into account,
Brecht Van Lommel
brechtvanlommel at pandora.be
Sat Aug 31 01:49:39 CEST 2013
Revision: 59678
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59678
Author: blendix
Date: 2013-08-30 23:49:38 +0000 (Fri, 30 Aug 2013)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/intern/cycles/blender/blender_session.cpp
trunk/blender/intern/cycles/blender/blender_sync.cpp
trunk/blender/intern/cycles/device/device.cpp
trunk/blender/intern/cycles/device/device_cpu.cpp
trunk/blender/intern/cycles/device/device_cuda.cpp
trunk/blender/intern/cycles/device/device_memory.h
trunk/blender/intern/cycles/device/device_multi.cpp
trunk/blender/intern/cycles/device/device_network.cpp
trunk/blender/intern/cycles/device/device_network.h
trunk/blender/intern/cycles/device/device_opencl.cpp
trunk/blender/intern/cycles/device/device_task.cpp
trunk/blender/intern/cycles/device/device_task.h
trunk/blender/intern/cycles/kernel/kernel.cl
trunk/blender/intern/cycles/kernel/kernel.cpp
trunk/blender/intern/cycles/kernel/kernel.cu
trunk/blender/intern/cycles/kernel/kernel.h
trunk/blender/intern/cycles/kernel/kernel_compat_cuda.h
trunk/blender/intern/cycles/kernel/kernel_film.h
trunk/blender/intern/cycles/kernel/kernel_sse2.cpp
trunk/blender/intern/cycles/kernel/kernel_sse3.cpp
trunk/blender/intern/cycles/render/buffers.cpp
trunk/blender/intern/cycles/render/buffers.h
trunk/blender/intern/cycles/render/session.cpp
trunk/blender/intern/cycles/render/session.h
trunk/blender/intern/cycles/util/util_types.h
Modified: trunk/blender/intern/cycles/blender/blender_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp 2013-08-30 23:49:35 UTC (rev 59677)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp 2013-08-30 23:49:38 UTC (rev 59678)
@@ -588,7 +588,15 @@
/* draw */
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
- return !session->draw(buffer_params);
+ if(session->params.display_buffer_linear)
+ b_engine.bind_display_space_shader(b_scene);
+
+ bool draw_ok = !session->draw(buffer_params);
+
+ if(session->params.display_buffer_linear)
+ b_engine.unbind_display_space_shader();
+
+ return draw_ok;
}
void BlenderSession::get_status(string& status, string& substatus)
Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp 2013-08-30 23:49:35 UTC (rev 59677)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp 2013-08-30 23:49:38 UTC (rev 59678)
@@ -492,6 +492,9 @@
params.shadingsystem = SessionParams::SVM;
else if(shadingsystem == 1)
params.shadingsystem = SessionParams::OSL;
+
+ /* color managagement */
+ params.display_buffer_linear = b_engine.support_display_space_shader(b_scene);
return params;
}
Modified: trunk/blender/intern/cycles/device/device.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device.cpp 2013-08-30 23:49:35 UTC (rev 59677)
+++ trunk/blender/intern/cycles/device/device.cpp 2013-08-30 23:49:38 UTC (rev 59678)
@@ -41,7 +41,10 @@
void Device::pixels_copy_from(device_memory& mem, int y, int w, int h)
{
- mem_copy_from(mem, y, w, h, sizeof(uint8_t)*4);
+ if(mem.data_type == TYPE_HALF)
+ mem_copy_from(mem, y, w, h, sizeof(half4));
+ else
+ mem_copy_from(mem, y, w, h, sizeof(uchar4));
}
void Device::pixels_free(device_memory& mem)
@@ -53,27 +56,49 @@
{
pixels_copy_from(rgba, y, w, h);
+ GLuint texid;
+ glGenTextures(1, &texid);
+ glBindTexture(GL_TEXTURE_2D, texid);
+ if(rgba.data_type == TYPE_HALF)
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, w, h, 0, GL_RGBA, GL_HALF_FLOAT, (void*)rgba.data_pointer);
+ else
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)rgba.data_pointer);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ glEnable(GL_TEXTURE_2D);
+
if(transparent) {
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
- glPixelZoom((float)width/(float)w, (float)height/(float)h);
- glRasterPos2f(0, dy);
+ glColor3f(1.0f, 1.0f, 1.0f);
- uint8_t *pixels = (uint8_t*)rgba.data_pointer;
+ glPushMatrix();
+ glTranslatef(0.0f, (float)dy, 0.0f);
- /* for multi devices, this assumes the ineffecient method that we allocate
- * all pixels on the device even though we only render to a subset */
- pixels += 4*y*w;
+ glBegin(GL_QUADS);
+
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex2f(0.0f, 0.0f);
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex2f((float)width, 0.0f);
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex2f((float)width, (float)height);
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex2f(0.0f, (float)height);
- glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ glEnd();
- glRasterPos2f(0.0f, 0.0f);
- glPixelZoom(1.0f, 1.0f);
+ glPopMatrix();
if(transparent)
glDisable(GL_BLEND);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+ glDeleteTextures(1, &texid);
}
Device *Device::create(DeviceInfo& info, Stats &stats, bool background)
Modified: trunk/blender/intern/cycles/device/device_cpu.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cpu.cpp 2013-08-30 23:49:35 UTC (rev 59677)
+++ trunk/blender/intern/cycles/device/device_cpu.cpp 2013-08-30 23:49:38 UTC (rev 59678)
@@ -127,8 +127,8 @@
{
if(task->type == DeviceTask::PATH_TRACE)
thread_path_trace(*task);
- else if(task->type == DeviceTask::TONEMAP)
- thread_tonemap(*task);
+ else if(task->type == DeviceTask::FILM_CONVERT)
+ thread_film_convert(*task);
else if(task->type == DeviceTask::SHADER)
thread_shader(*task);
}
@@ -237,28 +237,55 @@
#endif
}
- void thread_tonemap(DeviceTask& task)
+ void thread_film_convert(DeviceTask& task)
{
+ float sample_scale = 1.0f/(task.sample + 1);
+
+ if(task.rgba_half) {
#ifdef WITH_OPTIMIZED_KERNEL
- if(system_cpu_support_sse3()) {
- for(int y = task.y; y < task.y + task.h; y++)
- for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_sse3_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer,
- task.sample, x, y, task.offset, task.stride);
+ if(system_cpu_support_sse3()) {
+ for(int y = task.y; y < task.y + task.h; y++)
+ for(int x = task.x; x < task.x + task.w; x++)
+ kernel_cpu_sse3_convert_to_half_float(&kernel_globals, (uchar4*)task.rgba_half, (float*)task.buffer,
+ sample_scale, x, y, task.offset, task.stride);
+ }
+ else if(system_cpu_support_sse2()) {
+ for(int y = task.y; y < task.y + task.h; y++)
+ for(int x = task.x; x < task.x + task.w; x++)
+ kernel_cpu_sse2_convert_to_half_float(&kernel_globals, (uchar4*)task.rgba_half, (float*)task.buffer,
+ sample_scale, x, y, task.offset, task.stride);
+ }
+ else
+#endif
+ {
+ for(int y = task.y; y < task.y + task.h; y++)
+ for(int x = task.x; x < task.x + task.w; x++)
+ kernel_cpu_convert_to_half_float(&kernel_globals, (uchar4*)task.rgba_half, (float*)task.buffer,
+ sample_scale, x, y, task.offset, task.stride);
+ }
}
- else if(system_cpu_support_sse2()) {
- for(int y = task.y; y < task.y + task.h; y++)
- for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_sse2_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer,
- task.sample, x, y, task.offset, task.stride);
- }
- else
+ else {
+#ifdef WITH_OPTIMIZED_KERNEL
+ if(system_cpu_support_sse3()) {
+ for(int y = task.y; y < task.y + task.h; y++)
+ for(int x = task.x; x < task.x + task.w; x++)
+ kernel_cpu_sse3_convert_to_byte(&kernel_globals, (uchar4*)task.rgba_byte, (float*)task.buffer,
+ sample_scale, x, y, task.offset, task.stride);
+ }
+ else if(system_cpu_support_sse2()) {
+ for(int y = task.y; y < task.y + task.h; y++)
+ for(int x = task.x; x < task.x + task.w; x++)
+ kernel_cpu_sse2_convert_to_byte(&kernel_globals, (uchar4*)task.rgba_byte, (float*)task.buffer,
+ sample_scale, x, y, task.offset, task.stride);
+ }
+ else
#endif
- {
- for(int y = task.y; y < task.y + task.h; y++)
- for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer,
- task.sample, x, y, task.offset, task.stride);
+ {
+ for(int y = task.y; y < task.y + task.h; y++)
+ for(int x = task.x; x < task.x + task.w; x++)
+ kernel_cpu_convert_to_byte(&kernel_globals, (uchar4*)task.rgba_byte, (float*)task.buffer,
+ sample_scale, x, y, task.offset, task.stride);
+ }
}
}
Modified: trunk/blender/intern/cycles/device/device_cuda.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cuda.cpp 2013-08-30 23:49:35 UTC (rev 59677)
+++ trunk/blender/intern/cycles/device/device_cuda.cpp 2013-08-30 23:49:38 UTC (rev 59678)
@@ -625,7 +625,7 @@
cuda_pop_context();
}
- 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)
{
if(have_error())
return;
@@ -633,11 +633,14 @@
cuda_push_context();
CUfunction cuFilmConvert;
- CUdeviceptr d_rgba = map_pixels(rgba);
+ CUdeviceptr d_rgba = map_pixels((rgba_byte)? rgba_byte: rgba_half);
CUdeviceptr d_buffer = cuda_device_ptr(buffer);
/* get kernel function */
- cuda_assert(cuModuleGetFunction(&cuFilmConvert, cuModule, "kernel_cuda_tonemap"))
+ if(rgba_half)
+ cuda_assert(cuModuleGetFunction(&cuFilmConvert, cuModule, "kernel_cuda_convert_to_half_float"))
+ else
+ cuda_assert(cuModuleGetFunction(&cuFilmConvert, cuModule, "kernel_cuda_convert_to_byte"))
/* pass in parameters */
int offset = 0;
@@ -648,11 +651,11 @@
cuda_assert(cuParamSetv(cuFilmConvert, offset, &d_buffer, sizeof(d_buffer)))
offset += sizeof(d_buffer);
- int sample = task.sample;
- offset = align_up(offset, __alignof(sample));
+ float sample_scale = 1.0f/(task.sample + 1);
+ offset = align_up(offset, __alignof(sample_scale));
- cuda_assert(cuParamSeti(cuFilmConvert, offset, task.sample))
- offset += sizeof(task.sample);
+ cuda_assert(cuParamSetf(cuFilmConvert, offset, sample_scale))
+ offset += sizeof(sample_scale);
cuda_assert(cuParamSeti(cuFilmConvert, offset, task.x))
offset += sizeof(task.x);
@@ -684,7 +687,7 @@
cuda_assert(cuFuncSetBlockShape(cuFilmConvert, xthreads, ythreads, 1))
cuda_assert(cuLaunchGrid(cuFilmConvert, xblocks, yblocks))
- unmap_pixels(task.rgba);
+ unmap_pixels((rgba_byte)? rgba_byte: rgba_half);
cuda_pop_context();
}
@@ -771,13 +774,19 @@
glGenBuffers(1, &pmem.cuPBO);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pmem.cuPBO);
- glBufferData(GL_PIXEL_UNPACK_BUFFER, pmem.w*pmem.h*sizeof(GLfloat)*3, NULL, GL_DYNAMIC_DRAW);
+ if(mem.data_type == TYPE_HALF)
+ glBufferData(GL_PIXEL_UNPACK_BUFFER, pmem.w*pmem.h*sizeof(GLhalf)*4, NULL, GL_DYNAMIC_DRAW);
+ else
+ glBufferData(GL_PIXEL_UNPACK_BUFFER, pmem.w*pmem.h*sizeof(uint8_t)*4, NULL, GL_DYNAMIC_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
glGenTextures(1, &pmem.cuTexId);
glBindTexture(GL_TEXTURE_2D, pmem.cuTexId);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pmem.w, pmem.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ if(mem.data_type == TYPE_HALF)
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, pmem.w, pmem.h, 0, GL_RGBA, GL_HALF_FLOAT, NULL);
+ else
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pmem.w, pmem.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);
@@ -865,11 +874,19 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list