At this point, I’ll write out what I currently have and ask for more specific help.
var rd : RenderingDevice
var shader : RID
var main_pipeline : RID
var reset := 0
var nearest_sampler
var prevtex : Array[RID] = []
func _render_callback(_effect_callback_type: int, render_data: RenderData) -> void:
if not rd or not shader or not main_pipeline:
initialize_cs()
return
var scene_buffers : RenderSceneBuffersRD = render_data.get_render_scene_buffers()
if not scene_buffers: return
var size : Vector2i = scene_buffers.get_internal_size()
if size.x == 0 or size.y == 0: return
#var cam = render_data.get_camera_attributes()
var x_groups : int = (size.x - 1) / 8 + 1
var y_groups : int = (size.y - 1) / 8 + 1
var push_constants : PackedFloat32Array = PackedFloat32Array()
push_constants.append(size.x)
push_constants.append(size.y)
push_constants.append(Time.get_ticks_msec())
push_constants.append(reset)
for view in scene_buffers.get_view_count():
if not rd or not shader or not main_pipeline:
initialize_cs()
return
var scene_buffers : RenderSceneBuffersRD = render_data.get_render_scene_buffers()
if not scene_buffers: return
var size : Vector2i = scene_buffers.get_internal_size()
if size.x == 0 or size.y == 0: return
var cam = render_data.get_camera_attributes()
var fmt = RDTextureFormat.new()
fmt.width = size.x
fmt.height = size.y
fmt.format = RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT
fmt.usage_bits = RenderingDevice.TEXTURE_USAGE_CAN_UPDATE_BIT \
| RenderingDevice.TEXTURE_USAGE_STORAGE_BIT \
| RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT \
| RenderingDevice.TEXTURE_USAGE_CPU_READ_BIT \
| RenderingDevice.TEXTURE_USAGE_SAMPLING_BIT
#for i in scene_buffers.get_view_count():
#prevtex.append(RDTextureFormat.new())
#prevtex[i].width = size.x
#prevtex[i].height = size.y
#prevtex[i].format = RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT
#prevtex[i] = rd.texture_create(prevtex[i], RDTextureView.new(), [Image.create(size.x, size.y, false, Image.FORMAT_RGBA16).get_data()])
var x_groups : int = (size.x - 1) / 8 + 1
var y_groups : int = (size.y - 1) / 8 + 1
var push_constants : PackedFloat32Array = PackedFloat32Array()
push_constants.append(size.x)
push_constants.append(size.y)
push_constants.append(Time.get_ticks_msec())
push_constants.append(reset)
for view in scene_buffers.get_view_count():
var screentex : RID = scene_buffers.get_color_layer(view)
var motiontex : RID = scene_buffers.get_velocity_layer(view)
var depthext := scene_buffers.get_depth_layer(view)
#var prevframe : Texture2DRD = Texture2DRD.new()
#prevtex[view].usage_bits = RenderingDevice.TEXTURE_USAGE_CAN_UPDATE_BIT | RenderingDevice.TEXTURE_USAGE_STORAGE_BIT | RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT
if prevtex.size() <= view:
prevtex.append(rd.texture_create(fmt, RDTextureView.new(), [rd.texture_get_data(screentex, 0)]))
#prevframe.texture_rd_rid = prevtex[view]
var masktex := ShaderGlobals.mask_tex
var maskdepth := ShaderGlobals.depth_tex
#print(ShaderGlobals.auxtex)
var uniform_screen : RDUniform = RDUniform.new()
uniform_screen.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
uniform_screen.binding = 0
uniform_screen.add_id(screentex)
var uniform_vector := RDUniform.new()
uniform_vector.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
uniform_vector.binding = 1
uniform_vector.add_id(motiontex)
var uniform_depth := RDUniform.new()
uniform_depth.uniform_type = RenderingDevice.UNIFORM_TYPE_SAMPLER_WITH_TEXTURE
uniform_depth.binding = 2
uniform_depth.add_id(nearest_sampler)
uniform_depth.add_id(depthext)
var uniform_prev := RDUniform.new()
uniform_prev.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
uniform_prev.binding = 3
#prevtex[view] = (scene_buffers.get_color_layer(view))
print(prevtex[view])
uniform_prev.add_id(prevtex[view])
var uniform_mask := RDUniform.new()
uniform_mask.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
uniform_mask.binding = 4
uniform_mask.add_id(masktex)
var uniform_maskdepth := RDUniform.new()
uniform_maskdepth.uniform_type = RenderingDevice.UNIFORM_TYPE_SAMPLER_WITH_TEXTURE
uniform_maskdepth.binding = 5
uniform_maskdepth.add_id(nearest_sampler)
uniform_maskdepth.add_id(maskdepth)
var image_uniform_set : RID
image_uniform_set = UniformSetCacheRD.get_cache(shader, 0, [uniform_screen, uniform_vector, uniform_depth, uniform_prev, uniform_mask, uniform_maskdepth])
var compute_list : int = rd.compute_list_begin()
rd.compute_list_bind_compute_pipeline(compute_list, main_pipeline)
rd.compute_list_bind_uniform_set(compute_list, image_uniform_set, 0)
rd.compute_list_set_push_constant(compute_list, push_constants.to_byte_array(), push_constants.size() * 4)
rd.compute_list_dispatch(compute_list, x_groups, y_groups, 1)
rd.compute_list_end()
#prevtex[view] = rd.texture_create(RDTextureView.new(), prevtex[view])
#prevtex.append(RDTextureFormat.new())
#prevtex[view].width = size.x
#prevtex[view].height = size.y
#prevtex[view].format = RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT
#prevtex[view].usage_bits = ReneringDevice.TEXTURE_USAGE_CAN_UPDATE_BIT | RenderingDevice.TEXTURE_USAGE_STORAGE_BIT | RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT
prevtex[view] = rd.texture_create(fmt, RDTextureView.new(), [rd.texture_get_data(prevtex[view], 0)])
#prevtex[view] = prevframe.texture_rd_rid
if reset == 0:
reset += 1
Assume the omitted code is near 1:1 to the boilerplate code on the official docs.
Is the texture create being done correctly? I have a feeling I should configure what RDTextureView.new() is, but I have no idea how.
I wish there was a simple instruction on how to do this on docs, so I could read there instead of bothering people on a sunday, but alas.
Edit: I think I figured out how to get the texture, but now its RID is 0?