111 for (; rr; rr = rrnext) {
114 if (lb && lb->
first) {
139 if (dst ==
nullptr || src ==
nullptr) {
151 rv->
ibuf = rview->ibuf;
219 for (
int x = rectsize - 1;
x >= 0;
x--) {
224 for (
int x = rectsize - 1;
x >= 0;
x--) {
225 buffer_data[
x] = 10e10;
234 const char *viewname,
267 const char *layername,
268 const char *viewname)
277 if (rectx <= 0 || recty <= 0) {
299 if (layername && layername[0]) {
300 if (!
STREQ(view_layer->name, layername)) {
309 rl->
layflag = view_layer->layflag;
311 rl->
passflag = view_layer->passflag;
317 const char *
view = rv->name;
319 if (viewname && viewname[0]) {
340 const char *
view = rv->name;
342 if (viewname && viewname[0]) {
393 if (viewname && viewname[0] && !
STREQ(main_rp->view, viewname)) {
402 rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id,
false);
412 const char *layername,
413 const char *viewname,
417 if (layername && layername[0] && !
STREQ(rl->name, layername)) {
422 const char *
view = rv->name;
424 if (viewname && viewname[0] && !
STREQ(
view, viewname)) {
429 bool pass_exists =
false;
471 blender::gpu::TextureFormat::SFLOAT_32 :
473 blender::gpu::TextureFormat::SFLOAT_32_32_32 :
474 blender::gpu::TextureFormat::SFLOAT_32_32_32_32;
495 const char *passname,
496 const char *viewname,
501 const char *strings[4];
504 if (layname && layname[0]) {
505 strings[strings_len++] = layname;
507 if (passname && passname[0]) {
508 strings[strings_len++] = passname;
510 if (viewname && viewname[0]) {
511 strings[strings_len++] = viewname;
517 strings[strings_len++] = token;
525 const char delim[] = {
'.',
'\0'};
526 const char *sep, *suf;
529#define CHECK_PASS(NAME) \
530 if (STREQLEN(name, RE_PASSNAME_##NAME, len)) { \
531 return SCE_PASS_##NAME; \
603 if (
view[0] !=
'\0') {
629 if (left_rv ==
nullptr) {
652 if (passtype_b && !passtype_a) {
655 if (passtype_a && !passtype_b) {
659 if (passtype_a && passtype_b) {
660 if (passtype_a > passtype_b) {
663 if (passtype_a < passtype_b) {
699 ExrHandle *exrhandle,
const char *colorspace,
bool predivide,
int rectx,
int recty)
720 rpass->rectx = rectx;
721 rpass->recty = recty;
783 copylen = tilex = rrpart->
rectx;
784 tiley = rrpart->
recty;
787 target += pixsize * ofs;
789 copylen *=
sizeof(
float) * pixsize;
791 ofs = pixsize * rr->
rectx;
793 for (
y = 0;
y < tiley;
y++) {
794 memcpy(target,
tile, copylen);
813 if (rpass->ibuf ==
nullptr || rpassp->ibuf ==
nullptr) {
816 if (rpass->ibuf->float_buffer.data ==
nullptr ||
817 rpassp->ibuf->float_buffer.data ==
nullptr)
822 if (!
STREQ(rpassp->fullname, rpass->fullname)) {
829 rpassp->ibuf->float_buffer.data,
833 rpassp = rpassp->next;
858 if (re->
result ==
nullptr) {
859 printf(
"pop render result error; no current result!\n");
897 const char *filepath)
908 const int expected_rectx = (rr) ? rr->
rectx : rl_single->
rectx;
909 const int expected_recty = (rr) ? rr->
recty : rl_single->
recty;
910 bool found_channels =
false;
912 if (rectx != expected_rectx || recty != expected_recty) {
915 "Reading render result: dimensions don't match, expected %dx%d",
923 if (rl_single && rl_single != rl) {
929 const int xstride = rpass->channels;
930 const int ystride = xstride * rectx;
934 for (a = 0; a < xstride; a++) {
937 fullname, rl->name, rpass->name, rpass->view, rpass->chan_id, a);
939 exrhandle, fullname, xstride, ystride, rpass->ibuf->float_buffer.data + a))
941 found_channels =
true;
943 else if (rl_single) {
946 fullname,
nullptr, rpass->name, rpass->view, rpass->chan_id, a);
948 exrhandle, fullname, xstride, ystride, rpass->ibuf->float_buffer.data + a))
950 found_channels =
true;
955 "Reading render result: expected channel \"%s.%s\" or \"%s\" not found",
964 "Reading render result: expected channel \"%s.%s\" not found",
971 rpass->fullname,
nullptr, rpass->name, rpass->view, rpass->chan_id, -1);
975 if (found_channels) {
984#define FILE_CACHE_MAX (FILE_MAXDIR + FILE_MAXFILE + MAX_ID_NAME + 100)
993 char path_digest[16] = {0};
994 char path_hexdigest[33];
998 if (blendfile_path[0] !=
'\0') {
1011 if (*root ==
'\0') {
1025 SNPRINTF(filename_full,
"cached_RR_%s_%s_%s.exr", filename, sce->
id.
name + 2, path_hexdigest);
1034 const char *root =
U.render_cachedir;
1048 const char *root =
U.render_cachedir;
1051 printf(
"read exr cache file: %s\n", filepath);
1058 printf(
"cannot read: %s\n", filepath);
1150 "render_seq float");
1209 if (
ImBuf *ibuf = rv ? rv->
ibuf :
nullptr) {
1210 if (ibuf->byte_buffer.data) {
1211 memcpy(rect, ibuf->byte_buffer.data,
sizeof(
int) * rr->
rectx * rr->
recty);
1214 if (ibuf->float_buffer.data) {
1216 ibuf->float_buffer.data,
1228 memset(rect, 0,
sizeof(
int) * rectx * recty);
1244 if (rv ==
nullptr) {
1254 ImBuf *ibuf = rview->ibuf;
1297 new_rpass->
next = new_rpass->
prev =
nullptr;
1307 new_rl->
next = new_rl->
prev =
nullptr;
1328 new_rr->
next = new_rr->
prev =
nullptr;
1351 if (!render_pass->
ibuf) {
1358 return render_pass->
ibuf;
1363 if (!render_view->
ibuf) {
1367 return render_view->
ibuf;
1372 return STR_ELEM(render_pass->
chan_id,
"RGB",
"RGBA",
"R",
"G",
"B",
"A");
const char * BKE_tempdir_base() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
StampData * BKE_stamp_data_copy(const StampData *stamp_data)
void BKE_stamp_data_free(StampData *stamp_data)
bool BKE_image_render_write_exr(ReportList *reports, const RenderResult *rr, const char *filepath, const ImageFormatData *imf, const bool save_as_render, const char *view, int layer)
const char * BKE_main_blendfile_path_from_global()
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
bool BKE_scene_multiview_is_render_view_active(const RenderData *rd, const SceneRenderView *srv)
void BKE_scene_ppm_get(const RenderData *rd, double r_ppm[2])
char * BLI_hash_md5_to_hexdigest(const void *resblock, char r_hex_digest[33])
void * BLI_hash_md5_buffer(const char *buffer, size_t len, void *resblock)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findstringindex(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_listbase_sort(ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
MINLINE void copy_v2_v2_db(double r[2], const double a[2])
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
bool bool BLI_path_extension_strip(char *path) ATTR_NONNULL(1)
#define BLI_path_join(...)
void BLI_path_split_dir_file(const char *filepath, char *dir, size_t dir_maxncpy, char *file, size_t file_maxncpy) ATTR_NONNULL(1
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
BLI_INLINE int BLI_rcti_cent_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_cent_x(const struct rcti *rct)
int bool bool bool size_t BLI_str_partition(const char *str, const char delim[], const char **sep, const char **suf) ATTR_NONNULL(1
#define SNPRINTF(dst, format,...)
char * STRNCPY(char(&dst)[N], const char *src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
size_t BLI_string_join_array_by_sep_char(char *result, size_t result_maxncpy, char sep, const char *strings[], uint strings_num) ATTR_NONNULL()
#define ARRAY_SET_ITEMS(...)
const char * dirname(char *path)
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_VECTOR
#define RE_PASSNAME_DEPTH
#define STEREO_RIGHT_NAME
@ R_IMF_IMTYPE_MULTILAYER
@ GPU_TEXTURE_USAGE_GENERAL
blender::gpu::Texture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, blender::gpu::TextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_update(blender::gpu::Texture *texture, eGPUDataFormat data_format, const void *data)
void IMB_colormanagement_assign_float_colorspace(ImBuf *ibuf, const char *name)
void IMB_colormanagement_transform_float(float *buffer, int width, int height, int channels, const char *from_colorspace, const char *to_colorspace, bool predivide)
@ COLOR_ROLE_SCENE_LINEAR
const char * IMB_colormanagement_role_colorspace_name_get(int role)
void IMB_display_buffer_transform_apply(unsigned char *display_buffer, float *linear_buffer, int width, int height, int channels, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, bool predivide)
void IMB_free_gpu_textures(ImBuf *ibuf)
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
void IMB_color_to_bw(ImBuf *ibuf)
void IMB_freeImBuf(ImBuf *ibuf)
ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_free_float_pixels(ImBuf *ibuf)
void IMB_free_byte_pixels(ImBuf *ibuf)
void IMB_assign_byte_buffer(ImBuf *ibuf, uint8_t *buffer_data, ImBufOwnership ownership)
void IMB_float_from_byte(ImBuf *ibuf)
@ IB_DO_NOT_TAKE_OWNERSHIP
ExrHandle * IMB_exr_get_handle(bool write_multipart=false)
void IMB_exr_close(ExrHandle *handle)
void IMB_exr_multilayer_convert(ExrHandle *handle, void *base, void *(*addview)(void *base, const char *str), void *(*addlayer)(void *base, const char *str), void(*addpass)(void *base, void *lay, const char *str, float *rect, int totchan, const char *chan_id, const char *view))
bool IMB_exr_get_ppm(ExrHandle *handle, double ppm[2])
void IMB_exr_read_channels(ExrHandle *handle)
bool IMB_exr_set_channel(ExrHandle *handle, blender::StringRefNull full_name, int xstride, int ystride, float *rect)
bool IMB_exr_begin_read(ExrHandle *handle, const char *filepath, int *width, int *height, bool parse_channels)
Read Guarded memory(de)allocation.
BMesh const char void * data
const ccl_global KernelWorkTile * tile
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
static void render_result_exr_file_cache_path(Scene *sce, const char *root, char r_path[FILE_CACHE_MAX])
static int order_render_passes(const void *a, const void *b)
bool render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, ReportList *reports, const char *filepath)
static void render_result_views_free(RenderResult *rr)
ImBuf * RE_RenderPassEnsureImBuf(RenderPass *render_pass)
void RE_pass_set_buffer_data(RenderPass *pass, float *data)
RenderView * RE_RenderViewGetByName(RenderResult *rr, const char *viewname)
void render_result_single_layer_end(Render *re)
bool RE_HasCombinedLayer(const RenderResult *result)
void render_result_exr_file_cache_write(Render *re)
void render_result_free_gpu_texture_caches(RenderResult *rr)
ImBuf * RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view)
bool RE_RenderPassIsColor(const RenderPass *render_pass)
bool render_result_exr_file_cache_read(Render *re)
void RE_render_result_rect_from_ibuf(RenderResult *rr, const ImBuf *ibuf, const int view_id)
void render_result_rect_fill_zero(RenderResult *rr, const int view_id)
blender::gpu::Texture * RE_pass_ensure_gpu_texture_cache(Render *re, RenderPass *rpass)
void render_result_views_shallowdelete(RenderResult *rr)
void render_result_views_new(RenderResult *rr, const RenderData *rd)
void render_result_merge(RenderResult *rr, RenderResult *rrpart)
bool RE_HasFloatPixels(const RenderResult *result)
void render_result_view_new(RenderResult *rr, const char *viewname)
RenderPass * render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, const char *name, const char *viewname, const char *chan_id, const bool allocate)
ImBuf * RE_render_result_rect_to_ibuf(RenderResult *rr, const ImageFormatData *imf, const float dither, const int view_id)
void render_result_passes_allocated_ensure(RenderResult *rr)
static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp)
static void assign_render_pass_ibuf_colorspace(RenderPass &render_pass)
void render_result_free(RenderResult *rr)
static RenderLayer * duplicate_render_layer(RenderLayer *rl)
static void * ml_addlayer_cb(void *base, const char *str)
void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
void render_result_free_list(ListBase *lb, RenderResult *rr)
void RE_render_result_full_channel_name(char *fullname, const char *layname, const char *passname, const char *viewname, const char *chan_id, const int channel)
RenderView * RE_RenderViewGetById(RenderResult *rr, const int view_id)
RenderResult * RE_DuplicateRenderResult(RenderResult *rr)
static int passtype_from_name(const char *name)
static RenderView * duplicate_render_view(RenderView *rview)
void render_result_single_layer_begin(Render *re)
static void * ml_addview_cb(void *base, const char *str)
static void ml_addpass_cb(void *base, void *lay, const char *name, float *rect, int totchan, const char *chan_id, const char *view)
static RenderPass * duplicate_render_pass(RenderPass *rpass)
void render_result_rect_get_pixels(RenderResult *rr, uint *rect, int rectx, int recty, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const int view_id)
static int get_num_planes_for_pass_ibuf(const RenderPass &render_pass)
RenderResult * render_result_new(Render *re, const rcti *partrct, const char *layername, const char *viewname)
bool RE_RenderResult_is_stereo(const RenderResult *result)
void RE_create_render_pass(RenderResult *rr, const char *name, int channels, const char *chan_id, const char *layername, const char *viewname, const bool allocate)
RenderResult * render_result_new_from_exr(ExrHandle *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
static void do_merge_tile(RenderResult *rr, RenderResult *rrpart, float *target, float *tile, int pixsize)
void render_result_views_shallowcopy(RenderResult *dst, RenderResult *src)
#define FOREACH_VIEW_LAYER_TO_RENDER_END
#define FOREACH_VIEW_LAYER_TO_RENDER_BEGIN(re_, iter_)
void RE_FreeRenderResult(RenderResult *rr)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
blender::gpu::Texture * texture
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct RenderLayer * next
struct RenderLayer * prev
struct RenderResult * next
struct RenderResult * prev
struct StampData * stamp_data
bool result_has_gpu_texture_caches
RenderResult * pushedresult
char single_view_layer[MAX_NAME]