diff options
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.cpp | 182 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.h | 95 |
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 | ||
| 471 | Device 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 | |||
| 495 | Queue 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 | |||
| 501 | Buffer 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 | |||
| 507 | BufferView 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 | |||
| 513 | Image 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 | |||
| 519 | ImageView 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 | |||
| 525 | Semaphore 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 | |||
| 536 | Fence 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 | |||
| 542 | DescriptorPool 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 | |||
| 548 | RenderPass 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 | |||
| 554 | DescriptorSetLayout 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 | |||
| 561 | PipelineLayout 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 | |||
| 567 | Pipeline 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 | |||
| 573 | Pipeline 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 | |||
| 579 | Sampler 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 | |||
| 585 | Framebuffer 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 | |||
| 591 | CommandPool 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 | |||
| 597 | DescriptorUpdateTemplateKHR 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 | |||
| 604 | QueryPool 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 | |||
| 610 | ShaderModule 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 | |||
| 616 | SwapchainKHR 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 | |||
| 622 | DeviceMemory 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 | |||
| 630 | DeviceMemory 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 | |||
| 636 | VkMemoryRequirements Device::GetBufferMemoryRequirements(VkBuffer buffer) const noexcept { | ||
| 637 | VkMemoryRequirements requirements; | ||
| 638 | dld->vkGetBufferMemoryRequirements(handle, buffer, &requirements); | ||
| 639 | return requirements; | ||
| 640 | } | ||
| 641 | |||
| 642 | VkMemoryRequirements Device::GetImageMemoryRequirements(VkImage image) const noexcept { | ||
| 643 | VkMemoryRequirements requirements; | ||
| 644 | dld->vkGetImageMemoryRequirements(handle, image, &requirements); | ||
| 645 | return requirements; | ||
| 646 | } | ||
| 647 | |||
| 648 | void 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 | ||
| 657 | class Device : public Handle<VkDevice, NoOwner, DeviceDispatch> { | ||
| 658 | using Handle<VkDevice, NoOwner, DeviceDispatch>::Handle; | ||
| 659 | |||
| 660 | public: | ||
| 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 |