From 1994ed00a388d7eed3c9d4dfda614c41693c114e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 10 Feb 2013 13:44:18 +0000 Subject: add option not to calculate tessellation faces when converting an object to a mesh. (OBJ export no longer needs, so save some CPU cycles and skip tessellation) --- intern/cycles/blender/blender_util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'intern') diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index 0947b5a2e9d..976ed875211 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -41,7 +41,7 @@ CCL_NAMESPACE_BEGIN static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL::Scene scene, bool apply_modifiers, bool render) { - return data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1); + return data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1, true); } static inline void colorramp_to_array(BL::ColorRamp ramp, float4 *data, int size) -- cgit v1.2.3 From 8d4d27de9f0919c74fa629c287ba6678e79ce9a4 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 10 Feb 2013 18:02:59 +0000 Subject: Fix #34184: cycles speed vector pass should be zero when using motion blur, instead it had value 10000. --- intern/cycles/blender/blender_session.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'intern') diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 951f7022a10..dfea9833287 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -410,8 +410,10 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::Re int components = b_pass.channels(); /* copy pixels */ - if(buffers->get_pass_rect(pass_type, exposure, rtile.sample, components, &pixels[0])) - b_pass.rect(&pixels[0]); + if(!buffers->get_pass_rect(pass_type, exposure, rtile.sample, components, &pixels[0])) + memset(&pixels[0], 0, pixels.size()*sizeof(float)); + + b_pass.rect(&pixels[0]); } } -- cgit v1.2.3 From 50f7328fb6067cf5bf922c00a585886f9e992728 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 10 Feb 2013 20:47:44 +0000 Subject: Fix scons win32 link error with OSL, also fix a GLEW linker warning --- intern/cycles/SConscript | 2 ++ 1 file changed, 2 insertions(+) (limited to 'intern') diff --git a/intern/cycles/SConscript b/intern/cycles/SConscript index 8a8ef9cce39..7b4d2db6861 100644 --- a/intern/cycles/SConscript +++ b/intern/cycles/SConscript @@ -43,6 +43,8 @@ incs = [] defs = [] cxxflags = Split(env['CXXFLAGS']) +defs.append('GLEW_STATIC') + defs.append('CCL_NAMESPACE_BEGIN=namespace ccl {') defs.append('CCL_NAMESPACE_END=}') -- cgit v1.2.3 From 2005f7c6c0ee47b85bbcf5999225e86117290a65 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 11 Feb 2013 00:49:00 +0000 Subject: style cleanup: also some typos --- intern/bsp/intern/CSG_BooleanOps.cpp | 20 ++++++++++---------- intern/ghost/intern/GHOST_SystemCocoa.mm | 6 ++---- 2 files changed, 12 insertions(+), 14 deletions(-) (limited to 'intern') diff --git a/intern/bsp/intern/CSG_BooleanOps.cpp b/intern/bsp/intern/CSG_BooleanOps.cpp index 4f71e7992a1..f74dfc3c253 100644 --- a/intern/bsp/intern/CSG_BooleanOps.cpp +++ b/intern/bsp/intern/CSG_BooleanOps.cpp @@ -88,16 +88,16 @@ CSG_PerformBooleanOperation( BoolOpType boolType; - switch( op_type ) { - case e_csg_union: - boolType = BOP_UNION; - break; - case e_csg_difference: - boolType = BOP_DIFFERENCE; - break; - default: - boolType = BOP_INTERSECTION; - break; + switch (op_type) { + case e_csg_union: + boolType = BOP_UNION; + break; + case e_csg_difference: + boolType = BOP_DIFFERENCE; + break; + default: + boolType = BOP_INTERSECTION; + break; } BoolOpState boolOpResult; diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index e4245aaf095..6cf4ada6311 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1028,8 +1028,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleWindowEvent(GHOST_TEventType eventType, if (!validWindow(window)) { return GHOST_kFailure; } - switch(eventType) - { + switch (eventType) { case GHOST_kEventWindowClose: pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window) ); break; @@ -1086,8 +1085,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType if (!validWindow(window)) { return GHOST_kFailure; } - switch(eventType) - { + switch (eventType) { case GHOST_kEventDraggingEntered: case GHOST_kEventDraggingUpdated: case GHOST_kEventDraggingExited: -- cgit v1.2.3 From 53bce285ab42641959ce11095732d34a8e893f88 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 11 Feb 2013 08:16:32 +0000 Subject: patch [#31636] no pressure with Genius Mousepen i608X tablet from Viktoria S. (viktorias) --- intern/ghost/intern/GHOST_SystemX11.cpp | 29 ++++++++++++++++++++++------- intern/ghost/intern/GHOST_SystemX11.h | 3 +++ 2 files changed, 25 insertions(+), 7 deletions(-) (limited to 'intern') diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index 7ba8889fd1e..f8c7bf45ffc 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -133,6 +133,10 @@ GHOST_SystemX11( m_xclip_out = XInternAtom(m_display, "XCLIP_OUT", False); m_incr = XInternAtom(m_display, "INCR", False); m_utf8_string = XInternAtom(m_display, "UTF8_STRING", False); +#ifdef WITH_X11_XINPUT + m_xi_tablet = XInternAtom(m_display, XI_TABLET, False); +#endif + m_last_warp = 0; @@ -1939,7 +1943,9 @@ void GHOST_SystemX11::initXInputDevices() // printf("Tablet type:'%s', name:'%s', index:%d\n", device_type, device_info[i].name, i); - if (m_xtablet.StylusDevice == NULL && is_stylus(device_info[i].name, device_type)) { + if ((m_xtablet.StylusDevice == NULL) && + (is_stylus(device_info[i].name, device_type) || (device_info[i].type == m_xi_tablet))) + { // printf("\tfound stylus\n"); m_xtablet.StylusID = device_info[i].id; m_xtablet.StylusDevice = XOpenDevice(m_display, m_xtablet.StylusID); @@ -1952,11 +1958,18 @@ void GHOST_SystemX11::initXInputDevices() // printf("\t\tfound ValuatorClass\n"); XValuatorInfo *xvi = (XValuatorInfo *)ici; m_xtablet.PressureLevels = xvi->axes[2].max_value; - - /* this is assuming that the tablet has the same tilt resolution in both - * positive and negative directions. It would be rather weird if it didn't.. */ - m_xtablet.XtiltLevels = xvi->axes[3].max_value; - m_xtablet.YtiltLevels = xvi->axes[4].max_value; + + if (xvi->num_axes > 3) { + /* this is assuming that the tablet has the same tilt resolution in both + * positive and negative directions. It would be rather weird if it didn't.. */ + m_xtablet.XtiltLevels = xvi->axes[3].max_value; + m_xtablet.YtiltLevels = xvi->axes[4].max_value; + } + else { + m_xtablet.XtiltLevels = 0; + m_xtablet.YtiltLevels = 0; + } + break; } @@ -1967,7 +1980,9 @@ void GHOST_SystemX11::initXInputDevices() m_xtablet.StylusID = 0; } } - else if (m_xtablet.EraserDevice == NULL && is_eraser(device_info[i].name, device_type)) { + else if ((m_xtablet.EraserDevice == NULL) && + (is_eraser(device_info[i].name, device_type))) + { // printf("\tfound eraser\n"); m_xtablet.EraserID = device_info[i].id; m_xtablet.EraserDevice = XOpenDevice(m_display, m_xtablet.EraserID); diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h index 5fd494637f9..69ae634bb25 100644 --- a/intern/ghost/intern/GHOST_SystemX11.h +++ b/intern/ghost/intern/GHOST_SystemX11.h @@ -301,6 +301,9 @@ public: Atom m_xclip_out; Atom m_incr; Atom m_utf8_string; +#ifdef WITH_X11_XINPUT + Atom m_xi_tablet; +#endif #ifdef WITH_X11_XINPUT typedef struct GHOST_TabletX11 { -- cgit v1.2.3 From fb01dcea5ff167b838e25f234029f93b690954dc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 11 Feb 2013 09:30:04 +0000 Subject: move atoms into their own struct and make all names match the original atom names, there were too many and mixed in with the classes namespace. --- intern/ghost/intern/GHOST_SystemX11.cpp | 111 ++++++++++++++++---------------- intern/ghost/intern/GHOST_SystemX11.h | 64 +++++++++--------- intern/ghost/intern/GHOST_WindowX11.cpp | 44 ++++++------- 3 files changed, 111 insertions(+), 108 deletions(-) (limited to 'intern') diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index f8c7bf45ffc..48fb8375303 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -109,36 +109,37 @@ GHOST_SystemX11( m_xim = NULL; #endif - m_delete_window_atom - = XInternAtom(m_display, "WM_DELETE_WINDOW", True); - - m_wm_protocols = XInternAtom(m_display, "WM_PROTOCOLS", False); - m_wm_take_focus = XInternAtom(m_display, "WM_TAKE_FOCUS", False); - m_wm_state = XInternAtom(m_display, "WM_STATE", False); - m_wm_change_state = XInternAtom(m_display, "WM_CHANGE_STATE", False); - m_net_state = XInternAtom(m_display, "_NET_WM_STATE", False); - m_net_max_horz = XInternAtom(m_display, - "_NET_WM_STATE_MAXIMIZED_HORZ", False); - m_net_max_vert = XInternAtom(m_display, - "_NET_WM_STATE_MAXIMIZED_VERT", False); - m_net_fullscreen = XInternAtom(m_display, - "_NET_WM_STATE_FULLSCREEN", False); - m_motif = XInternAtom(m_display, "_MOTIF_WM_HINTS", False); - m_targets = XInternAtom(m_display, "TARGETS", False); - m_string = XInternAtom(m_display, "STRING", False); - m_compound_text = XInternAtom(m_display, "COMPOUND_TEXT", False); - m_text = XInternAtom(m_display, "TEXT", False); - m_clipboard = XInternAtom(m_display, "CLIPBOARD", False); - m_primary = XInternAtom(m_display, "PRIMARY", False); - m_xclip_out = XInternAtom(m_display, "XCLIP_OUT", False); - m_incr = XInternAtom(m_display, "INCR", False); - m_utf8_string = XInternAtom(m_display, "UTF8_STRING", False); +#define GHOST_INTERN_ATOM_IF_EXISTS(atom) { m_atom.atom = XInternAtom(m_display, #atom , True); } (void)0 +#define GHOST_INTERN_ATOM(atom) { m_atom.atom = XInternAtom(m_display, #atom , False); } (void)0 + + GHOST_INTERN_ATOM_IF_EXISTS(WM_DELETE_WINDOW); + GHOST_INTERN_ATOM(WM_PROTOCOLS); + GHOST_INTERN_ATOM(WM_TAKE_FOCUS); + GHOST_INTERN_ATOM(WM_STATE); + GHOST_INTERN_ATOM(WM_CHANGE_STATE); + GHOST_INTERN_ATOM(_NET_WM_STATE); + GHOST_INTERN_ATOM(_NET_WM_STATE_MAXIMIZED_HORZ); + GHOST_INTERN_ATOM(_NET_WM_STATE_MAXIMIZED_VERT); + + GHOST_INTERN_ATOM(_NET_WM_STATE_FULLSCREEN); + GHOST_INTERN_ATOM(_MOTIF_WM_HINTS); + GHOST_INTERN_ATOM(TARGETS); + GHOST_INTERN_ATOM(STRING); + GHOST_INTERN_ATOM(COMPOUND_TEXT); + GHOST_INTERN_ATOM(TEXT); + GHOST_INTERN_ATOM(CLIPBOARD); + GHOST_INTERN_ATOM(PRIMARY); + GHOST_INTERN_ATOM(XCLIP_OUT); + GHOST_INTERN_ATOM(INCR); + GHOST_INTERN_ATOM(UTF8_STRING); #ifdef WITH_X11_XINPUT - m_xi_tablet = XInternAtom(m_display, XI_TABLET, False); + m_atom.TABLET = XInternAtom(m_display, XI_TABLET, False); #endif - m_last_warp = 0; +#undef GHOST_INTERN_ATOM_IF_EXISTS +#undef GHOST_INTERN_ATOM + m_last_warp = 0; /* compute the initial time */ timeval tv; @@ -963,7 +964,7 @@ GHOST_SystemX11::processEvent(XEvent *xe) { XClientMessageEvent & xcme = xe->xclient; - if (((Atom)xcme.data.l[0]) == m_delete_window_atom) { + if (((Atom)xcme.data.l[0]) == m_atom.WM_DELETE_WINDOW) { g_event = new GHOST_Event( getMilliSeconds(), @@ -971,7 +972,7 @@ GHOST_SystemX11::processEvent(XEvent *xe) window ); } - else if (((Atom)xcme.data.l[0]) == m_wm_take_focus) { + else if (((Atom)xcme.data.l[0]) == m_atom.WM_TAKE_FOCUS) { XWindowAttributes attr; Window fwin; int revert_to; @@ -1524,7 +1525,7 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, } /* Send a selection request */ - XConvertSelection(m_display, sel, target, m_xclip_out, win, CurrentTime); + XConvertSelection(m_display, sel, target, m_atom.XCLIP_OUT, win, CurrentTime); *context = XCLIB_XCOUT_SENTCONVSEL; return; @@ -1532,28 +1533,28 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, if (evt.type != SelectionNotify) return; - if (target == m_utf8_string && evt.xselection.property == None) { + if (target == m_atom.UTF8_STRING && evt.xselection.property == None) { *context = XCLIB_XCOUT_FALLBACK_UTF8; return; } - else if (target == m_compound_text && evt.xselection.property == None) { + else if (target == m_atom.COMPOUND_TEXT && evt.xselection.property == None) { *context = XCLIB_XCOUT_FALLBACK_COMP; return; } - else if (target == m_text && evt.xselection.property == None) { + else if (target == m_atom.TEXT && evt.xselection.property == None) { *context = XCLIB_XCOUT_FALLBACK_TEXT; return; } /* find the size and format of the data in property */ - XGetWindowProperty(m_display, win, m_xclip_out, 0, 0, False, + XGetWindowProperty(m_display, win, m_atom.XCLIP_OUT, 0, 0, False, AnyPropertyType, &pty_type, &pty_format, &pty_items, &pty_size, &buffer); XFree(buffer); - if (pty_type == m_incr) { + if (pty_type == m_atom.INCR) { /* start INCR mechanism by deleting property */ - XDeleteProperty(m_display, win, m_xclip_out); + XDeleteProperty(m_display, win, m_atom.XCLIP_OUT); XFlush(m_display); *context = XCLIB_XCOUT_INCR; return; @@ -1568,12 +1569,12 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, } // not using INCR mechanism, just read the property - XGetWindowProperty(m_display, win, m_xclip_out, 0, (long) pty_size, + XGetWindowProperty(m_display, win, m_atom.XCLIP_OUT, 0, (long) pty_size, False, AnyPropertyType, &pty_type, &pty_format, &pty_items, &pty_size, &buffer); /* finished with property, delete it */ - XDeleteProperty(m_display, win, m_xclip_out); + XDeleteProperty(m_display, win, m_atom.XCLIP_OUT); /* copy the buffer to the pointer for returned data */ ltxt = (unsigned char *) malloc(pty_items); @@ -1606,7 +1607,7 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, return; /* check size and format of the property */ - XGetWindowProperty(m_display, win, m_xclip_out, 0, 0, False, + XGetWindowProperty(m_display, win, m_atom.XCLIP_OUT, 0, 0, False, AnyPropertyType, &pty_type, &pty_format, &pty_items, &pty_size, &buffer); @@ -1615,14 +1616,14 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, * to tell the other X client that we have read * it and to send the next property */ XFree(buffer); - XDeleteProperty(m_display, win, m_xclip_out); + XDeleteProperty(m_display, win, m_atom.XCLIP_OUT); return; } if (pty_size == 0) { /* no more data, exit from loop */ XFree(buffer); - XDeleteProperty(m_display, win, m_xclip_out); + XDeleteProperty(m_display, win, m_atom.XCLIP_OUT); *context = XCLIB_XCOUT_NONE; /* this means that an INCR transfer is now @@ -1634,7 +1635,7 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, /* if we have come this far, the property contains * text, we know the size. */ - XGetWindowProperty(m_display, win, m_xclip_out, 0, (long) pty_size, + XGetWindowProperty(m_display, win, m_atom.XCLIP_OUT, 0, (long) pty_size, False, AnyPropertyType, &pty_type, &pty_format, &pty_items, &pty_size, &buffer); @@ -1655,7 +1656,7 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, XFree(buffer); /* delete property to get the next item */ - XDeleteProperty(m_display, win, m_xclip_out); + XDeleteProperty(m_display, win, m_atom.XCLIP_OUT); XFlush(m_display); return; } @@ -1665,7 +1666,7 @@ void GHOST_SystemX11::getClipboard_xcout(XEvent evt, GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const { Atom sseln; - Atom target = m_utf8_string; + Atom target = m_atom.UTF8_STRING; Window owner; /* from xclip.c doOut() v0.11 */ @@ -1675,9 +1676,9 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const unsigned int context = XCLIB_XCOUT_NONE; if (selection == True) - sseln = m_primary; + sseln = m_atom.PRIMARY; else - sseln = m_clipboard; + sseln = m_atom.CLIPBOARD; vector & win_vec = m_windowManager->getWindows(); vector::iterator win_it = win_vec.begin(); @@ -1687,7 +1688,7 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const /* check if we are the owner. */ owner = XGetSelectionOwner(m_display, sseln); if (owner == win) { - if (sseln == m_clipboard) { + if (sseln == m_atom.CLIPBOARD) { sel_buf = (unsigned char *)malloc(strlen(txt_cut_buffer) + 1); strcpy((char *)sel_buf, txt_cut_buffer); return sel_buf; @@ -1712,19 +1713,19 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const /* fallback is needed. set XA_STRING to target and restart the loop. */ if (context == XCLIB_XCOUT_FALLBACK) { context = XCLIB_XCOUT_NONE; - target = m_string; + target = m_atom.STRING; continue; } else if (context == XCLIB_XCOUT_FALLBACK_UTF8) { /* utf8 fail, move to compouned text. */ context = XCLIB_XCOUT_NONE; - target = m_compound_text; + target = m_atom.COMPOUND_TEXT; continue; } else if (context == XCLIB_XCOUT_FALLBACK_COMP) { /* compouned text faile, move to text. */ context = XCLIB_XCOUT_NONE; - target = m_text; + target = m_atom.TEXT; continue; } @@ -1741,7 +1742,7 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const memcpy((char *)tmp_data, (char *)sel_buf, sel_len); tmp_data[sel_len] = '\0'; - if (sseln == m_string) + if (sseln == m_atom.STRING) XFree(sel_buf); else free(sel_buf); @@ -1762,8 +1763,8 @@ void GHOST_SystemX11::putClipboard(GHOST_TInt8 *buffer, bool selection) const if (buffer) { if (selection == False) { - XSetSelectionOwner(m_display, m_clipboard, m_window, CurrentTime); - owner = XGetSelectionOwner(m_display, m_clipboard); + XSetSelectionOwner(m_display, m_atom.CLIPBOARD, m_window, CurrentTime); + owner = XGetSelectionOwner(m_display, m_atom.CLIPBOARD); if (txt_cut_buffer) free((void *)txt_cut_buffer); @@ -1771,8 +1772,8 @@ void GHOST_SystemX11::putClipboard(GHOST_TInt8 *buffer, bool selection) const strcpy(txt_cut_buffer, buffer); } else { - XSetSelectionOwner(m_display, m_primary, m_window, CurrentTime); - owner = XGetSelectionOwner(m_display, m_primary); + XSetSelectionOwner(m_display, m_atom.PRIMARY, m_window, CurrentTime); + owner = XGetSelectionOwner(m_display, m_atom.PRIMARY); if (txt_select_buffer) free((void *)txt_select_buffer); @@ -1944,7 +1945,7 @@ void GHOST_SystemX11::initXInputDevices() if ((m_xtablet.StylusDevice == NULL) && - (is_stylus(device_info[i].name, device_type) || (device_info[i].type == m_xi_tablet))) + (is_stylus(device_info[i].name, device_type) || (device_info[i].type == m_atom.TABLET))) { // printf("\tfound stylus\n"); m_xtablet.StylusID = device_info[i].id; diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h index 69ae634bb25..a11aea240be 100644 --- a/intern/ghost/intern/GHOST_SystemX11.h +++ b/intern/ghost/intern/GHOST_SystemX11.h @@ -274,37 +274,6 @@ public: return 0; } - /** - * Atom used for ICCCM, WM-spec and Motif. - * We only need get this atom at the start, it's relative - * to the display not the window and are public for every - * window that need it. - */ - Atom m_wm_state; - Atom m_wm_change_state; - Atom m_net_state; - Atom m_net_max_horz; - Atom m_net_max_vert; - Atom m_net_fullscreen; - Atom m_motif; - Atom m_wm_take_focus; - Atom m_wm_protocols; - Atom m_delete_window_atom; - - /* Atoms for Selection, copy & paste. */ - Atom m_targets; - Atom m_string; - Atom m_compound_text; - Atom m_text; - Atom m_clipboard; - Atom m_primary; - Atom m_xclip_out; - Atom m_incr; - Atom m_utf8_string; -#ifdef WITH_X11_XINPUT - Atom m_xi_tablet; -#endif - #ifdef WITH_X11_XINPUT typedef struct GHOST_TabletX11 { XDevice *StylusDevice; @@ -326,6 +295,39 @@ public: } #endif // WITH_X11_XINPUT + struct { + /** + * Atom used for ICCCM, WM-spec and Motif. + * We only need get this atom at the start, it's relative + * to the display not the window and are public for every + * window that need it. + */ + Atom WM_STATE; + Atom WM_CHANGE_STATE; + Atom _NET_WM_STATE; + Atom _NET_WM_STATE_MAXIMIZED_HORZ; + Atom _NET_WM_STATE_MAXIMIZED_VERT; + Atom _NET_WM_STATE_FULLSCREEN; + Atom _MOTIF_WM_HINTS; + Atom WM_TAKE_FOCUS; + Atom WM_PROTOCOLS; + Atom WM_DELETE_WINDOW; + + /* Atoms for Selection, copy & paste. */ + Atom TARGETS; + Atom STRING; + Atom COMPOUND_TEXT; + Atom TEXT; + Atom CLIPBOARD; + Atom PRIMARY; + Atom XCLIP_OUT; + Atom INCR; + Atom UTF8_STRING; +#ifdef WITH_X11_XINPUT + Atom TABLET; +#endif + } m_atom; + private: Display *m_display; diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 7ef3a739b7e..50520b7eda5 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -395,16 +395,16 @@ GHOST_WindowX11( XFree(xclasshint); /* The basic for a good ICCCM "work" */ - if (m_system->m_wm_protocols) { + if (m_system->m_atom.WM_PROTOCOLS) { natom = 0; - if (m_system->m_delete_window_atom) { - atoms[natom] = m_system->m_delete_window_atom; + if (m_system->m_atom.WM_DELETE_WINDOW) { + atoms[natom] = m_system->m_atom.WM_DELETE_WINDOW; natom++; } - if (m_system->m_wm_take_focus) { - atoms[natom] = m_system->m_wm_take_focus; + if (m_system->m_atom.WM_TAKE_FOCUS) { + atoms[natom] = m_system->m_atom.WM_TAKE_FOCUS; natom++; } @@ -744,7 +744,7 @@ void GHOST_WindowX11::icccmSetState(int state) xev.xclient.display = m_display; xev.xclient.window = m_window; xev.xclient.format = 32; - xev.xclient.message_type = m_system->m_wm_change_state; + xev.xclient.message_type = m_system->m_atom.WM_CHANGE_STATE; xev.xclient.data.l[0] = state; XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)), False, SubstructureNotifyMask | SubstructureRedirectMask, &xev); @@ -758,8 +758,8 @@ int GHOST_WindowX11::icccmGetState(void) const int format_ret, st; prop_ret = NULL; - st = XGetWindowProperty(m_display, m_window, m_system->m_wm_state, 0, - 0x7fffffff, False, m_system->m_wm_state, &type_ret, + st = XGetWindowProperty(m_display, m_window, m_system->m_atom.WM_STATE, 0, + 0x7fffffff, False, m_system->m_atom.WM_STATE, &type_ret, &format_ret, &num_ret, &bytes_after, &prop_ret); if ((st == Success) && (prop_ret) && (num_ret == 2)) @@ -780,7 +780,7 @@ void GHOST_WindowX11::netwmMaximized(bool set) xev.xclient.serial = 0; xev.xclient.send_event = True; xev.xclient.window = m_window; - xev.xclient.message_type = m_system->m_net_state; + xev.xclient.message_type = m_system->m_atom._NET_WM_STATE; xev.xclient.format = 32; if (set == True) @@ -788,8 +788,8 @@ void GHOST_WindowX11::netwmMaximized(bool set) else xev.xclient.data.l[0] = _NET_WM_STATE_REMOVE; - xev.xclient.data.l[1] = m_system->m_net_max_horz; - xev.xclient.data.l[2] = m_system->m_net_max_vert; + xev.xclient.data.l[1] = m_system->m_atom._NET_WM_STATE_MAXIMIZED_HORZ; + xev.xclient.data.l[2] = m_system->m_atom._NET_WM_STATE_MAXIMIZED_VERT; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent(m_display, RootWindow(m_display, DefaultScreen(m_display)), @@ -806,15 +806,15 @@ bool GHOST_WindowX11::netwmIsMaximized(void) const prop_ret = NULL; st = False; - ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0, + ret = XGetWindowProperty(m_display, m_window, m_system->m_atom._NET_WM_STATE, 0, 0x7fffffff, False, XA_ATOM, &type_ret, &format_ret, &num_ret, &bytes_after, &prop_ret); if ((ret == Success) && (prop_ret) && (format_ret == 32)) { count = 0; for (i = 0; i < num_ret; i++) { - if (((unsigned long *) prop_ret)[i] == m_system->m_net_max_horz) + if (((unsigned long *) prop_ret)[i] == m_system->m_atom._NET_WM_STATE_MAXIMIZED_HORZ) count++; - if (((unsigned long *) prop_ret)[i] == m_system->m_net_max_vert) + if (((unsigned long *) prop_ret)[i] == m_system->m_atom._NET_WM_STATE_MAXIMIZED_VERT) count++; if (count == 2) { st = True; @@ -836,7 +836,7 @@ void GHOST_WindowX11::netwmFullScreen(bool set) xev.xclient.serial = 0; xev.xclient.send_event = True; xev.xclient.window = m_window; - xev.xclient.message_type = m_system->m_net_state; + xev.xclient.message_type = m_system->m_atom._NET_WM_STATE; xev.xclient.format = 32; if (set == True) @@ -844,7 +844,7 @@ void GHOST_WindowX11::netwmFullScreen(bool set) else xev.xclient.data.l[0] = _NET_WM_STATE_REMOVE; - xev.xclient.data.l[1] = m_system->m_net_fullscreen; + xev.xclient.data.l[1] = m_system->m_atom._NET_WM_STATE_FULLSCREEN; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; @@ -862,12 +862,12 @@ bool GHOST_WindowX11::netwmIsFullScreen(void) const prop_ret = NULL; st = False; - ret = XGetWindowProperty(m_display, m_window, m_system->m_net_state, 0, + ret = XGetWindowProperty(m_display, m_window, m_system->m_atom._NET_WM_STATE, 0, 0x7fffffff, False, XA_ATOM, &type_ret, &format_ret, &num_ret, &bytes_after, &prop_ret); if ((ret == Success) && (prop_ret) && (format_ret == 32)) { for (i = 0; i < num_ret; i++) { - if (((unsigned long *) prop_ret)[i] == m_system->m_net_fullscreen) { + if (((unsigned long *) prop_ret)[i] == m_system->m_atom._NET_WM_STATE_FULLSCREEN) { st = True; break; } @@ -889,8 +889,8 @@ void GHOST_WindowX11::motifFullScreen(bool set) else hints.decorations = 1; - XChangeProperty(m_display, m_window, m_system->m_motif, - m_system->m_motif, 32, PropModeReplace, + XChangeProperty(m_display, m_window, m_system->m_atom._MOTIF_WM_HINTS, + m_system->m_atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) &hints, 4); } @@ -905,8 +905,8 @@ bool GHOST_WindowX11::motifIsFullScreen(void) const prop_ret = NULL; state = False; - st = XGetWindowProperty(m_display, m_window, m_system->m_motif, 0, - 0x7fffffff, False, m_system->m_motif, + st = XGetWindowProperty(m_display, m_window, m_system->m_atom._MOTIF_WM_HINTS, 0, + 0x7fffffff, False, m_system->m_atom._MOTIF_WM_HINTS, &type_ret, &format_ret, &num_ret, &bytes_after, &prop_ret); if ((st == Success) && (prop_ret)) { -- cgit v1.2.3 From 1a8dcbcb4fe9686c641167fca3b880803859c5c4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 11 Feb 2013 16:22:20 +0000 Subject: quiet -Wnarrowing warning. --- intern/smoke/intern/FFT_NOISE.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'intern') diff --git a/intern/smoke/intern/FFT_NOISE.h b/intern/smoke/intern/FFT_NOISE.h index 8b7e4f2728b..0d8be7db602 100644 --- a/intern/smoke/intern/FFT_NOISE.h +++ b/intern/smoke/intern/FFT_NOISE.h @@ -94,9 +94,9 @@ static void generatTile_FFT(float* const noiseTileData, std::string filename) for (int x = 0; x < xRes; x++) { int index = x + y * xRes + z * xRes * yRes; - float diff[] = {abs(x - xRes/2), - abs(y - yRes/2), - abs(z - zRes/2)}; + float diff[] = {(float)abs(x - xRes / 2), + (float)abs(y - yRes / 2), + (float)abs(z - zRes / 2)}; float radius = sqrtf(diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2]) / (xRes / 2); -- cgit v1.2.3 From 1c4f704d5c6385c891057404fab462b5cc8121df Mon Sep 17 00:00:00 2001 From: Miika Hamalainen Date: Mon, 11 Feb 2013 20:22:47 +0000 Subject: Smoke simulator: add more float precision checks to make sure other data types don't get messed up either. (Relating previous fire fixes) --- intern/smoke/intern/FLUID_3D.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'intern') diff --git a/intern/smoke/intern/FLUID_3D.cpp b/intern/smoke/intern/FLUID_3D.cpp index a1d39286a90..5f0b2439200 100644 --- a/intern/smoke/intern/FLUID_3D.cpp +++ b/intern/smoke/intern/FLUID_3D.cpp @@ -1654,7 +1654,7 @@ void FLUID_3D::processBurn(float *fuel, float *smoke, float *react, float *flame fuel[index] -= burning_rate * dt; if (fuel[index] < 0.0f) fuel[index] = 0.0f; /* process reaction coordinate */ - if (orig_fuel) { + if (orig_fuel > FLT_EPSILON) { react[index] *= fuel[index]/orig_fuel; react_coord = react[index]; } @@ -1681,7 +1681,7 @@ void FLUID_3D::processBurn(float *fuel, float *smoke, float *react, float *flame heat[index] = (1.0f-flame[index])*ignition_point + flame[index]*temp_max; /* mix new color */ - if (r && smoke_emit) { + if (r && smoke_emit > FLT_EPSILON) { float smoke_factor = smoke[index]/(orig_smoke+smoke_emit); r[index] = (r[index] + _flame_smoke_color[0] * smoke_emit) * smoke_factor; g[index] = (g[index] + _flame_smoke_color[1] * smoke_emit) * smoke_factor; -- cgit v1.2.3 From 9307565269055e39cd71bd2c27bc86ad8fc12b96 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 11 Feb 2013 22:41:11 +0000 Subject: Attempted fix for issue with latest CUDA kernel for 32 bit windows/linux/mac, there seems to be some sort of compiler bug in CUDA toolkit 4.2, uninlining a few functions seems to avoid it. --- intern/cycles/kernel/kernel_emission.h | 10 +++++----- intern/cycles/kernel/kernel_light.h | 2 +- intern/cycles/kernel/kernel_shader.h | 6 +++--- intern/cycles/kernel/kernel_types.h | 1 + intern/cycles/render/osl.h | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) (limited to 'intern') diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 4048bbd9dfc..3b27a1f49c9 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -20,7 +20,7 @@ CCL_NAMESPACE_BEGIN /* Direction Emission */ -__device float3 direct_emissive_eval(KernelGlobals *kg, float rando, +__device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando, LightSample *ls, float u, float v, float3 I, float t, float time) { /* setup shading at emitter */ @@ -74,7 +74,7 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, return eval; } -__device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, +__device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, float randt, float rando, float randu, float randv, Ray *ray, BsdfEval *eval, bool *is_lamp) { @@ -148,7 +148,7 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, /* Indirect Primitive Emission */ -__device float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf) +__device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf) { /* evaluate emissive closure */ float3 L = shader_emissive_eval(kg, sd); @@ -171,7 +171,7 @@ __device float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, f /* Indirect Lamp Emission */ -__device bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission) +__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission) { LightSample ls; int lamp = lamp_light_eval_sample(kg, randt); @@ -200,7 +200,7 @@ __device bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, /* Indirect Background */ -__device float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf) +__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf) { #ifdef __BACKGROUND__ /* evaluate background closure */ diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index 10a32226f17..f6fbd3599ad 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -454,7 +454,7 @@ __device void triangle_light_sample(KernelGlobals *kg, int prim, int object, ls->lamp = ~0; ls->shader |= SHADER_USE_MIS; ls->t = 0.0f; - ls->type = LIGHT_AREA; + ls->type = LIGHT_TRIANGLE; ls->eval_fac = 1.0f; object_transform_light_sample(kg, ls, object, time); diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index b7d87427bd3..df86b352697 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -53,7 +53,7 @@ __device_noinline void shader_setup_object_transforms(KernelGlobals *kg, ShaderD } #endif -__device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, +__device_noinline void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, const Intersection *isect, const Ray *ray) { #ifdef __INSTANCING__ @@ -160,7 +160,7 @@ __device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, /* ShaderData setup from position sampled on mesh */ -__device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, +__device_noinline void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, const float3 P, const float3 Ng, const float3 I, int shader, int object, int prim, float u, float v, float t, float time, int segment = ~0) { @@ -283,7 +283,7 @@ __device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, /* ShaderData setup for displacement */ -__device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd, +__device_noinline void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd, int object, int prim, float u, float v) { /* Note: no OSLShader::init call here, this is done in shader_setup_from_sample! */ diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 52bdddc72fb..773ea0c43fb 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -299,6 +299,7 @@ typedef enum LightType { LIGHT_AREA, LIGHT_AO, LIGHT_SPOT, + LIGHT_TRIANGLE, LIGHT_STRAND } LightType; diff --git a/intern/cycles/render/osl.h b/intern/cycles/render/osl.h index 3c599caa893..d17f4c81362 100644 --- a/intern/cycles/render/osl.h +++ b/intern/cycles/render/osl.h @@ -36,7 +36,7 @@ class Device; class DeviceScene; class ImageManager; class OSLRenderServices; -class OSLGlobals; +struct OSLGlobals; class Scene; class ShaderGraph; class ShaderNode; -- cgit v1.2.3 From b3b993127681eac85c88d1cd7ceb0e235b54bdb8 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 12 Feb 2013 13:06:52 +0000 Subject: Fix #34205: Cycles: Zooming in rendered mode during update out of sync with intended zoom Made sure no pause_cond.wait() happens at the same time as session as resetting. --- intern/cycles/render/session.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'intern') diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 94cb69102d2..7a40e0d04b6 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -132,6 +132,8 @@ bool Session::ready_to_reset() void Session::reset_gpu(BufferParams& buffer_params, int samples) { + thread_scoped_lock pause_lock(pause_mutex); + /* block for buffer acces and reset immediately. we can't do this * in the thread, because we need to allocate an OpenGL buffer, and * that only works in the main thread */ @@ -295,6 +297,7 @@ void Session::run_gpu() void Session::reset_cpu(BufferParams& buffer_params, int samples) { thread_scoped_lock reset_lock(delayed_reset.mutex); + thread_scoped_lock pause_lock(pause_mutex); display_outdated = true; reset_time = time_dt(); @@ -484,7 +487,16 @@ void Session::run_cpu() * wait for pause condition notify to wake up again */ thread_scoped_lock pause_lock(pause_mutex); - if(pause || no_tiles) { + if(!pause && delayed_reset.do_reset) { + /* reset once to start */ + thread_scoped_lock reset_lock(delayed_reset.mutex); + thread_scoped_lock buffers_lock(buffers_mutex); + thread_scoped_lock display_lock(display_mutex); + + reset_(delayed_reset.params, delayed_reset.samples); + delayed_reset.do_reset = false; + } + else if(pause || no_tiles) { update_status_time(pause, no_tiles); while(1) { -- cgit v1.2.3 From 45c70acd2772fa9716b3116dbe2ffba5aab42cd3 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 12 Feb 2013 13:48:04 +0000 Subject: Fix some (quite harmless) use of uninitialized memory reported by valgrind. --- intern/cycles/bvh/bvh.cpp | 6 +++++- intern/cycles/render/buffers.cpp | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'intern') diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index 011406344ea..500b07f755b 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -340,6 +340,10 @@ void BVH::pack_primitives() Object *ob = objects[tob]; pack.prim_visibility[i] = ob->visibility; } + else { + memset(&pack.tri_woop[i * nsize], 0, sizeof(float4)*3); + pack.prim_visibility[i] = 0; + } } } @@ -476,7 +480,7 @@ void BVH::pack_instances(size_t nodes_size) } /* merge nodes */ - if( bvh->pack.nodes.size()) { + if(bvh->pack.nodes.size()) { size_t nsize_bbox = (use_qbvh)? nsize-2: nsize-1; int4 *bvh_nodes = &bvh->pack.nodes[0]; size_t bvh_nodes_size = bvh->pack.nodes.size(); diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp index 3b61ccd176d..572cfae45cd 100644 --- a/intern/cycles/render/buffers.cpp +++ b/intern/cycles/render/buffers.cpp @@ -83,6 +83,7 @@ RenderTile::RenderTile() w = 0; h = 0; + sample = 0; start_sample = 0; num_samples = 0; resolution = 0; -- cgit v1.2.3 From d095bcc8aa9ec60e537ed86b48f1025623cb2b38 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 12 Feb 2013 14:58:46 +0000 Subject: Fix cycles not using SSE3 kernel after recent, order with SSE2 should be switched, pointed out by Chad Fraleigh. --- intern/cycles/device/device_cpu.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'intern') diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp index 1915245bb55..c2ba91faf69 100644 --- a/intern/cycles/device/device_cpu.cpp +++ b/intern/cycles/device/device_cpu.cpp @@ -171,7 +171,7 @@ public: int end_sample = tile.start_sample + tile.num_samples; #ifdef WITH_OPTIMIZED_KERNEL - if(system_cpu_support_sse2()) { + if(system_cpu_support_sse3()) { for(int sample = start_sample; sample < end_sample; sample++) { if (task.get_cancel() || task_pool.cancelled()) { if(task.need_finish_queue == false) @@ -180,7 +180,7 @@ public: for(int y = tile.y; y < tile.y + tile.h; y++) { for(int x = tile.x; x < tile.x + tile.w; x++) { - kernel_cpu_sse2_path_trace(&kg, render_buffer, rng_state, + kernel_cpu_sse3_path_trace(&kg, render_buffer, rng_state, sample, x, y, tile.offset, tile.stride); } } @@ -190,7 +190,7 @@ public: task.update_progress(tile); } } - else if(system_cpu_support_sse3()) { + else if(system_cpu_support_sse2()) { for(int sample = start_sample; sample < end_sample; sample++) { if (task.get_cancel() || task_pool.cancelled()) { if(task.need_finish_queue == false) @@ -199,7 +199,7 @@ public: for(int y = tile.y; y < tile.y + tile.h; y++) { for(int x = tile.x; x < tile.x + tile.w; x++) { - kernel_cpu_sse3_path_trace(&kg, render_buffer, rng_state, + kernel_cpu_sse2_path_trace(&kg, render_buffer, rng_state, sample, x, y, tile.offset, tile.stride); } } @@ -247,16 +247,16 @@ public: void thread_tonemap(DeviceTask& task) { #ifdef WITH_OPTIMIZED_KERNEL - if(system_cpu_support_sse2()) { + 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_sse2_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer, + kernel_cpu_sse3_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer, task.sample, task.resolution, x, y, task.offset, task.stride); } - else if(system_cpu_support_sse3()) { + 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_sse3_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer, + kernel_cpu_sse2_tonemap(&kernel_globals, (uchar4*)task.rgba, (float*)task.buffer, task.sample, task.resolution, x, y, task.offset, task.stride); } else @@ -278,17 +278,17 @@ public: #endif #ifdef WITH_OPTIMIZED_KERNEL - if(system_cpu_support_sse2()) { + if(system_cpu_support_sse3()) { for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) { - kernel_cpu_sse2_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x); + kernel_cpu_sse3_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x); if(task_pool.cancelled()) break; } } - else if(system_cpu_support_sse3()) { + else if(system_cpu_support_sse2()) { for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) { - kernel_cpu_sse3_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x); + kernel_cpu_sse2_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x); if(task_pool.cancelled()) break; -- cgit v1.2.3 From ae385fb61cd8caa1024359f71f2e77a41ddb6e58 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 13 Feb 2013 07:50:41 +0000 Subject: Correction for fix #34205: Zooming in rendered mode during update out of sync with intended zoom Didn't initially notice one possibility when GPU render would fail here, --- intern/cycles/render/session.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'intern') diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 7a40e0d04b6..6ed14452c6b 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -210,7 +210,12 @@ void Session::run_gpu() * wait for pause condition notify to wake up again */ thread_scoped_lock pause_lock(pause_mutex); - if(pause || no_tiles) { + if(!pause && !tile_manager.done()) { + /* reset could have happened after no_tiles was set, before this lock. + * in this case we shall not wait for pause condition + */ + } + else if(pause || no_tiles) { update_status_time(pause, no_tiles); while(1) { -- cgit v1.2.3 From 4061f96d94aa410dd8550bb6b3ed8f6f87beb5de Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 13 Feb 2013 11:02:51 +0000 Subject: Fix cycles issue with BVH cache created with 64 bits and used for 32 bits binary, and vice versa. --- intern/cycles/bvh/bvh.cpp | 2 ++ intern/cycles/util/util_cache.h | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'intern') diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index 500b07f755b..f11b3c4c0bc 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -30,6 +30,7 @@ #include "util_foreach.h" #include "util_map.h" #include "util_progress.h" +#include "util_system.h" #include "util_types.h" CCL_NAMESPACE_BEGIN @@ -71,6 +72,7 @@ BVH *BVH::create(const BVHParams& params, const vector& objects) bool BVH::cache_read(CacheData& key) { + key.add(system_cpu_bits()); key.add(¶ms, sizeof(params)); foreach(Object *ob, objects) { diff --git a/intern/cycles/util/util_cache.h b/intern/cycles/util/util_cache.h index e8f111a5397..deff05fff16 100644 --- a/intern/cycles/util/util_cache.h +++ b/intern/cycles/util/util_cache.h @@ -72,7 +72,7 @@ public: buffers.push_back(buffer); } - void add(void *data, size_t size) + void add(const void *data, size_t size) { if(size) { CacheBuffer buffer(data, size); @@ -80,19 +80,19 @@ public: } } - void add(int& data) + void add(const int& data) { CacheBuffer buffer(&data, sizeof(int)); buffers.push_back(buffer); } - void add(float& data) + void add(const float& data) { CacheBuffer buffer(&data, sizeof(float)); buffers.push_back(buffer); } - void add(size_t& data) + void add(const size_t& data) { CacheBuffer buffer(&data, sizeof(size_t)); buffers.push_back(buffer); -- cgit v1.2.3 From 909d64079a228dfa9cccf8ed718efc322a038e7e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 13 Feb 2013 16:46:18 +0000 Subject: Fix #34226: cycles shadow pass got incorrectly influenced by world multiple importance sampleing. --- intern/cycles/device/device_cuda.cpp | 4 ++-- intern/cycles/kernel/kernel_emission.h | 2 +- intern/cycles/kernel/kernel_passes.h | 9 +-------- intern/cycles/kernel/kernel_types.h | 2 +- intern/cycles/render/light.cpp | 15 +++++++++++++++ 5 files changed, 20 insertions(+), 12 deletions(-) (limited to 'intern') diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp index 0c590645808..399414d5966 100644 --- a/intern/cycles/device/device_cuda.cpp +++ b/intern/cycles/device/device_cuda.cpp @@ -109,11 +109,11 @@ public: } } -#ifdef NDEBUG +/*#ifdef NDEBUG #define cuda_abort() #else #define cuda_abort() abort() -#endif +#endif*/ #define cuda_assert(stmt) \ { \ diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 3b27a1f49c9..9787af535bb 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -141,7 +141,7 @@ __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int li } /* return if it's a lamp for shadow pass */ - *is_lamp = (ls.prim == ~0); + *is_lamp = (ls.prim == ~0 && ls.type != LIGHT_BACKGROUND); return true; } diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index 727639386ed..57dbdc2ffc1 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -125,14 +125,7 @@ __device_inline void kernel_write_light_passes(KernelGlobals *kg, __global float kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_color, sample, L->color_transmission); if(flag & PASS_SHADOW) { float4 shadow = L->shadow; - - /* bit of an ugly hack to compensate for emitting triangles influencing - * amount of samples we get for this pass */ - if(kernel_data.integrator.progressive && kernel_data.integrator.pdf_triangles != 0.0f) - shadow.w = 0.5f; - else - shadow.w = 1.0f; - + shadow.w = kernel_data.film.pass_shadow_scale; kernel_write_pass_float4(buffer + kernel_data.film.pass_shadow, sample, shadow); } #endif diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 773ea0c43fb..ddbda9240fb 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -610,9 +610,9 @@ typedef struct KernelFilm { int pass_ao; int pass_shadow; + float pass_shadow_scale; int pass_pad1; int pass_pad2; - int pass_pad3; } KernelFilm; typedef struct KernelBackground { diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index e7fb9514371..ccc6c5142bd 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -143,6 +143,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen /* count */ size_t num_lights = scene->lights.size(); + size_t num_background_lights = 0; size_t num_triangles = 0; size_t num_curve_segments = 0; @@ -306,6 +307,8 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen if(light->size > 0.0f && light->use_mis) use_lamp_mis = true; + if(light->type == LIGHT_BACKGROUND) + num_background_lights++; } /* normalize cumulative distribution functions */ @@ -324,6 +327,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen /* update device */ KernelIntegrator *kintegrator = &dscene->data.integrator; + KernelFilm *kfilm = &dscene->data.film; kintegrator->use_direct_light = (totarea > 0.0f); if(kintegrator->use_direct_light) { @@ -354,6 +358,16 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen kintegrator->use_lamp_mis = use_lamp_mis; + /* bit of an ugly hack to compensate for emitting triangles influencing + * amount of samples we get for this pass */ + if(scene->integrator->progressive && kintegrator->pdf_triangles != 0.0f) + kfilm->pass_shadow_scale = 0.5f; + else + kfilm->pass_shadow_scale = 1.0f; + + if(num_background_lights < num_lights) + kfilm->pass_shadow_scale *= (float)(num_lights - num_background_lights)/(float)num_lights; + /* CDF */ device->tex_alloc("__light_distribution", dscene->light_distribution); } @@ -366,6 +380,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen kintegrator->pdf_lights = 0.0f; kintegrator->inv_pdf_lights = 0.0f; kintegrator->use_lamp_mis = false; + kfilm->pass_shadow_scale = 1.0f; } } -- cgit v1.2.3 From adbd84c320d8b0781e97d09055f6cde4920b79f8 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 14 Feb 2013 16:11:47 +0000 Subject: Fix #34121: OSL + persistent images option was not freeing shader memory properly, causing memory to increase continuously during animation render. --- intern/cycles/blender/blender_sync.cpp | 5 ++++- intern/cycles/render/mesh.cpp | 8 ++++++++ intern/cycles/render/osl.cpp | 13 ++++++++++++- intern/cycles/render/osl.h | 2 ++ intern/cycles/render/scene.cpp | 14 +++++++------- intern/cycles/render/shader.h | 2 ++ intern/cycles/render/svm.cpp | 4 ++++ intern/cycles/render/svm.h | 2 ++ 8 files changed, 41 insertions(+), 9 deletions(-) (limited to 'intern') diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index 7ad663b7e26..87c4efffe6c 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -307,7 +307,10 @@ SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background) params.use_bvh_spatial_split = RNA_boolean_get(&cscene, "debug_use_spatial_splits"); params.use_bvh_cache = (background)? RNA_boolean_get(&cscene, "use_cache"): false; - params.persistent_images = (background)? r.use_persistent_data(): false; + if(background && params.shadingsystem != SceneParams::OSL) + params.persistent_images = r.use_persistent_data(); + else + params.persistent_images = false; return params; } diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 57776e4cfa6..3a6fba32b34 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -966,6 +966,14 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene) dscene->attributes_map.clear(); dscene->attributes_float.clear(); dscene->attributes_float3.clear(); + + OSLGlobals *og = (OSLGlobals*)device->osl_memory(); + + if(og) { + og->object_name_map.clear(); + og->attribute_map.clear(); + og->object_names.clear(); + } } void MeshManager::tag_update(Scene *scene) diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index 28de56f3a72..56158278e29 100644 --- a/intern/cycles/render/osl.cpp +++ b/intern/cycles/render/osl.cpp @@ -47,15 +47,25 @@ OSLShaderManager::OSLShaderManager() { services = new OSLRenderServices(); - shading_system_init(); texture_system_init(); + shading_system_init(); } OSLShaderManager::~OSLShaderManager() { OSL::ShadingSystem::destroy(ss); OSL::TextureSystem::destroy(ts); + + delete services; +} + +void OSLShaderManager::reset(Scene *scene) +{ + OSL::ShadingSystem::destroy(ss); delete services; + + services = new OSLRenderServices(); + shading_system_init(); } void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) @@ -88,6 +98,7 @@ void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene og->ss = ss; og->ts = ts; og->services = services; + int background_id = scene->shader_manager->get_shader_id(scene->default_background); og->background_state = og->surface_state[background_id & SHADER_MASK]; og->use = true; diff --git a/intern/cycles/render/osl.h b/intern/cycles/render/osl.h index d17f4c81362..4b4ed6cba00 100644 --- a/intern/cycles/render/osl.h +++ b/intern/cycles/render/osl.h @@ -64,6 +64,8 @@ public: OSLShaderManager(); ~OSLShaderManager(); + void reset(Scene *scene); + bool use_osl() { return true; } void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp index 093bfecf88e..a1fcffa94a4 100644 --- a/intern/cycles/render/scene.cpp +++ b/intern/cycles/render/scene.cpp @@ -85,6 +85,12 @@ void Scene::free_memory(bool final) foreach(ParticleSystem *p, particle_systems) delete p; + shaders.clear(); + meshes.clear(); + objects.clear(); + lights.clear(); + particle_systems.clear(); + if(device) { camera->device_free(device, &dscene); filter->device_free(device, &dscene); @@ -118,13 +124,6 @@ void Scene::free_memory(bool final) delete curve_system_manager; delete image_manager; } - else { - shaders.clear(); - meshes.clear(); - objects.clear(); - lights.clear(); - particle_systems.clear(); - } } void Scene::device_update(Device *device_, Progress& progress) @@ -257,6 +256,7 @@ bool Scene::need_reset() void Scene::reset() { + shader_manager->reset(this); shader_manager->add_default(this); /* ensure all objects are updated */ diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h index d4421002ceb..b38e098e3cb 100644 --- a/intern/cycles/render/shader.h +++ b/intern/cycles/render/shader.h @@ -110,6 +110,8 @@ public: static ShaderManager *create(Scene *scene, int shadingsystem); virtual ~ShaderManager(); + virtual void reset(Scene *scene) = 0; + virtual bool use_osl() { return false; } /* device update */ diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index f7cb8f62247..5cb11a4ec1a 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -40,6 +40,10 @@ SVMShaderManager::~SVMShaderManager() { } +void SVMShaderManager::reset(Scene *scene) +{ +} + void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) { if(!need_update) diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h index 0b15c5aaa1e..c1ce619e12a 100644 --- a/intern/cycles/render/svm.h +++ b/intern/cycles/render/svm.h @@ -45,6 +45,8 @@ public: SVMShaderManager(); ~SVMShaderManager(); + void reset(Scene *scene); + void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); void device_free(Device *device, DeviceScene *dscene); }; -- cgit v1.2.3 From e0ca72735d586ba0abc380018bdc247199479f15 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 14 Feb 2013 16:48:43 +0000 Subject: Further fix for #34121: OSL + persistent images could crash in some cases still. --- intern/cycles/blender/blender_session.cpp | 3 ++- intern/cycles/blender/blender_sync.cpp | 4 ++-- intern/cycles/render/scene.cpp | 2 +- intern/cycles/render/scene.h | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) (limited to 'intern') diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index dfea9833287..98a4e5bda9f 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -128,7 +128,8 @@ void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_) height = b_engine.resolution_y(); if(scene->params.modified(scene_params) || - session->params.modified(session_params)) + session->params.modified(session_params) || + !scene_params.persistent_data) { /* if scene or session parameters changed, it's easier to simply re-create * them rather than trying to distinguish which settings need to be updated diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index 87c4efffe6c..f6ff78ab2ac 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -308,9 +308,9 @@ SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background) params.use_bvh_cache = (background)? RNA_boolean_get(&cscene, "use_cache"): false; if(background && params.shadingsystem != SceneParams::OSL) - params.persistent_images = r.use_persistent_data(); + params.persistent_data = r.use_persistent_data(); else - params.persistent_images = false; + params.persistent_data = false; return params; } diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp index a1fcffa94a4..7b82a91cae8 100644 --- a/intern/cycles/render/scene.cpp +++ b/intern/cycles/render/scene.cpp @@ -106,7 +106,7 @@ void Scene::free_memory(bool final) particle_system_manager->device_free(device, &dscene); curve_system_manager->device_free(device, &dscene); - if(!params.persistent_images || final) + if(!params.persistent_data || final) image_manager->device_free(device, &dscene); } diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index f6e1daea80d..fc6b538af03 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -125,7 +125,7 @@ public: bool use_bvh_cache; bool use_bvh_spatial_split; bool use_qbvh; - bool persistent_images; + bool persistent_data; SceneParams() { @@ -146,7 +146,7 @@ public: && use_bvh_cache == params.use_bvh_cache && use_bvh_spatial_split == params.use_bvh_spatial_split && use_qbvh == params.use_qbvh - && persistent_images == params.persistent_images); } + && persistent_data == params.persistent_data); } }; /* Scene */ -- cgit v1.2.3 From cb75d64f7d223e55e257278b8d0acd62ffeea882 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Thu, 14 Feb 2013 19:30:25 +0000 Subject: Cycles: * Compile fix when building without OSL. --- intern/cycles/render/mesh.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'intern') diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 3a6fba32b34..8d12ace4252 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -967,6 +967,7 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene) dscene->attributes_float.clear(); dscene->attributes_float3.clear(); +#ifdef WITH_OSL OSLGlobals *og = (OSLGlobals*)device->osl_memory(); if(og) { @@ -974,6 +975,7 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene) og->attribute_map.clear(); og->object_names.clear(); } +#endif } void MeshManager::tag_update(Scene *scene) -- cgit v1.2.3 From 6e03b70def962bf4c7ee346916c7472700c7f336 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 14 Feb 2013 21:40:28 +0000 Subject: Fix cycles hair curves with NaN values not rendering with dynamic BVH. These NaN values were breaking the bounding box computation, now they should have no influence. --- intern/cycles/util/util_boundbox.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'intern') diff --git a/intern/cycles/util/util_boundbox.h b/intern/cycles/util/util_boundbox.h index 0c857f906ee..7564c1f3c5c 100644 --- a/intern/cycles/util/util_boundbox.h +++ b/intern/cycles/util/util_boundbox.h @@ -61,15 +61,17 @@ public: __forceinline void grow(const float3& pt) { - min = ccl::min(min, pt); - max = ccl::max(max, pt); + /* the order of arguments to min is such that if pt is nan, it will not + * influence the resulting bounding box */ + min = ccl::min(pt, min); + max = ccl::max(pt, max); } __forceinline void grow(const float3& pt, float border) { float3 shift = {border, border, border, 0.0f}; - min = ccl::min(min, pt - shift); - max = ccl::max(max, pt + shift); + min = ccl::min(pt - shift, min); + max = ccl::max(pt + shift, max); } __forceinline void grow(const BoundBox& bbox) -- cgit v1.2.3 From b94993941fe5a503627b45fd55f93f3bebbad97d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 14 Feb 2013 21:40:29 +0000 Subject: Fix #34252: cycles rendering 16bit PNG with too light colors. --- intern/cycles/render/image.cpp | 30 +++++++++++++++++++++++++----- intern/cycles/render/image.h | 4 ++-- intern/cycles/render/nodes.cpp | 20 ++++++++++++-------- intern/cycles/render/nodes.h | 2 ++ 4 files changed, 41 insertions(+), 15 deletions(-) (limited to 'intern') diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index 6bfaf48c0c9..8e844bc788e 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -85,9 +85,10 @@ bool ImageManager::set_animation_frame_update(int frame) return false; } -bool ImageManager::is_float_image(const string& filename, void *builtin_data) +bool ImageManager::is_float_image(const string& filename, void *builtin_data, bool& is_linear) { bool is_float = false; + is_linear = false; if(builtin_data) { if(builtin_image_info_cb) { @@ -95,6 +96,9 @@ bool ImageManager::is_float_image(const string& filename, void *builtin_data) builtin_image_info_cb(filename, builtin_data, is_float, width, height, channels); } + if(is_float) + is_linear = true; + return is_float; } @@ -106,13 +110,29 @@ bool ImageManager::is_float_image(const string& filename, void *builtin_data) if(in->open(filename, spec)) { /* check the main format, and channel formats; * if any take up more than one byte, we'll need a float texture slot */ - if(spec.format.basesize() > 1) + if(spec.format.basesize() > 1) { is_float = true; + is_linear = true; + } for(size_t channel = 0; channel < spec.channelformats.size(); channel++) { - if(spec.channelformats[channel].basesize() > 1) + if(spec.channelformats[channel].basesize() > 1) { is_float = true; + is_linear = true; + } + } + + /* basic color space detection, not great but better than nothing + * before we do OpenColorIO integration */ + if(is_float) { + string colorspace = spec.get_string_attribute("oiio:ColorSpace"); + + is_linear = !(colorspace == "sRGB" || + colorspace == "GammaCorrected" || + strcmp(in->format_name(), "png") == 0); } + else + is_linear = false; in->close(); } @@ -123,13 +143,13 @@ bool ImageManager::is_float_image(const string& filename, void *builtin_data) return is_float; } -int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, bool& is_float) +int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, bool& is_float, bool& is_linear) { Image *img; size_t slot; /* load image info and find out if we need a float texture */ - is_float = (pack_images)? false: is_float_image(filename, builtin_data); + is_float = (pack_images)? false: is_float_image(filename, builtin_data, is_linear); if(is_float) { /* find existing image */ diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index 464b87ff530..b20ff23fbbb 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -51,9 +51,9 @@ public: ImageManager(); ~ImageManager(); - int add_image(const string& filename, void *builtin_data, bool animated, bool& is_float); + int add_image(const string& filename, void *builtin_data, bool animated, bool& is_float, bool& is_linear); void remove_image(const string& filename, void *builtin_data); - bool is_float_image(const string& filename, void *builtin_data); + bool is_float_image(const string& filename, void *builtin_data, bool& is_linear); void device_update(Device *device, DeviceScene *dscene, Progress& progress); void device_free(Device *device, DeviceScene *dscene); diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index a0a933ef682..8ac12242e15 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -141,6 +141,7 @@ ImageTextureNode::ImageTextureNode() image_manager = NULL; slot = -1; is_float = -1; + is_linear = false; filename = ""; builtin_data = NULL; color_space = ustring("Color"); @@ -165,6 +166,7 @@ ShaderNode *ImageTextureNode::clone() const node->image_manager = NULL; node->slot = -1; node->is_float = -1; + node->is_linear = false; return node; } @@ -177,7 +179,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler) image_manager = compiler.image_manager; if(is_float == -1) { bool is_float_bool; - slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool); + slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool, is_linear); is_float = (int)is_float_bool; } @@ -189,7 +191,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler) if(slot != -1) { compiler.stack_assign(vector_in); - int srgb = (is_float || color_space != "Color")? 0: 1; + int srgb = (is_linear || color_space != "Color")? 0: 1; int vector_offset = vector_in->stack_offset; if(!tex_mapping.skip()) { @@ -238,10 +240,10 @@ void ImageTextureNode::compile(OSLCompiler& compiler) tex_mapping.compile(compiler); if(is_float == -1) - is_float = (int)image_manager->is_float_image(filename, NULL); + is_float = (int)image_manager->is_float_image(filename, NULL, is_linear); compiler.parameter("filename", filename.c_str()); - if(is_float || color_space != "Color") + if(is_linear || color_space != "Color") compiler.parameter("color_space", "Linear"); else compiler.parameter("color_space", "sRGB"); @@ -271,6 +273,7 @@ EnvironmentTextureNode::EnvironmentTextureNode() image_manager = NULL; slot = -1; is_float = -1; + is_linear = false; filename = ""; builtin_data = NULL; color_space = ustring("Color"); @@ -294,6 +297,7 @@ ShaderNode *EnvironmentTextureNode::clone() const node->image_manager = NULL; node->slot = -1; node->is_float = -1; + node->is_linear = false; return node; } @@ -306,7 +310,7 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler) image_manager = compiler.image_manager; if(slot == -1) { bool is_float_bool; - slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool); + slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool, is_linear); is_float = (int)is_float_bool; } @@ -318,7 +322,7 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler) if(slot != -1) { compiler.stack_assign(vector_in); - int srgb = (is_float || color_space != "Color")? 0: 1; + int srgb = (is_linear || color_space != "Color")? 0: 1; int vector_offset = vector_in->stack_offset; if(!tex_mapping.skip()) { @@ -356,11 +360,11 @@ void EnvironmentTextureNode::compile(OSLCompiler& compiler) tex_mapping.compile(compiler); if(is_float == -1) - is_float = (int)image_manager->is_float_image(filename, NULL); + is_float = (int)image_manager->is_float_image(filename, NULL, is_linear); compiler.parameter("filename", filename.c_str()); compiler.parameter("projection", projection); - if(is_float || color_space != "Color") + if(is_linear || color_space != "Color") compiler.parameter("color_space", "Linear"); else compiler.parameter("color_space", "sRGB"); diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 66be919d098..3609497e5ce 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -69,6 +69,7 @@ public: ImageManager *image_manager; int slot; int is_float; + bool is_linear; string filename; void *builtin_data; ustring color_space; @@ -89,6 +90,7 @@ public: ImageManager *image_manager; int slot; int is_float; + bool is_linear; string filename; void *builtin_data; ustring color_space; -- cgit v1.2.3 From bd1c6571c9e96cef75ac30b7b8387a56497e0c2e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 15 Feb 2013 09:15:14 +0000 Subject: Fix #34205: Zooming in rendered mode during update out of sync with intended zoom Yes, again. There's some t within which reset is not allowed. This is so no reset happens too often for performance issues. If camera changes too often, some reset could be missed because of this timeout. For now tag engine for update, which will update viewport from blender side. Proper solution could be to detect such a changes from blender side and tag cycles for refresh instead of trying to detect changes form cycles, but that's for later. --- intern/cycles/blender/blender_session.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'intern') diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 98a4e5bda9f..dda7eb053c4 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -520,6 +520,9 @@ bool BlenderSession::draw(int w, int h) session->reset(buffer_params, session_params.samples); } } + else { + tag_update(); + } /* update status and progress for 3d view draw */ update_status_progress(); -- cgit v1.2.3 From 313dfbe35daaba41d6410042b12d1a1b63cb31a1 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 15 Feb 2013 14:54:11 +0000 Subject: Add some more detailed CUDA error prints to try to debug #34166. --- intern/cycles/device/device_cuda.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'intern') diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp index 399414d5966..77082006169 100644 --- a/intern/cycles/device/device_cuda.cpp +++ b/intern/cycles/device/device_cuda.cpp @@ -128,19 +128,21 @@ public: } \ } - bool cuda_error(CUresult result) + bool cuda_error_(CUresult result, const string& stmt) { if(result == CUDA_SUCCESS) return false; - string message = string_printf("CUDA error: %s", cuda_error_string(result)); + string message = string_printf("CUDA error at %s: %s", stmt.c_str(), cuda_error_string(result)); if(error_msg == "") error_msg = message; fprintf(stderr, "%s\n", message.c_str()); return true; } - void cuda_error(const string& message) +#define cuda_error(stmt) cuda_error_(stmt, #stmt) + + void cuda_error_message(const string& message) { if(error_msg == "") error_msg = message; @@ -187,7 +189,7 @@ public: } } - if(cuda_error(result)) + if(cuda_error_(result, "cuCtxCreate")) return; cuda_pop_context(); @@ -208,7 +210,7 @@ public: cuDeviceComputeCapability(&major, &minor, cuDevId); if(major <= 1 && minor <= 2) { - cuda_error(string_printf("CUDA device supported only with compute capability 1.3 or up, found %d.%d.", major, minor)); + cuda_error_message(string_printf("CUDA device supported only with compute capability 1.3 or up, found %d.%d.", major, minor)); return false; } } @@ -241,9 +243,9 @@ public: #ifdef _WIN32 if(cuHavePrecompiledKernels()) { if(major <= 1 && minor <= 2) - cuda_error(string_printf("CUDA device requires compute capability 1.3 or up, found %d.%d. Your GPU is not supported.", major, minor)); + cuda_error_message(string_printf("CUDA device requires compute capability 1.3 or up, found %d.%d. Your GPU is not supported.", major, minor)); else - cuda_error(string_printf("CUDA binary kernel for this graphics card compute capability (%d.%d) not found.", major, minor)); + cuda_error_message(string_printf("CUDA binary kernel for this graphics card compute capability (%d.%d) not found.", major, minor)); return ""; } #endif @@ -252,7 +254,7 @@ public: string nvcc = cuCompilerPath(); if(nvcc == "") { - cuda_error("CUDA nvcc compiler not found. Install CUDA toolkit in default location."); + cuda_error_message("CUDA nvcc compiler not found. Install CUDA toolkit in default location."); return ""; } @@ -272,13 +274,13 @@ public: nvcc.c_str(), major, minor, machine, kernel.c_str(), cubin.c_str(), maxreg, include.c_str()); if(system(command.c_str()) == -1) { - cuda_error("Failed to execute compilation command, see console for details."); + cuda_error_message("Failed to execute compilation command, see console for details."); return ""; } /* verify if compilation succeeded */ if(!path_exists(cubin)) { - cuda_error("CUDA kernel compilation failed, see console for details."); + cuda_error_message("CUDA kernel compilation failed, see console for details."); return ""; } @@ -306,8 +308,8 @@ public: cuda_push_context(); CUresult result = cuModuleLoad(&cuModule, cubin.c_str()); - if(cuda_error(result)) - cuda_error(string_printf("Failed loading CUDA kernel %s.", cubin.c_str())); + if(cuda_error_(result, "cuModuleLoad")) + cuda_error_message(string_printf("Failed loading CUDA kernel %s.", cubin.c_str())); cuda_pop_context(); @@ -737,7 +739,7 @@ public: CUresult result = cuGraphicsGLRegisterBuffer(&pmem.cuPBOresource, pmem.cuPBO, CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE); - if(!cuda_error(result)) { + if(result == CUDA_SUCCESS) { cuda_pop_context(); mem.device_pointer = pmem.cuTexId; -- cgit v1.2.3