1414
1515namespace  vkcompute  {
1616
17+ uint32_t  PushConstantDataInfo::write (
18+     void * dst,
19+     const  uint32_t  dst_offset,
20+     const  uint32_t  max_dst_size) const  {
21+   if  (tensorUniformData != nullptr ) {
22+     return  tensorUniformData->write_attribute (
23+         dst, dst_offset, max_dst_size, payload_.attr );
24+   }
25+ 
26+   VK_CHECK_COND (
27+       (dst_offset + payload_.dataSize ) <= max_dst_size,
28+       " Attempting to write push constant data outside data boundary." 
29+   memcpy ((uint8_t *)dst + dst_offset, payload_.data , payload_.dataSize );
30+   return  payload_.dataSize ;
31+ }
32+ 
1733DispatchNode::DispatchNode (
1834    ComputeGraph& graph,
1935    const  vkapi::ShaderInfo& shader,
@@ -23,13 +39,15 @@ DispatchNode::DispatchNode(
2339    const  vkapi::ParamsBindList& params,
2440    const  vkapi::SpecVarList& spec_vars,
2541    const  ResizeFunction& resize_fn,
26-     const  std::vector<ValueRef>& resize_args)
42+     const  std::vector<ValueRef>& resize_args,
43+     const  std::vector<PushConstantDataInfo>& push_constants)
2744    : ExecuteNode(resize_fn, resize_args, args, shader.kernel_name),
2845      shader_ (shader),
2946      global_workgroup_size_(global_workgroup_size),
3047      local_workgroup_size_(local_workgroup_size),
3148      params_(params),
32-       spec_vars_(spec_vars) {
49+       spec_vars_(spec_vars),
50+       push_constants_(push_constants) {
3351  graph.update_descriptor_counts (shader, /* execute = */ true );
3452}
3553
@@ -57,8 +75,22 @@ void DispatchNode::encode(ComputeGraph* graph) {
5775
5876  bind_params_to_descriptor_set (params_, descriptor_set, idx);
5977
78+   std::array<uint8_t , kMaxPushConstantSize > push_constants_data;
79+   uint32_t  push_constants_offset = 0 ;
80+ 
81+   for  (const  auto & push_constant : push_constants_) {
82+     push_constants_offset += push_constant.write (
83+         push_constants_data.data (),
84+         push_constants_offset,
85+         kMaxPushConstantSize );
86+   }
6087  context->register_shader_dispatch (
61-       descriptor_set, pipeline_barrier, shader_, global_workgroup_size_);
88+       descriptor_set,
89+       pipeline_barrier,
90+       shader_,
91+       global_workgroup_size_,
92+       push_constants_data.data (),
93+       push_constants_offset);
6294
6395  context->report_shader_dispatch_end ();
6496}
0 commit comments