mirror of
https://github.com/godotengine/godot.git
synced 2025-01-22 10:32:54 -05:00
Implement Buffer Device Address for Rendering Device Vulkan and DirectX12
This commit is contained in:
parent
b3a44e8d51
commit
3d92f406b2
13 changed files with 168 additions and 14 deletions
|
@ -81,6 +81,14 @@
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="buffer_get_device_address">
|
||||||
|
<return type="int" />
|
||||||
|
<param index="0" name="buffer" type="RID" />
|
||||||
|
<description>
|
||||||
|
Returns the address of the given [param buffer] which can be passed to shaders in any way to access underlying data. Buffer must have been created with this feature enabled.
|
||||||
|
[b]Note:[/b] You must check that the GPU supports this functionality by calling [method has_feature] with [constant SUPPORTS_BUFFER_DEVICE_ADDRESS] as a parameter.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="buffer_update">
|
<method name="buffer_update">
|
||||||
<return type="int" enum="Error" />
|
<return type="int" enum="Error" />
|
||||||
<param index="0" name="buffer" type="RID" />
|
<param index="0" name="buffer" type="RID" />
|
||||||
|
@ -672,6 +680,13 @@
|
||||||
This is only used by Vulkan in debug builds. Godot must also be started with the [code]--extra-gpu-memory-tracking[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url].
|
This is only used by Vulkan in debug builds. Godot must also be started with the [code]--extra-gpu-memory-tracking[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="has_feature" qualifiers="const">
|
||||||
|
<return type="bool" />
|
||||||
|
<param index="0" name="feature" type="int" enum="RenderingDevice.Features" />
|
||||||
|
<description>
|
||||||
|
Returns [code]true[/code] if the [param feature] is supported by the GPU.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="index_array_create">
|
<method name="index_array_create">
|
||||||
<return type="RID" />
|
<return type="RID" />
|
||||||
<param index="0" name="index_buffer" type="RID" />
|
<param index="0" name="index_buffer" type="RID" />
|
||||||
|
@ -688,9 +703,11 @@
|
||||||
<param index="1" name="format" type="int" enum="RenderingDevice.IndexBufferFormat" />
|
<param index="1" name="format" type="int" enum="RenderingDevice.IndexBufferFormat" />
|
||||||
<param index="2" name="data" type="PackedByteArray" default="PackedByteArray()" />
|
<param index="2" name="data" type="PackedByteArray" default="PackedByteArray()" />
|
||||||
<param index="3" name="use_restart_indices" type="bool" default="false" />
|
<param index="3" name="use_restart_indices" type="bool" default="false" />
|
||||||
|
<param index="4" name="enable_device_address" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Creates a new index buffer. It can be accessed with the RID that is returned.
|
Creates a new index buffer. It can be accessed with the RID that is returned.
|
||||||
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
|
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
|
||||||
|
Optionally, set [param enable_device_address] if you wish to use [method buffer_get_device_address] functionality and the GPU supports it.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="limit_get" qualifiers="const">
|
<method name="limit_get" qualifiers="const">
|
||||||
|
@ -1056,9 +1073,11 @@
|
||||||
<return type="RID" />
|
<return type="RID" />
|
||||||
<param index="0" name="size_bytes" type="int" />
|
<param index="0" name="size_bytes" type="int" />
|
||||||
<param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" />
|
<param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" />
|
||||||
|
<param index="2" name="enable_device_address" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Creates a new uniform buffer. It can be accessed with the RID that is returned.
|
Creates a new uniform buffer. It can be accessed with the RID that is returned.
|
||||||
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
|
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
|
||||||
|
Optionally, set [param enable_device_address] if you wish to use [method buffer_get_device_address] functionality and the GPU supports it.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="uniform_set_create">
|
<method name="uniform_set_create">
|
||||||
|
@ -1093,9 +1112,11 @@
|
||||||
<param index="0" name="size_bytes" type="int" />
|
<param index="0" name="size_bytes" type="int" />
|
||||||
<param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" />
|
<param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" />
|
||||||
<param index="2" name="use_as_storage" type="bool" default="false" />
|
<param index="2" name="use_as_storage" type="bool" default="false" />
|
||||||
|
<param index="3" name="enable_device_address" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
It can be accessed with the RID that is returned.
|
It can be accessed with the RID that is returned.
|
||||||
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
|
Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method.
|
||||||
|
Optionally, set [param enable_device_address] if you wish to use [method buffer_get_device_address] functionality and the GPU supports it.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="vertex_format_create">
|
<method name="vertex_format_create">
|
||||||
|
@ -2047,6 +2068,9 @@
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT" value="1" enum="StorageBufferUsage" is_bitfield="true">
|
<constant name="STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT" value="1" enum="StorageBufferUsage" is_bitfield="true">
|
||||||
</constant>
|
</constant>
|
||||||
|
<constant name="STORAGE_BUFFER_USAGE_DEVICE_ADDRESS" value="2" enum="StorageBufferUsage" is_bitfield="true">
|
||||||
|
Allows usage of [method buffer_get_device_address] on supported GPUs.
|
||||||
|
</constant>
|
||||||
<constant name="UNIFORM_TYPE_SAMPLER" value="0" enum="UniformType">
|
<constant name="UNIFORM_TYPE_SAMPLER" value="0" enum="UniformType">
|
||||||
Sampler uniform.
|
Sampler uniform.
|
||||||
</constant>
|
</constant>
|
||||||
|
@ -2418,6 +2442,9 @@
|
||||||
<constant name="PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT" value="2" enum="PipelineSpecializationConstantType">
|
<constant name="PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT" value="2" enum="PipelineSpecializationConstantType">
|
||||||
Floating-point specialization constant.
|
Floating-point specialization constant.
|
||||||
</constant>
|
</constant>
|
||||||
|
<constant name="SUPPORTS_BUFFER_DEVICE_ADDRESS" value="6" enum="Features">
|
||||||
|
Features support for buffer device address extension.
|
||||||
|
</constant>
|
||||||
<constant name="LIMIT_MAX_BOUND_UNIFORM_SETS" value="0" enum="Limit">
|
<constant name="LIMIT_MAX_BOUND_UNIFORM_SETS" value="0" enum="Limit">
|
||||||
Maximum number of uniform sets that can be bound at a given time.
|
Maximum number of uniform sets that can be bound at a given time.
|
||||||
</constant>
|
</constant>
|
||||||
|
|
|
@ -905,6 +905,11 @@ void RenderingDeviceDriverD3D12::buffer_unmap(BufferID p_buffer) {
|
||||||
buf_info->resource->Unmap(0, &VOID_RANGE);
|
buf_info->resource->Unmap(0, &VOID_RANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t RenderingDeviceDriverD3D12::buffer_get_device_address(BufferID p_buffer) {
|
||||||
|
const BufferInfo *buf_info = (const BufferInfo *)p_buffer.id;
|
||||||
|
return buf_info->resource->GetGPUVirtualAddress();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************/
|
/*****************/
|
||||||
/**** TEXTURE ****/
|
/**** TEXTURE ****/
|
||||||
/*****************/
|
/*****************/
|
||||||
|
@ -6271,6 +6276,8 @@ bool RenderingDeviceDriverD3D12::has_feature(Features p_feature) {
|
||||||
return vrs_capabilities.ss_image_supported;
|
return vrs_capabilities.ss_image_supported;
|
||||||
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
|
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
|
||||||
return true;
|
return true;
|
||||||
|
case SUPPORTS_BUFFER_DEVICE_ADDRESS:
|
||||||
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -284,6 +284,7 @@ public:
|
||||||
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) override final;
|
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) override final;
|
||||||
virtual uint8_t *buffer_map(BufferID p_buffer) override final;
|
virtual uint8_t *buffer_map(BufferID p_buffer) override final;
|
||||||
virtual void buffer_unmap(BufferID p_buffer) override final;
|
virtual void buffer_unmap(BufferID p_buffer) override final;
|
||||||
|
virtual uint64_t buffer_get_device_address(BufferID p_buffer) override final;
|
||||||
|
|
||||||
/*****************/
|
/*****************/
|
||||||
/**** TEXTURE ****/
|
/**** TEXTURE ****/
|
||||||
|
|
|
@ -105,6 +105,7 @@ public:
|
||||||
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) override final;
|
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) override final;
|
||||||
virtual uint8_t *buffer_map(BufferID p_buffer) override final;
|
virtual uint8_t *buffer_map(BufferID p_buffer) override final;
|
||||||
virtual void buffer_unmap(BufferID p_buffer) override final;
|
virtual void buffer_unmap(BufferID p_buffer) override final;
|
||||||
|
virtual uint64_t buffer_get_device_address(BufferID p_buffer) override final;
|
||||||
|
|
||||||
#pragma mark - Texture
|
#pragma mark - Texture
|
||||||
|
|
||||||
|
|
|
@ -159,6 +159,15 @@ void RenderingDeviceDriverMetal::buffer_unmap(BufferID p_buffer) {
|
||||||
// Nothing to do.
|
// Nothing to do.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t RenderingDeviceDriverMetal::buffer_get_device_address(BufferID p_buffer) {
|
||||||
|
if (@available(iOS 16.0, macOS 13.0, *)) {
|
||||||
|
id<MTLBuffer> obj = rid::get(p_buffer);
|
||||||
|
return obj.gpuAddress;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - Texture
|
#pragma mark - Texture
|
||||||
|
|
||||||
#pragma mark - Format Conversions
|
#pragma mark - Format Conversions
|
||||||
|
@ -4026,6 +4035,8 @@ bool RenderingDeviceDriverMetal::has_feature(Features p_feature) {
|
||||||
return false;
|
return false;
|
||||||
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
|
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
|
||||||
return true;
|
return true;
|
||||||
|
case SUPPORTS_BUFFER_DEVICE_ADDRESS:
|
||||||
|
return false;
|
||||||
case SUPPORTS_METALFX_SPATIAL:
|
case SUPPORTS_METALFX_SPATIAL:
|
||||||
return device_properties->features.metal_fx_spatial;
|
return device_properties->features.metal_fx_spatial;
|
||||||
case SUPPORTS_METALFX_TEMPORAL:
|
case SUPPORTS_METALFX_TEMPORAL:
|
||||||
|
|
|
@ -513,6 +513,7 @@ Error RenderingDeviceDriverVulkan::_initialize_device_extensions() {
|
||||||
_register_requested_device_extension(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, false);
|
_register_requested_device_extension(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, false);
|
||||||
_register_requested_device_extension(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false);
|
_register_requested_device_extension(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false);
|
||||||
_register_requested_device_extension(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, false);
|
_register_requested_device_extension(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, false);
|
||||||
|
_register_requested_device_extension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, false);
|
||||||
|
|
||||||
if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
|
if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
|
||||||
_register_requested_device_extension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, true);
|
_register_requested_device_extension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, true);
|
||||||
|
@ -730,6 +731,7 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
|
||||||
void *next_features = nullptr;
|
void *next_features = nullptr;
|
||||||
VkPhysicalDeviceVulkan12Features device_features_vk_1_2 = {};
|
VkPhysicalDeviceVulkan12Features device_features_vk_1_2 = {};
|
||||||
VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shader_features = {};
|
VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shader_features = {};
|
||||||
|
VkPhysicalDeviceBufferDeviceAddressFeaturesKHR buffer_device_address_features = {};
|
||||||
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {};
|
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {};
|
||||||
VkPhysicalDevice16BitStorageFeaturesKHR storage_feature = {};
|
VkPhysicalDevice16BitStorageFeaturesKHR storage_feature = {};
|
||||||
VkPhysicalDeviceMultiviewFeatures multiview_features = {};
|
VkPhysicalDeviceMultiviewFeatures multiview_features = {};
|
||||||
|
@ -740,10 +742,17 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
|
||||||
device_features_vk_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
|
device_features_vk_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
|
||||||
device_features_vk_1_2.pNext = next_features;
|
device_features_vk_1_2.pNext = next_features;
|
||||||
next_features = &device_features_vk_1_2;
|
next_features = &device_features_vk_1_2;
|
||||||
} else if (enabled_device_extension_names.has(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
} else {
|
||||||
shader_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR;
|
if (enabled_device_extension_names.has(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
||||||
shader_features.pNext = next_features;
|
shader_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR;
|
||||||
next_features = &shader_features;
|
shader_features.pNext = next_features;
|
||||||
|
next_features = &shader_features;
|
||||||
|
}
|
||||||
|
if (enabled_device_extension_names.has(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
|
||||||
|
buffer_device_address_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR;
|
||||||
|
buffer_device_address_features.pNext = next_features;
|
||||||
|
next_features = &buffer_device_address_features;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enabled_device_extension_names.has(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
|
if (enabled_device_extension_names.has(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
|
||||||
|
@ -783,11 +792,17 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
|
||||||
shader_capabilities.shader_float16_is_supported = device_features_vk_1_2.shaderFloat16;
|
shader_capabilities.shader_float16_is_supported = device_features_vk_1_2.shaderFloat16;
|
||||||
shader_capabilities.shader_int8_is_supported = device_features_vk_1_2.shaderInt8;
|
shader_capabilities.shader_int8_is_supported = device_features_vk_1_2.shaderInt8;
|
||||||
}
|
}
|
||||||
|
if (enabled_device_extension_names.has(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
|
||||||
|
buffer_device_address_support = device_features_vk_1_2.bufferDeviceAddress;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (enabled_device_extension_names.has(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
if (enabled_device_extension_names.has(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME)) {
|
||||||
shader_capabilities.shader_float16_is_supported = shader_features.shaderFloat16;
|
shader_capabilities.shader_float16_is_supported = shader_features.shaderFloat16;
|
||||||
shader_capabilities.shader_int8_is_supported = shader_features.shaderInt8;
|
shader_capabilities.shader_int8_is_supported = shader_features.shaderInt8;
|
||||||
}
|
}
|
||||||
|
if (enabled_device_extension_names.has(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME)) {
|
||||||
|
buffer_device_address_support = buffer_device_address_features.bufferDeviceAddress;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enabled_device_extension_names.has(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
|
if (enabled_device_extension_names.has(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
|
||||||
|
@ -971,6 +986,14 @@ Error RenderingDeviceDriverVulkan::_initialize_device(const LocalVector<VkDevice
|
||||||
shader_features.shaderInt8 = shader_capabilities.shader_int8_is_supported;
|
shader_features.shaderInt8 = shader_capabilities.shader_int8_is_supported;
|
||||||
create_info_next = &shader_features;
|
create_info_next = &shader_features;
|
||||||
|
|
||||||
|
VkPhysicalDeviceBufferDeviceAddressFeaturesKHR buffer_device_address_features = {};
|
||||||
|
if (buffer_device_address_support) {
|
||||||
|
buffer_device_address_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR;
|
||||||
|
buffer_device_address_features.pNext = create_info_next;
|
||||||
|
buffer_device_address_features.bufferDeviceAddress = buffer_device_address_support;
|
||||||
|
create_info_next = &buffer_device_address_features;
|
||||||
|
}
|
||||||
|
|
||||||
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {};
|
VkPhysicalDeviceFragmentShadingRateFeaturesKHR vrs_features = {};
|
||||||
if (vrs_capabilities.pipeline_vrs_supported || vrs_capabilities.primitive_vrs_supported || vrs_capabilities.attachment_vrs_supported) {
|
if (vrs_capabilities.pipeline_vrs_supported || vrs_capabilities.primitive_vrs_supported || vrs_capabilities.attachment_vrs_supported) {
|
||||||
vrs_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
|
vrs_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
|
||||||
|
@ -1112,6 +1135,9 @@ Error RenderingDeviceDriverVulkan::_initialize_allocator() {
|
||||||
if (use_1_3_features) {
|
if (use_1_3_features) {
|
||||||
allocator_info.flags |= VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT;
|
allocator_info.flags |= VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT;
|
||||||
}
|
}
|
||||||
|
if (buffer_device_address_support) {
|
||||||
|
allocator_info.flags |= VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT;
|
||||||
|
}
|
||||||
VkResult err = vmaCreateAllocator(&allocator_info, &allocator);
|
VkResult err = vmaCreateAllocator(&allocator_info, &allocator);
|
||||||
ERR_FAIL_COND_V_MSG(err, ERR_CANT_CREATE, "vmaCreateAllocator failed with error " + itos(err) + ".");
|
ERR_FAIL_COND_V_MSG(err, ERR_CANT_CREATE, "vmaCreateAllocator failed with error " + itos(err) + ".");
|
||||||
|
|
||||||
|
@ -1487,6 +1513,7 @@ static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_STORAGE_BIT, VK_BUFFER_USAGE_
|
||||||
static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_INDEX_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT));
|
static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_INDEX_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT));
|
||||||
static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_VERTEX_BIT, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
|
static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_VERTEX_BIT, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
|
||||||
static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_INDIRECT_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT));
|
static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_INDIRECT_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT));
|
||||||
|
static_assert(ENUM_MEMBERS_EQUAL(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT));
|
||||||
|
|
||||||
RDD::BufferID RenderingDeviceDriverVulkan::buffer_create(uint64_t p_size, BitField<BufferUsageBits> p_usage, MemoryAllocationType p_allocation_type) {
|
RDD::BufferID RenderingDeviceDriverVulkan::buffer_create(uint64_t p_size, BitField<BufferUsageBits> p_usage, MemoryAllocationType p_allocation_type) {
|
||||||
VkBufferCreateInfo create_info = {};
|
VkBufferCreateInfo create_info = {};
|
||||||
|
@ -1588,6 +1615,15 @@ void RenderingDeviceDriverVulkan::buffer_unmap(BufferID p_buffer) {
|
||||||
vmaUnmapMemory(allocator, buf_info->allocation.handle);
|
vmaUnmapMemory(allocator, buf_info->allocation.handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t RenderingDeviceDriverVulkan::buffer_get_device_address(BufferID p_buffer) {
|
||||||
|
const BufferInfo *buf_info = (const BufferInfo *)p_buffer.id;
|
||||||
|
VkBufferDeviceAddressInfo address_info = {};
|
||||||
|
address_info.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
|
||||||
|
address_info.pNext = nullptr;
|
||||||
|
address_info.buffer = buf_info->vk_buffer;
|
||||||
|
return vkGetBufferDeviceAddress(vk_device, &address_info);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************/
|
/*****************/
|
||||||
/**** TEXTURE ****/
|
/**** TEXTURE ****/
|
||||||
/*****************/
|
/*****************/
|
||||||
|
@ -5874,6 +5910,8 @@ bool RenderingDeviceDriverVulkan::has_feature(Features p_feature) {
|
||||||
return vrs_capabilities.attachment_vrs_supported && physical_device_features.shaderStorageImageExtendedFormats;
|
return vrs_capabilities.attachment_vrs_supported && physical_device_features.shaderStorageImageExtendedFormats;
|
||||||
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
|
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
|
||||||
return true;
|
return true;
|
||||||
|
case SUPPORTS_BUFFER_DEVICE_ADDRESS:
|
||||||
|
return buffer_device_address_support;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,6 +138,7 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
|
||||||
VRSCapabilities vrs_capabilities;
|
VRSCapabilities vrs_capabilities;
|
||||||
ShaderCapabilities shader_capabilities;
|
ShaderCapabilities shader_capabilities;
|
||||||
StorageBufferCapabilities storage_buffer_capabilities;
|
StorageBufferCapabilities storage_buffer_capabilities;
|
||||||
|
bool buffer_device_address_support = false;
|
||||||
bool pipeline_cache_control_support = false;
|
bool pipeline_cache_control_support = false;
|
||||||
bool device_fault_support = false;
|
bool device_fault_support = false;
|
||||||
#if defined(VK_TRACK_DEVICE_MEMORY)
|
#if defined(VK_TRACK_DEVICE_MEMORY)
|
||||||
|
@ -204,6 +205,7 @@ public:
|
||||||
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) override final;
|
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) override final;
|
||||||
virtual uint8_t *buffer_map(BufferID p_buffer) override final;
|
virtual uint8_t *buffer_map(BufferID p_buffer) override final;
|
||||||
virtual void buffer_unmap(BufferID p_buffer) override final;
|
virtual void buffer_unmap(BufferID p_buffer) override final;
|
||||||
|
virtual uint64_t buffer_get_device_address(BufferID p_buffer) override final;
|
||||||
|
|
||||||
/*****************/
|
/*****************/
|
||||||
/**** TEXTURE ****/
|
/**** TEXTURE ****/
|
||||||
|
|
|
@ -285,3 +285,12 @@ GH-101482
|
||||||
Validate extension JSON: Error: Field 'classes/RichTextLabel/methods/set_table_column_expand/arguments': size changed value in new API, from 3 to 4.
|
Validate extension JSON: Error: Field 'classes/RichTextLabel/methods/set_table_column_expand/arguments': size changed value in new API, from 3 to 4.
|
||||||
|
|
||||||
Added optional "shrink" argument. Compatibility method registered.
|
Added optional "shrink" argument. Compatibility method registered.
|
||||||
|
|
||||||
|
|
||||||
|
GH-100062
|
||||||
|
--------
|
||||||
|
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/index_buffer_create/arguments': size changed value in new API, from 4 to 5.
|
||||||
|
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/uniform_buffer_create/arguments': size changed value in new API, from 2 to 3.
|
||||||
|
Validate extension JSON: Error: Field 'classes/RenderingDevice/methods/vertex_buffer_create/arguments': size changed value in new API, from 3 to 4.
|
||||||
|
|
||||||
|
Optional argument added. Compatibility methods registered.
|
||||||
|
|
|
@ -143,6 +143,18 @@ RenderingDevice::FramebufferFormatID RenderingDevice::_screen_get_framebuffer_fo
|
||||||
return screen_get_framebuffer_format(DisplayServer::MAIN_WINDOW_ID);
|
return screen_get_framebuffer_format(DisplayServer::MAIN_WINDOW_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RID RenderingDevice::_uniform_buffer_create_bind_compat_100062(uint32_t p_size_bytes, const Vector<uint8_t> &p_data) {
|
||||||
|
return uniform_buffer_create(p_size_bytes, p_data, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
RID RenderingDevice::_vertex_buffer_create_bind_compat_100062(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, bool p_use_as_storage) {
|
||||||
|
return vertex_buffer_create(p_size_bytes, p_data, p_use_as_storage, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
return index_buffer_create(p_size_indices, p_format, p_data, p_use_restart_indices, false);
|
||||||
|
}
|
||||||
|
|
||||||
void RenderingDevice::_bind_compatibility_methods() {
|
void RenderingDevice::_bind_compatibility_methods() {
|
||||||
ClassDB::bind_compatibility_method(D_METHOD("shader_create_from_bytecode", "binary_data"), &RenderingDevice::_shader_create_from_bytecode_bind_compat_79606);
|
ClassDB::bind_compatibility_method(D_METHOD("shader_create_from_bytecode", "binary_data"), &RenderingDevice::_shader_create_from_bytecode_bind_compat_79606);
|
||||||
|
|
||||||
|
@ -166,6 +178,10 @@ void RenderingDevice::_bind_compatibility_methods() {
|
||||||
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"), &RenderingDevice::_draw_list_begin_bind_compat_90993, DEFVAL(Vector<Color>()), DEFVAL(1.0), DEFVAL(0), DEFVAL(Rect2()));
|
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"), &RenderingDevice::_draw_list_begin_bind_compat_90993, DEFVAL(Vector<Color>()), DEFVAL(1.0), DEFVAL(0), DEFVAL(Rect2()));
|
||||||
|
|
||||||
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));
|
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));
|
||||||
|
|
||||||
|
ClassDB::bind_compatibility_method(D_METHOD("uniform_buffer_create"), &RenderingDevice::_uniform_buffer_create_bind_compat_100062, DEFVAL(Vector<uint8_t>()));
|
||||||
|
ClassDB::bind_compatibility_method(D_METHOD("vertex_buffer_create"), &RenderingDevice::_vertex_buffer_create_bind_compat_100062, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
|
||||||
|
ClassDB::bind_compatibility_method(D_METHOD("index_buffer_create"), &RenderingDevice::_index_buffer_create_bind_compat_100062, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -786,6 +786,16 @@ Error RenderingDevice::buffer_get_data_async(RID p_buffer, const Callable &p_cal
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t RenderingDevice::buffer_get_device_address(RID p_buffer) {
|
||||||
|
ERR_RENDER_THREAD_GUARD_V(0);
|
||||||
|
|
||||||
|
Buffer *buffer = _get_buffer_from_owner(p_buffer);
|
||||||
|
ERR_FAIL_NULL_V_MSG(buffer, 0, "Buffer argument is not a valid buffer of any type.");
|
||||||
|
ERR_FAIL_COND_V_MSG(!buffer->usage.has_flag(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT), 0, "Buffer was not created with device address flag.");
|
||||||
|
|
||||||
|
return driver->buffer_get_device_address(buffer->driver_id);
|
||||||
|
}
|
||||||
|
|
||||||
RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, BitField<StorageBufferUsage> p_usage) {
|
RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, BitField<StorageBufferUsage> p_usage) {
|
||||||
ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID());
|
ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID());
|
||||||
|
|
||||||
|
@ -795,6 +805,14 @@ RID RenderingDevice::storage_buffer_create(uint32_t p_size_bytes, const Vector<u
|
||||||
if (p_usage.has_flag(STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT)) {
|
if (p_usage.has_flag(STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT)) {
|
||||||
buffer.usage.set_flag(RDD::BUFFER_USAGE_INDIRECT_BIT);
|
buffer.usage.set_flag(RDD::BUFFER_USAGE_INDIRECT_BIT);
|
||||||
}
|
}
|
||||||
|
if (p_usage.has_flag(STORAGE_BUFFER_USAGE_DEVICE_ADDRESS)) {
|
||||||
|
#ifdef DEBUG_ENABLED
|
||||||
|
ERR_FAIL_COND_V_MSG(!has_feature(SUPPORTS_BUFFER_DEVICE_ADDRESS), RID(),
|
||||||
|
"The GPU doesn't support buffer address flag.");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
buffer.usage.set_flag(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT);
|
||||||
|
}
|
||||||
buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
||||||
ERR_FAIL_COND_V(!buffer.driver_id, RID());
|
ERR_FAIL_COND_V(!buffer.driver_id, RID());
|
||||||
|
|
||||||
|
@ -2960,7 +2978,7 @@ bool RenderingDevice::sampler_is_format_supported_for_filter(DataFormat p_format
|
||||||
/**** VERTEX BUFFER ****/
|
/**** VERTEX BUFFER ****/
|
||||||
/***********************/
|
/***********************/
|
||||||
|
|
||||||
RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, bool p_use_as_storage) {
|
RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, bool p_use_as_storage, bool p_enable_device_address) {
|
||||||
ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID());
|
ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID());
|
||||||
|
|
||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
|
@ -2969,6 +2987,9 @@ RID RenderingDevice::vertex_buffer_create(uint32_t p_size_bytes, const Vector<ui
|
||||||
if (p_use_as_storage) {
|
if (p_use_as_storage) {
|
||||||
buffer.usage.set_flag(RDD::BUFFER_USAGE_STORAGE_BIT);
|
buffer.usage.set_flag(RDD::BUFFER_USAGE_STORAGE_BIT);
|
||||||
}
|
}
|
||||||
|
if (p_enable_device_address) {
|
||||||
|
buffer.usage.set_flag(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT);
|
||||||
|
}
|
||||||
buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
||||||
ERR_FAIL_COND_V(!buffer.driver_id, RID());
|
ERR_FAIL_COND_V(!buffer.driver_id, RID());
|
||||||
|
|
||||||
|
@ -3099,7 +3120,7 @@ RID RenderingDevice::vertex_array_create(uint32_t p_vertex_count, VertexFormatID
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
RID RenderingDevice::index_buffer_create(uint32_t p_index_count, IndexBufferFormat p_format, const Vector<uint8_t> &p_data, bool p_use_restart_indices) {
|
RID RenderingDevice::index_buffer_create(uint32_t p_index_count, IndexBufferFormat p_format, const Vector<uint8_t> &p_data, bool p_use_restart_indices, bool p_enable_device_address) {
|
||||||
ERR_FAIL_COND_V(p_index_count == 0, RID());
|
ERR_FAIL_COND_V(p_index_count == 0, RID());
|
||||||
|
|
||||||
IndexBuffer index_buffer;
|
IndexBuffer index_buffer;
|
||||||
|
@ -3138,6 +3159,9 @@ RID RenderingDevice::index_buffer_create(uint32_t p_index_count, IndexBufferForm
|
||||||
#endif
|
#endif
|
||||||
index_buffer.size = size_bytes;
|
index_buffer.size = size_bytes;
|
||||||
index_buffer.usage = (RDD::BUFFER_USAGE_TRANSFER_FROM_BIT | RDD::BUFFER_USAGE_TRANSFER_TO_BIT | RDD::BUFFER_USAGE_INDEX_BIT);
|
index_buffer.usage = (RDD::BUFFER_USAGE_TRANSFER_FROM_BIT | RDD::BUFFER_USAGE_TRANSFER_TO_BIT | RDD::BUFFER_USAGE_INDEX_BIT);
|
||||||
|
if (p_enable_device_address) {
|
||||||
|
index_buffer.usage.set_flag(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT);
|
||||||
|
}
|
||||||
index_buffer.driver_id = driver->buffer_create(index_buffer.size, index_buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
index_buffer.driver_id = driver->buffer_create(index_buffer.size, index_buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
||||||
ERR_FAIL_COND_V(!index_buffer.driver_id, RID());
|
ERR_FAIL_COND_V(!index_buffer.driver_id, RID());
|
||||||
|
|
||||||
|
@ -3346,12 +3370,15 @@ uint64_t RenderingDevice::shader_get_vertex_input_attribute_mask(RID p_shader) {
|
||||||
/**** UNIFORMS ****/
|
/**** UNIFORMS ****/
|
||||||
/******************/
|
/******************/
|
||||||
|
|
||||||
RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data) {
|
RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, bool p_enable_device_address) {
|
||||||
ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID());
|
ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID());
|
||||||
|
|
||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
buffer.size = p_size_bytes;
|
buffer.size = p_size_bytes;
|
||||||
buffer.usage = (RDD::BUFFER_USAGE_TRANSFER_TO_BIT | RDD::BUFFER_USAGE_UNIFORM_BIT);
|
buffer.usage = (RDD::BUFFER_USAGE_TRANSFER_TO_BIT | RDD::BUFFER_USAGE_UNIFORM_BIT);
|
||||||
|
if (p_enable_device_address) {
|
||||||
|
buffer.usage.set_flag(RDD::BUFFER_USAGE_DEVICE_ADDRESS_BIT);
|
||||||
|
}
|
||||||
buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
buffer.driver_id = driver->buffer_create(buffer.size, buffer.usage, RDD::MEMORY_ALLOCATION_TYPE_GPU);
|
||||||
ERR_FAIL_COND_V(!buffer.driver_id, RID());
|
ERR_FAIL_COND_V(!buffer.driver_id, RID());
|
||||||
|
|
||||||
|
@ -7267,11 +7294,11 @@ void RenderingDevice::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("sampler_create", "state"), &RenderingDevice::_sampler_create);
|
ClassDB::bind_method(D_METHOD("sampler_create", "state"), &RenderingDevice::_sampler_create);
|
||||||
ClassDB::bind_method(D_METHOD("sampler_is_format_supported_for_filter", "format", "sampler_filter"), &RenderingDevice::sampler_is_format_supported_for_filter);
|
ClassDB::bind_method(D_METHOD("sampler_is_format_supported_for_filter", "format", "sampler_filter"), &RenderingDevice::sampler_is_format_supported_for_filter);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("vertex_buffer_create", "size_bytes", "data", "use_as_storage"), &RenderingDevice::vertex_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
|
ClassDB::bind_method(D_METHOD("vertex_buffer_create", "size_bytes", "data", "use_as_storage", "enable_device_address"), &RenderingDevice::vertex_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(false), DEFVAL(false));
|
||||||
ClassDB::bind_method(D_METHOD("vertex_format_create", "vertex_descriptions"), &RenderingDevice::_vertex_format_create);
|
ClassDB::bind_method(D_METHOD("vertex_format_create", "vertex_descriptions"), &RenderingDevice::_vertex_format_create);
|
||||||
ClassDB::bind_method(D_METHOD("vertex_array_create", "vertex_count", "vertex_format", "src_buffers", "offsets"), &RenderingDevice::_vertex_array_create, DEFVAL(Vector<int64_t>()));
|
ClassDB::bind_method(D_METHOD("vertex_array_create", "vertex_count", "vertex_format", "src_buffers", "offsets"), &RenderingDevice::_vertex_array_create, DEFVAL(Vector<int64_t>()));
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("index_buffer_create", "size_indices", "format", "data", "use_restart_indices"), &RenderingDevice::index_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
|
ClassDB::bind_method(D_METHOD("index_buffer_create", "size_indices", "format", "data", "use_restart_indices", "enable_device_address"), &RenderingDevice::index_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(false), DEFVAL(false));
|
||||||
ClassDB::bind_method(D_METHOD("index_array_create", "index_buffer", "index_offset", "index_count"), &RenderingDevice::index_array_create);
|
ClassDB::bind_method(D_METHOD("index_array_create", "index_buffer", "index_offset", "index_count"), &RenderingDevice::index_array_create);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("shader_compile_spirv_from_source", "shader_source", "allow_cache"), &RenderingDevice::_shader_compile_spirv_from_source, DEFVAL(true));
|
ClassDB::bind_method(D_METHOD("shader_compile_spirv_from_source", "shader_source", "allow_cache"), &RenderingDevice::_shader_compile_spirv_from_source, DEFVAL(true));
|
||||||
|
@ -7282,7 +7309,7 @@ void RenderingDevice::_bind_methods() {
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("shader_get_vertex_input_attribute_mask", "shader"), &RenderingDevice::shader_get_vertex_input_attribute_mask);
|
ClassDB::bind_method(D_METHOD("shader_get_vertex_input_attribute_mask", "shader"), &RenderingDevice::shader_get_vertex_input_attribute_mask);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("uniform_buffer_create", "size_bytes", "data"), &RenderingDevice::uniform_buffer_create, DEFVAL(Vector<uint8_t>()));
|
ClassDB::bind_method(D_METHOD("uniform_buffer_create", "size_bytes", "data", "enable_device_address"), &RenderingDevice::uniform_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(false));
|
||||||
ClassDB::bind_method(D_METHOD("storage_buffer_create", "size_bytes", "data", "usage"), &RenderingDevice::storage_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(0));
|
ClassDB::bind_method(D_METHOD("storage_buffer_create", "size_bytes", "data", "usage"), &RenderingDevice::storage_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(0));
|
||||||
ClassDB::bind_method(D_METHOD("texture_buffer_create", "size_bytes", "format", "data"), &RenderingDevice::texture_buffer_create, DEFVAL(Vector<uint8_t>()));
|
ClassDB::bind_method(D_METHOD("texture_buffer_create", "size_bytes", "format", "data"), &RenderingDevice::texture_buffer_create, DEFVAL(Vector<uint8_t>()));
|
||||||
|
|
||||||
|
@ -7294,6 +7321,7 @@ void RenderingDevice::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("buffer_clear", "buffer", "offset", "size_bytes"), &RenderingDevice::buffer_clear);
|
ClassDB::bind_method(D_METHOD("buffer_clear", "buffer", "offset", "size_bytes"), &RenderingDevice::buffer_clear);
|
||||||
ClassDB::bind_method(D_METHOD("buffer_get_data", "buffer", "offset_bytes", "size_bytes"), &RenderingDevice::buffer_get_data, DEFVAL(0), DEFVAL(0));
|
ClassDB::bind_method(D_METHOD("buffer_get_data", "buffer", "offset_bytes", "size_bytes"), &RenderingDevice::buffer_get_data, DEFVAL(0), DEFVAL(0));
|
||||||
ClassDB::bind_method(D_METHOD("buffer_get_data_async", "buffer", "callback", "offset_bytes", "size_bytes"), &RenderingDevice::buffer_get_data_async, DEFVAL(0), DEFVAL(0));
|
ClassDB::bind_method(D_METHOD("buffer_get_data_async", "buffer", "callback", "offset_bytes", "size_bytes"), &RenderingDevice::buffer_get_data_async, DEFVAL(0), DEFVAL(0));
|
||||||
|
ClassDB::bind_method(D_METHOD("buffer_get_device_address", "buffer"), &RenderingDevice::buffer_get_device_address);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("render_pipeline_create", "shader", "framebuffer_format", "vertex_format", "primitive", "rasterization_state", "multisample_state", "stencil_state", "color_blend_state", "dynamic_state_flags", "for_render_pass", "specialization_constants"), &RenderingDevice::_render_pipeline_create, DEFVAL(0), DEFVAL(0), DEFVAL(TypedArray<RDPipelineSpecializationConstant>()));
|
ClassDB::bind_method(D_METHOD("render_pipeline_create", "shader", "framebuffer_format", "vertex_format", "primitive", "rasterization_state", "multisample_state", "stencil_state", "color_blend_state", "dynamic_state_flags", "for_render_pass", "specialization_constants"), &RenderingDevice::_render_pipeline_create, DEFVAL(0), DEFVAL(0), DEFVAL(TypedArray<RDPipelineSpecializationConstant>()));
|
||||||
ClassDB::bind_method(D_METHOD("render_pipeline_is_valid", "render_pipeline"), &RenderingDevice::render_pipeline_is_valid);
|
ClassDB::bind_method(D_METHOD("render_pipeline_is_valid", "render_pipeline"), &RenderingDevice::render_pipeline_is_valid);
|
||||||
|
@ -7350,6 +7378,7 @@ void RenderingDevice::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("get_captured_timestamp_cpu_time", "index"), &RenderingDevice::get_captured_timestamp_cpu_time);
|
ClassDB::bind_method(D_METHOD("get_captured_timestamp_cpu_time", "index"), &RenderingDevice::get_captured_timestamp_cpu_time);
|
||||||
ClassDB::bind_method(D_METHOD("get_captured_timestamp_name", "index"), &RenderingDevice::get_captured_timestamp_name);
|
ClassDB::bind_method(D_METHOD("get_captured_timestamp_name", "index"), &RenderingDevice::get_captured_timestamp_name);
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("has_feature", "feature"), &RenderingDevice::has_feature);
|
||||||
ClassDB::bind_method(D_METHOD("limit_get", "limit"), &RenderingDevice::limit_get);
|
ClassDB::bind_method(D_METHOD("limit_get", "limit"), &RenderingDevice::limit_get);
|
||||||
ClassDB::bind_method(D_METHOD("get_frame_delay"), &RenderingDevice::get_frame_delay);
|
ClassDB::bind_method(D_METHOD("get_frame_delay"), &RenderingDevice::get_frame_delay);
|
||||||
ClassDB::bind_method(D_METHOD("submit"), &RenderingDevice::submit);
|
ClassDB::bind_method(D_METHOD("submit"), &RenderingDevice::submit);
|
||||||
|
@ -7724,6 +7753,7 @@ void RenderingDevice::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(INDEX_BUFFER_FORMAT_UINT32);
|
BIND_ENUM_CONSTANT(INDEX_BUFFER_FORMAT_UINT32);
|
||||||
|
|
||||||
BIND_BITFIELD_FLAG(STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT);
|
BIND_BITFIELD_FLAG(STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT);
|
||||||
|
BIND_BITFIELD_FLAG(STORAGE_BUFFER_USAGE_DEVICE_ADDRESS);
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER); //for sampling only (sampler GLSL type)
|
BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER); //for sampling only (sampler GLSL type)
|
||||||
BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER_WITH_TEXTURE); // for sampling only); but includes a texture); (samplerXX GLSL type)); first a sampler then a texture
|
BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER_WITH_TEXTURE); // for sampling only); but includes a texture); (samplerXX GLSL type)); first a sampler then a texture
|
||||||
|
@ -7868,6 +7898,8 @@ void RenderingDevice::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT);
|
BIND_ENUM_CONSTANT(PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT);
|
||||||
BIND_ENUM_CONSTANT(PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT);
|
BIND_ENUM_CONSTANT(PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT);
|
||||||
|
|
||||||
|
BIND_ENUM_CONSTANT(SUPPORTS_BUFFER_DEVICE_ADDRESS);
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(LIMIT_MAX_BOUND_UNIFORM_SETS);
|
BIND_ENUM_CONSTANT(LIMIT_MAX_BOUND_UNIFORM_SETS);
|
||||||
BIND_ENUM_CONSTANT(LIMIT_MAX_FRAMEBUFFER_COLOR_ATTACHMENTS);
|
BIND_ENUM_CONSTANT(LIMIT_MAX_FRAMEBUFFER_COLOR_ATTACHMENTS);
|
||||||
BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURES_PER_UNIFORM_SET);
|
BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURES_PER_UNIFORM_SET);
|
||||||
|
|
|
@ -222,6 +222,7 @@ public:
|
||||||
Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size);
|
Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size);
|
||||||
Vector<uint8_t> buffer_get_data(RID p_buffer, uint32_t p_offset = 0, uint32_t p_size = 0); // This causes stall, only use to retrieve large buffers for saving.
|
Vector<uint8_t> buffer_get_data(RID p_buffer, uint32_t p_offset = 0, uint32_t p_size = 0); // This causes stall, only use to retrieve large buffers for saving.
|
||||||
Error buffer_get_data_async(RID p_buffer, const Callable &p_callback, uint32_t p_offset = 0, uint32_t p_size = 0);
|
Error buffer_get_data_async(RID p_buffer, const Callable &p_callback, uint32_t p_offset = 0, uint32_t p_size = 0);
|
||||||
|
uint64_t buffer_get_device_address(RID p_buffer);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/******************/
|
/******************/
|
||||||
|
@ -753,13 +754,13 @@ private:
|
||||||
RID_Owner<IndexArray, true> index_array_owner;
|
RID_Owner<IndexArray, true> index_array_owner;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RID vertex_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>(), bool p_use_as_storage = false);
|
RID vertex_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>(), bool p_use_as_storage = false, bool p_enable_device_address = false);
|
||||||
|
|
||||||
// This ID is warranted to be unique for the same formats, does not need to be freed
|
// This ID is warranted to be unique for the same formats, does not need to be freed
|
||||||
VertexFormatID vertex_format_create(const Vector<VertexAttribute> &p_vertex_descriptions);
|
VertexFormatID vertex_format_create(const Vector<VertexAttribute> &p_vertex_descriptions);
|
||||||
RID vertex_array_create(uint32_t p_vertex_count, VertexFormatID p_vertex_format, const Vector<RID> &p_src_buffers, const Vector<uint64_t> &p_offsets = Vector<uint64_t>());
|
RID vertex_array_create(uint32_t p_vertex_count, VertexFormatID p_vertex_format, const Vector<RID> &p_src_buffers, const Vector<uint64_t> &p_offsets = Vector<uint64_t>());
|
||||||
|
|
||||||
RID index_buffer_create(uint32_t p_size_indices, IndexBufferFormat p_format, const Vector<uint8_t> &p_data = Vector<uint8_t>(), bool p_use_restart_indices = false);
|
RID index_buffer_create(uint32_t p_size_indices, IndexBufferFormat p_format, const Vector<uint8_t> &p_data = Vector<uint8_t>(), bool p_use_restart_indices = false, bool p_enable_device_address = false);
|
||||||
RID index_array_create(RID p_index_buffer, uint32_t p_index_offset, uint32_t p_index_count);
|
RID index_array_create(RID p_index_buffer, uint32_t p_index_offset, uint32_t p_index_count);
|
||||||
|
|
||||||
/****************/
|
/****************/
|
||||||
|
@ -893,6 +894,10 @@ private:
|
||||||
DrawListID _draw_list_begin_bind_compat_90993(RID p_framebuffer, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values, float p_clear_depth, uint32_t p_clear_stencil, const Rect2 &p_region);
|
DrawListID _draw_list_begin_bind_compat_90993(RID p_framebuffer, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values, float p_clear_depth, uint32_t p_clear_stencil, const Rect2 &p_region);
|
||||||
|
|
||||||
DrawListID _draw_list_begin_bind_compat_98670(RID p_framebuffer, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values, float p_clear_depth, uint32_t p_clear_stencil, const Rect2 &p_region, uint32_t p_breadcrumb);
|
DrawListID _draw_list_begin_bind_compat_98670(RID p_framebuffer, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values, float p_clear_depth, uint32_t p_clear_stencil, const Rect2 &p_region, uint32_t p_breadcrumb);
|
||||||
|
|
||||||
|
RID _uniform_buffer_create_bind_compat_100062(uint32_t p_size_bytes, const Vector<uint8_t> &p_data);
|
||||||
|
RID _vertex_buffer_create_bind_compat_100062(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, bool p_use_as_storage);
|
||||||
|
RID _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);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -926,14 +931,15 @@ public:
|
||||||
String get_perf_report() const;
|
String get_perf_report() const;
|
||||||
|
|
||||||
enum StorageBufferUsage {
|
enum StorageBufferUsage {
|
||||||
STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT = 1,
|
STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT = (1 << 0),
|
||||||
|
STORAGE_BUFFER_USAGE_DEVICE_ADDRESS = (1 << 1),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************/
|
/*****************/
|
||||||
/**** BUFFERS ****/
|
/**** BUFFERS ****/
|
||||||
/*****************/
|
/*****************/
|
||||||
|
|
||||||
RID uniform_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>());
|
RID uniform_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>(), bool p_enable_device_address = false);
|
||||||
RID storage_buffer_create(uint32_t p_size, const Vector<uint8_t> &p_data = Vector<uint8_t>(), BitField<StorageBufferUsage> p_usage = 0);
|
RID storage_buffer_create(uint32_t p_size, const Vector<uint8_t> &p_data = Vector<uint8_t>(), BitField<StorageBufferUsage> p_usage = 0);
|
||||||
|
|
||||||
RID texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, const Vector<uint8_t> &p_data = Vector<uint8_t>());
|
RID texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, const Vector<uint8_t> &p_data = Vector<uint8_t>());
|
||||||
|
|
|
@ -885,6 +885,7 @@ public:
|
||||||
SUPPORTS_METALFX_TEMPORAL,
|
SUPPORTS_METALFX_TEMPORAL,
|
||||||
// If not supported, a fragment shader with only side effects (i.e., writes to buffers, but doesn't output to attachments), may be optimized down to no-op by the GPU driver.
|
// If not supported, a fragment shader with only side effects (i.e., writes to buffers, but doesn't output to attachments), may be optimized down to no-op by the GPU driver.
|
||||||
SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS,
|
SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS,
|
||||||
|
SUPPORTS_BUFFER_DEVICE_ADDRESS,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SubgroupOperations {
|
enum SubgroupOperations {
|
||||||
|
|
|
@ -197,6 +197,7 @@ public:
|
||||||
BUFFER_USAGE_INDEX_BIT = (1 << 6),
|
BUFFER_USAGE_INDEX_BIT = (1 << 6),
|
||||||
BUFFER_USAGE_VERTEX_BIT = (1 << 7),
|
BUFFER_USAGE_VERTEX_BIT = (1 << 7),
|
||||||
BUFFER_USAGE_INDIRECT_BIT = (1 << 8),
|
BUFFER_USAGE_INDIRECT_BIT = (1 << 8),
|
||||||
|
BUFFER_USAGE_DEVICE_ADDRESS_BIT = (1 << 17),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -210,6 +211,8 @@ public:
|
||||||
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) = 0;
|
virtual uint64_t buffer_get_allocation_size(BufferID p_buffer) = 0;
|
||||||
virtual uint8_t *buffer_map(BufferID p_buffer) = 0;
|
virtual uint8_t *buffer_map(BufferID p_buffer) = 0;
|
||||||
virtual void buffer_unmap(BufferID p_buffer) = 0;
|
virtual void buffer_unmap(BufferID p_buffer) = 0;
|
||||||
|
// Only for a buffer with BUFFER_USAGE_DEVICE_ADDRESS_BIT.
|
||||||
|
virtual uint64_t buffer_get_device_address(BufferID p_buffer) = 0;
|
||||||
|
|
||||||
/*****************/
|
/*****************/
|
||||||
/**** TEXTURE ****/
|
/**** TEXTURE ****/
|
||||||
|
|
Loading…
Reference in a new issue