Skip to content

Commit

Permalink
Mesh Shader support for D3D12 and Vulkan
Browse files Browse the repository at this point in the history
  • Loading branch information
MBCX Debian Laptop committed Aug 6, 2024
1 parent c7f99c5 commit c20c151
Show file tree
Hide file tree
Showing 15 changed files with 440 additions and 8 deletions.
66 changes: 63 additions & 3 deletions drivers/d3d12/rendering_device_driver_d3d12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3102,6 +3102,8 @@ Vector<uint8_t> RenderingDeviceDriverD3D12::shader_compile_binary_from_spirv(Vec
/* SHADER_STAGE_TESSELATION_CONTROL */ MESA_SHADER_TESS_CTRL,
/* SHADER_STAGE_TESSELATION_EVALUATION */ MESA_SHADER_TESS_EVAL,
/* SHADER_STAGE_COMPUTE */ MESA_SHADER_COMPUTE,
/* SHADER_STAGE_MESH_TASK */ MESA_SHADER_TASK,
/* SHADER_STAGE_MESH */ MESA_SHADER_MESH,
};

nir_shader *shader = spirv_to_nir(
Expand Down Expand Up @@ -3494,15 +3496,19 @@ Vector<uint8_t> RenderingDeviceDriverD3D12::shader_compile_binary_from_spirv(Vec
D3D12_ROOT_SIGNATURE_FLAGS root_sig_flags =
D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_AMPLIFICATION_SHADER_ROOT_ACCESS |
D3D12_ROOT_SIGNATURE_FLAG_DENY_MESH_SHADER_ROOT_ACCESS;
D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
if (!stages_processed.has_flag(SHADER_STAGE_VERTEX_BIT)) {
root_sig_flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_VERTEX_SHADER_ROOT_ACCESS;
}
if (!stages_processed.has_flag(SHADER_STAGE_FRAGMENT_BIT)) {
root_sig_flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_PIXEL_SHADER_ROOT_ACCESS;
}
if (!stages_processed.has_flag(SHADER_STAGE_MESH_TASK_BIT)) {
root_sig_flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_AMPLIFICATION_SHADER_ROOT_ACCESS;
}
if (!stages_processed.has_flag(SHADER_STAGE_MESH_BIT)) {
root_sig_flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_MESH_SHADER_ROOT_ACCESS;
}
if (binary_data.vertex_input_mask) {
root_sig_flags |= D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
}
Expand Down Expand Up @@ -5417,6 +5423,29 @@ void RenderingDeviceDriverD3D12::command_render_draw_indirect_count(CommandBuffe
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.draw.Get(), p_max_draw_count, indirect_buf_info->resource, p_offset, count_buf_info->resource, p_count_buffer_offset);
}

void RenderingDeviceDriverD3D12::command_render_dispatch_mesh(CommandBufferID p_cmd_buffer, uint32_t p_x_groups, uint32_t p_y_groups, uint32_t p_z_groups) {
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
((ID3D12GraphicsCommandList6 *)cmd_buf_info->cmd_list.Get())->DispatchMesh(p_x_groups, p_y_groups, p_z_groups);
}

void RenderingDeviceDriverD3D12::command_render_dispatch_mesh_indirect(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, uint32_t p_draw_count, uint32_t p_stride) {
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
BufferInfo *indirect_buf_info = (BufferInfo *)p_indirect_buffer.id;
_resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
_resource_transitions_flush(cmd_buf_info->cmd_list.Get());
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.dispatch_mesh.Get(), p_draw_count, indirect_buf_info->resource, p_offset, nullptr, 0);
}

void RenderingDeviceDriverD3D12::command_render_dispatch_mesh_indirect_count(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, BufferID p_count_buffer, uint64_t p_count_buffer_offset, uint32_t p_max_draw_count, uint32_t p_stride) {
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
BufferInfo *indirect_buf_info = (BufferInfo *)p_indirect_buffer.id;
BufferInfo *count_buf_info = (BufferInfo *)p_count_buffer.id;
_resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
_resource_transition_batch(count_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
_resource_transitions_flush(cmd_buf_info->cmd_list.Get());
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.dispatch_mesh.Get(), p_max_draw_count, indirect_buf_info->resource, p_offset, count_buf_info->resource, p_count_buffer_offset);
}

void RenderingDeviceDriverD3D12::command_render_bind_vertex_buffers(CommandBufferID p_cmd_buffer, uint32_t p_binding_count, const BufferID *p_buffers, const uint64_t *p_offsets) {
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;

Expand Down Expand Up @@ -6160,6 +6189,18 @@ uint64_t RenderingDeviceDriverD3D12::limit_get(Limit p_limit) {
return D3D12_CS_THREAD_GROUP_MAX_Y;
case LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z:
return D3D12_CS_THREAD_GROUP_MAX_Z;
case LIMIT_MAX_MESH_TASK_WORKGROUP_COUNT_X:
return MeshShaderCapabilities::MAX_THREAD_GROUPS;
case LIMIT_MAX_MESH_TASK_WORKGROUP_COUNT_Y:
return MeshShaderCapabilities::MAX_THREAD_GROUPS;
case LIMIT_MAX_MESH_TASK_WORKGROUP_COUNT_Z:
return MeshShaderCapabilities::MAX_THREAD_GROUPS;
case LIMIT_MAX_MESH_WORKGROUP_COUNT_X:
return MeshShaderCapabilities::MAX_THREAD_GROUPS;
case LIMIT_MAX_MESH_WORKGROUP_COUNT_Y:
return MeshShaderCapabilities::MAX_THREAD_GROUPS;
case LIMIT_MAX_MESH_WORKGROUP_COUNT_Z:
return MeshShaderCapabilities::MAX_THREAD_GROUPS;
case LIMIT_SUBGROUP_SIZE:
// Note in min/max. Shader model 6.6 supports it (see https://microsoft.github.io/DirectX-Specs/d3d/HLSL_SM_6_6_WaveSize.html),
// but at this time I don't know the implications on the transpilation to DXIL, etc.
Expand Down Expand Up @@ -6214,6 +6255,8 @@ bool RenderingDeviceDriverD3D12::has_feature(Features p_feature) {
return vrs_capabilities.ss_image_supported;
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
return true;
case SUPPORTS_MESH_SHADER:
return mesh_shader_capabilities.is_supported;
default:
return false;
}
Expand Down Expand Up @@ -6492,6 +6535,14 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
}
}

D3D12_FEATURE_DATA_D3D12_OPTIONS7 options7 = {};
res = device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &options7, sizeof(options7));
if (SUCCEEDED(res)) {
if (options7.MeshShaderTier >= D3D12_MESH_SHADER_TIER_1) {
mesh_shader_capabilities.is_supported = true;
}
}

D3D12_FEATURE_DATA_D3D12_OPTIONS12 options12 = {};
res = device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS12, &options12, sizeof(options12));
if (SUCCEEDED(res)) {
Expand Down Expand Up @@ -6539,6 +6590,12 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
print_verbose("- Relaxed casting not supported");
}

if (mesh_shader_capabilities.is_supported) {
print_verbose("- D3D12 Mesh Shader supported");
} else {
print_verbose("- D3D12 Mesh Shader not supported");
}

print_verbose(String("- D3D12 16-bit ops supported: ") + (shader_capabilities.native_16bit_ops ? "yes" : "no"));

if (misc_features_support.depth_bounds_supported) {
Expand Down Expand Up @@ -6650,6 +6707,9 @@ Error RenderingDeviceDriverD3D12::_initialize_command_signatures() {
err = create_command_signature(device.Get(), D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH, sizeof(D3D12_DISPATCH_ARGUMENTS), &indirect_cmd_signatures.dispatch);
ERR_FAIL_COND_V(err != OK, ERR_CANT_CREATE);

err = create_command_signature(device.Get(), D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH, sizeof(D3D12_DISPATCH_MESH_ARGUMENTS), &indirect_cmd_signatures.dispatch_mesh);
ERR_FAIL_COND_V(err != OK, ERR_CANT_CREATE);

return OK;
}

Expand Down
11 changes: 11 additions & 0 deletions drivers/d3d12/rendering_device_driver_d3d12.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,11 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
bool depth_bounds_supported = false;
};

struct MeshShaderCapabilities {
static const uint32_t MAX_THREAD_GROUPS = 63999; // Quoting the DirectX Mesh Shader Spec: "Each of the three thread group counts must be less than 64k" so ok...
bool is_supported = false;
};

RenderingContextDriverD3D12 *context_driver = nullptr;
RenderingContextDriver::Device context_device;
ComPtr<IDXGIAdapter> adapter;
Expand Down Expand Up @@ -198,6 +203,7 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
ComPtr<ID3D12CommandSignature> draw;
ComPtr<ID3D12CommandSignature> draw_indexed;
ComPtr<ID3D12CommandSignature> dispatch;
ComPtr<ID3D12CommandSignature> dispatch_mesh;
} indirect_cmd_signatures;

static void STDMETHODCALLTYPE _debug_message_func(D3D12_MESSAGE_CATEGORY p_category, D3D12_MESSAGE_SEVERITY p_severity, D3D12_MESSAGE_ID p_id, LPCSTR p_description, void *p_context);
Expand Down Expand Up @@ -854,6 +860,11 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
virtual void command_render_draw_indirect(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, uint32_t p_draw_count, uint32_t p_stride) override final;
virtual void command_render_draw_indirect_count(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, BufferID p_count_buffer, uint64_t p_count_buffer_offset, uint32_t p_max_draw_count, uint32_t p_stride) override final;

// Mesh Shader Drawing.
virtual void command_render_dispatch_mesh(CommandBufferID p_cmd_buffer, uint32_t p_x_groups, uint32_t p_y_groups, uint32_t p_z_groups) override final;
virtual void command_render_dispatch_mesh_indirect(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, uint32_t p_draw_count, uint32_t p_stride) override final;
virtual void command_render_dispatch_mesh_indirect_count(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, BufferID p_count_buffer, uint64_t p_count_buffer_offset, uint32_t p_max_draw_count, uint32_t p_stride) override final;

// Buffer binding.
virtual void command_render_bind_vertex_buffers(CommandBufferID p_cmd_buffer, uint32_t p_binding_count, const BufferID *p_buffers, const uint64_t *p_offsets) override final;
virtual void command_render_bind_index_buffer(CommandBufferID p_cmd_buffer, BufferID p_buffer, IndexBufferFormat p_format, uint64_t p_offset) override final;
Expand Down
79 changes: 79 additions & 0 deletions drivers/vulkan/rendering_device_driver_vulkan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,7 @@ Error RenderingDeviceDriverVulkan::_initialize_device_extensions() {
_register_requested_device_extension(VK_KHR_MAINTENANCE_2_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_MESH_SHADER_EXTENSION_NAME, false);

if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
_register_requested_device_extension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, true);
Expand Down Expand Up @@ -667,6 +668,7 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
VkPhysicalDevice16BitStorageFeaturesKHR storage_feature = {};
VkPhysicalDeviceMultiviewFeatures multiview_features = {};
VkPhysicalDevicePipelineCreationCacheControlFeatures pipeline_cache_control_features = {};
VkPhysicalDeviceMeshShaderFeaturesEXT mesh_shader_features = {};

const bool use_1_2_features = physical_device_properties.apiVersion >= VK_API_VERSION_1_2;
if (use_1_2_features) {
Expand Down Expand Up @@ -703,6 +705,12 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
next_features = &pipeline_cache_control_features;
}

if (enabled_device_extension_names.has(VK_EXT_MESH_SHADER_EXTENSION_NAME)) {
mesh_shader_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
mesh_shader_features.pNext = next_features;
next_features = &mesh_shader_features;
}

VkPhysicalDeviceFeatures2 device_features_2 = {};
device_features_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
device_features_2.pNext = next_features;
Expand Down Expand Up @@ -745,6 +753,14 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
if (enabled_device_extension_names.has(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME)) {
pipeline_cache_control_support = pipeline_cache_control_features.pipelineCreationCacheControl;
}

if (enabled_device_extension_names.has(VK_EXT_MESH_SHADER_EXTENSION_NAME)) {
mesh_shader_capabilities.task_shader_is_supported = mesh_shader_features.taskShader;
mesh_shader_capabilities.mesh_shader_is_supported = mesh_shader_features.meshShader;
mesh_shader_capabilities.multiview_mesh_shader_is_supported = mesh_shader_features.multiviewMeshShader;
mesh_shader_capabilities.primitive_fragment_shading_rate_mesh_shader_is_supported = mesh_shader_features.primitiveFragmentShadingRateMeshShader;
mesh_shader_capabilities.mesh_shader_queries_is_supported = mesh_shader_features.meshShaderQueries;
}
}

if (functions.GetPhysicalDeviceProperties2 != nullptr) {
Expand All @@ -754,6 +770,7 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
VkPhysicalDeviceSubgroupProperties subgroup_properties = {};
VkPhysicalDeviceSubgroupSizeControlProperties subgroup_size_control_properties = {};
VkPhysicalDeviceProperties2 physical_device_properties_2 = {};
VkPhysicalDeviceMeshShaderPropertiesEXT mesh_shader_properties = {};

const bool use_1_1_properties = physical_device_properties.apiVersion >= VK_API_VERSION_1_1;
if (use_1_1_properties) {
Expand Down Expand Up @@ -781,6 +798,12 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
next_properties = &vrs_properties;
}

if (mesh_shader_capabilities.task_shader_is_supported || mesh_shader_capabilities.mesh_shader_is_supported) {
mesh_shader_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT;
mesh_shader_properties.pNext = next_properties;
next_properties = &mesh_shader_properties;
}

physical_device_properties_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
physical_device_properties_2.pNext = next_properties;
functions.GetPhysicalDeviceProperties2(physical_device, &physical_device_properties_2);
Expand Down Expand Up @@ -839,6 +862,19 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
print_verbose("- Vulkan multiview not supported");
}

if (mesh_shader_capabilities.task_shader_is_supported || mesh_shader_capabilities.mesh_shader_is_supported) {
mesh_shader_capabilities.max_task_work_group_count[0] = mesh_shader_properties.maxTaskWorkGroupCount[0];
mesh_shader_capabilities.max_task_work_group_count[1] = mesh_shader_properties.maxTaskWorkGroupCount[1];
mesh_shader_capabilities.max_task_work_group_count[2] = mesh_shader_properties.maxTaskWorkGroupCount[2];
mesh_shader_capabilities.max_mesh_work_group_count[0] = mesh_shader_properties.maxMeshWorkGroupCount[0];
mesh_shader_capabilities.max_mesh_work_group_count[1] = mesh_shader_properties.maxMeshWorkGroupCount[1];
mesh_shader_capabilities.max_mesh_work_group_count[2] = mesh_shader_properties.maxMeshWorkGroupCount[2];

print_verbose("- Vulkan Mesh Shader supported:");
} else {
print_verbose("- Vulkan Mesh Shader not supported");
}

print_verbose("- Vulkan subgroup:");
print_verbose(" size: " + itos(subgroup_capabilities.size));
print_verbose(" min size: " + itos(subgroup_capabilities.min_size));
Expand Down Expand Up @@ -913,6 +949,18 @@ Error RenderingDeviceDriverVulkan::_initialize_device(const LocalVector<VkDevice
create_info_next = &pipeline_cache_control_features;
}

VkPhysicalDeviceMeshShaderFeaturesEXT mesh_shader_features = {};
if (mesh_shader_capabilities.task_shader_is_supported || mesh_shader_capabilities.mesh_shader_is_supported) {
mesh_shader_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
mesh_shader_features.pNext = create_info_next;
mesh_shader_features.taskShader = mesh_shader_capabilities.task_shader_is_supported;
mesh_shader_features.meshShader = mesh_shader_capabilities.mesh_shader_is_supported;
mesh_shader_features.multiviewMeshShader = mesh_shader_capabilities.multiview_mesh_shader_is_supported;
mesh_shader_features.primitiveFragmentShadingRateMeshShader = mesh_shader_capabilities.primitive_fragment_shading_rate_mesh_shader_is_supported;
mesh_shader_features.meshShaderQueries = mesh_shader_capabilities.mesh_shader_queries_is_supported;
create_info_next = &mesh_shader_features;
}

VkPhysicalDeviceVulkan11Features vulkan_1_1_features = {};
VkPhysicalDevice16BitStorageFeaturesKHR storage_features = {};
VkPhysicalDeviceMultiviewFeatures multiview_features = {};
Expand Down Expand Up @@ -2918,6 +2966,8 @@ static VkShaderStageFlagBits RD_STAGE_TO_VK_SHADER_STAGE_BITS[RDD::SHADER_STAGE_
VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
VK_SHADER_STAGE_COMPUTE_BIT,
VK_SHADER_STAGE_TASK_BIT_EXT,
VK_SHADER_STAGE_MESH_BIT_EXT,
};

String RenderingDeviceDriverVulkan::shader_get_binary_cache_key() {
Expand Down Expand Up @@ -4231,6 +4281,21 @@ void RenderingDeviceDriverVulkan::command_render_draw_indirect_count(CommandBuff
vkCmdDrawIndirectCount((VkCommandBuffer)p_cmd_buffer.id, indirect_buf_info->vk_buffer, p_offset, count_buf_info->vk_buffer, p_count_buffer_offset, p_max_draw_count, p_stride);
}

void RenderingDeviceDriverVulkan::command_render_dispatch_mesh(CommandBufferID p_cmd_buffer, uint32_t p_x_groups, uint32_t p_y_groups, uint32_t p_z_groups) {
vkCmdDrawMeshTasksEXT((VkCommandBuffer)p_cmd_buffer.id, p_x_groups, p_y_groups, p_z_groups);
}

void RenderingDeviceDriverVulkan::command_render_dispatch_mesh_indirect(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, uint32_t p_draw_count, uint32_t p_stride) {
const BufferInfo *buf_info = (const BufferInfo *)p_indirect_buffer.id;
vkCmdDrawMeshTasksIndirectEXT((VkCommandBuffer)p_cmd_buffer.id, buf_info->vk_buffer, p_offset, p_draw_count, p_stride);
}

void RenderingDeviceDriverVulkan::command_render_dispatch_mesh_indirect_count(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset, BufferID p_count_buffer, uint64_t p_count_buffer_offset, uint32_t p_max_draw_count, uint32_t p_stride) {
const BufferInfo *indirect_buf_info = (const BufferInfo *)p_indirect_buffer.id;
const BufferInfo *count_buf_info = (const BufferInfo *)p_count_buffer.id;
vkCmdDrawMeshTasksIndirectCountEXT((VkCommandBuffer)p_cmd_buffer.id, indirect_buf_info->vk_buffer, p_offset, count_buf_info->vk_buffer, p_count_buffer_offset, p_max_draw_count, p_stride);
}

void RenderingDeviceDriverVulkan::command_render_bind_vertex_buffers(CommandBufferID p_cmd_buffer, uint32_t p_binding_count, const BufferID *p_buffers, const uint64_t *p_offsets) {
VkBuffer *vk_buffers = ALLOCA_ARRAY(VkBuffer, p_binding_count);
for (uint32_t i = 0; i < p_binding_count; i++) {
Expand Down Expand Up @@ -4927,6 +4992,18 @@ uint64_t RenderingDeviceDriverVulkan::limit_get(Limit p_limit) {
return limits.maxViewportDimensions[0];
case LIMIT_MAX_VIEWPORT_DIMENSIONS_Y:
return limits.maxViewportDimensions[1];
case LIMIT_MAX_MESH_TASK_WORKGROUP_COUNT_X:
return mesh_shader_capabilities.max_task_work_group_count[0];
case LIMIT_MAX_MESH_TASK_WORKGROUP_COUNT_Y:
return mesh_shader_capabilities.max_task_work_group_count[1];
case LIMIT_MAX_MESH_TASK_WORKGROUP_COUNT_Z:
return mesh_shader_capabilities.max_task_work_group_count[2];
case LIMIT_MAX_MESH_WORKGROUP_COUNT_X:
return mesh_shader_capabilities.max_mesh_work_group_count[0];
case LIMIT_MAX_MESH_WORKGROUP_COUNT_Y:
return mesh_shader_capabilities.max_mesh_work_group_count[1];
case LIMIT_MAX_MESH_WORKGROUP_COUNT_Z:
return mesh_shader_capabilities.max_mesh_work_group_count[2];
case LIMIT_SUBGROUP_SIZE:
return subgroup_capabilities.size;
case LIMIT_SUBGROUP_MIN_SIZE:
Expand Down Expand Up @@ -4971,6 +5048,8 @@ bool RenderingDeviceDriverVulkan::has_feature(Features p_feature) {
return vrs_capabilities.attachment_vrs_supported && physical_device_features.shaderStorageImageExtendedFormats;
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
return true;
case SUPPORTS_MESH_SHADER:
return mesh_shader_capabilities.task_shader_is_supported && mesh_shader_capabilities.mesh_shader_is_supported;
default:
return false;
}
Expand Down
Loading

0 comments on commit c20c151

Please sign in to comment.