mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
venus: initial support for transform feedback
Signed-off-by: Chia-I Wu <olvaffe@gmail.com> Reviewed-by: Ryan Neph <ryanneph@google.com> Reviewed-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5800>
This commit is contained in:
parent
5dfe49e588
commit
91f914338d
2 changed files with 169 additions and 0 deletions
|
|
@ -704,6 +704,15 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev)
|
|||
local_feats.vulkan_memory_model.pNext = NULL;
|
||||
}
|
||||
|
||||
if (physical_dev->renderer_extensions.EXT_transform_feedback) {
|
||||
physical_dev->transform_feedback_features.sType =
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT;
|
||||
physical_dev->transform_feedback_features.pNext =
|
||||
physical_dev->features.pNext;
|
||||
physical_dev->features.pNext =
|
||||
&physical_dev->transform_feedback_features;
|
||||
}
|
||||
|
||||
vn_call_vkGetPhysicalDeviceFeatures2(
|
||||
instance, vn_physical_device_to_handle(physical_dev),
|
||||
&physical_dev->features);
|
||||
|
|
@ -1008,6 +1017,15 @@ vn_physical_device_init_properties(struct vn_physical_device *physical_dev)
|
|||
local_props.timeline_semaphore.pNext = NULL;
|
||||
}
|
||||
|
||||
if (physical_dev->renderer_extensions.EXT_transform_feedback) {
|
||||
physical_dev->transform_feedback_properties.sType =
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT;
|
||||
physical_dev->transform_feedback_properties.pNext =
|
||||
physical_dev->properties.pNext;
|
||||
physical_dev->properties.pNext =
|
||||
&physical_dev->transform_feedback_properties;
|
||||
}
|
||||
|
||||
vn_call_vkGetPhysicalDeviceProperties2(
|
||||
instance, vn_physical_device_to_handle(physical_dev),
|
||||
&physical_dev->properties);
|
||||
|
|
@ -1418,6 +1436,9 @@ vn_physical_device_get_supported_extensions(
|
|||
.EXT_scalar_block_layout = true,
|
||||
.EXT_separate_stencil_usage = true,
|
||||
.EXT_shader_viewport_index_layer = true,
|
||||
|
||||
/* EXT */
|
||||
.EXT_transform_feedback = true,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -2143,6 +2164,8 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
|
|||
VkPhysicalDeviceTimelineSemaphoreFeatures *timeline_semaphore;
|
||||
VkPhysicalDeviceBufferDeviceAddressFeatures *buffer_device_address;
|
||||
VkPhysicalDeviceVulkanMemoryModelFeatures *vulkan_memory_model;
|
||||
|
||||
VkPhysicalDeviceTransformFeedbackFeaturesEXT *transform_feedback;
|
||||
} u;
|
||||
|
||||
u.pnext = (VkBaseOutStructure *)pFeatures;
|
||||
|
|
@ -2299,6 +2322,11 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
|
|||
u.vulkan_memory_model->vulkanMemoryModelAvailabilityVisibilityChains =
|
||||
vk12_feats->vulkanMemoryModelAvailabilityVisibilityChains;
|
||||
break;
|
||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT:
|
||||
memcpy(u.transform_feedback,
|
||||
&physical_dev->transform_feedback_features,
|
||||
sizeof(physical_dev->transform_feedback_features));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -2338,6 +2366,7 @@ vn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
|
|||
VkPhysicalDeviceTimelineSemaphoreProperties *timeline_semaphore;
|
||||
|
||||
VkPhysicalDevicePCIBusInfoPropertiesEXT *pci_bus_info;
|
||||
VkPhysicalDeviceTransformFeedbackPropertiesEXT *transform_feedback;
|
||||
} u;
|
||||
|
||||
u.pnext = (VkBaseOutStructure *)pProperties;
|
||||
|
|
@ -2529,6 +2558,11 @@ vn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
|
|||
physical_dev->instance->renderer_info.pci.function;
|
||||
}
|
||||
break;
|
||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT:
|
||||
memcpy(u.transform_feedback,
|
||||
&physical_dev->transform_feedback_properties,
|
||||
sizeof(physical_dev->transform_feedback_properties));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -6195,6 +6229,9 @@ vn_CreateQueryPool(VkDevice device,
|
|||
case VK_QUERY_TYPE_TIMESTAMP:
|
||||
pool->result_array_size = 1;
|
||||
break;
|
||||
case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
|
||||
pool->result_array_size = 2;
|
||||
break;
|
||||
default:
|
||||
unreachable("bad query type");
|
||||
break;
|
||||
|
|
@ -7903,3 +7940,132 @@ vn_CmdDispatchBase(VkCommandBuffer commandBuffer,
|
|||
baseGroupY, baseGroupZ, groupCountX,
|
||||
groupCountY, groupCountZ);
|
||||
}
|
||||
|
||||
void
|
||||
vn_CmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer,
|
||||
VkQueryPool queryPool,
|
||||
uint32_t query,
|
||||
VkQueryControlFlags flags,
|
||||
uint32_t index)
|
||||
{
|
||||
struct vn_command_buffer *cmd =
|
||||
vn_command_buffer_from_handle(commandBuffer);
|
||||
size_t cmd_size;
|
||||
|
||||
cmd_size = vn_sizeof_vkCmdBeginQueryIndexedEXT(commandBuffer, queryPool,
|
||||
query, flags, index);
|
||||
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
|
||||
return;
|
||||
|
||||
vn_encode_vkCmdBeginQueryIndexedEXT(&cmd->cs, 0, commandBuffer, queryPool,
|
||||
query, flags, index);
|
||||
}
|
||||
|
||||
void
|
||||
vn_CmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer,
|
||||
VkQueryPool queryPool,
|
||||
uint32_t query,
|
||||
uint32_t index)
|
||||
{
|
||||
struct vn_command_buffer *cmd =
|
||||
vn_command_buffer_from_handle(commandBuffer);
|
||||
size_t cmd_size;
|
||||
|
||||
cmd_size = vn_sizeof_vkCmdEndQueryIndexedEXT(commandBuffer, queryPool,
|
||||
query, index);
|
||||
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
|
||||
return;
|
||||
|
||||
vn_encode_vkCmdEndQueryIndexedEXT(&cmd->cs, 0, commandBuffer, queryPool,
|
||||
query, index);
|
||||
}
|
||||
|
||||
void
|
||||
vn_CmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer,
|
||||
uint32_t firstBinding,
|
||||
uint32_t bindingCount,
|
||||
const VkBuffer *pBuffers,
|
||||
const VkDeviceSize *pOffsets,
|
||||
const VkDeviceSize *pSizes)
|
||||
{
|
||||
struct vn_command_buffer *cmd =
|
||||
vn_command_buffer_from_handle(commandBuffer);
|
||||
size_t cmd_size;
|
||||
|
||||
cmd_size = vn_sizeof_vkCmdBindTransformFeedbackBuffersEXT(
|
||||
commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
|
||||
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
|
||||
return;
|
||||
|
||||
vn_encode_vkCmdBindTransformFeedbackBuffersEXT(&cmd->cs, 0, commandBuffer,
|
||||
firstBinding, bindingCount,
|
||||
pBuffers, pOffsets, pSizes);
|
||||
}
|
||||
|
||||
void
|
||||
vn_CmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer,
|
||||
uint32_t firstCounterBuffer,
|
||||
uint32_t counterBufferCount,
|
||||
const VkBuffer *pCounterBuffers,
|
||||
const VkDeviceSize *pCounterBufferOffsets)
|
||||
{
|
||||
struct vn_command_buffer *cmd =
|
||||
vn_command_buffer_from_handle(commandBuffer);
|
||||
size_t cmd_size;
|
||||
|
||||
cmd_size = vn_sizeof_vkCmdBeginTransformFeedbackEXT(
|
||||
commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers,
|
||||
pCounterBufferOffsets);
|
||||
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
|
||||
return;
|
||||
|
||||
vn_encode_vkCmdBeginTransformFeedbackEXT(
|
||||
&cmd->cs, 0, commandBuffer, firstCounterBuffer, counterBufferCount,
|
||||
pCounterBuffers, pCounterBufferOffsets);
|
||||
}
|
||||
|
||||
void
|
||||
vn_CmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer,
|
||||
uint32_t firstCounterBuffer,
|
||||
uint32_t counterBufferCount,
|
||||
const VkBuffer *pCounterBuffers,
|
||||
const VkDeviceSize *pCounterBufferOffsets)
|
||||
{
|
||||
struct vn_command_buffer *cmd =
|
||||
vn_command_buffer_from_handle(commandBuffer);
|
||||
size_t cmd_size;
|
||||
|
||||
cmd_size = vn_sizeof_vkCmdEndTransformFeedbackEXT(
|
||||
commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers,
|
||||
pCounterBufferOffsets);
|
||||
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
|
||||
return;
|
||||
|
||||
vn_encode_vkCmdEndTransformFeedbackEXT(
|
||||
&cmd->cs, 0, commandBuffer, firstCounterBuffer, counterBufferCount,
|
||||
pCounterBuffers, pCounterBufferOffsets);
|
||||
}
|
||||
|
||||
void
|
||||
vn_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer,
|
||||
uint32_t instanceCount,
|
||||
uint32_t firstInstance,
|
||||
VkBuffer counterBuffer,
|
||||
VkDeviceSize counterBufferOffset,
|
||||
uint32_t counterOffset,
|
||||
uint32_t vertexStride)
|
||||
{
|
||||
struct vn_command_buffer *cmd =
|
||||
vn_command_buffer_from_handle(commandBuffer);
|
||||
size_t cmd_size;
|
||||
|
||||
cmd_size = vn_sizeof_vkCmdDrawIndirectByteCountEXT(
|
||||
commandBuffer, instanceCount, firstInstance, counterBuffer,
|
||||
counterBufferOffset, counterOffset, vertexStride);
|
||||
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
|
||||
return;
|
||||
|
||||
vn_encode_vkCmdDrawIndirectByteCountEXT(
|
||||
&cmd->cs, 0, commandBuffer, instanceCount, firstInstance, counterBuffer,
|
||||
counterBufferOffset, counterOffset, vertexStride);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,10 +70,13 @@ struct vn_physical_device {
|
|||
VkPhysicalDeviceFeatures2 features;
|
||||
VkPhysicalDeviceVulkan11Features vulkan_1_1_features;
|
||||
VkPhysicalDeviceVulkan12Features vulkan_1_2_features;
|
||||
VkPhysicalDeviceTransformFeedbackFeaturesEXT transform_feedback_features;
|
||||
|
||||
VkPhysicalDeviceProperties2 properties;
|
||||
VkPhysicalDeviceVulkan11Properties vulkan_1_1_properties;
|
||||
VkPhysicalDeviceVulkan12Properties vulkan_1_2_properties;
|
||||
VkPhysicalDeviceTransformFeedbackPropertiesEXT
|
||||
transform_feedback_properties;
|
||||
|
||||
VkQueueFamilyProperties2 *queue_family_properties;
|
||||
uint32_t *queue_family_sync_queue_bases;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue