On Fri, Dec 15, 2017 at 05:09:09PM -0800, Jason Ekstrand wrote: > The Vulkan spec says: > > "pipelineBindPoint is a VkPipelineBindPoint indicating whether the > descriptors will be used by graphics pipelines or compute pipelines. > There is a separate set of bind points for each of graphics and > compute, so binding one does not disturb the other." > > Up until now, we've been ignoring the pipeline bind point and had just > one bind point for everything. This commit separates things out into > separate bind points. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102897 > --- > src/intel/vulkan/anv_cmd_buffer.c | 65 > ++++++++++++++++++++++++++--------- > src/intel/vulkan/anv_descriptor_set.c | 2 ++ > src/intel/vulkan/anv_private.h | 11 +++--- > 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 636f515..9720e7e 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;
Should we put () around the right hand side? We seem to be using that elsewhere. > + } > } > > 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 629c041..63557ab 100644 > --- a/src/intel/vulkan/anv_descriptor_set.c > +++ b/src/intel/vulkan/anv_descriptor_set.c > @@ -891,6 +891,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 e8d0d27..f1868a3 100644 > --- a/src/intel/vulkan/anv_private.h > +++ b/src/intel/vulkan/anv_private.h > @@ -1319,6 +1319,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. > @@ -1686,6 +1688,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 > @@ -1734,16 +1741,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 994c996..75aa40a 100644 > --- a/src/intel/vulkan/genX_cmd_buffer.c > +++ b/src/intel/vulkan/genX_cmd_buffer.c > @@ -1434,32 +1434,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 > @@ -1567,7 +1567,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: > @@ -1643,7 +1643,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); > @@ -1724,7 +1724,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) > @@ -1848,7 +1848,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, > @@ -1901,7 +1902,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; > @@ -1917,7 +1918,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 = > -- > 2.5.0.400.gff86faf > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev