Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2015-04-29 17:26:30 +0300
committerDalai Felinto <dfelinto@gmail.com>2015-04-29 17:55:53 +0300
commit3e6a66b9dee4e0b034a1de83fbd242191858a7df (patch)
treea585414e8d9c26e66c73555e30727597ff1652ab /source/blender/render
parent18ba32df37aa84d0a7c884bd1945772df0d9c59f (diff)
Multi-View cleanup: using RenderResult->rect* only for temporary RenderResults
Originally I wanted to get rid of RenderResult->rect* entirely, but it's convenient to have for temporary structs. This patch makes sure they are used only when really needed, which should help clearing the code out. (they are needed when using RE_AcquireResultImage() - which produces a RenderResult with no RenderView) Reviewers: sergey Differential Revision: https://developer.blender.org/D1270
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h9
-rw-r--r--source/blender/render/intern/source/pipeline.c25
-rw-r--r--source/blender/render/intern/source/render_result.c76
3 files changed, 32 insertions, 78 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 2c3ad74c7e3..2df4cde2b27 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -138,6 +138,9 @@ typedef struct RenderResult {
int rectx, recty;
short crop, sample_nr;
+ /* the following rect32, rectf and rectz buffers are for temporary storage only, for RenderResult structs
+ * created in #RE_AcquireResultImage - which do not have RenderView */
+
/* optional, 32 bits version of picture, used for ogl render and image curves */
int *rect32;
/* if this exists, a copy of one of layers, or result of composited layers */
@@ -353,14 +356,8 @@ bool RE_allow_render_generic_object(struct Object *ob);
bool RE_HasFakeLayer(RenderResult *res);
bool RE_RenderResult_is_stereo(RenderResult *res);
-
struct RenderView *RE_RenderViewGetById(struct RenderResult *res, const int view_id);
struct RenderView *RE_RenderViewGetByName(struct RenderResult *res, const char *viewname);
-float *RE_RenderViewGetRectf(struct RenderResult *rr, const int view_id);
-float *RE_RenderViewGetRectz(struct RenderResult *rr, const int view_id);
-int *RE_RenderViewGetRect32(struct RenderResult *rr, const int view_id);
-void RE_RenderViewSetRectf(struct RenderResult *res, const int view_id, float *rect);
-void RE_RenderViewSetRectz(struct RenderResult *res, const int view_id, float *rect);
#endif /* __RE_PIPELINE_H__ */
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index c26a74f18c5..a4089002ba5 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -380,6 +380,8 @@ void RE_ReleaseResultImageViews(Render *re, RenderResult *rr)
}
/* fill provided result struct with what's currently active or done */
+/* this RenderResult struct is the only exception to the rule of a RenderResult */
+/* always having at least one RenderView */
void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
{
memset(rr, 0, sizeof(RenderResult));
@@ -397,14 +399,14 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
/* actview view */
rv = RE_RenderViewGetById(re->result, view_id);
- rr->rectf = rv ? rv->rectf : NULL;
- rr->rectz = rv ? rv->rectz : NULL;
- rr->rect32 = rv ? rv->rect32 : NULL;
+ rr->rectf = rv->rectf;
+ rr->rectz = rv->rectz;
+ rr->rect32 = rv->rect32;
/* active layer */
rl = render_get_active_layer(re, re->result);
- if (rl && rv) {
+ if (rl) {
if (rv->rectf == NULL)
rr->rectf = RE_RenderLayerGetPass(rl, SCE_PASS_COMBINED, rv->name);
@@ -412,7 +414,7 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
rr->rectz = RE_RenderLayerGetPass(rl, SCE_PASS_Z, rv->name);
}
- rr->have_combined = rv ? (rv->rectf != NULL) : false;
+ rr->have_combined = (rv->rectf != NULL);
rr->layers = re->result->layers;
rr->views = re->result->views;
@@ -434,9 +436,9 @@ void RE_ResultGet32(Render *re, unsigned int *rect)
RenderResult rres;
const size_t view_id = BKE_scene_multiview_view_id_get(&re->r, re->viewname);
- RE_AcquireResultImage(re, &rres, view_id);
- render_result_rect_get_pixels(&rres, rect, re->rectx, re->recty, &re->scene->view_settings, &re->scene->display_settings, 0);
- RE_ReleaseResultImage(re);
+ RE_AcquireResultImageViews(re, &rres);
+ render_result_rect_get_pixels(&rres, rect, re->rectx, re->recty, &re->scene->view_settings, &re->scene->display_settings, view_id);
+ RE_ReleaseResultImageViews(re, &rres);
}
/* caller is responsible for allocating rect in correct size! */
@@ -768,11 +770,14 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
static void render_result_rescale(Render *re)
{
RenderResult *result = re->result;
+ RenderView *rv;
int x, y;
float scale_x, scale_y;
float *src_rectf;
- src_rectf = result->rectf;
+ rv = RE_RenderViewGetById(result, 0);
+ src_rectf = rv->rectf;
+
if (src_rectf == NULL) {
RenderLayer *rl = render_get_active_layer(re, re->result);
if (rl != NULL) {
@@ -790,7 +795,7 @@ static void render_result_rescale(Render *re)
"");
if (re->result != NULL) {
- dst_rectf = re->result->rectf;
+ dst_rectf = RE_RenderViewGetById(re->result, 0)->rectf;
if (dst_rectf == NULL) {
RenderLayer *rl;
rl = render_get_active_layer(re, re->result);
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 1668b11bd20..c8ca1105417 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -1465,12 +1465,13 @@ bool render_result_exr_file_cache_read(Render *re)
ImBuf *render_result_rect_to_ibuf(RenderResult *rr, RenderData *rd, const int view_id)
{
ImBuf *ibuf = IMB_allocImBuf(rr->rectx, rr->recty, rd->im_format.planes, 0);
-
+ RenderView *rv = RE_RenderViewGetById(rr, view_id);
+
/* if not exists, BKE_imbuf_write makes one */
- ibuf->rect = (unsigned int *) RE_RenderViewGetRect32(rr, view_id);
- ibuf->rect_float = RE_RenderViewGetRectf(rr, view_id);
- ibuf->zbuf_float = RE_RenderViewGetRectz(rr, view_id);
-
+ ibuf->rect = (unsigned int *) rv->rect32;
+ ibuf->rect_float = rv->rectf;
+ ibuf->zbuf_float = rv->rectz;
+
/* float factor for random dither, imbuf takes care of it */
ibuf->dither = rd->dither_intensity;
@@ -1528,10 +1529,6 @@ void render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), ImBu
/* Same things as above, old rectf can hang around from previous render. */
MEM_SAFE_FREE(rv->rectf);
}
-
- /* clean up non-view buffers */
- MEM_SAFE_FREE(rr->rect32);
- MEM_SAFE_FREE(rr->rectf);
}
void render_result_rect_fill_zero(RenderResult *rr, const int view_id)
@@ -1550,15 +1547,13 @@ void render_result_rect_get_pixels(RenderResult *rr, unsigned int *rect, int rec
const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings,
const int view_id)
{
- if (rr->rect32) {
- int *rect32 = RE_RenderViewGetRect32(rr, view_id);
- memcpy(rect, (rect32 ? rect32 : rr->rect32), sizeof(int) * rr->rectx * rr->recty);
- }
- else if (rr->rectf) {
- float *rectf = RE_RenderViewGetRectf(rr, view_id);
- IMB_display_buffer_transform_apply((unsigned char *) rect, (rectf ? rectf : rr->rectf), rr->rectx, rr->recty, 4,
+ RenderView *rv = RE_RenderViewGetById(rr, view_id);
+
+ if (rv->rect32)
+ memcpy(rect, rv->rect32, sizeof(int) * rr->rectx * rr->recty);
+ else if (rv->rectf)
+ IMB_display_buffer_transform_apply((unsigned char *) rect, rv->rectf, rr->rectx, rr->recty, 4,
view_settings, display_settings, true);
- }
else
/* else fill with black */
memset(rect, 0, sizeof(int) * rectx * recty);
@@ -1595,56 +1590,13 @@ bool RE_RenderResult_is_stereo(RenderResult *res)
RenderView *RE_RenderViewGetById(RenderResult *res, const int view_id)
{
RenderView *rv = BLI_findlink(&res->views, view_id);
+ BLI_assert(res->views.first);
return rv ? rv : res->views.first;
}
RenderView *RE_RenderViewGetByName(RenderResult *res, const char *viewname)
{
RenderView *rv = BLI_findstring(&res->views, viewname, offsetof(RenderView, name));
+ BLI_assert(res->views.first);
return rv ? rv : res->views.first;
}
-
-void RE_RenderViewSetRectf(RenderResult *res, const int view_id, float *rect)
-{
- RenderView *rv = BLI_findlink(&res->views, view_id);
- if (rv) {
- rv->rectf = rect;
- }
-}
-
-void RE_RenderViewSetRectz(RenderResult *res, const int view_id, float *rect)
-{
- RenderView *rv = BLI_findlink(&res->views, view_id);
- if (rv) {
- rv->rectz = rect;
- }
-}
-
-float *RE_RenderViewGetRectz(RenderResult *res, const int view_id)
-{
- RenderView *rv = BLI_findlink(&res->views, view_id);
- if (rv) {
- return rv->rectz;
- }
- return res->rectz;
-}
-
-float *RE_RenderViewGetRectf(RenderResult *res, const int view_id)
-{
- RenderView *rv = BLI_findlink(&res->views, view_id);
- if (rv) {
- return rv->rectf;
- }
- return res->rectf;
-}
-
-int *RE_RenderViewGetRect32(RenderResult *res, const int view_id)
-{
- RenderView *rv = BLI_findlink(&res->views, view_id);
- if (rv) {
- return rv->rect32;
- }
- return res->rect32;
-}
-
-