|  | // Copyright 2018 The SwiftShader Authors. All Rights Reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //    http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef VK_QUEUE_HPP_ | 
|  | #define VK_QUEUE_HPP_ | 
|  |  | 
|  | #include "VkObject.hpp" | 
|  | #include "Device/Renderer.hpp" | 
|  | #include <vulkan/vk_icd.h> | 
|  | #include <thread> | 
|  |  | 
|  | #include "System/Synchronization.hpp" | 
|  |  | 
|  | namespace marl { | 
|  | class Scheduler; | 
|  | } | 
|  |  | 
|  | namespace sw { | 
|  |  | 
|  | class Context; | 
|  | class Renderer; | 
|  |  | 
|  | }  // namespace sw | 
|  |  | 
|  | namespace vk { | 
|  |  | 
|  | class Device; | 
|  | class Fence; | 
|  |  | 
|  | class Queue | 
|  | { | 
|  | VK_LOADER_DATA loaderData = { ICD_LOADER_MAGIC }; | 
|  |  | 
|  | public: | 
|  | Queue(Device *device, marl::Scheduler *scheduler); | 
|  | ~Queue(); | 
|  |  | 
|  | operator VkQueue() | 
|  | { | 
|  | return reinterpret_cast<VkQueue>(this); | 
|  | } | 
|  |  | 
|  | VkResult submit(uint32_t submitCount, const VkSubmitInfo *pSubmits, Fence *fence); | 
|  | VkResult waitIdle(); | 
|  | #ifndef __ANDROID__ | 
|  | VkResult present(const VkPresentInfoKHR *presentInfo); | 
|  | #endif | 
|  |  | 
|  | private: | 
|  | struct Task | 
|  | { | 
|  | uint32_t submitCount = 0; | 
|  | VkSubmitInfo *pSubmits = nullptr; | 
|  | sw::TaskEvents *events = nullptr; | 
|  |  | 
|  | enum Type | 
|  | { | 
|  | KILL_THREAD, | 
|  | SUBMIT_QUEUE | 
|  | }; | 
|  | Type type = SUBMIT_QUEUE; | 
|  | }; | 
|  |  | 
|  | void taskLoop(marl::Scheduler *scheduler); | 
|  | void garbageCollect(); | 
|  | void submitQueue(const Task &task); | 
|  |  | 
|  | Device *device; | 
|  | std::unique_ptr<sw::Renderer> renderer; | 
|  | sw::Chan<Task> pending; | 
|  | sw::Chan<VkSubmitInfo *> toDelete; | 
|  | std::thread queueThread; | 
|  | }; | 
|  |  | 
|  | static inline Queue *Cast(VkQueue object) | 
|  | { | 
|  | return reinterpret_cast<Queue *>(object); | 
|  | } | 
|  |  | 
|  | }  // namespace vk | 
|  |  | 
|  | #endif  // VK_QUEUE_HPP_ |