diff options
Diffstat (limited to 'src/Runtime/ogl-runtime/src/foundation/IOStreams.cpp')
m--------- | src/Runtime/ogl-runtime | 0 | ||||
-rw-r--r-- | src/Runtime/ogl-runtime/src/foundation/IOStreams.cpp | 384 |
2 files changed, 0 insertions, 384 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime new file mode 160000 +Subproject 2025912174c4cf99270b7439ec3b021e1d089ae diff --git a/src/Runtime/ogl-runtime/src/foundation/IOStreams.cpp b/src/Runtime/ogl-runtime/src/foundation/IOStreams.cpp deleted file mode 100644 index f1adfbc0..00000000 --- a/src/Runtime/ogl-runtime/src/foundation/IOStreams.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "foundation/IOStreams.h" -#include "foundation/FileTools.h" -#include "foundation/StrConvertUTF.h" -#include "foundation/Qt3DSFoundation.h" -#include "foundation/Qt3DSBroadcastingAllocator.h" -#include "foundation/Qt3DSMutex.h" -#include "foundation/Qt3DSSync.h" -#include "foundation/Qt3DSThread.h" -#include "foundation/Qt3DSAtomic.h" -#include "foundation/Qt3DSMemoryBuffer.h" - -using namespace qt3ds::foundation; - -#ifndef _WIN32 - -inline int _fseeki64(FILE *inFile, int64_t pos, int seekFlags) -{ - return fseek(inFile, (int32_t)pos, seekFlags); -} - -inline int64_t _ftelli64(FILE *inFile) -{ - return ftell(inFile); -} - -#endif - -CFileSeekableIOStream::CFileSeekableIOStream(const char *inFileName, FileOpenFlags inFlags) -{ - openFile(QString(inFileName), inFlags); -} - -#ifdef WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T - -CFileSeekableIOStream::CFileSeekableIOStream(const wchar_t *inFileName, FileOpenFlags inFlags) -{ - openFile(QString::fromWCharArray(inFileName), inFlags); -} - -#endif - -CFileSeekableIOStream::CFileSeekableIOStream(const char16_t *inWideName, FileOpenFlags inFlags) -{ - openFile(QString::fromUtf16(inWideName), inFlags); -} - -CFileSeekableIOStream::CFileSeekableIOStream(const QString &inFIle, FileOpenFlags inFlags) -{ - openFile(inFIle, inFlags); -} - -void CFileSeekableIOStream::openFile(const QString &path, FileOpenFlags inFlags) -{ - if (path.isEmpty()) - return; - - QIODevice::OpenMode fileFlags = QIODevice::ReadOnly; - if (inFlags & FileOpenFlagValues::Write) - fileFlags = QIODevice::ReadWrite; - if (inFlags & FileOpenFlagValues::Truncate) - fileFlags |= QIODevice::Truncate; - - m_File.setFileName(CFileTools::NormalizePathForQtUsage(path)); - if (!m_File.open(fileFlags)) { - qCCritical(INTERNAL_ERROR) << "failed to open file" - << path << "with error" << m_File.errorString(); - QT3DS_ASSERT(false); - } -} - -CFileSeekableIOStream::~CFileSeekableIOStream() -{ - m_File.close(); -} - -bool CFileSeekableIOStream::IsOpen() -{ - return m_File.isOpen(); -} - -void CFileSeekableIOStream::SetPosition(QT3DSI64 inOffset, SeekPosition::Enum inEnum) -{ - if (inOffset > QT3DS_MAX_I32 || inOffset < QT3DS_MIN_I32) { - qCCritical(INVALID_OPERATION, "Attempt to seek further than platform allows"); - QT3DS_ASSERT(false); - return; - } else { - CFileTools::SetStreamPosition(m_File, inOffset, inEnum); - } -} - -QT3DSI64 CFileSeekableIOStream::GetPosition() const -{ - return m_File.pos(); -} - -QT3DSU32 CFileSeekableIOStream::Read(NVDataRef<QT3DSU8> data) -{ - return m_File.read((char *)data.begin(), data.size()); -} - -bool CFileSeekableIOStream::Write(NVConstDataRef<QT3DSU8> data) -{ - if (!m_File.isOpen()) { - QT3DS_ASSERT(false); - return 0; - } - qint64 numBytes = m_File.write((char*)data.begin(), data.size()); - return numBytes == data.size(); -} - -CMemorySeekableIOStream::CMemorySeekableIOStream(NVAllocatorCallback &inAlloc, - const char *inAllocName) - : m_Allocator(inAlloc) - , m_AllocationName(inAllocName) - , m_Data(NULL) - , m_Size(0) - , m_Offset(0) - , m_Capacity(0) -{ -} - -CMemorySeekableIOStream::~CMemorySeekableIOStream() -{ - if (m_Data) - m_Allocator.deallocate(m_Data); - m_Data = NULL; - m_Size = 0; - m_Capacity = 0; - m_Offset = 0; -} - -void CMemorySeekableIOStream::SetPosition(QT3DSI64 inOffset, SeekPosition::Enum inEnum) -{ - QT3DSI64 startPos = 0; - - switch (inEnum) { - case SeekPosition::Begin: - startPos = 0; - break; - case SeekPosition::Current: - startPos = m_Offset; - break; - case SeekPosition::End: - startPos = m_Size; - break; - default: - QT3DS_ASSERT(false); - break; - } - - startPos += inOffset; - if (m_Size == 0 && inOffset != 0) { - QT3DS_ASSERT(false); - return; - } - if (startPos < 0) { - QT3DS_ASSERT(false); - startPos = 0; - } - if (startPos >= m_Size && startPos != 0) { - QT3DS_ASSERT(false); - startPos = m_Size - 1; - } - m_Offset = static_cast<QT3DSU32>(startPos); -} - -QT3DSU32 CMemorySeekableIOStream::Read(NVDataRef<QT3DSU8> data) -{ - if (m_Data == NULL) - return 0; - QT3DSU32 amountLeft = m_Size - m_Offset; - QT3DSU32 numBytes = NVMin(amountLeft, data.size()); - intrinsics::memCopy(data.begin(), m_Data + m_Offset, numBytes); - m_Offset += numBytes; - return numBytes; -} - -bool CMemorySeekableIOStream::Write(NVConstDataRef<QT3DSU8> data) -{ - reserve(data.size() + m_Offset); - intrinsics::memCopy(m_Data + m_Offset, data.begin(), data.size()); - m_Offset += data.size(); - m_Size = NVMax(m_Size, m_Offset); - return true; -} - -void CMemorySeekableIOStream::reserve(QT3DSU32 inNewSize) -{ - if (inNewSize > m_Capacity) { - if (inNewSize < 100000) - inNewSize *= 2; - QT3DSU8 *newData = - (QT3DSU8 *)m_Allocator.allocate(inNewSize, m_AllocationName, __FILE__, __LINE__); - if (m_Size) { - intrinsics::memCopy(newData, m_Data, m_Size); - m_Allocator.deallocate(m_Data); - } - m_Data = newData; - m_Capacity = inNewSize; - } -} - -namespace { - -struct WriteBufferedStreamImpl; -struct WriteBufferThread : public Thread -{ - // When a buffer is available - WriteBufferedStreamImpl &m_Impl; - WriteBufferThread(NVFoundationBase &fnd, WriteBufferedStreamImpl &i) - : Thread(fnd) - , m_Impl(i) - { - setName("WriteBufferThread"); - } - void execute() override; -}; - -#ifdef _WIN32 -#pragma warning(disable : 4355) -#endif -/* Double buffered stream implementation with a sending thread constantly - * pulling data from the main thread and writing it out to socket. - */ -struct WriteBufferedStreamImpl : public WriteBufferedOutStream -{ - NVFoundationBase &m_Foundation; - IOutStream &m_Stream; - MemoryBuffer<> m_Buf1; - MemoryBuffer<> m_Buf2; - MemoryBuffer<> *m_CurrentBuffer; - MemoryBuffer<> *m_WriteBuffer; - QT3DSU32 m_BufferSize; - volatile bool m_StreamValid; - Mutex m_BufferLock; - Sync m_DataAvailable; - Sync m_WriteFinished; - WriteBufferThread m_Thread; - QT3DSI32 mRefCount; - - WriteBufferedStreamImpl(NVFoundationBase &fnd, QT3DSU32 totalBufSize, IOutStream &s) - : m_Foundation(fnd) - , m_Stream(s) - , m_Buf1(ForwardingAllocator(fnd.getAllocator(), "WriteBufferedStreamImpl::buffer")) - , m_Buf2(ForwardingAllocator(fnd.getAllocator(), "WriteBufferedStreamImpl::buffer")) - , m_CurrentBuffer(&m_Buf1) - , m_WriteBuffer(NULL) - , m_BufferSize(totalBufSize / 2) - , m_StreamValid(true) - , m_BufferLock(fnd.getAllocator()) - , m_DataAvailable(fnd.getAllocator()) - , m_WriteFinished(fnd.getAllocator()) - , m_Thread(fnd, *this) - , mRefCount(0) - { - m_Buf1.reserve(m_BufferSize); - m_Buf2.reserve(m_BufferSize); - } - ~WriteBufferedStreamImpl() - { - m_Thread.signalQuit(); - m_DataAvailable.set(); - m_Thread.waitForQuit(); - } - - QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator()) - - bool Write(NVConstDataRef<QT3DSU8> data) override - { - while (data.size() && m_StreamValid) { - QT3DSU32 currentBufferSize; - QT3DSU32 amountCanWrite; - { - Mutex::ScopedLock locker(m_BufferLock); - currentBufferSize = m_CurrentBuffer->size(); - amountCanWrite = NVMin(data.size(), m_BufferSize - currentBufferSize); - m_CurrentBuffer->write(data.begin(), amountCanWrite); - currentBufferSize += amountCanWrite; - } - m_DataAvailable.set(); - if (currentBufferSize == m_BufferSize) { - m_WriteFinished.wait(); - m_WriteFinished.reset(); - // Blocking call if we are already sending data. - data = NVConstDataRef<QT3DSU8>(data.begin() + amountCanWrite, - data.size() - amountCanWrite); - } - } - return m_StreamValid; - } - - IOutStream &wrappedStream() override { return m_Stream; } - - QT3DSU32 getTotalBufferSize() - { - Mutex::ScopedLock locker(m_BufferLock); - QT3DSU32 retval = m_CurrentBuffer->size(); - if (m_WriteBuffer) - retval += m_WriteBuffer->size(); - return retval; - } - - QT3DSU32 getWriteBufferSize() - { - Mutex::ScopedLock locker(m_BufferLock); - if (m_WriteBuffer) - return m_WriteBuffer->size(); - return 0; - } - - void flush() override - { - while (getTotalBufferSize()) { - m_WriteFinished.wait(); - m_WriteFinished.reset(); - } - } -}; - -void WriteBufferThread::execute() -{ - while (!quitIsSignalled()) { - m_Impl.m_DataAvailable.wait(); - - if (!quitIsSignalled() && m_Impl.m_StreamValid) { - m_Impl.m_DataAvailable.reset(); - { - Mutex::ScopedLock locker(m_Impl.m_BufferLock); - m_Impl.m_WriteBuffer = m_Impl.m_CurrentBuffer; - m_Impl.m_CurrentBuffer = - m_Impl.m_CurrentBuffer == &m_Impl.m_Buf1 ? &m_Impl.m_Buf2 : &m_Impl.m_Buf1; - QT3DS_ASSERT(m_Impl.m_WriteBuffer != m_Impl.m_CurrentBuffer); - } - NVConstDataRef<QT3DSU8> dataBuffer(*m_Impl.m_WriteBuffer); - if (dataBuffer.size()) { - m_Impl.m_StreamValid = m_Impl.m_Stream.Write(dataBuffer); - { - Mutex::ScopedLock locker(m_Impl.m_BufferLock); - m_Impl.m_WriteBuffer->clear(); - m_Impl.m_WriteBuffer = NULL; - } - } - m_Impl.m_WriteFinished.set(); - } - } - quit(); -} -} - -NVScopedRefCounted<WriteBufferedOutStream> -WriteBufferedOutStreamCreate(NVFoundationBase &fnd, IOutStream &stream, QT3DSU32 totalBufferSize) -{ - return QT3DS_NEW(fnd.getAllocator(), WriteBufferedStreamImpl)(fnd, totalBufferSize, stream); -} |