Add the ChameleonMan PowerVR sample.
BUG=14598298
Change-Id: Id6dcaebe793cf3d3a10af571348f461023d2a9d2
Reviewed-on: https://swiftshader-review.googlesource.com/1090
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/tests/third_party/PowerVR/Tools/PVRTResourceFile.cpp b/tests/third_party/PowerVR/Tools/PVRTResourceFile.cpp
new file mode 100644
index 0000000..d92abe3
--- /dev/null
+++ b/tests/third_party/PowerVR/Tools/PVRTResourceFile.cpp
@@ -0,0 +1,342 @@
+/******************************************************************************
+
+ @File PVRTResourceFile.cpp
+
+ @Title PVRTResourceFile.cpp
+
+ @Version
+
+ @Copyright Copyright (c) Imagination Technologies Limited.
+
+ @Platform ANSI compatible
+
+ @Description Simple resource file wrapper
+
+******************************************************************************/
+
+#include "PVRTResourceFile.h"
+#include <stdio.h>
+#include <string.h>
+
+#include "PVRTResourceFile.h"
+#include "PVRTString.h"
+#include "PVRTMemoryFileSystem.h"
+
+CPVRTString CPVRTResourceFile::s_ReadPath;
+
+static void* LoadFileFunc(const char* pFilename, char** pData, size_t &size)
+{
+ size = 0;
+
+ FILE* pFile = fopen(pFilename, "rb");
+
+ if (pFile)
+ {
+ // Get the file size
+ fseek(pFile, 0, SEEK_END);
+ size = ftell(pFile);
+ fseek(pFile, 0, SEEK_SET);
+
+ // read the data
+ char* pTmp = new char[size];
+ size_t BytesRead = fread(pTmp, 1, size, pFile);
+
+ if (BytesRead != size)
+ {
+ delete [] pTmp;
+ pTmp = NULL;
+ size = 0;
+ }
+ else
+ *pData = pTmp;
+
+ fclose(pFile);
+ return pTmp;
+ }
+
+ return 0;
+}
+
+static bool ReleaseFileFunc(void* handle)
+{
+ if(handle)
+ {
+ delete[] (char*) handle;
+ return true;
+ }
+
+ return false;
+}
+
+PFNLoadFileFunc CPVRTResourceFile::s_pLoadFileFunc = &LoadFileFunc;
+PFNReleaseFileFunc CPVRTResourceFile::s_pReleaseFileFunc = &ReleaseFileFunc;
+
+/*!***************************************************************************
+@Function SetReadPath
+@Input pszReadPath The path where you would like to read from
+@Description Sets the read path
+*****************************************************************************/
+void CPVRTResourceFile::SetReadPath(const char* const pszReadPath)
+{
+ s_ReadPath = (pszReadPath) ? pszReadPath : "";
+}
+
+/*!***************************************************************************
+@Function GetReadPath
+@Returns The currently set read path
+@Description Returns the currently set read path
+*****************************************************************************/
+CPVRTString CPVRTResourceFile::GetReadPath()
+{
+ return CPVRTString(s_ReadPath);
+}
+
+/*!***************************************************************************
+@Function SetLoadReleaseFunctions
+@Input pLoadFileFunc Function to use for opening a file
+@Input pReleaseFileFunc Function to release any data allocated by the load function
+@Description This function is used to override the CPVRTResource file loading functions. If
+ you pass NULL in as the load function CPVRTResource will use the default functions.
+*****************************************************************************/
+void CPVRTResourceFile::SetLoadReleaseFunctions(void* pLoadFileFunc, void* pReleaseFileFunc)
+{
+ if(pLoadFileFunc)
+ {
+ s_pLoadFileFunc = (PFNLoadFileFunc) pLoadFileFunc;
+ s_pReleaseFileFunc = (PFNReleaseFileFunc) pReleaseFileFunc;
+ }
+ else
+ {
+ s_pLoadFileFunc = &LoadFileFunc;
+ s_pReleaseFileFunc = &ReleaseFileFunc;
+ }
+}
+
+/*!***************************************************************************
+@Function CPVRTResourceFile
+@Input pszFilename Name of the file you would like to open
+@Description Constructor
+*****************************************************************************/
+CPVRTResourceFile::CPVRTResourceFile(const char* const pszFilename) :
+ m_bOpen(false),
+ m_bMemoryFile(false),
+ m_Size(0),
+ m_pData(0),
+ m_Handle(0)
+{
+ CPVRTString Path(s_ReadPath);
+ Path += pszFilename;
+
+ m_Handle = s_pLoadFileFunc(Path.c_str(), (char**) &m_pData, m_Size);
+ m_bOpen = (m_pData && m_Size) != 0;
+
+ if (!m_bOpen)
+ {
+ m_bOpen = m_bMemoryFile = CPVRTMemoryFileSystem::GetFile(pszFilename, (const void**)(&m_pData), &m_Size);
+ }
+}
+
+/*!***************************************************************************
+@Function CPVRTResourceFile
+@Input pData A pointer to the data you would like to use
+@Input i32Size The size of the data
+@Description Constructor
+*****************************************************************************/
+CPVRTResourceFile::CPVRTResourceFile(const char* pData, size_t i32Size) :
+ m_bOpen(true),
+ m_bMemoryFile(true),
+ m_Size(i32Size),
+ m_pData(pData),
+ m_Handle(0)
+{
+}
+
+/*!***************************************************************************
+@Function ~CPVRTResourceFile
+@Description Destructor
+*****************************************************************************/
+CPVRTResourceFile::~CPVRTResourceFile()
+{
+ Close();
+}
+
+/*!***************************************************************************
+@Function IsOpen
+@Returns true if the file is open
+@Description Is the file open
+*****************************************************************************/
+bool CPVRTResourceFile::IsOpen() const
+{
+ return m_bOpen;
+}
+
+/*!***************************************************************************
+@Function IsMemoryFile
+@Returns true if the file was opened from memory
+@Description Was the file opened from memory
+*****************************************************************************/
+bool CPVRTResourceFile::IsMemoryFile() const
+{
+ return m_bMemoryFile;
+}
+
+/*!***************************************************************************
+@Function Size
+@Returns The size of the opened file
+@Description Returns the size of the opened file
+*****************************************************************************/
+size_t CPVRTResourceFile::Size() const
+{
+ return m_Size;
+}
+
+/*!***************************************************************************
+@Function DataPtr
+@Returns A pointer to the file data
+@Description Returns a pointer to the file data
+*****************************************************************************/
+const void* CPVRTResourceFile::DataPtr() const
+{
+ return m_pData;
+}
+
+/*!***************************************************************************
+@Function Close
+@Description Closes the file
+*****************************************************************************/
+void CPVRTResourceFile::Close()
+{
+ if (m_bOpen)
+ {
+ if (!m_bMemoryFile && s_pReleaseFileFunc)
+ {
+ s_pReleaseFileFunc(m_Handle);
+ }
+
+ m_bMemoryFile = false;
+ m_bOpen = false;
+ m_pData = 0;
+ m_Size = 0;
+ }
+}
+
+/****************************************************************************
+** class CPVRTMemoryFileSystem
+****************************************************************************/
+CPVRTMemoryFileSystem::CAtExit CPVRTMemoryFileSystem::s_AtExit;
+CPVRTMemoryFileSystem::SFileInfo* CPVRTMemoryFileSystem::s_pFileInfo = 0;
+int CPVRTMemoryFileSystem::s_i32Capacity = 0;
+int CPVRTMemoryFileSystem::s_i32NumFiles = 0;
+
+/*!***************************************************************************
+@Function Destructor
+@Description Destructor of CAtExit class. Workaround for platforms that
+ don't support the atexit() function. This deletes any memory
+ file system data.
+*****************************************************************************/
+CPVRTMemoryFileSystem::CAtExit::~CAtExit()
+{
+ for (int i = 0; i < CPVRTMemoryFileSystem::s_i32NumFiles; ++i)
+ {
+ if (CPVRTMemoryFileSystem::s_pFileInfo[i].bAllocated)
+ {
+ delete [] (char*)CPVRTMemoryFileSystem::s_pFileInfo[i].pszFilename;
+ delete [] (char*)CPVRTMemoryFileSystem::s_pFileInfo[i].pBuffer;
+ }
+ }
+ delete [] CPVRTMemoryFileSystem::s_pFileInfo;
+}
+
+CPVRTMemoryFileSystem::CPVRTMemoryFileSystem(const char* pszFilename, const void* pBuffer, size_t Size, bool bCopy)
+{
+ RegisterMemoryFile(pszFilename, pBuffer, Size, bCopy);
+}
+
+/*!***************************************************************************
+@Function RegisterMemoryFile
+@Input pszFilename Name of file to register
+@Input pBuffer Pointer to file data
+@Input Size File size
+@Input bCopy Name and data should be copied?
+@Description Registers a block of memory as a file that can be looked up
+ by name.
+*****************************************************************************/
+void CPVRTMemoryFileSystem::RegisterMemoryFile(const char* pszFilename, const void* pBuffer, size_t Size, bool bCopy)
+{
+ if (s_i32NumFiles == s_i32Capacity)
+ {
+ SFileInfo* pFileInfo = new SFileInfo[s_i32Capacity + 10];
+ memcpy(pFileInfo, s_pFileInfo, sizeof(SFileInfo) * s_i32Capacity);
+ delete [] s_pFileInfo;
+ s_pFileInfo = pFileInfo;
+ s_i32Capacity += 10;
+ }
+
+ s_pFileInfo[s_i32NumFiles].pszFilename = pszFilename;
+ s_pFileInfo[s_i32NumFiles].pBuffer = pBuffer;
+ if (bCopy)
+ {
+ char* pszNewFilename = new char[strlen(pszFilename) + 1];
+ strcpy(pszNewFilename, pszFilename);
+ s_pFileInfo[s_i32NumFiles].pszFilename = pszNewFilename;
+
+ void* pszNewBuffer = new char[Size];
+ memcpy(pszNewBuffer, pBuffer, Size);
+ s_pFileInfo[s_i32NumFiles].pBuffer = pszNewBuffer;
+ }
+ s_pFileInfo[s_i32NumFiles].Size = Size;
+ s_pFileInfo[s_i32NumFiles].bAllocated = bCopy;
+ ++s_i32NumFiles;
+}
+
+/*!***************************************************************************
+@Function GetFile
+@Input pszFilename Name of file to open
+@Output ppBuffer Pointer to file data
+@Output pSize File size
+@Return true if the file was found in memory, false otherwise
+@Description Looks up a file in the memory file system by name. Returns a
+ pointer to the file data as well as its size on success.
+*****************************************************************************/
+bool CPVRTMemoryFileSystem::GetFile(const char* pszFilename, const void** ppBuffer, size_t* pSize)
+{
+ for (int i = 0; i < s_i32NumFiles; ++i)
+ {
+ if (strcmp(s_pFileInfo[i].pszFilename, pszFilename) == 0)
+ {
+ if (ppBuffer) *ppBuffer = s_pFileInfo[i].pBuffer;
+ if (pSize) *pSize = s_pFileInfo[i].Size;
+ return true;
+ }
+ }
+ return false;
+}
+
+/*!***************************************************************************
+@Function GetNumFiles
+@Return The number of registered files
+@Description Getter for the number of registered files
+*****************************************************************************/
+int CPVRTMemoryFileSystem::GetNumFiles()
+{
+ return s_i32NumFiles;
+}
+
+/*!***************************************************************************
+@Function GetFilename
+@Input i32Index Index of file
+@Return A pointer to the filename of the requested file
+@Description Looks up a file in the memory file system by name. Returns a
+ pointer to the file data as well as its size on success.
+*****************************************************************************/
+const char* CPVRTMemoryFileSystem::GetFilename(int i32Index)
+{
+ if (i32Index < 0 || i32Index > s_i32NumFiles) return 0;
+
+ return s_pFileInfo[i32Index].pszFilename;
+}
+
+
+/*****************************************************************************
+ End of file (PVRTResourceFile.cpp)
+*****************************************************************************/