diff options
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/vulkan/anv_cmd_buffer.c | 65 | ||||
-rw-r--r-- | src/intel/vulkan/anv_descriptor_set.c | 2 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 11 | ||||
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 24 |
4 files changed, 70 insertions, 32 deletions
diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 636f5150f22..9720e7e87ba 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -124,12 +124,20 @@ anv_cmd_state_init(struct anv_cmd_buffer *cmd_buffer) } static void +anv_cmd_pipeline_state_finish(struct anv_cmd_buffer *cmd_buffer, + struct anv_cmd_pipeline_state *pipe_state) +{ + for (uint32_t i = 0; i < ARRAY_SIZE(pipe_state->push_descriptors); i++) + vk_free(&cmd_buffer->pool->alloc, pipe_state->push_descriptors[i]); +} + +static void anv_cmd_state_finish(struct anv_cmd_buffer *cmd_buffer) { struct anv_cmd_state *state = &cmd_buffer->state; - for (uint32_t i = 0; i < ARRAY_SIZE(state->push_descriptors); i++) - vk_free(&cmd_buffer->pool->alloc, state->push_descriptors[i]); + anv_cmd_pipeline_state_finish(cmd_buffer, &state->gfx.base); + anv_cmd_pipeline_state_finish(cmd_buffer, &state->compute.base); for (uint32_t i = 0; i < MESA_SHADER_STAGES; i++) vk_free(&cmd_buffer->pool->alloc, state->push_constants[i]); @@ -495,6 +503,7 @@ void anv_CmdSetStencilReference( static void anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer, + VkPipelineBindPoint bind_point, struct anv_pipeline_layout *layout, uint32_t set_index, struct anv_descriptor_set *set, @@ -504,7 +513,14 @@ anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer, struct anv_descriptor_set_layout *set_layout = layout->set[set_index].layout; - cmd_buffer->state.descriptors[set_index] = set; + struct anv_cmd_pipeline_state *pipe_state; + if (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) { + pipe_state = &cmd_buffer->state.compute.base; + } else { + assert(bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS); + pipe_state = &cmd_buffer->state.gfx.base; + } + pipe_state->descriptors[set_index] = set; if (dynamic_offsets) { if (set_layout->dynamic_offset_count > 0) { @@ -514,9 +530,9 @@ anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer, /* Assert that everything is in range */ assert(set_layout->dynamic_offset_count <= *dynamic_offset_count); assert(dynamic_offset_start + set_layout->dynamic_offset_count <= - ARRAY_SIZE(cmd_buffer->state.dynamic_offsets)); + ARRAY_SIZE(pipe_state->dynamic_offsets)); - typed_memcpy(&cmd_buffer->state.dynamic_offsets[dynamic_offset_start], + typed_memcpy(&pipe_state->dynamic_offsets[dynamic_offset_start], *dynamic_offsets, set_layout->dynamic_offset_count); *dynamic_offsets += set_layout->dynamic_offset_count; @@ -524,7 +540,13 @@ anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer, } } - cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages; + if (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) { + cmd_buffer->state.descriptors_dirty |= VK_SHADER_STAGE_COMPUTE_BIT; + } else { + assert(bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS); + cmd_buffer->state.descriptors_dirty |= + set_layout->shader_stages & VK_SHADER_STAGE_ALL_GRAPHICS; + } } void anv_CmdBindDescriptorSets( @@ -544,8 +566,8 @@ void anv_CmdBindDescriptorSets( for (uint32_t i = 0; i < descriptorSetCount; i++) { ANV_FROM_HANDLE(anv_descriptor_set, set, pDescriptorSets[i]); - anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout, - firstSet + i, set, + anv_cmd_buffer_bind_descriptor_set(cmd_buffer, pipelineBindPoint, + layout, firstSet + i, set, &dynamicOffsetCount, &pDynamicOffsets); } @@ -851,10 +873,19 @@ anv_cmd_buffer_get_depth_stencil_view(const struct anv_cmd_buffer *cmd_buffer) static struct anv_push_descriptor_set * anv_cmd_buffer_get_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer, + VkPipelineBindPoint bind_point, uint32_t set) { + struct anv_cmd_pipeline_state *pipe_state; + if (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) { + pipe_state = &cmd_buffer->state.compute.base; + } else { + assert(bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS); + pipe_state = &cmd_buffer->state.gfx.base; + } + struct anv_push_descriptor_set **push_set = - &cmd_buffer->state.push_descriptors[set]; + &pipe_state->push_descriptors[set]; if (*push_set == NULL) { *push_set = vk_alloc(&cmd_buffer->pool->alloc, @@ -880,15 +911,14 @@ void anv_CmdPushDescriptorSetKHR( ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); ANV_FROM_HANDLE(anv_pipeline_layout, layout, _layout); - assert(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS || - pipelineBindPoint == VK_PIPELINE_BIND_POINT_COMPUTE); assert(_set < MAX_SETS); const struct anv_descriptor_set_layout *set_layout = layout->set[_set].layout; struct anv_push_descriptor_set *push_set = - anv_cmd_buffer_get_push_descriptor_set(cmd_buffer, _set); + anv_cmd_buffer_get_push_descriptor_set(cmd_buffer, + pipelineBindPoint, _set); if (!push_set) return; @@ -958,8 +988,8 @@ void anv_CmdPushDescriptorSetKHR( } } - anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout, _set, - set, NULL, NULL); + anv_cmd_buffer_bind_descriptor_set(cmd_buffer, pipelineBindPoint, + layout, _set, set, NULL, NULL); } void anv_CmdPushDescriptorSetWithTemplateKHR( @@ -980,7 +1010,8 @@ void anv_CmdPushDescriptorSetWithTemplateKHR( layout->set[_set].layout; struct anv_push_descriptor_set *push_set = - anv_cmd_buffer_get_push_descriptor_set(cmd_buffer, _set); + anv_cmd_buffer_get_push_descriptor_set(cmd_buffer, + template->bind_point, _set); if (!push_set) return; @@ -997,6 +1028,6 @@ void anv_CmdPushDescriptorSetWithTemplateKHR( template, pData); - anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout, _set, - set, NULL, NULL); + anv_cmd_buffer_bind_descriptor_set(cmd_buffer, template->bind_point, + layout, _set, set, NULL, NULL); } diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index e4e39f5c7b4..1d4df264ae6 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -893,6 +893,8 @@ VkResult anv_CreateDescriptorUpdateTemplateKHR( if (template == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + template->bind_point = pCreateInfo->pipelineBindPoint; + if (pCreateInfo->templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR) template->set = pCreateInfo->set; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 416b946ea99..d0c987ae269 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1306,6 +1306,8 @@ struct anv_descriptor_template_entry { }; struct anv_descriptor_update_template { + VkPipelineBindPoint bind_point; + /* The descriptor set this template corresponds to. This value is only * valid if the template was created with the templateType * VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR. @@ -1673,6 +1675,11 @@ struct anv_attachment_state { */ struct anv_cmd_pipeline_state { struct anv_pipeline *pipeline; + + struct anv_descriptor_set *descriptors[MAX_SETS]; + uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS]; + + struct anv_push_descriptor_set *push_descriptors[MAX_SETS]; }; /** State tracking for graphics pipeline @@ -1721,16 +1728,12 @@ struct anv_cmd_state { VkRect2D render_area; uint32_t restart_index; struct anv_vertex_binding vertex_bindings[MAX_VBS]; - struct anv_descriptor_set * descriptors[MAX_SETS]; - uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS]; VkShaderStageFlags push_constant_stages; struct anv_push_constants * push_constants[MESA_SHADER_STAGES]; struct anv_state binding_tables[MESA_SHADER_STAGES]; struct anv_state samplers[MESA_SHADER_STAGES]; struct anv_dynamic_state dynamic; - struct anv_push_descriptor_set * push_descriptors[MAX_SETS]; - /** * Whether or not the gen8 PMA fix is enabled. We ensure that, at the top * of any command buffer it is disabled by disabling it in EndCommandBuffer diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 479f75b3b1a..e25d2e1e3d2 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -1463,32 +1463,32 @@ cmd_buffer_alloc_push_constants(struct anv_cmd_buffer *cmd_buffer) } static const struct anv_descriptor * -anv_descriptor_for_binding(const struct anv_cmd_buffer *cmd_buffer, +anv_descriptor_for_binding(const struct anv_cmd_pipeline_state *pipe_state, const struct anv_pipeline_binding *binding) { assert(binding->set < MAX_SETS); const struct anv_descriptor_set *set = - cmd_buffer->state.descriptors[binding->set]; + pipe_state->descriptors[binding->set]; const uint32_t offset = set->layout->binding[binding->binding].descriptor_index; return &set->descriptors[offset + binding->index]; } static uint32_t -dynamic_offset_for_binding(const struct anv_cmd_buffer *cmd_buffer, +dynamic_offset_for_binding(const struct anv_cmd_pipeline_state *pipe_state, const struct anv_pipeline *pipeline, const struct anv_pipeline_binding *binding) { assert(binding->set < MAX_SETS); const struct anv_descriptor_set *set = - cmd_buffer->state.descriptors[binding->set]; + pipe_state->descriptors[binding->set]; uint32_t dynamic_offset_idx = pipeline->layout->set[binding->set].dynamic_offset_start + set->layout->binding[binding->binding].dynamic_offset_index + binding->index; - return cmd_buffer->state.dynamic_offsets[dynamic_offset_idx]; + return pipe_state->dynamic_offsets[dynamic_offset_idx]; } static VkResult @@ -1596,7 +1596,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, } const struct anv_descriptor *desc = - anv_descriptor_for_binding(cmd_buffer, binding); + anv_descriptor_for_binding(pipe_state, binding); switch (desc->type) { case VK_DESCRIPTOR_TYPE_SAMPLER: @@ -1672,7 +1672,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { /* Compute the offset within the buffer */ uint32_t dynamic_offset = - dynamic_offset_for_binding(cmd_buffer, pipeline, binding); + dynamic_offset_for_binding(pipe_state, pipeline, binding); uint64_t offset = desc->offset + dynamic_offset; /* Clamp to the buffer size */ offset = MIN2(offset, desc->buffer->size); @@ -1753,7 +1753,7 @@ emit_samplers(struct anv_cmd_buffer *cmd_buffer, for (uint32_t s = 0; s < map->sampler_count; s++) { struct anv_pipeline_binding *binding = &map->sampler_to_descriptor[s]; const struct anv_descriptor *desc = - anv_descriptor_for_binding(cmd_buffer, binding); + anv_descriptor_for_binding(pipe_state, binding); if (desc->type != VK_DESCRIPTOR_TYPE_SAMPLER && desc->type != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) @@ -1877,7 +1877,8 @@ static void cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer, VkShaderStageFlags dirty_stages) { - const struct anv_pipeline *pipeline = cmd_buffer->state.gfx.base.pipeline; + const struct anv_cmd_graphics_state *gfx_state = &cmd_buffer->state.gfx; + const struct anv_pipeline *pipeline = gfx_state->base.pipeline; static const uint32_t push_constant_opcodes[] = { [MESA_SHADER_VERTEX] = 21, @@ -1930,7 +1931,7 @@ cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer, &bind_map->surface_to_descriptor[surface]; const struct anv_descriptor *desc = - anv_descriptor_for_binding(cmd_buffer, binding); + anv_descriptor_for_binding(&gfx_state->base, binding); struct anv_address read_addr; uint32_t read_len; @@ -1946,7 +1947,8 @@ cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer, assert(desc->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC); uint32_t dynamic_offset = - dynamic_offset_for_binding(cmd_buffer, pipeline, binding); + dynamic_offset_for_binding(&gfx_state->base, + pipeline, binding); uint32_t buf_offset = MIN2(desc->offset + dynamic_offset, desc->buffer->size); uint32_t buf_range = |