コード例 #1
0
ファイル: vr.cpp プロジェクト: aonorin/vulkan-cpp-library
int vr_type::run(const draw_callback_type &draw_callback,
		const event_callback_type &event_callback) {
	vcc::command_pool::command_pool_type command_pool(
		vcc::command_pool::create(vcc::internal::get_parent(*queue),
			0, vcc::queue::get_family_index(*queue)));
	vcc::command_buffer::command_buffer_type pre_draw_command_buffer(std::move(
		vcc::command_buffer::allocate(vcc::internal::get_parent(*queue),
			std::ref(command_pool), VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1)
		.front())),
		post_draw_command_buffer(std::move(vcc::command_buffer::allocate(
			vcc::internal::get_parent(*queue), std::ref(command_pool),
			VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1).front()));

	vcc::command::compile(
		vcc::command::build(std::ref(pre_draw_command_buffer), 0, VK_FALSE, 0, 0),
		vcc::command::pipeline_barrier(
			VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
			VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, {},
			{}, {
				vcc::command::image_memory_barrier{ 0, 0,
					VK_IMAGE_LAYOUT_UNDEFINED,
					VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
					VK_QUEUE_FAMILY_IGNORED,
					vcc::queue::get_family_index(*queue),
					std::ref(image),
					{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
				}
			}));
	vcc::command::compile(
		vcc::command::build(std::ref(post_draw_command_buffer), 0, VK_FALSE, 0, 0),
		vcc::command::pipeline_barrier(
			VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
			VK_PIPELINE_STAGE_TRANSFER_BIT, 0, {}, {},
			{
				vcc::command::image_memory_barrier{ 0, 0,
					VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
					VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
					VK_QUEUE_FAMILY_IGNORED,
					VK_QUEUE_FAMILY_IGNORED,
					std::ref(image),
					{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
				}
			}));

	std::array<vr::TrackedDevicePose_t, vr::k_unMaxTrackedDeviceCount>
		trackedDevicePose;
	std::array<glm::mat4x3, vr::k_unMaxTrackedDeviceCount> mat4DevicePose;
	std::array<bool, vr::k_unMaxTrackedDeviceCount> bPoseIsValid;
	for (;;) {
		vr::VREvent_t event;
		while (hmd.hmd->PollNextEvent(&event, sizeof(event))) {
			event_callback(event);
		}

		for (vr::TrackedDeviceIndex_t unDevice = 0;
			unDevice < vr::k_unMaxTrackedDeviceCount; unDevice++) {
			vr::VRControllerState_t state;
			if (hmd.hmd->GetControllerState(unDevice, &state, sizeof(vr::VRControllerState_t))) {
				//m_rbShowTrackedDevice[unDevice] = state.ulButtonPressed == 0;
			}
		}
		vr::IVRCompositor *compositor(vr::VRCompositor());
		compositor->WaitGetPoses(trackedDevicePose.data(),
			vr::k_unMaxTrackedDeviceCount, NULL, 0);

		for (int nDevice = 0; nDevice < vr::k_unMaxTrackedDeviceCount; ++nDevice) {
			bPoseIsValid[nDevice] = trackedDevicePose[nDevice].bPoseIsValid;
			if (bPoseIsValid[nDevice]) {
				mat4DevicePose[nDevice] = convert(
					trackedDevicePose[nDevice].mDeviceToAbsoluteTracking);
			}
		}

		type::supplier<const vcc::device::device_type> device(
			vcc::internal::get_parent(*queue));

		vcc::queue::submit(*queue, { }, { pre_draw_command_buffer }, {});

		draw_callback(mat4DevicePose);

		vcc::queue::submit(*queue, {}, { post_draw_command_buffer }, { });

		vr::VRVulkanTextureData_t texture_data{
			uint64_t(VkImage(vcc::internal::get_instance(image))),
			vcc::internal::get_instance(*device),
			vcc::device::get_physical_device(*device),
			vcc::internal::get_instance(*instance),
			vcc::internal::get_instance(*queue),
			vcc::queue::get_family_index(*queue),
			extent.width, extent.height, VK_FORMAT_R8G8B8A8_UNORM, 1
		};
		const vr::Texture_t texdesc = { (void*)&texture_data,
			vr::TextureType_Vulkan, vr::ColorSpace_Gamma };
		{
			const vr::VRTextureBounds_t bounds = { 0.f, 0.f, .5f, 1.f };
			vr::EVRCompositorError error(compositor->Submit(vr::Eye_Left, &texdesc, &bounds));
			assert(error == vr::VRCompositorError_None);
		}
		{
			const vr::VRTextureBounds_t bounds = { .5f, 0.f, 1.f, 1.f };
			vr::EVRCompositorError error(compositor->Submit(vr::Eye_Right, &texdesc, &bounds));
			assert(error == vr::VRCompositorError_None);
		}
	}
}
コード例 #2
0
ファイル: vk_misc_funcs.cpp プロジェクト: Althar93/renderdoc
bool WrappedVulkan::ReleaseResource(WrappedVkRes *res)
{
	if(res == NULL) return true;

	// MULTIDEVICE need to get the actual device that created this object
	VkDevice dev = GetDev();
	const VkLayerDispatchTable *vt = ObjDisp(dev);

	WrappedVkNonDispRes *nondisp = (WrappedVkNonDispRes *)res;
	WrappedVkDispRes *disp = (WrappedVkDispRes *)res;
	uint64_t handle = (uint64_t)nondisp;

	switch(IdentifyTypeByPtr(res))
	{
		case eResSurface:
		case eResSwapchain:
			if(m_State >= WRITING)
				RDCERR("Swapchain/swapchain object is leaking");
			else
				RDCERR("Should be no swapchain/surface objects created on replay");
			break;

		case eResUnknown:
			RDCERR("Unknown resource type!");
			break;
			
		case eResCommandBuffer:
			// special case here, on replay we don't have the tracking
			// to remove these with the parent object so do it here.
			// This ensures we clean up after ourselves with a well-
			// behaved application.
			if(m_State < WRITING)
				GetResourceManager()->ReleaseWrappedResource((VkCommandBuffer)res);
			break;
		case eResDescriptorSet:
			if(m_State < WRITING)
				GetResourceManager()->ReleaseWrappedResource(VkDescriptorSet(handle));
			break;
		case eResPhysicalDevice:
			if(m_State < WRITING)
				GetResourceManager()->ReleaseWrappedResource((VkPhysicalDevice)disp);
			break;
		case eResQueue:
			if(m_State < WRITING)
				GetResourceManager()->ReleaseWrappedResource((VkQueue)disp);
			break;
			
		case eResDevice:
			// these are explicitly released elsewhere, do not need to destroy
			// any API objects.
			// On replay though we do need to tidy up book-keeping for these.
			if(m_State < WRITING)
			{
				GetResourceManager()->ReleaseCurrentResource(disp->id);
				GetResourceManager()->RemoveWrapper(ToTypedHandle(disp->real.As<VkDevice>()));
			}
			break;
		case eResInstance:
			if(m_State < WRITING)
			{
				GetResourceManager()->ReleaseCurrentResource(disp->id);
				GetResourceManager()->RemoveWrapper(ToTypedHandle(disp->real.As<VkInstance>()));
			}
			break;

		case eResDeviceMemory:
		{
			VkDeviceMemory real = nondisp->real.As<VkDeviceMemory>();
			GetResourceManager()->ReleaseWrappedResource(VkDeviceMemory(handle));
			vt->FreeMemory(Unwrap(dev), real, NULL);
			break;
		}
		case eResBuffer:
		{
			VkBuffer real = nondisp->real.As<VkBuffer>();
			GetResourceManager()->ReleaseWrappedResource(VkBuffer(handle));
			vt->DestroyBuffer(Unwrap(dev), real, NULL);
			break;
		}
		case eResBufferView:
		{
			VkBufferView real = nondisp->real.As<VkBufferView>();
			GetResourceManager()->ReleaseWrappedResource(VkBufferView(handle));
			vt->DestroyBufferView(Unwrap(dev), real, NULL);
			break;
		}
		case eResImage:
		{
			VkImage real = nondisp->real.As<VkImage>();
			GetResourceManager()->ReleaseWrappedResource(VkImage(handle));
			vt->DestroyImage(Unwrap(dev), real, NULL);
			break;
		}
		case eResImageView:
		{
			VkImageView real = nondisp->real.As<VkImageView>();
			GetResourceManager()->ReleaseWrappedResource(VkImageView(handle));
			vt->DestroyImageView(Unwrap(dev), real, NULL);
			break;
		}
		case eResFramebuffer:
		{
			VkFramebuffer real = nondisp->real.As<VkFramebuffer>();
			GetResourceManager()->ReleaseWrappedResource(VkFramebuffer(handle));
			vt->DestroyFramebuffer(Unwrap(dev), real, NULL);
			break;
		}
		case eResRenderPass:
		{
			VkRenderPass real = nondisp->real.As<VkRenderPass>();
			GetResourceManager()->ReleaseWrappedResource(VkRenderPass(handle));
			vt->DestroyRenderPass(Unwrap(dev), real, NULL);
			break;
		}
		case eResShaderModule:
		{
			VkShaderModule real = nondisp->real.As<VkShaderModule>();
			GetResourceManager()->ReleaseWrappedResource(VkShaderModule(handle));
			vt->DestroyShaderModule(Unwrap(dev), real, NULL);
			break;
		}
		case eResPipelineCache:
		{
			VkPipelineCache real = nondisp->real.As<VkPipelineCache>();
			GetResourceManager()->ReleaseWrappedResource(VkPipelineCache(handle));
			vt->DestroyPipelineCache(Unwrap(dev), real, NULL);
			break;
		}
		case eResPipelineLayout:
		{
			VkPipelineLayout real = nondisp->real.As<VkPipelineLayout>();
			GetResourceManager()->ReleaseWrappedResource(VkPipelineLayout(handle));
			vt->DestroyPipelineLayout(Unwrap(dev), real, NULL);
			break;
		}
		case eResPipeline:
		{
			VkPipeline real = nondisp->real.As<VkPipeline>();
			GetResourceManager()->ReleaseWrappedResource(VkPipeline(handle));
			vt->DestroyPipeline(Unwrap(dev), real, NULL);
			break;
		}
		case eResSampler:
		{
			VkSampler real = nondisp->real.As<VkSampler>();
			GetResourceManager()->ReleaseWrappedResource(VkSampler(handle));
			vt->DestroySampler(Unwrap(dev), real, NULL);
			break;
		}
		case eResDescriptorPool:
		{
			VkDescriptorPool real = nondisp->real.As<VkDescriptorPool>();
			GetResourceManager()->ReleaseWrappedResource(VkDescriptorPool(handle));
			vt->DestroyDescriptorPool(Unwrap(dev), real, NULL);
			break;
		}
		case eResDescriptorSetLayout:
		{
			VkDescriptorSetLayout real = nondisp->real.As<VkDescriptorSetLayout>();
			GetResourceManager()->ReleaseWrappedResource(VkDescriptorSetLayout(handle));
			vt->DestroyDescriptorSetLayout(Unwrap(dev), real, NULL);
			break;
		}
		case eResCommandPool:
		{
			VkCommandPool real = nondisp->real.As<VkCommandPool>();
			GetResourceManager()->ReleaseWrappedResource(VkCommandPool(handle));
			vt->DestroyCommandPool(Unwrap(dev), real, NULL);
			break;
		}
		case eResFence:
		{
			VkFence real = nondisp->real.As<VkFence>();
			GetResourceManager()->ReleaseWrappedResource(VkFence(handle));
			vt->DestroyFence(Unwrap(dev), real, NULL);
			break;
		}
		case eResEvent:
		{
			VkEvent real = nondisp->real.As<VkEvent>();
			GetResourceManager()->ReleaseWrappedResource(VkEvent(handle));
			vt->DestroyEvent(Unwrap(dev), real, NULL);
			break;
		}
		case eResQueryPool:
		{
			VkQueryPool real = nondisp->real.As<VkQueryPool>();
			GetResourceManager()->ReleaseWrappedResource(VkQueryPool(handle));
			vt->DestroyQueryPool(Unwrap(dev), real, NULL);
			break;
		}
		case eResSemaphore:
		{
			VkSemaphore real = nondisp->real.As<VkSemaphore>();
			GetResourceManager()->ReleaseWrappedResource(VkSemaphore(handle));
			vt->DestroySemaphore(Unwrap(dev), real, NULL);
			break;
		}
	}

	return true;
}