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
This commit is contained in:
Jesse Yurkovich 2022-03-15 20:53:10 -07:00
parent f1501ac060
commit 24ada9c960
6 changed files with 16 additions and 44 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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) { \

View File

@ -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;