コード例 #1
0
ファイル: Platform.cpp プロジェクト: Lizard-13/GD
bool Platform::AddExtension(std::shared_ptr<gd::PlatformExtension> extension) {
  if (!extension) return false;

  std::cout << "Loading " << extension->GetName() << "...";
  if (IsExtensionLoaded(extension->GetName())) {
    std::cout << " (replacing existing extension)";
    RemoveExtension(extension->GetName());
  }
  std::cout << std::endl;

  extensionsLoaded.push_back(extension);

  // Load all creation/destruction functions for objects provided by the
  // extension
  vector<gd::String> objectsTypes = extension->GetExtensionObjectsTypes();
  for (std::size_t i = 0; i < objectsTypes.size(); ++i) {
    creationFunctionTable[objectsTypes[i]] =
        extension->GetObjectCreationFunctionPtr(objectsTypes[i]);
  }

  return true;
}
コード例 #2
0
ファイル: VkDevice.cpp プロジェクト: Ilearn32/NazaraEngine
		bool Device::Create(VkPhysicalDevice device, const VkDeviceCreateInfo& createInfo, const VkAllocationCallbacks* allocator)
		{
			m_lastErrorCode = m_instance.vkCreateDevice(device, &createInfo, allocator, &m_device);
			if (m_lastErrorCode != VkResult::VK_SUCCESS)
			{
				NazaraError("Failed to create Vulkan device");
				return false;
			}

			// Store the allocator to access them when needed
			if (allocator)
				m_allocator = *allocator;
			else
				m_allocator.pfnAllocation = nullptr;

			// Parse extensions and layers
			for (UInt32 i = 0; i < createInfo.enabledExtensionCount; ++i)
				m_loadedExtensions.insert(createInfo.ppEnabledExtensionNames[i]);

			for (UInt32 i = 0; i < createInfo.enabledLayerCount; ++i)
				m_loadedLayers.insert(createInfo.ppEnabledLayerNames[i]);

			#define NAZARA_VULKAN_LOAD_DEVICE(func) func = reinterpret_cast<PFN_##func>(GetProcAddr(#func))

			try
			{
				ErrorFlags flags(ErrorFlag_ThrowException, true);

				NAZARA_VULKAN_LOAD_DEVICE(vkAllocateCommandBuffers);
				NAZARA_VULKAN_LOAD_DEVICE(vkAllocateMemory);
				NAZARA_VULKAN_LOAD_DEVICE(vkBeginCommandBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkBindBufferMemory);
				NAZARA_VULKAN_LOAD_DEVICE(vkBindImageMemory);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdBeginQuery);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdBeginRenderPass);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdBindDescriptorSets);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdBindIndexBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdBindPipeline);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdBindVertexBuffers);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdBlitImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdClearAttachments);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdClearColorImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdClearDepthStencilImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdCopyBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdCopyBufferToImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdCopyImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdCopyImageToBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdCopyQueryPoolResults);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdDispatch);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdDispatchIndirect);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdDraw);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdDrawIndexed);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdDrawIndexedIndirect);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdDrawIndirect);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdEndQuery);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdEndRenderPass);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdExecuteCommands);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdFillBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdNextSubpass);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdPipelineBarrier);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdPushConstants);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdResetEvent);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdResetQueryPool);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdResolveImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetBlendConstants);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetDepthBias);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetDepthBounds);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetEvent);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetLineWidth);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetScissor);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetStencilCompareMask);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetStencilReference);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetStencilWriteMask);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdSetViewport);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdUpdateBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdWaitEvents);
				NAZARA_VULKAN_LOAD_DEVICE(vkCmdWriteTimestamp);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateBufferView);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateCommandPool);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateComputePipelines);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateDescriptorPool);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateDescriptorSetLayout);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateEvent);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateFramebuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateGraphicsPipelines);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateImageView);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreatePipelineLayout);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateRenderPass);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateSampler);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateSemaphore);
				NAZARA_VULKAN_LOAD_DEVICE(vkCreateShaderModule);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyBufferView);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyCommandPool);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyDescriptorPool);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyDescriptorSetLayout);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyDevice);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyEvent);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyFramebuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyImage);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyImageView);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyPipeline);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyPipelineLayout);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyRenderPass);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroySampler);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroySemaphore);
				NAZARA_VULKAN_LOAD_DEVICE(vkDestroyShaderModule);
				NAZARA_VULKAN_LOAD_DEVICE(vkDeviceWaitIdle);
				NAZARA_VULKAN_LOAD_DEVICE(vkEndCommandBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkFreeCommandBuffers);
				NAZARA_VULKAN_LOAD_DEVICE(vkFreeDescriptorSets);
				NAZARA_VULKAN_LOAD_DEVICE(vkFreeMemory);
				NAZARA_VULKAN_LOAD_DEVICE(vkFlushMappedMemoryRanges);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetBufferMemoryRequirements);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetDeviceMemoryCommitment);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetDeviceQueue);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetEventStatus);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetFenceStatus);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetImageMemoryRequirements);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetImageSparseMemoryRequirements);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetImageSubresourceLayout);
				NAZARA_VULKAN_LOAD_DEVICE(vkGetRenderAreaGranularity);
				NAZARA_VULKAN_LOAD_DEVICE(vkInvalidateMappedMemoryRanges);
				NAZARA_VULKAN_LOAD_DEVICE(vkMapMemory);
				NAZARA_VULKAN_LOAD_DEVICE(vkMergePipelineCaches);
				NAZARA_VULKAN_LOAD_DEVICE(vkQueueSubmit);
				NAZARA_VULKAN_LOAD_DEVICE(vkQueueWaitIdle);
				NAZARA_VULKAN_LOAD_DEVICE(vkResetCommandBuffer);
				NAZARA_VULKAN_LOAD_DEVICE(vkResetCommandPool);
				NAZARA_VULKAN_LOAD_DEVICE(vkResetDescriptorPool);
				NAZARA_VULKAN_LOAD_DEVICE(vkResetFences);
				NAZARA_VULKAN_LOAD_DEVICE(vkResetEvent);
				NAZARA_VULKAN_LOAD_DEVICE(vkSetEvent);
				NAZARA_VULKAN_LOAD_DEVICE(vkUnmapMemory);
				NAZARA_VULKAN_LOAD_DEVICE(vkUpdateDescriptorSets);
				NAZARA_VULKAN_LOAD_DEVICE(vkWaitForFences);

				// VK_KHR_display_swapchain
				if (IsExtensionLoaded("VK_KHR_display_swapchain"))
					NAZARA_VULKAN_LOAD_DEVICE(vkCreateSharedSwapchainsKHR);

				// VK_KHR_swapchain
				if (IsExtensionLoaded("VK_KHR_swapchain"))
				{
					NAZARA_VULKAN_LOAD_DEVICE(vkAcquireNextImageKHR);
					NAZARA_VULKAN_LOAD_DEVICE(vkCreateSwapchainKHR);
					NAZARA_VULKAN_LOAD_DEVICE(vkDestroySwapchainKHR);
					NAZARA_VULKAN_LOAD_DEVICE(vkGetSwapchainImagesKHR);
					NAZARA_VULKAN_LOAD_DEVICE(vkQueuePresentKHR);
				}
			}
			catch (const std::exception& e)
			{
				NazaraError(String("Failed to query device function: ") + e.what());
				return false;
			}

			#undef NAZARA_VULKAN_LOAD_DEVICE

			return true;
		}
コード例 #3
0
ファイル: VkInstance.cpp プロジェクト: Ilearn32/NazaraEngine
		bool Instance::Create(const VkInstanceCreateInfo& createInfo, const VkAllocationCallbacks* allocator)
		{
			m_lastErrorCode = Loader::vkCreateInstance(&createInfo, allocator, &m_instance);
			if (m_lastErrorCode != VkResult::VK_SUCCESS)
			{
				NazaraError("Failed to create Vulkan instance");
				return false;
			}

			// Store the allocator to access them when needed
			if (allocator)
				m_allocator = *allocator;
			else
				m_allocator.pfnAllocation = nullptr;

			// Parse extensions and layers
			for (UInt32 i = 0; i < createInfo.enabledExtensionCount; ++i)
				m_loadedExtensions.insert(createInfo.ppEnabledExtensionNames[i]);

			for (UInt32 i = 0; i < createInfo.enabledLayerCount; ++i)
				m_loadedLayers.insert(createInfo.ppEnabledLayerNames[i]);

			// And now load everything
			#define NAZARA_VULKAN_LOAD_INSTANCE(func) func = reinterpret_cast<PFN_##func>(GetProcAddr(#func))

			try
			{
				ErrorFlags flags(ErrorFlag_ThrowException, true);

				// Vulkan core
				NAZARA_VULKAN_LOAD_INSTANCE(vkCreateDevice);
				NAZARA_VULKAN_LOAD_INSTANCE(vkDestroyInstance);
				NAZARA_VULKAN_LOAD_INSTANCE(vkEnumeratePhysicalDevices);
				NAZARA_VULKAN_LOAD_INSTANCE(vkGetDeviceProcAddr);
				NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceFeatures);
				NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceFormatProperties);
				NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceImageFormatProperties);
				NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceMemoryProperties);
				NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceProperties);
				NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceQueueFamilyProperties);

				// VK_KHR_display
				if (IsExtensionLoaded("VK_KHR_display"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateDisplayModeKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateDisplayPlaneSurfaceKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetDisplayModePropertiesKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetDisplayPlaneCapabilitiesKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetDisplayPlaneSupportedDisplaysKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceDisplayPlanePropertiesKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceDisplayPropertiesKHR);
				}

				// VK_KHR_surface
				if (IsExtensionLoaded("VK_KHR_surface"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkDestroySurfaceKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceSurfaceCapabilitiesKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceSurfaceFormatsKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceSurfacePresentModesKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceSurfaceSupportKHR);
				}

				// VK_EXT_debug_report
				if (IsExtensionLoaded("VK_EXT_debug_report"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateDebugReportCallbackEXT);
					NAZARA_VULKAN_LOAD_INSTANCE(vkDestroyDebugReportCallbackEXT);
					NAZARA_VULKAN_LOAD_INSTANCE(vkDebugReportMessageEXT);
				}

				#ifdef VK_USE_PLATFORM_ANDROID_KHR
				// VK_KHR_android_surface
				if (IsExtensionLoaded("VK_KHR_android_surface"))
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateAndroidSurfaceKHR);
				#endif

				#ifdef VK_USE_PLATFORM_MIR_KHR
				// VK_KHR_mir_surface
				if (IsExtensionLoaded("VK_KHR_mir_surface"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateMirSurfaceKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceMirPresentationSupportKHR);
				}
				#endif

				#ifdef VK_USE_PLATFORM_XCB_KHR
				// VK_KHR_xcb_surface
				if (IsExtensionLoaded("VK_KHR_xcb_surface"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateXcbSurfaceKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceXcbPresentationSupportKHR);
				}
				#endif

				#ifdef VK_USE_PLATFORM_XLIB_KHR
				// VK_KHR_xlib_surface
				if (IsExtensionLoaded("VK_KHR_xlib_surface"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateXlibSurfaceKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceXlibPresentationSupportKHR);
				}
				#endif

				#ifdef VK_USE_PLATFORM_WAYLAND_KHR
				// VK_KHR_wayland_surface
				if (IsExtensionLoaded("VK_KHR_wayland_surface"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateWaylandSurfaceKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceWaylandPresentationSupportKHR);
				}
				#endif

				#ifdef VK_USE_PLATFORM_WIN32_KHR
				// VK_KHR_win32_surface
				if (IsExtensionLoaded("VK_KHR_win32_surface"))
				{
					NAZARA_VULKAN_LOAD_INSTANCE(vkCreateWin32SurfaceKHR);
					NAZARA_VULKAN_LOAD_INSTANCE(vkGetPhysicalDeviceWin32PresentationSupportKHR);
				}
				#endif
			}
			catch (const std::exception& e)
			{
				NazaraError(String("Failed to query instance function: ") + e.what());
				return false;
			}

			#undef NAZARA_VULKAN_LOAD_INSTANCE

			return true;
		}