summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/wrapper.cpp182
-rw-r--r--src/video_core/renderer_vulkan/wrapper.h95
2 files changed, 277 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp
index decb34a4c..0795fbcc6 100644
--- a/src/video_core/renderer_vulkan/wrapper.cpp
+++ b/src/video_core/renderer_vulkan/wrapper.cpp
@@ -468,4 +468,186 @@ std::vector<VkImage> SwapchainKHR::GetImages() const {
468 return images; 468 return images;
469} 469}
470 470
471Device Device::Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci,
472 Span<const char*> enabled_extensions,
473 const VkPhysicalDeviceFeatures2& enabled_features,
474 DeviceDispatch& dld) noexcept {
475 VkDeviceCreateInfo ci;
476 ci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
477 ci.pNext = &enabled_features;
478 ci.flags = 0;
479 ci.queueCreateInfoCount = queues_ci.size();
480 ci.pQueueCreateInfos = queues_ci.data();
481 ci.enabledLayerCount = 0;
482 ci.ppEnabledLayerNames = nullptr;
483 ci.enabledExtensionCount = enabled_extensions.size();
484 ci.ppEnabledExtensionNames = enabled_extensions.data();
485 ci.pEnabledFeatures = nullptr;
486
487 VkDevice device;
488 if (dld.vkCreateDevice(physical_device, &ci, nullptr, &device) != VK_SUCCESS) {
489 return {};
490 }
491 Load(device, dld);
492 return Device(device, dld);
493}
494
495Queue Device::GetQueue(u32 family_index) const noexcept {
496 VkQueue queue;
497 dld->vkGetDeviceQueue(handle, family_index, 0, &queue);
498 return Queue(queue, *dld);
499}
500
501Buffer Device::CreateBuffer(const VkBufferCreateInfo& ci) const {
502 VkBuffer object;
503 Check(dld->vkCreateBuffer(handle, &ci, nullptr, &object));
504 return Buffer(object, handle, *dld);
505}
506
507BufferView Device::CreateBufferView(const VkBufferViewCreateInfo& ci) const {
508 VkBufferView object;
509 Check(dld->vkCreateBufferView(handle, &ci, nullptr, &object));
510 return BufferView(object, handle, *dld);
511}
512
513Image Device::CreateImage(const VkImageCreateInfo& ci) const {
514 VkImage object;
515 Check(dld->vkCreateImage(handle, &ci, nullptr, &object));
516 return Image(object, handle, *dld);
517}
518
519ImageView Device::CreateImageView(const VkImageViewCreateInfo& ci) const {
520 VkImageView object;
521 Check(dld->vkCreateImageView(handle, &ci, nullptr, &object));
522 return ImageView(object, handle, *dld);
523}
524
525Semaphore Device::CreateSemaphore() const {
526 VkSemaphoreCreateInfo ci;
527 ci.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
528 ci.pNext = nullptr;
529 ci.flags = 0;
530
531 VkSemaphore object;
532 Check(dld->vkCreateSemaphore(handle, &ci, nullptr, &object));
533 return Semaphore(object, handle, *dld);
534}
535
536Fence Device::CreateFence(const VkFenceCreateInfo& ci) const {
537 VkFence object;
538 Check(dld->vkCreateFence(handle, &ci, nullptr, &object));
539 return Fence(object, handle, *dld);
540}
541
542DescriptorPool Device::CreateDescriptorPool(const VkDescriptorPoolCreateInfo& ci) const {
543 VkDescriptorPool object;
544 Check(dld->vkCreateDescriptorPool(handle, &ci, nullptr, &object));
545 return DescriptorPool(object, handle, *dld);
546}
547
548RenderPass Device::CreateRenderPass(const VkRenderPassCreateInfo& ci) const {
549 VkRenderPass object;
550 Check(dld->vkCreateRenderPass(handle, &ci, nullptr, &object));
551 return RenderPass(object, handle, *dld);
552}
553
554DescriptorSetLayout Device::CreateDescriptorSetLayout(
555 const VkDescriptorSetLayoutCreateInfo& ci) const {
556 VkDescriptorSetLayout object;
557 Check(dld->vkCreateDescriptorSetLayout(handle, &ci, nullptr, &object));
558 return DescriptorSetLayout(object, handle, *dld);
559}
560
561PipelineLayout Device::CreatePipelineLayout(const VkPipelineLayoutCreateInfo& ci) const {
562 VkPipelineLayout object;
563 Check(dld->vkCreatePipelineLayout(handle, &ci, nullptr, &object));
564 return PipelineLayout(object, handle, *dld);
565}
566
567Pipeline Device::CreateGraphicsPipeline(const VkGraphicsPipelineCreateInfo& ci) const {
568 VkPipeline object;
569 Check(dld->vkCreateGraphicsPipelines(handle, nullptr, 1, &ci, nullptr, &object));
570 return Pipeline(object, handle, *dld);
571}
572
573Pipeline Device::CreateComputePipeline(const VkComputePipelineCreateInfo& ci) const {
574 VkPipeline object;
575 Check(dld->vkCreateComputePipelines(handle, nullptr, 1, &ci, nullptr, &object));
576 return Pipeline(object, handle, *dld);
577}
578
579Sampler Device::CreateSampler(const VkSamplerCreateInfo& ci) const {
580 VkSampler object;
581 Check(dld->vkCreateSampler(handle, &ci, nullptr, &object));
582 return Sampler(object, handle, *dld);
583}
584
585Framebuffer Device::CreateFramebuffer(const VkFramebufferCreateInfo& ci) const {
586 VkFramebuffer object;
587 Check(dld->vkCreateFramebuffer(handle, &ci, nullptr, &object));
588 return Framebuffer(object, handle, *dld);
589}
590
591CommandPool Device::CreateCommandPool(const VkCommandPoolCreateInfo& ci) const {
592 VkCommandPool object;
593 Check(dld->vkCreateCommandPool(handle, &ci, nullptr, &object));
594 return CommandPool(object, handle, *dld);
595}
596
597DescriptorUpdateTemplateKHR Device::CreateDescriptorUpdateTemplateKHR(
598 const VkDescriptorUpdateTemplateCreateInfoKHR& ci) const {
599 VkDescriptorUpdateTemplateKHR object;
600 Check(dld->vkCreateDescriptorUpdateTemplateKHR(handle, &ci, nullptr, &object));
601 return DescriptorUpdateTemplateKHR(object, handle, *dld);
602}
603
604QueryPool Device::CreateQueryPool(const VkQueryPoolCreateInfo& ci) const {
605 VkQueryPool object;
606 Check(dld->vkCreateQueryPool(handle, &ci, nullptr, &object));
607 return QueryPool(object, handle, *dld);
608}
609
610ShaderModule Device::CreateShaderModule(const VkShaderModuleCreateInfo& ci) const {
611 VkShaderModule object;
612 Check(dld->vkCreateShaderModule(handle, &ci, nullptr, &object));
613 return ShaderModule(object, handle, *dld);
614}
615
616SwapchainKHR Device::CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const {
617 VkSwapchainKHR object;
618 Check(dld->vkCreateSwapchainKHR(handle, &ci, nullptr, &object));
619 return SwapchainKHR(object, handle, *dld);
620}
621
622DeviceMemory Device::TryAllocateMemory(const VkMemoryAllocateInfo& ai) const noexcept {
623 VkDeviceMemory memory;
624 if (dld->vkAllocateMemory(handle, &ai, nullptr, &memory) != VK_SUCCESS) {
625 return {};
626 }
627 return DeviceMemory(memory, handle, *dld);
628}
629
630DeviceMemory Device::AllocateMemory(const VkMemoryAllocateInfo& ai) const {
631 VkDeviceMemory memory;
632 Check(dld->vkAllocateMemory(handle, &ai, nullptr, &memory));
633 return DeviceMemory(memory, handle, *dld);
634}
635
636VkMemoryRequirements Device::GetBufferMemoryRequirements(VkBuffer buffer) const noexcept {
637 VkMemoryRequirements requirements;
638 dld->vkGetBufferMemoryRequirements(handle, buffer, &requirements);
639 return requirements;
640}
641
642VkMemoryRequirements Device::GetImageMemoryRequirements(VkImage image) const noexcept {
643 VkMemoryRequirements requirements;
644 dld->vkGetImageMemoryRequirements(handle, image, &requirements);
645 return requirements;
646}
647
648void Device::UpdateDescriptorSets(Span<VkWriteDescriptorSet> writes,
649 Span<VkCopyDescriptorSet> copies) const noexcept {
650 dld->vkUpdateDescriptorSets(handle, writes.size(), writes.data(), copies.size(), copies.data());
651}
652
471} // namespace Vulkan::vk 653} // namespace Vulkan::vk
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h
index d8976f3b0..6ac5a8f59 100644
--- a/src/video_core/renderer_vulkan/wrapper.h
+++ b/src/video_core/renderer_vulkan/wrapper.h
@@ -654,4 +654,99 @@ public:
654 std::vector<VkImage> GetImages() const; 654 std::vector<VkImage> GetImages() const;
655}; 655};
656 656
657class Device : public Handle<VkDevice, NoOwner, DeviceDispatch> {
658 using Handle<VkDevice, NoOwner, DeviceDispatch>::Handle;
659
660public:
661 static Device Create(VkPhysicalDevice physical_device, Span<VkDeviceQueueCreateInfo> queues_ci,
662 Span<const char*> enabled_extensions,
663 const VkPhysicalDeviceFeatures2& enabled_features,
664 DeviceDispatch& dld) noexcept;
665
666 Queue GetQueue(u32 family_index) const noexcept;
667
668 Buffer CreateBuffer(const VkBufferCreateInfo& ci) const;
669
670 BufferView CreateBufferView(const VkBufferViewCreateInfo& ci) const;
671
672 Image CreateImage(const VkImageCreateInfo& ci) const;
673
674 ImageView CreateImageView(const VkImageViewCreateInfo& ci) const;
675
676 Semaphore CreateSemaphore() const;
677
678 Fence CreateFence(const VkFenceCreateInfo& ci) const;
679
680 DescriptorPool CreateDescriptorPool(const VkDescriptorPoolCreateInfo& ci) const;
681
682 RenderPass CreateRenderPass(const VkRenderPassCreateInfo& ci) const;
683
684 DescriptorSetLayout CreateDescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo& ci) const;
685
686 PipelineLayout CreatePipelineLayout(const VkPipelineLayoutCreateInfo& ci) const;
687
688 Pipeline CreateGraphicsPipeline(const VkGraphicsPipelineCreateInfo& ci) const;
689
690 Pipeline CreateComputePipeline(const VkComputePipelineCreateInfo& ci) const;
691
692 Sampler CreateSampler(const VkSamplerCreateInfo& ci) const;
693
694 Framebuffer CreateFramebuffer(const VkFramebufferCreateInfo& ci) const;
695
696 CommandPool CreateCommandPool(const VkCommandPoolCreateInfo& ci) const;
697
698 DescriptorUpdateTemplateKHR CreateDescriptorUpdateTemplateKHR(
699 const VkDescriptorUpdateTemplateCreateInfoKHR& ci) const;
700
701 QueryPool CreateQueryPool(const VkQueryPoolCreateInfo& ci) const;
702
703 ShaderModule CreateShaderModule(const VkShaderModuleCreateInfo& ci) const;
704
705 SwapchainKHR CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const;
706
707 DeviceMemory TryAllocateMemory(const VkMemoryAllocateInfo& ai) const noexcept;
708
709 DeviceMemory AllocateMemory(const VkMemoryAllocateInfo& ai) const;
710
711 VkMemoryRequirements GetBufferMemoryRequirements(VkBuffer buffer) const noexcept;
712
713 VkMemoryRequirements GetImageMemoryRequirements(VkImage image) const noexcept;
714
715 void UpdateDescriptorSets(Span<VkWriteDescriptorSet> writes,
716 Span<VkCopyDescriptorSet> copies) const noexcept;
717
718 void UpdateDescriptorSet(VkDescriptorSet set, VkDescriptorUpdateTemplateKHR update_template,
719 const void* data) const noexcept {
720 dld->vkUpdateDescriptorSetWithTemplateKHR(handle, set, update_template, data);
721 }
722
723 VkResult AcquireNextImageKHR(VkSwapchainKHR swapchain, u64 timeout, VkSemaphore semaphore,
724 VkFence fence, u32* image_index) const noexcept {
725 return dld->vkAcquireNextImageKHR(handle, swapchain, timeout, semaphore, fence,
726 image_index);
727 }
728
729 VkResult WaitIdle() const noexcept {
730 return dld->vkDeviceWaitIdle(handle);
731 }
732
733 void ResetQueryPoolEXT(VkQueryPool query_pool, u32 first, u32 count) const noexcept {
734 dld->vkResetQueryPoolEXT(handle, query_pool, first, count);
735 }
736
737 void GetQueryResults(VkQueryPool query_pool, u32 first, u32 count, std::size_t data_size,
738 void* data, VkDeviceSize stride, VkQueryResultFlags flags) const {
739 Check(dld->vkGetQueryPoolResults(handle, query_pool, first, count, data_size, data, stride,
740 flags));
741 }
742
743 template <typename T>
744 T GetQueryResult(VkQueryPool query_pool, u32 first, VkQueryResultFlags flags) const {
745 static_assert(std::is_trivially_copyable_v<T>);
746 T value;
747 GetQueryResults(query_pool, first, 1, sizeof(T), &value, sizeof(T), flags);
748 return value;
749 }
750};
751
657} // namespace Vulkan::vk 752} // namespace Vulkan::vk