mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
nvk: Add support for version 2 of all descriptor binding commands
Signed-off-by: Valentine Burley <valentine.burley@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27796>
This commit is contained in:
parent
3a88e3f18b
commit
16397c10c7
2 changed files with 86 additions and 64 deletions
|
|
@ -596,20 +596,12 @@ nvk_cmd_bind_shaders(struct vk_command_buffer *vk_cmd,
|
|||
}
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer,
|
||||
VkPipelineBindPoint pipelineBindPoint,
|
||||
VkPipelineLayout layout,
|
||||
uint32_t firstSet,
|
||||
uint32_t descriptorSetCount,
|
||||
const VkDescriptorSet *pDescriptorSets,
|
||||
uint32_t dynamicOffsetCount,
|
||||
const uint32_t *pDynamicOffsets)
|
||||
static void
|
||||
nvk_bind_descriptor_sets(UNUSED struct nvk_cmd_buffer *cmd,
|
||||
struct nvk_descriptor_state *desc,
|
||||
const VkBindDescriptorSetsInfoKHR *info)
|
||||
{
|
||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, layout);
|
||||
struct nvk_descriptor_state *desc =
|
||||
nvk_get_descriptors_state(cmd, pipelineBindPoint);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, info->layout);
|
||||
|
||||
/* Fro the Vulkan 1.3.275 spec:
|
||||
*
|
||||
|
|
@ -628,12 +620,13 @@ nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer,
|
|||
* range and it's only our responsibility to adjust all
|
||||
* set_dynamic_buffer_start[p] for p > s as needed.
|
||||
*/
|
||||
uint8_t dyn_buffer_start = desc->root.set_dynamic_buffer_start[firstSet];
|
||||
uint8_t dyn_buffer_start =
|
||||
desc->root.set_dynamic_buffer_start[info->firstSet];
|
||||
|
||||
uint32_t next_dyn_offset = 0;
|
||||
for (uint32_t i = 0; i < descriptorSetCount; ++i) {
|
||||
unsigned s = i + firstSet;
|
||||
VK_FROM_HANDLE(nvk_descriptor_set, set, pDescriptorSets[i]);
|
||||
for (uint32_t i = 0; i < info->descriptorSetCount; ++i) {
|
||||
unsigned s = i + info->firstSet;
|
||||
VK_FROM_HANDLE(nvk_descriptor_set, set, info->pDescriptorSets[i]);
|
||||
|
||||
if (desc->sets[s] != set) {
|
||||
if (set != NULL) {
|
||||
|
|
@ -659,7 +652,7 @@ nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer,
|
|||
if (set != NULL && set_layout->dynamic_buffer_count > 0) {
|
||||
for (uint32_t j = 0; j < set_layout->dynamic_buffer_count; j++) {
|
||||
struct nvk_buffer_address addr = set->dynamic_buffers[j];
|
||||
addr.base_addr += pDynamicOffsets[next_dyn_offset + j];
|
||||
addr.base_addr += info->pDynamicOffsets[next_dyn_offset + j];
|
||||
desc->root.dynamic_buffers[dyn_buffer_start + j] = addr;
|
||||
}
|
||||
next_dyn_offset += set->layout->dynamic_buffer_count;
|
||||
|
|
@ -671,45 +664,57 @@ nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer,
|
|||
}
|
||||
}
|
||||
assert(dyn_buffer_start <= NVK_MAX_DYNAMIC_BUFFERS);
|
||||
assert(next_dyn_offset <= dynamicOffsetCount);
|
||||
assert(next_dyn_offset <= info->dynamicOffsetCount);
|
||||
|
||||
for (uint32_t s = firstSet + descriptorSetCount; s < NVK_MAX_SETS; s++)
|
||||
for (uint32_t s = info->firstSet + info->descriptorSetCount;
|
||||
s < NVK_MAX_SETS; s++)
|
||||
desc->root.set_dynamic_buffer_start[s] = dyn_buffer_start;
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
nvk_CmdPushConstants(VkCommandBuffer commandBuffer,
|
||||
VkPipelineLayout layout,
|
||||
VkShaderStageFlags stageFlags,
|
||||
uint32_t offset,
|
||||
uint32_t size,
|
||||
const void *pValues)
|
||||
nvk_CmdBindDescriptorSets2KHR(VkCommandBuffer commandBuffer,
|
||||
const VkBindDescriptorSetsInfoKHR *pBindDescriptorSetsInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||
|
||||
if (stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) {
|
||||
struct nvk_descriptor_state *desc =
|
||||
nvk_get_descriptors_state(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS);
|
||||
|
||||
memcpy(desc->root.push + offset, pValues, size);
|
||||
if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) {
|
||||
nvk_bind_descriptor_sets(cmd, &cmd->state.gfx.descriptors,
|
||||
pBindDescriptorSetsInfo);
|
||||
}
|
||||
|
||||
if (stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) {
|
||||
struct nvk_descriptor_state *desc =
|
||||
nvk_get_descriptors_state(cmd, VK_PIPELINE_BIND_POINT_COMPUTE);
|
||||
|
||||
memcpy(desc->root.push + offset, pValues, size);
|
||||
if (pBindDescriptorSetsInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) {
|
||||
nvk_bind_descriptor_sets(cmd, &cmd->state.cs.descriptors,
|
||||
pBindDescriptorSetsInfo);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nvk_push_constants(UNUSED struct nvk_cmd_buffer *cmd,
|
||||
struct nvk_descriptor_state *desc,
|
||||
const VkPushConstantsInfoKHR *info)
|
||||
{
|
||||
memcpy(desc->root.push + info->offset, info->pValues, info->size);
|
||||
}
|
||||
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
nvk_CmdPushConstants2KHR(VkCommandBuffer commandBuffer,
|
||||
const VkPushConstantsInfoKHR *pPushConstantsInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||
|
||||
if (pPushConstantsInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS)
|
||||
nvk_push_constants(cmd, &cmd->state.gfx.descriptors, pPushConstantsInfo);
|
||||
|
||||
if (pPushConstantsInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT)
|
||||
nvk_push_constants(cmd, &cmd->state.cs.descriptors, pPushConstantsInfo);
|
||||
}
|
||||
|
||||
static struct nvk_push_descriptor_set *
|
||||
nvk_cmd_push_descriptors(struct nvk_cmd_buffer *cmd,
|
||||
VkPipelineBindPoint bind_point,
|
||||
struct nvk_descriptor_state *desc,
|
||||
uint32_t set)
|
||||
{
|
||||
struct nvk_descriptor_state *desc =
|
||||
nvk_get_descriptors_state(cmd, bind_point);
|
||||
|
||||
assert(set < NVK_MAX_SETS);
|
||||
if (unlikely(desc->push[set] == NULL)) {
|
||||
desc->push[set] = vk_zalloc(&cmd->vk.pool->alloc,
|
||||
|
|
@ -728,27 +733,41 @@ nvk_cmd_push_descriptors(struct nvk_cmd_buffer *cmd,
|
|||
return desc->push[set];
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
nvk_CmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
|
||||
VkPipelineBindPoint pipelineBindPoint,
|
||||
VkPipelineLayout layout,
|
||||
uint32_t set,
|
||||
uint32_t descriptorWriteCount,
|
||||
const VkWriteDescriptorSet *pDescriptorWrites)
|
||||
static void
|
||||
nvk_push_descriptor_set(struct nvk_cmd_buffer *cmd,
|
||||
struct nvk_descriptor_state *desc,
|
||||
const VkPushDescriptorSetInfoKHR *info)
|
||||
{
|
||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, layout);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, info->layout);
|
||||
|
||||
struct nvk_push_descriptor_set *push_set =
|
||||
nvk_cmd_push_descriptors(cmd, pipelineBindPoint, set);
|
||||
nvk_cmd_push_descriptors(cmd, desc, info->set);
|
||||
if (unlikely(push_set == NULL))
|
||||
return;
|
||||
|
||||
struct nvk_descriptor_set_layout *set_layout =
|
||||
vk_to_nvk_descriptor_set_layout(pipeline_layout->set_layouts[set]);
|
||||
vk_to_nvk_descriptor_set_layout(pipeline_layout->set_layouts[info->set]);
|
||||
|
||||
nvk_push_descriptor_set_update(push_set, set_layout,
|
||||
descriptorWriteCount, pDescriptorWrites);
|
||||
info->descriptorWriteCount,
|
||||
info->pDescriptorWrites);
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
nvk_CmdPushDescriptorSet2KHR(VkCommandBuffer commandBuffer,
|
||||
const VkPushDescriptorSetInfoKHR *pPushDescriptorSetInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||
|
||||
if (pPushDescriptorSetInfo->stageFlags & VK_SHADER_STAGE_ALL_GRAPHICS) {
|
||||
nvk_push_descriptor_set(cmd, &cmd->state.gfx.descriptors,
|
||||
pPushDescriptorSetInfo);
|
||||
}
|
||||
|
||||
if (pPushDescriptorSetInfo->stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) {
|
||||
nvk_push_descriptor_set(cmd, &cmd->state.cs.descriptors,
|
||||
pPushDescriptorSetInfo);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -869,24 +888,26 @@ nvk_cmd_buffer_dump(struct nvk_cmd_buffer *cmd, FILE *fp)
|
|||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
nvk_CmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
|
||||
VkDescriptorUpdateTemplate _template,
|
||||
VkPipelineLayout _layout,
|
||||
uint32_t set,
|
||||
const void *pData)
|
||||
nvk_CmdPushDescriptorSetWithTemplate2KHR(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkPushDescriptorSetWithTemplateInfoKHR *pPushDescriptorSetWithTemplateInfo)
|
||||
{
|
||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||
VK_FROM_HANDLE(vk_descriptor_update_template, template, _template);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout, _layout);
|
||||
VK_FROM_HANDLE(vk_descriptor_update_template, template,
|
||||
pPushDescriptorSetWithTemplateInfo->descriptorUpdateTemplate);
|
||||
VK_FROM_HANDLE(vk_pipeline_layout, pipeline_layout,
|
||||
pPushDescriptorSetWithTemplateInfo->layout);
|
||||
|
||||
struct nvk_descriptor_state *desc =
|
||||
nvk_get_descriptors_state(cmd, template->bind_point);
|
||||
struct nvk_push_descriptor_set *push_set =
|
||||
nvk_cmd_push_descriptors(cmd, template->bind_point, set);
|
||||
nvk_cmd_push_descriptors(cmd, desc, pPushDescriptorSetWithTemplateInfo->set);
|
||||
if (unlikely(push_set == NULL))
|
||||
return;
|
||||
|
||||
struct nvk_descriptor_set_layout *set_layout =
|
||||
vk_to_nvk_descriptor_set_layout(pipeline_layout->set_layouts[set]);
|
||||
vk_to_nvk_descriptor_set_layout(pipeline_layout->set_layouts[pPushDescriptorSetWithTemplateInfo->set]);
|
||||
|
||||
nvk_push_descriptor_set_update_template(push_set, set_layout, template,
|
||||
pData);
|
||||
pPushDescriptorSetWithTemplateInfo->pData);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include "nvk_mme.h"
|
||||
#include "nvk_physical_device.h"
|
||||
|
||||
#include "vk_common_entrypoints.h"
|
||||
#include "vk_meta.h"
|
||||
#include "vk_pipeline.h"
|
||||
|
||||
|
|
@ -980,8 +981,8 @@ nvk_meta_copy_query_pool_results(struct nvk_cmd_buffer *cmd,
|
|||
VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||
pipeline);
|
||||
|
||||
nvk_CmdPushConstants(nvk_cmd_buffer_to_handle(cmd), layout,
|
||||
VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(push), &push);
|
||||
vk_common_CmdPushConstants(nvk_cmd_buffer_to_handle(cmd), layout,
|
||||
VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(push), &push);
|
||||
|
||||
nvk_CmdDispatchBase(nvk_cmd_buffer_to_handle(cmd), 0, 0, 0, 1, 1, 1);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue