MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ op_confine()

GpuVisionPass::Completed MayaFlux::Yantra::VisionGpuExecutor::op_confine ( VisionGpuContexts &  contexts,
const Kinesis::Vision::ConfineParams &  p 
)
private

Arbitrary rectangular sub-region of the current image, optionally resized back to the frame's own size before this step.

Publishes the result as VisionResult::images.confine.

Returns
The resulting image and the image it was derived from.

Definition at line 114 of file VisionImageDispatch.cpp.

117{
118 auto& pixel_ctx = contexts.pixel;
119 auto w = contexts.pass.w;
120 auto h = contexts.pass.h;
121 auto& foundry = Portal::Graphics::get_shader_foundry();
122
123 const auto confine_input = contexts.pass.current;
124
125 const auto src_x = static_cast<uint32_t>(p.bounds.x * static_cast<float>(w));
126 const auto src_y = static_cast<uint32_t>(p.bounds.y * static_cast<float>(h));
127 const auto src_w = std::max<uint32_t>(1U, static_cast<uint32_t>(p.bounds.w * static_cast<float>(w)));
128 const auto src_h = std::max<uint32_t>(1U, static_cast<uint32_t>(p.bounds.h * static_cast<float>(h)));
129
130 const uint32_t out_w = p.resize_to_source ? w : src_w;
131 const uint32_t out_h = p.resize_to_source ? h : src_h;
132
133 pixel_ctx.swap_shader({
134 .shader_path = "vision_confine.comp.spv",
135 .workgroup_size = k_wg2d,
136 .push_constant_size = sizeof(ConfinePC),
137 });
138 pixel_ctx.stage_image(confine_input);
139 pixel_ctx.set_push_constants(ConfinePC {
140 .src_x = src_x, .src_y = src_y, .src_w = src_w, .src_h = src_h,
141 .out_w = out_w, .out_h = out_h });
142 pixel_ctx.prepare_output_image(out_w, out_h);
143 pixel_ctx.set_output_dimensions(out_w, out_h);
144
145 const auto fence = pixel_ctx.dispatch_async({});
146 pixel_ctx.clear_output_dimensions();
147 foundry.wait_for_fence(fence);
148 foundry.release_fence(fence);
149
150 auto confined = pixel_ctx.get_output_image(0);
151
152 contexts.pass.result.images.confine = confined;
153 contexts.pass.current = confined;
154 contexts.pass.result.structured = std::monostate {};
155 contexts.bound_staged.reset();
156
157 contexts.pass.set_geometry(out_w, out_h);
158 contexts.pass.storage_w = out_w;
159 contexts.pass.storage_h = out_h;
160
161 return { .output = confined, .input = confine_input };
162}
vk::Fence fence
uint32_t h
Definition InkPress.cpp:29
uint32_t out_h
float src_w
float src_h
float src_y
float src_x
uint32_t out_w
MAYAFLUX_API ShaderFoundry & get_shader_foundry()
Get the global shader compiler instance.
constexpr std::array< uint32_t, 3 > k_wg2d
Standard 2D workgroup used by all pixel-to-pixel vision shaders.

References MayaFlux::Yantra::VisionGpuContexts::bound_staged, MayaFlux::Kinesis::Vision::ConfineParams::bounds, MayaFlux::Kinesis::Vision::ImageOutputs::confine, MayaFlux::Kinesis::Vision::VisionPass< Handle >::current, fence, MayaFlux::Portal::Graphics::get_shader_foundry(), MayaFlux::Kinesis::Vision::BoundingBox::h, MayaFlux::Kinesis::Vision::VisionPass< Handle >::h, h, MayaFlux::Kinesis::Vision::VisionResult::images, MayaFlux::Yantra::VisionInternal::k_wg2d, out_h, out_w, MayaFlux::Yantra::VisionGpuContexts::pass, MayaFlux::Yantra::VisionGpuContexts::pixel, MayaFlux::Kinesis::Vision::ConfineParams::resize_to_source, MayaFlux::Kinesis::Vision::VisionPass< Handle >::result, MayaFlux::Kinesis::Vision::VisionPass< Handle >::set_geometry(), src_h, src_w, MayaFlux::Yantra::VisionInternal::ConfinePC::src_x, src_x, src_y, MayaFlux::Kinesis::Vision::VisionPass< Handle >::storage_h, MayaFlux::Kinesis::Vision::VisionPass< Handle >::storage_w, MayaFlux::Kinesis::Vision::VisionResult::structured, MayaFlux::Kinesis::Vision::BoundingBox::w, MayaFlux::Kinesis::Vision::VisionPass< Handle >::w, MayaFlux::Kinesis::Vision::BoundingBox::x, and MayaFlux::Kinesis::Vision::BoundingBox::y.

+ Here is the call graph for this function: