Skip to content

Commit 1db4850

Browse files
authored
RPRBLND-2301: Fix addon enabling in Blender 4.0+ (#660)
* RPRBLND-2301: Fix addon enabling in Blender 4.0+ Made RPR node visible in Add menu. * Fixed sockets issue. * Adjusted ShaderNodeBsdfPrincipled. * Code improvements. * Migration from bgl to gpu module. * Remover redundant bgl code. Fixed hardcoded channels. * Fixed render pass dimension issue. * Fixed Transmission input issue. * Fixed Preview render. * Performance drop fix. * Refactored gl.py to gpu.py and removed redundant bgl code. * Removed entire gpu.py. Moved set_image method to ViewportEngine. * Improved node category registration. Added register_rpr_node_categories, unregister_rpr_node_categories with condition for blender version >=4.0 * Code improvements
1 parent 618066d commit 1db4850

File tree

17 files changed

+266
-424
lines changed

17 files changed

+266
-424
lines changed

src/bindings/pyrpr/src/pyrpr.py

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import numpy as np
2323
from typing import List
2424

25-
import bgl
26-
2725
import pyrprwrap
2826
from pyrprwrap import *
2927

@@ -966,36 +964,6 @@ def get_cl_mem(self):
966964
return cl_mem[0]
967965

968966

969-
class FrameBufferGL(FrameBuffer):
970-
def __init__(self, context, width, height):
971-
super().__init__(context, width, height)
972-
973-
def _create(self):
974-
textures = bgl.Buffer(bgl.GL_INT, [1,])
975-
bgl.glGenTextures(1, textures)
976-
self.texture_id = textures[0]
977-
978-
bgl.glBindTexture(bgl.GL_TEXTURE_2D, self.texture_id)
979-
bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MIN_FILTER, bgl.GL_LINEAR)
980-
bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MAG_FILTER, bgl.GL_LINEAR)
981-
bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_S, bgl.GL_REPEAT)
982-
bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_T, bgl.GL_REPEAT)
983-
984-
bgl.glTexImage2D(
985-
bgl.GL_TEXTURE_2D, 0, bgl.GL_RGBA if platform.system() == 'Darwin' else bgl.GL_RGBA16F,
986-
self.width, self.height, 0,
987-
bgl.GL_RGBA, bgl.GL_FLOAT,
988-
bgl.Buffer(bgl.GL_FLOAT, [self.width, self.height, self.channels])
989-
)
990-
991-
ContextCreateFramebufferFromGLTexture2D(self.context, bgl.GL_TEXTURE_2D, 0, self.texture_id, self)
992-
993-
def delete(self):
994-
super().delete()
995-
textures = bgl.Buffer(bgl.GL_INT, [1,], [self.texture_id, ])
996-
bgl.glDeleteTextures(1, textures)
997-
998-
999967
class Composite(Object):
1000968
core_type_name = 'rpr_composite'
1001969

src/bindings/pyrpr/src/pyrprimagefilters.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323

2424
import pyrpr
2525

26-
import bgl
27-
2826

2927
class _init_data:
3028
log_fun = None
@@ -146,9 +144,6 @@ def create_image(self, width, height, components=4):
146144
def create_frame_buffer_image(self, frame_buffer):
147145
return FrameBufferImage(self, frame_buffer)
148146

149-
def create_frame_buffer_image_gl(self, frame_buffer):
150-
return FrameBufferImageGL(self, frame_buffer)
151-
152147
def create_command_queue(self):
153148
return CommandQueue(self)
154149

@@ -257,15 +252,6 @@ def update(self):
257252
pass
258253

259254

260-
class FrameBufferImageGL(FrameBufferImage):
261-
def _create(self):
262-
ContextCreateImageFromOpenGlTexture(self.context, bgl.GL_TEXTURE_2D, 0, self.frame_buffer.gl_texture, self)
263-
264-
def update(self):
265-
# image is updated directly
266-
pass
267-
268-
269255
class FrameBufferImageMetal(FrameBufferImage):
270256
def _create(self):
271257
ContextCreateImageFromMetalMemory(self.context, self._get_desc(),

src/rprblender/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"version": (3, 6, 9),
2424
"blender": (2, 93, 0),
2525
"location": "Info header, render engine menu",
26-
"description": "Radeon ProRender rendering plugin for Blender 2.9x",
26+
"description": "Radeon ProRender rendering plugin for Blender 2.9x+",
2727
"warning": "",
2828
"tracker_url": "",
2929
"wiki_url": "",

src/rprblender/engine/context.py

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ def __init__(self):
5353
self.material_system = None
5454
self.width = None
5555
self.height = None
56-
self.gl_interop = None
5756
self.engine_type = None
5857

5958
# Here we'll store some useful blender data, which could be required to do some export
@@ -97,7 +96,6 @@ def __init__(self):
9796
def init(self, context_flags, context_props):
9897
self.context = self._Context(context_flags, context_props)
9998
self.material_system = pyrpr.MaterialSystem(self.context)
100-
self.gl_interop = pyrpr.CREATION_FLAGS_ENABLE_GL_INTEROP in context_flags
10199

102100
# context settings
103101
self.set_parameter(pyrpr.CONTEXT_X_FLIP, False)
@@ -159,9 +157,6 @@ def get_frame_buffer(self, aov_type=None):
159157
if aov_type is not None:
160158
return self.frame_buffers_aovs[aov_type]['res']
161159

162-
if self.gl_interop:
163-
return self.frame_buffers_aovs[pyrpr.AOV_COLOR]['gl']
164-
165160
if self.composite:
166161
return self.frame_buffers_aovs[pyrpr.AOV_COLOR]['composite']
167162

@@ -186,13 +181,8 @@ def enable_aov(self, aov_type):
186181
fbs['aov'] = pyrpr.FrameBuffer(self.context, self.width, self.height)
187182
fbs['aov'].set_name("%d_aov" % aov_type)
188183
self.context.attach_aov(aov_type, fbs['aov'])
189-
if aov_type == pyrpr.AOV_COLOR and self.gl_interop:
190-
fbs['res'] = pyrpr.FrameBufferGL(self.context, self.width, self.height)
191-
fbs['gl'] = fbs['res'] # resolved and gl framebuffers are the same
192-
fbs['gl'].set_name("%d_gl" % aov_type)
193-
else:
194-
fbs['res'] = pyrpr.FrameBuffer(self.context, self.width, self.height)
195-
fbs['res'].set_name("%d_res" % aov_type)
184+
fbs['res'] = pyrpr.FrameBuffer(self.context, self.width, self.height)
185+
fbs['res'].set_name("%d_res" % aov_type)
196186

197187
self.frame_buffers_aovs[aov_type] = fbs
198188

@@ -300,11 +290,6 @@ def create_filter_composite(self):
300290
self.frame_buffers_aovs[pyrpr.AOV_COLOR]['composite'] = pyrpr.FrameBuffer(
301291
self.context, self.width, self.height)
302292
self.frame_buffers_aovs[pyrpr.AOV_COLOR]['composite'].set_name('default_composite')
303-
if self.gl_interop:
304-
# splitting resolved and gl framebuffers
305-
self.frame_buffers_aovs[pyrpr.AOV_COLOR]['res'] = pyrpr.FrameBuffer(
306-
self.context, self.width, self.height)
307-
self.frame_buffers_aovs[pyrpr.AOV_COLOR]['res'].set_name('default_res')
308293
# Composite calculation elements frame buffers
309294
color = self.create_composite(pyrpr.COMPOSITE_FRAMEBUFFER, {
310295
'framebuffer.input': self.frame_buffers_aovs[pyrpr.AOV_COLOR]['res']
@@ -347,9 +332,6 @@ def create_filter_composite(self):
347332

348333
def _disable_catchers(self):
349334
self.composite = None
350-
if self.gl_interop:
351-
# set resolved framebuffer be the same as gl
352-
self.frame_buffers_aovs[pyrpr.AOV_COLOR]['res'] = self.frame_buffers_aovs[pyrpr.AOV_COLOR]['gl']
353335
del self.frame_buffers_aovs[pyrpr.AOV_COLOR]['composite']
354336

355337
def sync_auto_adapt_subdivision(self, width=0, height=0):
@@ -613,8 +595,6 @@ def apply_filters(self):
613595
if self.composite:
614596
color_aov = self.frame_buffers_aovs[pyrpr.AOV_COLOR]
615597
self.composite.compute(color_aov['composite'])
616-
if self.gl_interop:
617-
color_aov['composite'].resolve(color_aov['gl'])
618598

619599

620600
class RPRContext2(RPRContext):

src/rprblender/engine/image_filter.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
# limitations under the License.
1414
#********************************************************************
1515
from abc import ABCMeta, abstractmethod
16-
import os
1716

1817
import pyrpr
1918
import pyhybrid
@@ -65,10 +64,7 @@ def __init__(self, rpr_context: pyrpr.Context, inputs, sigmas, params, width, he
6564
self.inputs[input_id] = self.context.create_image(self.width, self.height)
6665

6766
self.command_queue = self.context.create_command_queue()
68-
if frame_buffer_gl:
69-
self.output_image = self.context.create_frame_buffer_image_gl(frame_buffer_gl)
70-
else:
71-
self.output_image = self.context.create_image(self.width, self.height)
67+
self.output_image = self.context.create_image(self.width, self.height)
7268

7369
self._create_filter()
7470

src/rprblender/engine/preview_engine.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,13 @@ def render(self):
8686
# since version 3.4 result.layers[0].passes == ['Combined', 'Depth']
8787
# we need to add Depth AOV to keep correct array size while using foreach_set
8888
image = np.concatenate(
89-
(image, self.rpr_context.get_image(pyrpr.AOV_DEPTH).flatten())
89+
(image, self.rpr_context.get_image(pyrpr.AOV_DEPTH)[:, :, 0:1].flatten())
9090
)
9191

92+
if BLENDER_VERSION >= '4.0':
93+
# foreach_set requires every pass to be 4 channels, so we resize to reach desirable size
94+
image.resize((len(result.layers[0].passes) * self.rpr_context.width * self.rpr_context.height * 4,))
95+
9296
result.layers[0].passes.foreach_set('rect', image)
9397
self.rpr_engine.update_result(result)
9498

src/rprblender/engine/render_engine.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from rprblender import utils
2626
from .engine import Engine
2727
from rprblender.export import world, camera, object, instance, particle
28-
from rprblender.utils import render_stamp
28+
from rprblender.utils import render_stamp, BLENDER_VERSION
2929
from rprblender.utils.conversion import perfcounter_to_str, get_cryptomatte_hash
3030
from rprblender.utils.user_settings import get_user_settings
3131
from rprblender import bl_info
@@ -152,8 +152,13 @@ def set_render_result(render_passes: bpy.types.RenderPasses):
152152

153153
images.append(image.flatten())
154154

155+
images_data = np.concatenate(images)
156+
if BLENDER_VERSION >= '4.0':
157+
# foreach_set requires every pass to be 4 channels, so we resize to reach desirable size
158+
images_data.resize((len(render_passes) * self.width * self.height * 4,))
159+
155160
# efficient way to copy all AOV images
156-
render_passes.foreach_set('rect', np.concatenate(images))
161+
render_passes.foreach_set('rect', images_data)
157162

158163
result = self.rpr_engine.begin_result(*tile_pos, *tile_size, layer=layer_name, view="")
159164
try:
@@ -203,8 +208,13 @@ def set_render_result(render_passes: bpy.types.RenderPasses):
203208

204209
images.append(image.flatten())
205210

211+
images_data = np.concatenate(images)
212+
if BLENDER_VERSION >= '4.0':
213+
# foreach_set requires every pass to be 4 channels, so we resize to reach desirable size
214+
images_data.resize((len(render_passes) * self.width * self.height * 4,))
215+
206216
# efficient way to copy all AOV images
207-
render_passes.foreach_set('rect', np.concatenate(images))
217+
render_passes.foreach_set('rect', images_data)
208218

209219
result = self.rpr_engine.begin_result(*tile_pos, *tile_size, layer=layer_name, view="")
210220
try:

0 commit comments

Comments
 (0)