[Bf-blender-cvs] [24ada9c9602] master: Cleanup: Remove volatile from RenderResult and related APIs

Jesse Yurkovich noreply at git.blender.org
Wed Mar 16 05:21:39 CET 2022


Commit: 24ada9c96027971e50e9d103c746d674024b6892
Author: Jesse Yurkovich
Date:   Tue Mar 15 20:53:10 2022 -0700
Branches: master
https://developer.blender.org/rB24ada9c96027971e50e9d103c746d674024b6892

Cleanup: Remove volatile from RenderResult and related APIs

Volatile fields were introduced to the RenderResult struct years ago[1].

However, volatile is most likely not doing what it was intended to do
in this instance, and is problematic when moving files to c++ (see
discussion from D13962). There are complex rules around what happens to
these fields but none of them guarantee what the above commit alluded to.

This patch drops the volatile and cleans up the APIs surrounding it.

[1] rB7930c40051ef1b1a26140629cf1299aa89eed859

Passing on all platforms:
https://builder.blender.org/admin/#/builders/18/builds/338

Differential Revision: https://developer.blender.org/D14298

===================================================================

M	source/blender/blenkernel/intern/image.cc
M	source/blender/editors/render/render_internal.cc
M	source/blender/editors/render/render_preview.cc
M	source/blender/render/RE_pipeline.h
M	source/blender/render/intern/pipeline.c
M	source/blender/render/intern/render_types.h

===================================================================

diff --git a/source/blender/blenkernel/intern/image.cc b/source/blender/blenkernel/intern/image.cc
index 4a1cbdba42a..88888831e1c 100644
--- a/source/blender/blenkernel/intern/image.cc
+++ b/source/blender/blenkernel/intern/image.cc
@@ -5105,31 +5105,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc
     RE_AcquireResultImage(re, &rres, actview);
   }
   else if ((slot = BKE_image_get_renderslot(ima, ima->render_slot))->render) {
-    /* Unfortunately each field needs to be set individually because RenderResult
-     * contains volatile fields and using memcpy would invoke undefined behavior with c++. */
-    rres.next = slot->render->next;
-    rres.prev = slot->render->prev;
-    rres.rectx = slot->render->rectx;
-    rres.recty = slot->render->recty;
-    rres.sample_nr = slot->render->sample_nr;
-    rres.rect32 = slot->render->rect32;
-    rres.rectf = slot->render->rectf;
-    rres.rectz = slot->render->rectz;
-    rres.tilerect = slot->render->tilerect;
-    rres.xof = slot->render->xof;
-    rres.yof = slot->render->yof;
-    rres.layers = slot->render->layers;
-    rres.views = slot->render->views;
-    rres.renrect.xmin = slot->render->renrect.xmin;
-    rres.renrect.xmax = slot->render->renrect.xmax;
-    rres.renrect.ymin = slot->render->renrect.ymin;
-    rres.renrect.ymax = slot->render->renrect.ymax;
-    rres.renlay = slot->render->renlay;
-    rres.framenr = slot->render->framenr;
-    rres.text = slot->render->text;
-    rres.error = slot->render->error;
-    rres.stamp_data = slot->render->stamp_data;
-    rres.passes_allocated = slot->render->passes_allocated;
+    rres = *(slot->render);
     rres.have_combined = ((RenderView *)rres.views.first)->rectf != nullptr;
   }
 
diff --git a/source/blender/editors/render/render_internal.cc b/source/blender/editors/render/render_internal.cc
index 6c04523ed07..6796eff29d4 100644
--- a/source/blender/editors/render/render_internal.cc
+++ b/source/blender/editors/render/render_internal.cc
@@ -101,7 +101,7 @@ struct RenderJob {
 /* called inside thread! */
 static bool image_buffer_calc_tile_rect(const RenderResult *rr,
                                         const ImBuf *ibuf,
-                                        volatile rcti *renrect,
+                                        rcti *renrect,
                                         rcti *r_ibuf_rect,
                                         int *r_offset_x,
                                         int *r_offset_y)
@@ -556,7 +556,7 @@ static void render_image_update_pass_and_layer(RenderJob *rj, RenderResult *rr,
   }
 }
 
-static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect)
+static void image_rect_update(void *rjv, RenderResult *rr, rcti *renrect)
 {
   RenderJob *rj = static_cast<RenderJob *>(rjv);
   Image *ima = rj->image;
diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc
index cfb88cd7868..57858b202d2 100644
--- a/source/blender/editors/render/render_preview.cc
+++ b/source/blender/editors/render/render_preview.cc
@@ -987,9 +987,7 @@ static void action_preview_render(IconPreview *preview, IconPreviewSize *preview
  * \{ */
 
 /* inside thread, called by renderer, sets job update value */
-static void shader_preview_update(void *spv,
-                                  RenderResult *UNUSED(rr),
-                                  volatile struct rcti *UNUSED(rect))
+static void shader_preview_update(void *spv, RenderResult *UNUSED(rr), struct rcti *UNUSED(rect))
 {
   ShaderPreview *sp = static_cast<ShaderPreview *>(spv);
 
diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h
index 21be690a56e..a8436772299 100644
--- a/source/blender/render/RE_pipeline.h
+++ b/source/blender/render/RE_pipeline.h
@@ -123,8 +123,8 @@ typedef struct RenderResult {
   ListBase views; /* RenderView */
 
   /* allowing live updates: */
-  volatile rcti renrect;
-  volatile RenderLayer *renlay;
+  rcti renrect;
+  RenderLayer *renlay;
 
   /* for render results in Image, verify validity for sequences */
   int framenr;
@@ -248,9 +248,7 @@ void RE_render_result_rect_from_ibuf(struct RenderResult *rr,
                                      int view_id);
 
 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
-float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl,
-                             const char *name,
-                             const char *viewname);
+float *RE_RenderLayerGetPass(struct RenderLayer *rl, const char *name, const char *viewname);
 
 bool RE_HasSingleLayer(struct Render *re);
 
@@ -400,7 +398,7 @@ void RE_display_clear_cb(struct Render *re,
                          void (*f)(void *handle, RenderResult *rr));
 void RE_display_update_cb(struct Render *re,
                           void *handle,
-                          void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
+                          void (*f)(void *handle, RenderResult *rr, struct rcti *rect));
 void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
 void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float));
 void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, bool lock));
@@ -429,13 +427,13 @@ int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
 bool RE_layers_have_name(struct RenderResult *result);
 bool RE_passes_have_name(struct RenderLayer *rl);
 
-struct RenderPass *RE_pass_find_by_name(volatile struct RenderLayer *rl,
+struct RenderPass *RE_pass_find_by_name(struct RenderLayer *rl,
                                         const char *name,
                                         const char *viewname);
 /**
  * Only provided for API compatibility, don't use this in new code!
  */
-struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl,
+struct RenderPass *RE_pass_find_by_type(struct RenderLayer *rl,
                                         int passtype,
                                         const char *viewname);
 
diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c
index 913a4d3857b..f66d65ce68c 100644
--- a/source/blender/render/intern/pipeline.c
+++ b/source/blender/render/intern/pipeline.c
@@ -166,7 +166,7 @@ static void result_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr))
 }
 static void result_rcti_nothing(void *UNUSED(arg),
                                 RenderResult *UNUSED(rr),
-                                volatile struct rcti *UNUSED(rect))
+                                struct rcti *UNUSED(rect))
 {
 }
 static void current_scene_nothing(void *UNUSED(arg), Scene *UNUSED(scene))
@@ -262,7 +262,7 @@ void RE_FreeRenderResult(RenderResult *rr)
   render_result_free(rr);
 }
 
-float *RE_RenderLayerGetPass(volatile RenderLayer *rl, const char *name, const char *viewname)
+float *RE_RenderLayerGetPass(RenderLayer *rl, const char *name, const char *viewname)
 {
   RenderPass *rpass = RE_pass_find_by_name(rl, name, viewname);
   return rpass ? rpass->rect : NULL;
@@ -890,7 +890,7 @@ void RE_display_clear_cb(Render *re, void *handle, void (*f)(void *handle, Rende
 }
 void RE_display_update_cb(Render *re,
                           void *handle,
-                          void (*f)(void *handle, RenderResult *rr, volatile rcti *rect))
+                          void (*f)(void *handle, RenderResult *rr, rcti *rect))
 {
   re->display_update = f;
   re->duh = handle;
@@ -2743,7 +2743,7 @@ bool RE_passes_have_name(struct RenderLayer *rl)
   return false;
 }
 
-RenderPass *RE_pass_find_by_name(volatile RenderLayer *rl, const char *name, const char *viewname)
+RenderPass *RE_pass_find_by_name(RenderLayer *rl, const char *name, const char *viewname)
 {
   RenderPass *rp = NULL;
 
@@ -2760,7 +2760,7 @@ RenderPass *RE_pass_find_by_name(volatile RenderLayer *rl, const char *name, con
   return rp;
 }
 
-RenderPass *RE_pass_find_by_type(volatile RenderLayer *rl, int passtype, const char *viewname)
+RenderPass *RE_pass_find_by_type(RenderLayer *rl, int passtype, const char *viewname)
 {
 #define CHECK_PASS(NAME) \
   if (passtype == SCE_PASS_##NAME) { \
diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h
index b3c80f7dded..27b014ac289 100644
--- a/source/blender/render/intern/render_types.h
+++ b/source/blender/render/intern/render_types.h
@@ -99,7 +99,7 @@ struct Render {
   void *dih;
   void (*display_clear)(void *handle, RenderResult *rr);
   void *dch;
-  void (*display_update)(void *handle, RenderResult *rr, volatile rcti *rect);
+  void (*display_update)(void *handle, RenderResult *rr, rcti *rect);
   void *duh;
   void (*current_scene_update)(void *handle, struct Scene *scene);
   void *suh;



More information about the Bf-blender-cvs mailing list