| /* |
| * 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 |