vk: Update binding model for compute jobs

This commit is contained in:
kd-11 2025-06-15 14:21:25 +03:00 committed by kd-11
parent 2c8c788d81
commit f241825c73
7 changed files with 47 additions and 42 deletions

View file

@ -305,6 +305,11 @@ namespace rsx
return _size * sizeof(Ty); return _size * sizeof(Ty);
} }
u32 size_bytes32() const
{
return _size * sizeof(Ty);
}
u32 capacity() const u32 capacity() const
{ {
return _capacity; return _capacity;

View file

@ -132,7 +132,7 @@ namespace vk
m_program = compiler->compile(create_info, vk::pipe_compiler::COMPILE_INLINE, {}, get_inputs()); m_program = compiler->compile(create_info, vk::pipe_compiler::COMPILE_INLINE, {}, get_inputs());
} }
bind_resources(); bind_resources(cmd);
m_program->bind(cmd, VK_PIPELINE_BIND_POINT_COMPUTE); m_program->bind(cmd, VK_PIPELINE_BIND_POINT_COMPUTE);
} }
@ -243,20 +243,19 @@ namespace vk
m_src += suffix; m_src += suffix;
} }
void cs_shuffle_base::bind_resources() void cs_shuffle_base::bind_resources(const vk::command_buffer& cmd)
{ {
set_parameters(cmd);
m_program->bind_uniform({ m_data->value, m_data_offset, m_data_length }, 0, 0); m_program->bind_uniform({ m_data->value, m_data_offset, m_data_length }, 0, 0);
} }
void cs_shuffle_base::set_parameters(const vk::command_buffer& cmd, const u32* params, u8 count) void cs_shuffle_base::set_parameters(const vk::command_buffer& cmd)
{ {
if (!m_program) if (!m_params.empty())
{ {
load_program(cmd); ensure(use_push_constants);
vkCmdPushConstants(cmd, m_program->layout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, m_params.size_bytes32(), m_params.data());
} }
ensure(use_push_constants);
vkCmdPushConstants(cmd, m_program->layout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, count * 4, params);
} }
void cs_shuffle_base::run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_length, u32 data_offset) void cs_shuffle_base::run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_length, u32 data_offset)
@ -294,15 +293,15 @@ namespace vk
" uint stencil_offset;\n"; " uint stencil_offset;\n";
} }
void cs_interleave_task::bind_resources() void cs_interleave_task::bind_resources(const vk::command_buffer& cmd)
{ {
set_parameters(cmd);
m_program->bind_uniform({ m_data->value, m_data_offset, m_ssbo_length }, 0, 0); m_program->bind_uniform({ m_data->value, m_data_offset, m_ssbo_length }, 0, 0);
} }
void cs_interleave_task::run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_offset, u32 data_length, u32 zeta_offset, u32 stencil_offset) void cs_interleave_task::run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_offset, u32 data_length, u32 zeta_offset, u32 stencil_offset)
{ {
u32 parameters[4] = { data_length, zeta_offset - data_offset, stencil_offset - data_offset, 0 }; m_params = { data_length, zeta_offset - data_offset, stencil_offset - data_offset, 0 };
set_parameters(cmd, parameters, 4);
ensure(stencil_offset > data_offset); ensure(stencil_offset > data_offset);
m_ssbo_length = stencil_offset + (data_length / 4) - data_offset; m_ssbo_length = stencil_offset + (data_length / 4) - data_offset;
@ -354,7 +353,7 @@ namespace vk
m_src = fmt::replace_all(m_src, syntax_replace); m_src = fmt::replace_all(m_src, syntax_replace);
} }
void cs_aggregator::bind_resources() void cs_aggregator::bind_resources(const vk::command_buffer& cmd)
{ {
m_program->bind_uniform({ src->value, 0, block_length }, 0, 0); m_program->bind_uniform({ src->value, 0, block_length }, 0, 0);
m_program->bind_uniform({ dst->value, 0, 4 }, 0, 1); m_program->bind_uniform({ dst->value, 0, 4 }, 0, 1);

View file

@ -35,7 +35,7 @@ namespace vk
void destroy(); void destroy();
virtual std::vector<glsl::program_input> get_inputs(); virtual std::vector<glsl::program_input> get_inputs();
virtual void bind_resources() {} virtual void bind_resources(const vk::command_buffer& cmd) {}
void load_program(const vk::command_buffer& cmd); void load_program(const vk::command_buffer& cmd);
@ -50,6 +50,8 @@ namespace vk
u32 m_data_length = 0; u32 m_data_length = 0;
u32 kernel_size = 1; u32 kernel_size = 1;
rsx::simple_array<u32> m_params;
std::string variables, work_kernel, loop_advance, suffix; std::string variables, work_kernel, loop_advance, suffix;
std::string method_declarations; std::string method_declarations;
@ -57,9 +59,9 @@ namespace vk
void build(const char* function_name, u32 _kernel_size = 0); void build(const char* function_name, u32 _kernel_size = 0);
void bind_resources() override; void bind_resources(const vk::command_buffer& cmd) override;
void set_parameters(const vk::command_buffer& cmd, const u32* params, u8 count); void set_parameters(const vk::command_buffer& cmd);
void run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_length, u32 data_offset = 0); void run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_length, u32 data_offset = 0);
}; };
@ -125,7 +127,7 @@ namespace vk
cs_interleave_task(); cs_interleave_task();
void bind_resources() override; void bind_resources(const vk::command_buffer& cmd) override;
void run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_offset, u32 data_length, u32 zeta_offset, u32 stencil_offset); void run(const vk::command_buffer& cmd, const vk::buffer* data, u32 data_offset, u32 data_length, u32 zeta_offset, u32 stencil_offset);
}; };
@ -342,8 +344,9 @@ namespace vk
cs_shuffle_base::build(""); cs_shuffle_base::build("");
} }
void bind_resources() override void bind_resources(const vk::command_buffer& cmd) override
{ {
set_parameters(cmd);
m_program->bind_uniform({ m_data->value, m_data_offset, m_ssbo_length }, 0, 0); m_program->bind_uniform({ m_data->value, m_data_offset, m_ssbo_length }, 0, 0);
} }
@ -361,8 +364,7 @@ namespace vk
data_offset = src_offset; data_offset = src_offset;
} }
u32 parameters[4] = { src_length, src_offset - data_offset, dst_offset - data_offset, 0 }; m_params = { src_length, src_offset - data_offset, dst_offset - data_offset, 0 };
set_parameters(cmd, parameters, 4);
cs_shuffle_base::run(cmd, data, src_length, data_offset); cs_shuffle_base::run(cmd, data, src_length, data_offset);
} }
}; };
@ -443,19 +445,16 @@ namespace vk
m_src = fmt::replace_all(m_src, syntax_replace); m_src = fmt::replace_all(m_src, syntax_replace);
} }
void bind_resources() override void bind_resources(const vk::command_buffer& cmd) override
{ {
set_parameters(cmd);
m_program->bind_uniform({ src_buffer->value, in_offset, block_length }, 0, 0); m_program->bind_uniform({ src_buffer->value, in_offset, block_length }, 0, 0);
m_program->bind_uniform({ dst_buffer->value, out_offset, block_length }, 0, 1); m_program->bind_uniform({ dst_buffer->value, out_offset, block_length }, 0, 1);
} }
void set_parameters(const vk::command_buffer& cmd) void set_parameters(const vk::command_buffer& cmd)
{ {
if (!m_program)
{
load_program(cmd);
}
vkCmdPushConstants(cmd, m_program->layout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, push_constants_size, params.data); vkCmdPushConstants(cmd, m_program->layout(), VK_SHADER_STAGE_COMPUTE_BIT, 0, push_constants_size, params.data);
} }
@ -475,7 +474,6 @@ namespace vk
params.logw = rsx::ceil_log2(width); params.logw = rsx::ceil_log2(width);
params.logh = rsx::ceil_log2(height); params.logh = rsx::ceil_log2(height);
params.logd = rsx::ceil_log2(depth); params.logd = rsx::ceil_log2(depth);
set_parameters(cmd);
const u32 num_bytes_per_invocation = (sizeof(_BlockType) * optimal_group_size); const u32 num_bytes_per_invocation = (sizeof(_BlockType) * optimal_group_size);
const u32 linear_invocations = utils::aligned_div(data_length, num_bytes_per_invocation); const u32 linear_invocations = utils::aligned_div(data_length, num_bytes_per_invocation);
@ -492,7 +490,7 @@ namespace vk
cs_aggregator(); cs_aggregator();
void bind_resources() override; void bind_resources(const vk::command_buffer& cmd) override;
void run(const vk::command_buffer& cmd, const vk::buffer* dst, const vk::buffer* src, u32 num_words); void run(const vk::command_buffer& cmd, const vk::buffer* dst, const vk::buffer* src, u32 num_words);
}; };
@ -576,8 +574,10 @@ namespace vk
m_src = fmt::replace_all(m_src, syntax_replace); m_src = fmt::replace_all(m_src, syntax_replace);
} }
void bind_resources() override void bind_resources(const vk::command_buffer& cmd) override
{ {
set_parameters(cmd);
const auto op = static_cast<u32>(Op); const auto op = static_cast<u32>(Op);
m_program->bind_uniform({ src_buffer->value, in_offset, in_block_length }, 0u, 0u ^ op); m_program->bind_uniform({ src_buffer->value, in_offset, in_block_length }, 0u, 0u ^ op);
m_program->bind_uniform({ dst_buffer->value, out_offset, out_block_length }, 0u, 1u ^ op); m_program->bind_uniform({ dst_buffer->value, out_offset, out_block_length }, 0u, 1u ^ op);
@ -648,7 +648,6 @@ namespace vk
params.image_height = (Op == RSX_detiler_op::decode) ? tile_aligned_height : config.image_height; params.image_height = (Op == RSX_detiler_op::decode) ? tile_aligned_height : config.image_height;
params.image_pitch = config.image_pitch; params.image_pitch = config.image_pitch;
params.image_bpp = config.image_bpp; params.image_bpp = config.image_bpp;
set_parameters(cmd);
const u32 subtexels_per_invocation = (config.image_bpp < 4) ? (4 / config.image_bpp) : 1; const u32 subtexels_per_invocation = (config.image_bpp < 4) ? (4 / config.image_bpp) : 1;
const u32 virtual_width = config.image_width / subtexels_per_invocation; const u32 virtual_width = config.image_width / subtexels_per_invocation;

View file

@ -49,7 +49,7 @@ namespace vk
return result; return result;
} }
void bind_resources() override void bind_resources(const vk::command_buffer& cmd) override
{ {
auto msaa_view = multisampled->get_view(rsx::default_remap_vector.with_encoding(VK_REMAP_VIEW_MULTISAMPLED)); auto msaa_view = multisampled->get_view(rsx::default_remap_vector.with_encoding(VK_REMAP_VIEW_MULTISAMPLED));
auto resolved_view = resolve->get_view(rsx::default_remap_vector.with_encoding(VK_REMAP_IDENTITY)); auto resolved_view = resolve->get_view(rsx::default_remap_vector.with_encoding(VK_REMAP_IDENTITY));

View file

@ -97,7 +97,7 @@ namespace vk
return result; return result;
} }
void fsr_pass::bind_resources() void fsr_pass::bind_resources(const vk::command_buffer& cmd)
{ {
// Bind relevant stuff // Bind relevant stuff
if (!m_sampler) if (!m_sampler)

View file

@ -20,7 +20,7 @@ namespace vk
u32 m_constants_buf[20]; u32 m_constants_buf[20];
std::vector<glsl::program_input> get_inputs() override; std::vector<glsl::program_input> get_inputs() override;
void bind_resources() override; void bind_resources(const vk::command_buffer&) override;
virtual void configure(const vk::command_buffer& cmd) = 0; virtual void configure(const vk::command_buffer& cmd) = 0;

View file

@ -14,7 +14,7 @@ namespace vk
public: public:
inline void flush_all() inline void flush_all()
{ {
std::shared_lock lock(m_notifications_lock); std::lock_guard lock(m_notifications_lock);
for (auto& set : m_notification_list) for (auto& set : m_notification_list)
{ {
@ -44,7 +44,7 @@ namespace vk
private: private:
rsx::simple_array<descriptor_set*> m_notification_list; rsx::simple_array<descriptor_set*> m_notification_list;
std::shared_mutex m_notifications_lock; std::mutex m_notifications_lock;
dispatch_manager(const dispatch_manager&) = delete; dispatch_manager(const dispatch_manager&) = delete;
dispatch_manager& operator = (const dispatch_manager&) = delete; dispatch_manager& operator = (const dispatch_manager&) = delete;
@ -81,17 +81,17 @@ namespace vk
} }
else else
{ {
binding_flags[i] = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT; binding_flags[i] = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT;
} }
} }
binding_infos.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT; binding_infos.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO;
binding_infos.pNext = nullptr; binding_infos.pNext = nullptr;
binding_infos.bindingCount = ::size32(binding_flags); binding_infos.bindingCount = ::size32(binding_flags);
binding_infos.pBindingFlags = binding_flags.data(); binding_infos.pBindingFlags = binding_flags.data();
infos.pNext = &binding_infos; infos.pNext = &binding_infos;
infos.flags |= VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT; infos.flags |= VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
VkDescriptorSetLayout result; VkDescriptorSetLayout result;
CHECK_RESULT(vkCreateDescriptorSetLayout(*g_render_device, &infos, nullptr, &result)); CHECK_RESULT(vkCreateDescriptorSetLayout(*g_render_device, &infos, nullptr, &result));
@ -442,6 +442,7 @@ namespace vk
{ {
if (!m_push_type_mask) if (!m_push_type_mask)
{ {
ensure(m_pending_writes.empty());
return; return;
} }
@ -450,16 +451,17 @@ namespace vk
(m_pending_writes.size() >= max_cache_size)) (m_pending_writes.size() >= max_cache_size))
{ {
flush(); flush();
return;
} }
else if (m_update_after_bind_mask)
{ // Register for async flush
// Register for async flush ensure(m_update_after_bind_mask);
g_fxo->get<descriptors::dispatch_manager>().register_(this); g_fxo->get<descriptors::dispatch_manager>().register_(this);
}
} }
void descriptor_set::bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout) void descriptor_set::bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout)
{ {
// Notify
on_bind(); on_bind();
vkCmdBindDescriptorSets(cmd, bind_point, layout, 0, 1, &m_handle, ::size32(m_dynamic_offsets), m_dynamic_offsets.data()); vkCmdBindDescriptorSets(cmd, bind_point, layout, 0, 1, &m_handle, ::size32(m_dynamic_offsets), m_dynamic_offsets.data());