Skip to content

Commit 237ad10

Browse files
authored
Merge pull request #378 from GPUOpen-LibrariesAndSDKs/Release_October_2021
Release october 2021
2 parents 387a3ec + ed7b77d commit 237ad10

25 files changed

+875
-262
lines changed

RadeonProRenderSDK

Submodule RadeonProRenderSDK updated 45 files

src/bindings/pyrpr/rpr_load_store.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
int rprsExport(char const * rprsFileName, void * context, void * scene,
2424
int extraCustomParam_int_number, char const * * extraCustomParam_int_names,
2525
int const * extraCustomParam_int_values, int extraCustomParam_float_number,
26-
char const * * extraCustomParam_float_names, float const * extraCustomParam_float_values, unsigned int exportFlags);""")
26+
char const * * extraCustomParam_float_names, float const * extraCustomParam_float_values,
27+
unsigned int exportFlags, void * rprsCtx);""")
2728

2829
if __name__ == "__main__":
2930

src/bindings/pyrpr/src/pyrpr.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -657,9 +657,38 @@ def __init__(self, context, vertices, normals, uvs: List[np.array],
657657
vertex_indices, normal_indices, uv_indices: List[np.array],
658658
num_face_vertices, mesh_info):
659659
super().__init__(context)
660-
self.poly_count = len(num_face_vertices)
661660

662-
if len(uvs) > 1 or mesh_info:
661+
self.poly_count = 0 if vertices is None else len(num_face_vertices)
662+
663+
mesh_info_ptr = ffi.NULL
664+
if mesh_info:
665+
mesh_info_ptr = ffi.new(f"rpr_mesh_info[{2 * len(mesh_info) + 1}]")
666+
i = 0
667+
for key, val in mesh_info.items():
668+
mesh_info_ptr[i] = key
669+
mesh_info_ptr[i + 1] = val
670+
i += 2
671+
mesh_info_ptr[i] = 0
672+
673+
if vertices is None:
674+
ContextCreateMeshEx2(
675+
self.context,
676+
ffi.NULL, 0, 0,
677+
ffi.NULL, 0, 0,
678+
ffi.NULL, 0, 0,
679+
0,
680+
ffi.NULL, ffi.NULL,
681+
ffi.NULL,
682+
ffi.NULL, 0,
683+
ffi.NULL, 0,
684+
ffi.NULL, ffi.NULL,
685+
ffi.NULL, 0,
686+
mesh_info_ptr,
687+
self
688+
)
689+
return
690+
691+
if len(uvs) > 1 or mesh_info_ptr:
663692
# several UVs set present
664693
texcoords_layers_num = len(uvs)
665694
texcoords_uvs = ffi.new("float *[]", texcoords_layers_num)
@@ -675,14 +704,6 @@ def __init__(self, context, vertices, normals, uvs: List[np.array],
675704
texcoords_ind[i] = ffi.cast('rpr_int *', uv_indices[i].ctypes.data)
676705
texcoords_ind_nbytes[i] = uv_indices[i][0].nbytes
677706

678-
mesh_info_ptr = ffi.new(f"rpr_mesh_info[{2 * len(mesh_info) + 1}]")
679-
i = 0
680-
for key, val in mesh_info.items():
681-
mesh_info_ptr[i] = key
682-
mesh_info_ptr[i + 1] = val
683-
i += 2
684-
mesh_info_ptr[i] = 0
685-
686707
ContextCreateMeshEx2(
687708
self.context,
688709
ffi.cast("float *", vertices.ctypes.data), len(vertices), vertices[0].nbytes,
@@ -1119,6 +1140,8 @@ def delete(self):
11191140
MaterialNodeSetInputImageDataByKey(self, name, None)
11201141
elif isinstance(value, Buffer):
11211142
MaterialNodeSetInputBufferDataByKey(self, name, None)
1143+
elif isinstance(value, Grid):
1144+
MaterialNodeSetInputGridDataByKey(self, name, None)
11221145
self.inputs.clear()
11231146

11241147
super().delete()
@@ -1140,6 +1163,8 @@ def set_input(self, name, value):
11401163
MaterialNodeSetInputImageDataByKey(self, name, value)
11411164
elif isinstance(value, Buffer):
11421165
MaterialNodeSetInputBufferDataByKey(self, name, value)
1166+
elif isinstance(value, Grid):
1167+
MaterialNodeSetInputGridDataByKey(self, name, value)
11431168
else:
11441169
raise TypeError("Incorrect type for MaterialNodeSetInput*", self, name, value)
11451170

src/bindings/pyrpr/src/pyrpr_load_store.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ def export(name, context, scene, flags):
3939
# RPRLOADSTORE_EXPORTFLAG_COMPRESS_IMAGE_LEVEL_2 (1 << 2) - image data will be lossy compressed during export
4040
# note: without any of above flags images will not be exported.
4141
return lib.rprsExport(pyrpr.encode(name), context._get_handle(), scene._get_handle(),
42-
0, ffi.NULL, ffi.NULL, 0, ffi.NULL, ffi.NULL, flags)
42+
0, ffi.NULL, ffi.NULL, 0, ffi.NULL, ffi.NULL, flags, ffi.NULL)

src/bindings/pyrpr/src/pyrprapi.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,8 @@ def get_rif_sdk(base=Path()):
675675
'RPR_UV_CAMERA_SET_CHART_INDEX_FUNC_NAME',
676676
'RPR_CONTEXT_CREATE_FRAMEBUFFER_TYPED_FUNC_NAME',
677677
'RPR_MATERIAL_SET_INPUT_BY_S_KEY_FUNC_NAME',
678-
'RPR_MATERIALX_SET_ADDRESS_FUNC_NAME',]
678+
'RPR_MATERIALX_SET_FILE_FUNC_NAME',
679+
'RPR_MATERIALX_SET_FILE_AS_BUFFER_FUNC_NAME',]
679680
)
680681

681682
export(

src/rprblender/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
bl_info = {
2121
"name": "Radeon ProRender",
2222
"author": "AMD",
23-
"version": (3, 2, 2),
23+
"version": (3, 3, 0),
2424
"blender": (2, 80, 0),
2525
"location": "Info header, render engine menu",
2626
"description": "Radeon ProRender rendering plugin for Blender 2.8x",
@@ -211,7 +211,7 @@ def do_register_pass(aov):
211211
for i in range(3,6):
212212
do_register_pass(cryptomatte_aovs[i])
213213

214-
if layer.rpr.use_contour_render:
214+
if layer.rpr.use_contour_render and scene.rpr.render_quality == "FULL2":
215215
do_register_pass(layer.rpr.contour_info)
216216

217217

src/rprblender/engine/engine.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from rprblender.export import object, instance
3030
from . import image_filter
3131

32-
from rprblender.utils import logging
32+
from rprblender.utils import logging, IS_LINUX
3333
log = logging.Log(tag='Engine')
3434

3535

@@ -83,28 +83,25 @@ def cache_blur_data(self, depsgraph: bpy.types.Depsgraph):
8383
position = scene.cycles.motion_blur_position
8484

8585
if position == 'END': # shutter closes at the current frame, so [N-1 .. N]
86-
start_frame = scene.frame_current - 1
87-
subframe = 0.0
86+
from_frame = (scene.frame_current, 0.0)
87+
to_frame = (scene.frame_current - 1, 0.0)
8888
elif position == 'START': # shutter opens at the current frame, [N .. N+1]
89-
start_frame = scene.frame_current
90-
subframe = 0.0
89+
from_frame = (scene.frame_current, 0.0)
90+
to_frame = (scene.frame_current + 1, 0.0)
9191
else: # 'CENTER' # shutter is opened during current frame, [N-0.5 .. N+0.5]
92-
start_frame = scene.frame_current - 1
93-
subframe = 0.5
94-
end_frame = start_frame + 1
92+
from_frame = (scene.frame_current - 1, 0.5)
93+
to_frame = (scene.frame_current, 0.5)
9594

96-
# set to next frame and cache blur data
97-
self._set_scene_frame(scene, end_frame, subframe)
95+
# set to to_frame and cache blur data
96+
self._set_scene_frame(scene, *to_frame)
9897

99-
try:
100-
for obj in self.depsgraph_objects(depsgraph, with_camera=True):
101-
object.cache_blur_data(self.rpr_context, obj)
98+
for obj in self.depsgraph_objects(depsgraph, with_camera=True):
99+
object.cache_blur_data(self.rpr_context, obj)
102100

103-
for inst in self.depsgraph_instances(depsgraph):
104-
instance.cache_blur_data(self.rpr_context, inst)
101+
for inst in self.depsgraph_instances(depsgraph):
102+
instance.cache_blur_data(self.rpr_context, inst)
105103

106-
finally:
107-
self._set_scene_frame(scene, start_frame, subframe)
104+
self._set_scene_frame(scene, *from_frame)
108105

109106
def _set_scene_frame(self, scene, frame, subframe=0.0):
110107
self.rpr_engine.frame_set(frame, subframe)
@@ -401,12 +398,16 @@ def setup_upscale_filter(self, settings):
401398
return True
402399

403400
def _enable_upscale_filter(self, settings):
401+
import pyrprimagefilters as rif
404402
width, height = settings['resolution']
405403

406404
self.rpr_context.enable_aov(pyrpr.AOV_COLOR)
407405

406+
# freeze on Ubuntu with rif.COMPUTE_TYPE_FLOAT16
408407
self.upscale_filter = image_filter.ImageFilterUpscale(
409-
self.rpr_context.context, {'color'}, {}, {}, width, height)
408+
self.rpr_context.context, {'color'}, {},
409+
{'compute_type': rif.COMPUTE_TYPE_FLOAT if IS_LINUX else rif.COMPUTE_TYPE_FLOAT16},
410+
width, height)
410411

411412
self.upscale_filter.settings = settings
412413

src/rprblender/engine/export_engine.py

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def sync(self, context):
4848
depsgraph = context.evaluated_depsgraph_get()
4949
self.rpr_context.blender_data['depsgraph'] = depsgraph
5050
scene = depsgraph.scene
51+
material_override = depsgraph.view_layer.material_override
5152

5253
scene.rpr.init_rpr_context(self.rpr_context)
5354

@@ -60,43 +61,53 @@ def sync(self, context):
6061
# cache blur data
6162
self.rpr_context.do_motion_blur = scene.render.use_motion_blur and \
6263
not math.isclose(scene.camera.data.rpr.motion_blur_exposure, 0.0)
63-
if self.rpr_context.do_motion_blur:
64-
self.cache_blur_data(depsgraph)
65-
self.set_motion_blur_mode(scene)
66-
67-
# camera, objects, particles
68-
for obj in self.depsgraph_objects(depsgraph, with_camera=True):
69-
indirect_only = obj.original.indirect_only_get(view_layer=depsgraph.view_layer)
70-
object.sync(self.rpr_context, obj, indirect_only=indirect_only,
71-
frame_current=scene.frame_current)
72-
73-
# instances
74-
for inst in self.depsgraph_instances(depsgraph):
75-
indirect_only = inst.parent.original.indirect_only_get(view_layer=depsgraph.view_layer)
76-
instance.sync(self.rpr_context, inst, indirect_only=indirect_only,
77-
frame_current=scene.frame_current)
78-
79-
# rpr_context parameters
80-
self.rpr_context.set_parameter(pyrpr.CONTEXT_PREVIEW, False)
81-
scene.rpr.export_ray_depth(self.rpr_context)
82-
self.rpr_context.texture_compression = scene.rpr.texture_compression
83-
84-
# EXPORT CAMERA
85-
camera_key = object.key(scene.camera) # current camera key
86-
rpr_camera = self.rpr_context.create_camera(camera_key)
87-
self.rpr_context.scene.set_camera(rpr_camera)
88-
camera_obj = depsgraph.objects.get(camera_key, None)
89-
if not camera_obj:
90-
camera_obj = scene.camera
91-
92-
camera_data = camera.CameraData.init_from_camera(camera_obj.data, camera_obj.matrix_world,
93-
self.rpr_context.width / self.rpr_context.height)
94-
camera_data.export(rpr_camera)
95-
96-
if self.rpr_context.do_motion_blur:
97-
rpr_camera.set_exposure(scene.camera.data.rpr.motion_blur_exposure)
98-
object.export_motion_blur(self.rpr_context, camera_key,
99-
object.get_transform(camera_obj))
64+
65+
# with enabled motion blur, cache_blur_data() can change frame,
66+
# therefore we store current frame and set it back after export process
67+
cur_frame = (scene.frame_current, 0.0)
68+
69+
try:
70+
if self.rpr_context.do_motion_blur:
71+
self.cache_blur_data(depsgraph)
72+
self.set_motion_blur_mode(scene)
73+
74+
# camera, objects, particles
75+
for obj in self.depsgraph_objects(depsgraph, with_camera=True):
76+
indirect_only = obj.original.indirect_only_get(view_layer=depsgraph.view_layer)
77+
object.sync(self.rpr_context, obj, indirect_only=indirect_only, material_override=material_override,
78+
frame_current=scene.frame_current)
79+
80+
# instances
81+
for inst in self.depsgraph_instances(depsgraph):
82+
indirect_only = inst.parent.original.indirect_only_get(view_layer=depsgraph.view_layer)
83+
instance.sync(self.rpr_context, inst, indirect_only=indirect_only, material_override=material_override,
84+
frame_current=scene.frame_current)
85+
86+
# rpr_context parameters
87+
self.rpr_context.set_parameter(pyrpr.CONTEXT_PREVIEW, False)
88+
scene.rpr.export_ray_depth(self.rpr_context)
89+
self.rpr_context.texture_compression = scene.rpr.texture_compression
90+
91+
# EXPORT CAMERA
92+
camera_key = object.key(scene.camera) # current camera key
93+
rpr_camera = self.rpr_context.create_camera(camera_key)
94+
self.rpr_context.scene.set_camera(rpr_camera)
95+
camera_obj = depsgraph.objects.get(camera_key, None)
96+
if not camera_obj:
97+
camera_obj = scene.camera
98+
99+
camera_data = camera.CameraData.init_from_camera(camera_obj.data, camera_obj.matrix_world,
100+
self.rpr_context.width / self.rpr_context.height)
101+
camera_data.export(rpr_camera)
102+
103+
if self.rpr_context.do_motion_blur:
104+
rpr_camera.set_exposure(scene.camera.data.rpr.motion_blur_exposure)
105+
object.export_motion_blur(self.rpr_context, camera_key,
106+
object.get_transform(camera_obj))
107+
108+
finally:
109+
if self.rpr_context.do_motion_blur:
110+
self._set_scene_frame(scene, *cur_frame)
100111

101112
# adaptive subdivision will be limited to the current scene render size
102113
self.rpr_context.enable_aov(pyrpr.AOV_COLOR)

src/rprblender/engine/preview_engine.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,10 @@ def sync(self, depsgraph):
110110
camera.sync(self.rpr_context, depsgraph.objects[depsgraph.scene.camera.name])
111111

112112
# export world only if active_material.use_preview_world is enabled
113-
preview_obj = next(obj for obj in self.depsgraph_objects(depsgraph)
114-
if obj.name.startswith('preview_'))
115-
if preview_obj.active_material and preview_obj.active_material.use_preview_world:
113+
preview_obj = next((obj for obj in self.depsgraph_objects(depsgraph)
114+
if obj.name.startswith('preview_')), None)
115+
if preview_obj and settings_scene.world and preview_obj.active_material \
116+
and preview_obj.active_material.use_preview_world:
116117
world.sync(self.rpr_context, settings_scene.world)
117118

118119
self.rpr_context.enable_aov(pyrpr.AOV_COLOR)

0 commit comments

Comments
 (0)