| // 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 "System/Synchronization.hpp" | |
| #include <thread> | |
| namespace marl { | |
| class Scheduler; | |
| } | |
| namespace sw { | |
| class Context; | |
| class Renderer; | |
| } // namespace sw | |
| namespace vk { | |
| class Device; | |
| class Fence; | |
| struct SubmitInfo; | |
| class Queue | |
| { | |
| VK_LOADER_DATA loaderData = { ICD_LOADER_MAGIC }; | |
| public: | |
| Queue(Device *device, marl::Scheduler *scheduler, VkDeviceQueueCreateFlags flags); | |
| ~Queue(); | |
| operator VkQueue() | |
| { | |
| return reinterpret_cast<VkQueue>(this); | |
| } | |
| VkResult submit(uint32_t submitCount, SubmitInfo *pSubmits, Fence *fence); | |
| VkResult waitIdle(); | |
| #ifndef __ANDROID__ | |
| VkResult present(const VkPresentInfoKHR *presentInfo); | |
| #endif | |
| void beginDebugUtilsLabel(const VkDebugUtilsLabelEXT *pLabelInfo); | |
| void endDebugUtilsLabel(); | |
| void insertDebugUtilsLabel(const VkDebugUtilsLabelEXT *pLabelInfo); | |
| std::unique_lock<marl::mutex> getInternalLock(); | |
| private: | |
| struct Task | |
| { | |
| uint32_t submitCount = 0; | |
| SubmitInfo *pSubmits = nullptr; | |
| std::shared_ptr<sw::CountedEvent> events; | |
| 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<SubmitInfo *> toDelete; | |
| std::thread queueThread; | |
| // For VK_KHR_internally_synchronized_queues | |
| std::unique_ptr<marl::mutex> internalMutex; | |
| }; | |
| static inline Queue *Cast(VkQueue object) | |
| { | |
| return reinterpret_cast<Queue *>(object); | |
| } | |
| } // namespace vk | |
| #endif // VK_QUEUE_HPP_ |