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);
}
u32 size_bytes32() const
{
return _size * sizeof(Ty);
}
u32 capacity() const
{
return _capacity;

View file

@ -132,7 +132,7 @@ namespace vk
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);
}
@ -243,20 +243,19 @@ namespace vk
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);
}
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)
@ -294,15 +293,15 @@ namespace vk
" 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);
}
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 };
set_parameters(cmd, parameters, 4);
m_params = { data_length, zeta_offset - data_offset, stencil_offset - data_offset, 0 };
ensure(stencil_offset > 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);
}
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({ dst->value, 0, 4 }, 0, 1);

View file

@ -35,7 +35,7 @@ namespace vk
void destroy();
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);
@ -50,6 +50,8 @@ namespace vk
u32 m_data_length = 0;
u32 kernel_size = 1;
rsx::simple_array<u32> m_params;
std::string variables, work_kernel, loop_advance, suffix;
std::string method_declarations;
@ -57,9 +59,9 @@ namespace vk
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);
};
@ -125,7 +127,7 @@ namespace vk
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);
};
@ -342,8 +344,9 @@ namespace vk
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);
}
@ -361,8 +364,7 @@ namespace vk
data_offset = src_offset;
}
u32 parameters[4] = { src_length, src_offset - data_offset, dst_offset - data_offset, 0 };
set_parameters(cmd, parameters, 4);
m_params = { src_length, src_offset - data_offset, dst_offset - data_offset, 0 };
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);
}
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({ dst_buffer->value, out_offset, block_length }, 0, 1);
}
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);
}
@ -475,7 +474,6 @@ namespace vk
params.logw = rsx::ceil_log2(width);
params.logh = rsx::ceil_log2(height);
params.logd = rsx::ceil_log2(depth);
set_parameters(cmd);
const u32 num_bytes_per_invocation = (sizeof(_BlockType) * optimal_group_size);
const u32 linear_invocations = utils::aligned_div(data_length, num_bytes_per_invocation);
@ -492,7 +490,7 @@ namespace vk
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);
};
@ -576,8 +574,10 @@ namespace vk
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);
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);
@ -648,7 +648,6 @@ namespace vk
params.image_height = (Op == RSX_detiler_op::decode) ? tile_aligned_height : config.image_height;
params.image_pitch = config.image_pitch;
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 virtual_width = config.image_width / subtexels_per_invocation;

View file

@ -49,7 +49,7 @@ namespace vk
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 resolved_view = resolve->get_view(rsx::default_remap_vector.with_encoding(VK_REMAP_IDENTITY));

View file

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

View file

@ -20,7 +20,7 @@ namespace vk
u32 m_constants_buf[20];
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;

View file

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