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:
parent
f1501ac060
commit
24ada9c960
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) { \
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue