1static ResourceTracker* sResourceTracker = nullptr; 2static uint32_t sFeatureBits = 0; 3 4class VkEncoder::Impl { 5public: 6 Impl(IOStream* stream) : m_stream(stream), m_logEncodes(false) { 7 if (!sResourceTracker) sResourceTracker = ResourceTracker::get(); 8 m_stream.incStreamRef(); 9 const char* emuVkLogEncodesPropName = "qemu.vk.log"; 10 char encodeProp[PROPERTY_VALUE_MAX]; 11 if (property_get(emuVkLogEncodesPropName, encodeProp, nullptr) > 0) { 12 m_logEncodes = atoi(encodeProp) > 0; 13 } 14 sFeatureBits = m_stream.getFeatureBits(); 15 } 16 17 ~Impl() { 18 m_stream.decStreamRef(); 19 } 20 21 VulkanCountingStream* countingStream() { return &m_countingStream; } 22 VulkanStreamGuest* stream() { return &m_stream; } 23 BumpPool* pool() { return &m_pool; } 24 ResourceTracker* resources() { return ResourceTracker::get(); } 25 Validation* validation() { return &m_validation; } 26 27 void log(const char* text) { 28 if (!m_logEncodes) return; 29 ALOGD("encoder log: %s", text); 30 } 31 32 void flush() { 33 lock(); 34 m_stream.flush(); 35 unlock(); 36 } 37 38 // can be recursive 39 void lock() { 40 while (mLock.test_and_set(std::memory_order_acquire)); 41 } 42 43 void unlock() { 44 mLock.clear(std::memory_order_release); 45 } 46 47private: 48 VulkanCountingStream m_countingStream; 49 VulkanStreamGuest m_stream; 50 BumpPool m_pool; 51 52 Validation m_validation; 53 bool m_logEncodes; 54 std::atomic_flag mLock = ATOMIC_FLAG_INIT; 55}; 56 57VkEncoder::~VkEncoder() { } 58 59struct EncoderAutoLock { 60 EncoderAutoLock(VkEncoder* enc) : mEnc(enc) { 61 mEnc->lock(); 62 } 63 ~EncoderAutoLock() { 64 mEnc->unlock(); 65 } 66 VkEncoder* mEnc; 67}; 68 69VkEncoder::VkEncoder(IOStream *stream) : 70 mImpl(new VkEncoder::Impl(stream)) { } 71 72void VkEncoder::flush() { 73 mImpl->flush(); 74} 75 76void VkEncoder::lock() { 77 mImpl->lock(); 78} 79 80void VkEncoder::unlock() { 81 mImpl->unlock(); 82} 83 84void VkEncoder::incRef() { 85 __atomic_add_fetch(&refCount, 1, __ATOMIC_SEQ_CST); 86} 87 88bool VkEncoder::decRef() { 89 if (0 == __atomic_sub_fetch(&refCount, 1, __ATOMIC_SEQ_CST)) { 90 delete this; 91 return true; 92 } 93 return false; 94} 95