/* * Copyright (C) 2011 The Android Open Source Project * * 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 __ADDRESS_SPACE_STREAM_H #define __ADDRESS_SPACE_STREAM_H #include "IOStream.h" #include "VirtGpu.h" #include "address_space_graphics_types.h" #include "aemu/base/AndroidHealthMonitor.h" #include "goldfish_address_space.h" using android::base::guest::HealthMonitor; class AddressSpaceStream; AddressSpaceStream* createAddressSpaceStream(size_t bufSize, HealthMonitor<>* healthMonitor); AddressSpaceStream* createVirtioGpuAddressSpaceStream(HealthMonitor<>* healthMonitor); class AddressSpaceStream : public IOStream { public: explicit AddressSpaceStream( address_space_handle_t handle, uint32_t version, struct asg_context context, uint64_t ringOffset, uint64_t writeBufferOffset, struct address_space_ops ops, HealthMonitor<>* healthMonitor); ~AddressSpaceStream(); virtual size_t idealAllocSize(size_t len); virtual void *allocBuffer(size_t minSize); virtual int commitBuffer(size_t size); virtual const unsigned char *readFully( void *buf, size_t len); virtual const unsigned char *read( void *buf, size_t *inout_len); virtual int writeFully(const void *buf, size_t len); virtual int writeFullyAsync(const void *buf, size_t len); virtual const unsigned char *commitBufferAndReadFully(size_t size, void *buf, size_t len); void setMapping(VirtGpuBlobMappingPtr mapping) { m_mapping = mapping; } void setResourceId(uint32_t id) { m_resourceId = id; } private: bool isInError() const; ssize_t speculativeRead(unsigned char* readBuffer, size_t trySize); void notifyAvailable(); uint32_t getRelativeBufferPos(uint32_t pos); void advanceWrite(); void ensureConsumerFinishing(); void ensureType1Finished(); void ensureType3Finished(); int type1Write(uint32_t offset, size_t size); void backoff(); void resetBackoff(); VirtGpuBlobMappingPtr m_mapping = nullptr; struct address_space_ops m_ops; unsigned char* m_tmpBuf; size_t m_tmpBufSize; size_t m_tmpBufXferSize; bool m_usingTmpBuf; unsigned char* m_readBuf; size_t m_read; size_t m_readLeft; address_space_handle_t m_handle; uint32_t m_version; struct asg_context m_context; uint64_t m_ringOffset; uint64_t m_writeBufferOffset; uint32_t m_writeBufferSize; uint32_t m_writeBufferMask; unsigned char* m_buf; unsigned char* m_writeStart; uint32_t m_writeStep; uint32_t m_notifs; uint32_t m_written; uint64_t m_backoffIters; uint64_t m_backoffFactor; size_t m_ringStorageSize; uint32_t m_resourceId = 0; HealthMonitor<>* m_healthMonitor; }; #endif