VapourSynth-llvmexpr
Loading...
Searching...
No Matches
vkexpr::VkExprExecutor::Impl Struct Reference
Collaboration diagram for vkexpr::VkExprExecutor::Impl:

Classes

struct  PlaneResources
struct  Stream

Public Member Functions

 Impl (int device_id, int num_streams, int num_inputs, std::array< std::vector< std::string >, 3 > glsl_stages, std::uint32_t num_props_floats)
int acquireStreamIndex ()
void releaseStreamIndex (int idx)
void drain ()

Public Attributes

VulkanContextcontext = nullptr
int num_inputs = 0
std::uint32_t num_props_floats = 0
std::array< std::vector< std::string >, 3 > glsl_stages
int num_streams = 0
std::vector< std::unique_ptr< Stream > > streams
std::counting_semaphore semaphore {0}
std::queue< int > free_stream_indices
std::mutex stream_mutex

Detailed Description

Definition at line 272 of file VkExprExecutor.cpp.

Constructor & Destructor Documentation

◆ Impl()

vkexpr::VkExprExecutor::Impl::Impl ( int device_id,
int num_streams,
int num_inputs,
std::array< std::vector< std::string >, 3 > glsl_stages,
std::uint32_t num_props_floats )
inline

Definition at line 349 of file VkExprExecutor.cpp.

352 : context(&VulkanContext::getInstance(device_id)),
356 [[unlikely]] if (num_inputs <= 0) {
357 throw std::runtime_error("VkExprExecutor: num_inputs must be > 0.");
358 }
359 [[unlikely]] if (num_streams <= 0) {
360 throw std::runtime_error(
361 "VkExprExecutor: num_streams must be > 0.");
362 }
363
364 auto& ctx = *context;
365 streams.resize(static_cast<size_t>(num_streams));
366 for (int k = 0; k < num_streams; ++k) {
367 streams[static_cast<size_t>(k)] = std::make_unique<Stream>();
368 auto& stream = *streams[static_cast<size_t>(k)];
369 stream.memory = std::make_unique<VulkanMemory>(ctx);
370 free_stream_indices.push(k);
371
372 vk::CommandPoolCreateInfo pool_info(
373 vk::CommandPoolCreateFlagBits::eResetCommandBuffer,
374 ctx.getQueueFamilyIndex());
375 stream.command_pool =
376 vk::raii::CommandPool(ctx.getDevice(), pool_info);
377
378 vk::CommandBufferAllocateInfo cmd_info(
379 *stream.command_pool, vk::CommandBufferLevel::ePrimary, 1);
380 auto cmd_buffers =
381 vk::raii::CommandBuffers(ctx.getDevice(), cmd_info);
382 stream.command_buffer = std::move(cmd_buffers[0]);
383
384 vk::FenceCreateInfo fence_info;
385 stream.fence = vk::raii::Fence(ctx.getDevice(), fence_info);
386
387 for (int plane = 0; plane < 3; ++plane) {
388 if (this->glsl_stages.at(plane).empty()) {
389 continue;
390 }
391 auto& plane_pipelines = stream.pipelines.at(plane);
392 auto& stages = this->glsl_stages.at(plane);
393 plane_pipelines.resize(stages.size());
394
395 for (size_t s = 0; s < stages.size(); ++s) {
396 plane_pipelines[s] =
397 std::make_unique<VulkanComputePipeline>(
398 ctx, stages[s],
399 static_cast<std::uint32_t>(num_inputs +
400 static_cast<int>(s)),
402 }
403 }
404 }
405 }
static VulkanContext & getInstance()
std::array< std::vector< std::string >, 3 > glsl_stages
std::queue< int > free_stream_indices
std::vector< std::unique_ptr< Stream > > streams
std::counting_semaphore semaphore

References context, free_stream_indices, glsl_stages, num_inputs, num_props_floats, num_streams, semaphore, and streams.

Member Function Documentation

◆ acquireStreamIndex()

int vkexpr::VkExprExecutor::Impl::acquireStreamIndex ( )
inline

Definition at line 407 of file VkExprExecutor.cpp.

407 {
408 semaphore.acquire();
409 std::lock_guard<std::mutex> lock(stream_mutex);
410 int idx = free_stream_indices.front();
412 return idx;
413 }

References free_stream_indices, semaphore, and stream_mutex.

◆ drain()

void vkexpr::VkExprExecutor::Impl::drain ( )
inline

Definition at line 423 of file VkExprExecutor.cpp.

423 {
424 for (int i = 0; i < num_streams; ++i) {
425 semaphore.acquire();
426 }
427 }

References num_streams, and semaphore.

◆ releaseStreamIndex()

void vkexpr::VkExprExecutor::Impl::releaseStreamIndex ( int idx)
inline

Definition at line 415 of file VkExprExecutor.cpp.

415 {
416 {
417 std::lock_guard<std::mutex> lock(stream_mutex);
418 free_stream_indices.push(idx);
419 }
420 semaphore.release();
421 }

References free_stream_indices, semaphore, and stream_mutex.

Member Data Documentation

◆ context

VulkanContext* vkexpr::VkExprExecutor::Impl::context = nullptr

Definition at line 338 of file VkExprExecutor.cpp.

Referenced by Impl().

◆ free_stream_indices

std::queue<int> vkexpr::VkExprExecutor::Impl::free_stream_indices

Definition at line 346 of file VkExprExecutor.cpp.

Referenced by acquireStreamIndex(), Impl(), and releaseStreamIndex().

◆ glsl_stages

std::array<std::vector<std::string>, 3> vkexpr::VkExprExecutor::Impl::glsl_stages

Definition at line 341 of file VkExprExecutor.cpp.

Referenced by Impl().

◆ num_inputs

int vkexpr::VkExprExecutor::Impl::num_inputs = 0

Definition at line 339 of file VkExprExecutor.cpp.

Referenced by Impl().

◆ num_props_floats

std::uint32_t vkexpr::VkExprExecutor::Impl::num_props_floats = 0

Definition at line 340 of file VkExprExecutor.cpp.

Referenced by Impl().

◆ num_streams

int vkexpr::VkExprExecutor::Impl::num_streams = 0

Definition at line 343 of file VkExprExecutor.cpp.

Referenced by drain(), and Impl().

◆ semaphore

std::counting_semaphore vkexpr::VkExprExecutor::Impl::semaphore {0}

Definition at line 345 of file VkExprExecutor.cpp.

345{0};

Referenced by acquireStreamIndex(), drain(), Impl(), and releaseStreamIndex().

◆ stream_mutex

std::mutex vkexpr::VkExprExecutor::Impl::stream_mutex

Definition at line 347 of file VkExprExecutor.cpp.

Referenced by acquireStreamIndex(), and releaseStreamIndex().

◆ streams

std::vector<std::unique_ptr<Stream> > vkexpr::VkExprExecutor::Impl::streams

Definition at line 344 of file VkExprExecutor.cpp.

Referenced by Impl().


The documentation for this struct was generated from the following file: