Skip to content

Commit 1939e87

Browse files
committed
Merge pull request #101561 from darksylinc/matias-device-address-api
Change how device address is requested to avoid future API breakage
2 parents f418603 + af900a5 commit 1939e87

File tree

7 files changed

+78
-52
lines changed

7 files changed

+78
-52
lines changed

doc/classes/RenderingDevice.xml

+18-9
Original file line numberDiff line numberDiff line change
@@ -703,11 +703,10 @@
703703
<param index="1" name="format" type="int" enum="RenderingDevice.IndexBufferFormat" />
704704
<param index="2" name="data" type="PackedByteArray" default="PackedByteArray()" />
705705
<param index="3" name="use_restart_indices" type="bool" default="false" />
706-
<param index="4" name="enable_device_address" type="bool" default="false" />
706+
<param index="4" name="creation_bits" type="int" enum="RenderingDevice.BufferCreationBits" is_bitfield="true" default="0" />
707707
<description>
708708
Creates a new index buffer. It can be accessed with the RID that is returned.
709709
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
710-
Optionally, set [param enable_device_address] if you wish to use [method buffer_get_device_address] functionality and the GPU supports it.
711710
</description>
712711
</method>
713712
<method name="limit_get" qualifiers="const">
@@ -847,6 +846,7 @@
847846
<param index="0" name="size_bytes" type="int" />
848847
<param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" />
849848
<param index="2" name="usage" type="int" enum="RenderingDevice.StorageBufferUsage" is_bitfield="true" default="0" />
849+
<param index="3" name="creation_bits" type="int" enum="RenderingDevice.BufferCreationBits" is_bitfield="true" default="0" />
850850
<description>
851851
Creates a [url=https://vkguide.dev/docs/chapter-4/storage_buffers/]storage buffer[/url] with the specified [param data] and [param usage]. It can be accessed with the RID that is returned.
852852
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
@@ -1073,11 +1073,10 @@
10731073
<return type="RID" />
10741074
<param index="0" name="size_bytes" type="int" />
10751075
<param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" />
1076-
<param index="2" name="enable_device_address" type="bool" default="false" />
1076+
<param index="2" name="creation_bits" type="int" enum="RenderingDevice.BufferCreationBits" is_bitfield="true" default="0" />
10771077
<description>
10781078
Creates a new uniform buffer. It can be accessed with the RID that is returned.
10791079
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
1080-
Optionally, set [param enable_device_address] if you wish to use [method buffer_get_device_address] functionality and the GPU supports it.
10811080
</description>
10821081
</method>
10831082
<method name="uniform_set_create">
@@ -1111,12 +1110,10 @@
11111110
<return type="RID" />
11121111
<param index="0" name="size_bytes" type="int" />
11131112
<param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" />
1114-
<param index="2" name="use_as_storage" type="bool" default="false" />
1115-
<param index="3" name="enable_device_address" type="bool" default="false" />
1113+
<param index="2" name="creation_bits" type="int" enum="RenderingDevice.BufferCreationBits" is_bitfield="true" default="0" />
11161114
<description>
11171115
It can be accessed with the RID that is returned.
11181116
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
1119-
Optionally, set [param enable_device_address] if you wish to use [method buffer_get_device_address] functionality and the GPU supports it.
11201117
</description>
11211118
</method>
11221119
<method name="vertex_format_create">
@@ -2068,8 +2065,20 @@
20682065
</constant>
20692066
<constant name="STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT" value="1" enum="StorageBufferUsage" is_bitfield="true">
20702067
</constant>
2071-
<constant name="STORAGE_BUFFER_USAGE_DEVICE_ADDRESS" value="2" enum="StorageBufferUsage" is_bitfield="true">
2072-
Allows usage of [method buffer_get_device_address] on supported GPUs.
2068+
<constant name="BUFFER_CREATION_DEVICE_ADDRESS_BIT" value="1" enum="BufferCreationBits" is_bitfield="true">
2069+
Optionally, set this flag if you wish to use [method buffer_get_device_address] functionality. You must first check the GPU supports it:
2070+
[codeblocks]
2071+
[gdscript]
2072+
rd = RenderingServer.get_rendering_device()
2073+
2074+
if rd.has_feature(RenderingDevice.SUPPORTS_BUFFER_DEVICE_ADDRESS):
2075+
storage_buffer = rd.storage_buffer_create(bytes.size(), bytes, RenderingDevice.STORAGE_BUFFER_USAGE_SHADER_DEVICE_ADDRESS):
2076+
storage_buffer_address = rd.buffer_get_device_address(storage_buffer)
2077+
[/gdscript]
2078+
[/codeblocks]
2079+
</constant>
2080+
<constant name="BUFFER_CREATION_AS_STORAGE_BIT" value="2" enum="BufferCreationBits" is_bitfield="true">
2081+
Set this flag so that it is created as storage. This is useful if Compute Shaders need access (for reading or writing) to the buffer, e.g. skeletal animations are processed in Compute Shaders which need access to vertex buffers, to be later consumed by vertex shaders as part of the regular rasterization pipeline.
20732082
</constant>
20742083
<constant name="UNIFORM_TYPE_SAMPLER" value="0" enum="UniformType">
20752084
Sampler uniform.

misc/extension_api_validation/4.3-stable.expected

+5-2
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,16 @@ Validate extension JSON: Error: Field 'classes/RichTextLabel/methods/set_table_c
294294
Added optional "shrink" argument. Compatibility method registered.
295295

296296

297-
GH-100062
297+
GH-101561
298298
--------
299299
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/index_buffer_create/arguments': size changed value in new API, from 4 to 5.
300300
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/uniform_buffer_create/arguments': size changed value in new API, from 2 to 3.
301+
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/storage_buffer_create/arguments': size changed value in new API, from 3 to 4.
301302
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/vertex_buffer_create/arguments': size changed value in new API, from 3 to 4.
303+
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/vertex_buffer_create/arguments/2': default_value changed value in new API, from "false" to "0".
304+
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/vertex_buffer_create/arguments/2': type changed value in new API, from "bool" to "bitfield::RenderingDevice.BufferCreationBits".
302305

303-
Optional argument added. Compatibility methods registered.
306+
Optional argument (creation flags) added. Compatibility methods registered.
304307

305308

306309
GH-101531

servers/rendering/renderer_rd/effects/debug_effects.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ DebugEffects::DebugEffects() {
6666
void DebugEffects::_create_frustum_arrays() {
6767
if (frustum.vertex_buffer.is_null()) {
6868
// Create vertex buffer, but don't put data in it yet
69-
frustum.vertex_buffer = RD::get_singleton()->vertex_buffer_create(8 * sizeof(float) * 3, Vector<uint8_t>(), false);
69+
frustum.vertex_buffer = RD::get_singleton()->vertex_buffer_create(8 * sizeof(float) * 3, Vector<uint8_t>());
7070

7171
Vector<RD::VertexAttribute> attributes;
7272
Vector<RID> buffers;

servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,8 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
370370
s->format = new_surface.format;
371371
s->primitive = new_surface.primitive;
372372

373-
bool use_as_storage = (new_surface.skin_data.size() || mesh->blend_shape_count > 0);
373+
const bool use_as_storage = (new_surface.skin_data.size() || mesh->blend_shape_count > 0);
374+
const BitField<RD::BufferCreationBits> as_storage_flag = use_as_storage ? RD::BUFFER_CREATION_AS_STORAGE_BIT : 0;
374375

375376
if (new_surface.vertex_data.size()) {
376377
// If we have an uncompressed surface that contains normals, but not tangents, we need to differentiate the array
@@ -384,10 +385,10 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
384385
Vector<uint8_t> new_vertex_data;
385386
new_vertex_data.resize_zeroed(new_surface.vertex_data.size() + sizeof(uint16_t) * 2);
386387
memcpy(new_vertex_data.ptrw(), new_surface.vertex_data.ptr(), new_surface.vertex_data.size());
387-
s->vertex_buffer = RD::get_singleton()->vertex_buffer_create(new_vertex_data.size(), new_vertex_data, use_as_storage);
388+
s->vertex_buffer = RD::get_singleton()->vertex_buffer_create(new_vertex_data.size(), new_vertex_data, as_storage_flag);
388389
s->vertex_buffer_size = new_vertex_data.size();
389390
} else {
390-
s->vertex_buffer = RD::get_singleton()->vertex_buffer_create(new_surface.vertex_data.size(), new_surface.vertex_data, use_as_storage);
391+
s->vertex_buffer = RD::get_singleton()->vertex_buffer_create(new_surface.vertex_data.size(), new_surface.vertex_data, as_storage_flag);
391392
s->vertex_buffer_size = new_surface.vertex_data.size();
392393
}
393394
}
@@ -396,7 +397,7 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
396397
s->attribute_buffer = RD::get_singleton()->vertex_buffer_create(new_surface.attribute_data.size(), new_surface.attribute_data);
397398
}
398399
if (new_surface.skin_data.size()) {
399-
s->skin_buffer = RD::get_singleton()->vertex_buffer_create(new_surface.skin_data.size(), new_surface.skin_data, use_as_storage);
400+
s->skin_buffer = RD::get_singleton()->vertex_buffer_create(new_surface.skin_data.size(), new_surface.skin_data, as_storage_flag);
400401
s->skin_buffer_size = new_surface.skin_data.size();
401402
}
402403

servers/rendering/rendering_device.compat.inc

+14-9
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,20 @@ RenderingDevice::FramebufferFormatID RenderingDevice::_screen_get_framebuffer_fo
143143
return screen_get_framebuffer_format(DisplayServer::MAIN_WINDOW_ID);
144144
}
145145

146-
RID RenderingDevice::_uniform_buffer_create_bind_compat_100062(uint32_t p_size_bytes, const Vector<uint8_t> &p_data) {
147-
return uniform_buffer_create(p_size_bytes, p_data, false);
146+
RID RenderingDevice::_uniform_buffer_create_bind_compat_101561(uint32_t p_size_bytes, const Vector<uint8_t> &p_data) {
147+
return uniform_buffer_create(p_size_bytes, p_data, 0);
148148
}
149149

150-
RID RenderingDevice::_vertex_buffer_create_bind_compat_100062(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, bool p_use_as_storage) {
151-
return vertex_buffer_create(p_size_bytes, p_data, p_use_as_storage, false);
150+
RID RenderingDevice::_storage_buffer_create_bind_compat_101561(uint32_t p_size, const Vector<uint8_t> &p_data, BitField<StorageBufferUsage> p_usage) {
151+
return storage_buffer_create(p_size, p_data, p_usage, 0);
152152
}
153153

154-
RID RenderingDevice::_index_buffer_create_bind_compat_100062(uint32_t p_size_indices, IndexBufferFormat p_format, const Vector<uint8_t> &p_data, bool p_use_restart_indices) {
155-
return index_buffer_create(p_size_indices, p_format, p_data, p_use_restart_indices, false);
154+
RID RenderingDevice::_vertex_buffer_create_bind_compat_101561(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, bool p_use_as_storage) {
155+
return vertex_buffer_create(p_size_bytes, p_data, p_use_as_storage ? RD::BUFFER_CREATION_AS_STORAGE_BIT : 0);
156+
}
157+
158+
RID RenderingDevice::_index_buffer_create_bind_compat_101561(uint32_t p_size_indices, IndexBufferFormat p_format, const Vector<uint8_t> &p_data, bool p_use_restart_indices) {
159+
return index_buffer_create(p_size_indices, p_format, p_data, p_use_restart_indices, 0);
156160
}
157161

158162
void RenderingDevice::_bind_compatibility_methods() {
@@ -179,9 +183,10 @@ void RenderingDevice::_bind_compatibility_methods() {
179183

180184
ClassDB::bind_compatibility_method(D_METHOD("draw_list_begin", "framebuffer", "initial_color_action", "final_color_action", "initial_depth_action", "final_depth_action", "clear_color_values", "clear_depth", "clear_stencil", "region", "breadcrumb"), &RenderingDevice::_draw_list_begin_bind_compat_98670, DEFVAL(Vector<Color>()), DEFVAL(1.0), DEFVAL(0), DEFVAL(Rect2()), DEFVAL(0));
181185

182-
ClassDB::bind_compatibility_method(D_METHOD("uniform_buffer_create"), &RenderingDevice::_uniform_buffer_create_bind_compat_100062, DEFVAL(Vector<uint8_t>()));
183-
ClassDB::bind_compatibility_method(D_METHOD("vertex_buffer_create"), &RenderingDevice::_vertex_buffer_create_bind_compat_100062, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
184-
ClassDB::bind_compatibility_method(D_METHOD("index_buffer_create"), &RenderingDevice::_index_buffer_create_bind_compat_100062, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
186+
ClassDB::bind_compatibility_method(D_METHOD("uniform_buffer_create", "size_bytes", "data"), &RenderingDevice::_uniform_buffer_create_bind_compat_101561, DEFVAL(Vector<uint8_t>()));
187+
ClassDB::bind_compatibility_method(D_METHOD("storage_buffer_create", "size_bytes", "data", "usage"), &RenderingDevice::_storage_buffer_create_bind_compat_101561, DEFVAL(Vector<uint8_t>()), DEFVAL(0));
188+
ClassDB::bind_compatibility_method(D_METHOD("vertex_buffer_create", "size_bytes", "data", "use_as_storage"), &RenderingDevice::_vertex_buffer_create_bind_compat_101561, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
189+
ClassDB::bind_compatibility_method(D_METHOD("index_buffer_create", "size_indices", "format", "data", "use_restart_indices"), &RenderingDevice::_index_buffer_create_bind_compat_101561, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
185190
}
186191

187192
#endif

0 commit comments

Comments
 (0)