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:
Chia-I Wu 2020-10-09 10:33:23 -07:00 committed by Marge Bot
parent 5dfe49e588
commit 91f914338d
2 changed files with 169 additions and 0 deletions

View file

@ -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);
}

View file

@ -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;