Apply the Apache 2.0 license. Change-Id: I4a7aeefedcd2d891093520d5a10ebefadcddb5be Reviewed-on: https://swiftshader-review.googlesource.com/5320 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/CPUID.cpp b/src/Common/CPUID.cpp index e2879e2..23d76d6 100644 --- a/src/Common/CPUID.cpp +++ b/src/Common/CPUID.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2012 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "CPUID.hpp" @@ -164,7 +167,7 @@ #if defined(_WIN32) __cpuid(registers, info); #else - __asm volatile("cpuid": "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3]): "a" (info)); + __asm volatile("cpuid": "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3]): "a" (info)); #endif }
diff --git a/src/Common/CPUID.hpp b/src/Common/CPUID.hpp index 43c9e69..73c8e94 100644 --- a/src/Common/CPUID.hpp +++ b/src/Common/CPUID.hpp
@@ -1,130 +1,133 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2012 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_CPUID_hpp -#define sw_CPUID_hpp - -namespace sw -{ - #if !defined(__x86_64__) && (defined(_M_AMD64) || defined (_M_X64)) - #define __x86_64__ 1 - #endif - - class CPUID - { - public: - static bool supportsMMX(); - static bool supportsCMOV(); - static bool supportsMMX2(); // MMX instructions added by SSE: pshufw, pmulhuw, pmovmskb, pavgw/b, pextrw, pinsrw, pmaxsw/ub, etc. - static bool supportsSSE(); - static bool supportsSSE2(); - static bool supportsSSE3(); - static bool supportsSSSE3(); - static bool supportsSSE4_1(); - static int coreCount(); - static int processAffinity(); - - static void setEnableMMX(bool enable); - static void setEnableCMOV(bool enable); - static void setEnableSSE(bool enable); - static void setEnableSSE2(bool enable); - static void setEnableSSE3(bool enable); - static void setEnableSSSE3(bool enable); - static void setEnableSSE4_1(bool enable); - - static void setFlushToZero(bool enable); // Denormal results are written as zero - static void setDenormalsAreZero(bool enable); // Denormal inputs are read as zero - - private: - static bool MMX; - static bool CMOV; - static bool SSE; - static bool SSE2; - static bool SSE3; - static bool SSSE3; - static bool SSE4_1; - static int cores; - static int affinity; - - static bool enableMMX; - static bool enableCMOV; - static bool enableSSE; - static bool enableSSE2; - static bool enableSSE3; - static bool enableSSSE3; - static bool enableSSE4_1; - - static bool detectMMX(); - static bool detectCMOV(); - static bool detectSSE(); - static bool detectSSE2(); - static bool detectSSE3(); - static bool detectSSSE3(); - static bool detectSSE4_1(); - static int detectCoreCount(); - static int detectAffinity(); - }; -} - -namespace sw -{ - inline bool CPUID::supportsMMX() - { - return MMX && enableMMX; - } - - inline bool CPUID::supportsCMOV() - { - return CMOV && enableCMOV; - } - - inline bool CPUID::supportsMMX2() - { - return supportsSSE(); // Coincides with 64-bit integer vector instructions supported by SSE - } - - inline bool CPUID::supportsSSE() - { - return SSE && enableSSE; - } - - inline bool CPUID::supportsSSE2() - { - return SSE2 && enableSSE2; - } - - inline bool CPUID::supportsSSE3() - { - return SSE3 && enableSSE3; - } - - inline bool CPUID::supportsSSSE3() - { - return SSSE3 && enableSSSE3; - } - - inline bool CPUID::supportsSSE4_1() - { - return SSE4_1 && enableSSE4_1; - } - - inline int CPUID::coreCount() - { - return cores; - } - - inline int CPUID::processAffinity() - { - return affinity; - } -} - -#endif // sw_CPUID_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_CPUID_hpp +#define sw_CPUID_hpp + +namespace sw +{ + #if !defined(__x86_64__) && (defined(_M_AMD64) || defined (_M_X64)) + #define __x86_64__ 1 + #endif + + class CPUID + { + public: + static bool supportsMMX(); + static bool supportsCMOV(); + static bool supportsMMX2(); // MMX instructions added by SSE: pshufw, pmulhuw, pmovmskb, pavgw/b, pextrw, pinsrw, pmaxsw/ub, etc. + static bool supportsSSE(); + static bool supportsSSE2(); + static bool supportsSSE3(); + static bool supportsSSSE3(); + static bool supportsSSE4_1(); + static int coreCount(); + static int processAffinity(); + + static void setEnableMMX(bool enable); + static void setEnableCMOV(bool enable); + static void setEnableSSE(bool enable); + static void setEnableSSE2(bool enable); + static void setEnableSSE3(bool enable); + static void setEnableSSSE3(bool enable); + static void setEnableSSE4_1(bool enable); + + static void setFlushToZero(bool enable); // Denormal results are written as zero + static void setDenormalsAreZero(bool enable); // Denormal inputs are read as zero + + private: + static bool MMX; + static bool CMOV; + static bool SSE; + static bool SSE2; + static bool SSE3; + static bool SSSE3; + static bool SSE4_1; + static int cores; + static int affinity; + + static bool enableMMX; + static bool enableCMOV; + static bool enableSSE; + static bool enableSSE2; + static bool enableSSE3; + static bool enableSSSE3; + static bool enableSSE4_1; + + static bool detectMMX(); + static bool detectCMOV(); + static bool detectSSE(); + static bool detectSSE2(); + static bool detectSSE3(); + static bool detectSSSE3(); + static bool detectSSE4_1(); + static int detectCoreCount(); + static int detectAffinity(); + }; +} + +namespace sw +{ + inline bool CPUID::supportsMMX() + { + return MMX && enableMMX; + } + + inline bool CPUID::supportsCMOV() + { + return CMOV && enableCMOV; + } + + inline bool CPUID::supportsMMX2() + { + return supportsSSE(); // Coincides with 64-bit integer vector instructions supported by SSE + } + + inline bool CPUID::supportsSSE() + { + return SSE && enableSSE; + } + + inline bool CPUID::supportsSSE2() + { + return SSE2 && enableSSE2; + } + + inline bool CPUID::supportsSSE3() + { + return SSE3 && enableSSE3; + } + + inline bool CPUID::supportsSSSE3() + { + return SSSE3 && enableSSSE3; + } + + inline bool CPUID::supportsSSE4_1() + { + return SSE4_1 && enableSSE4_1; + } + + inline int CPUID::coreCount() + { + return cores; + } + + inline int CPUID::processAffinity() + { + return affinity; + } +} + +#endif // sw_CPUID_hpp
diff --git a/src/Common/Configurator.cpp b/src/Common/Configurator.cpp index 2a8ad16..994d105 100644 --- a/src/Common/Configurator.cpp +++ b/src/Common/Configurator.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2012 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Configurator.hpp" @@ -189,7 +192,7 @@ } int valueID = findValue(keyID, valueName); - + if(valueID == -1) { sections[keyID].names.resize(sections[keyID].names.size() + 1, valueName); @@ -217,7 +220,7 @@ sprintf(svalue, "%d", defaultValue); - return atoi(getValue(keyName, valueName, svalue).c_str()); + return atoi(getValue(keyName, valueName, svalue).c_str()); } bool Configurator::getBoolean(string keyName, string valueName, bool defaultValue) const @@ -231,7 +234,7 @@ sprintf(svalue, "%f", defaultValue); - return atof(getValue(keyName, valueName, svalue).c_str()); + return atof(getValue(keyName, valueName, svalue).c_str()); } unsigned int Configurator::getFormatted(string keyName, string valueName, char *format,
diff --git a/src/Common/Configurator.hpp b/src/Common/Configurator.hpp index a9bf156..6fd930c 100644 --- a/src/Common/Configurator.hpp +++ b/src/Common/Configurator.hpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2011 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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 sw_Configurator_hpp #define sw_Configurator_hpp @@ -19,22 +22,22 @@ namespace sw { - class Configurator + class Configurator { public: Configurator(std::string iniPath = ""); ~Configurator(); - std::string getValue(std::string sectionName, std::string valueName, std::string defaultValue = "") const; + std::string getValue(std::string sectionName, std::string valueName, std::string defaultValue = "") const; int getInteger(std::string sectionName, std::string valueName, int defaultValue = 0) const; bool getBoolean(std::string sectionName, std::string valueName, bool defaultValue = false) const; double getFloat(std::string sectionName, std::string valueName, double defaultValue = 0.0) const; unsigned int getFormatted(std::string sectionName, std::string valueName, char *format, - void *v1 = 0, void *v2 = 0, void *v3 = 0, void *v4 = 0, - void *v5 = 0, void *v6 = 0, void *v7 = 0, void *v8 = 0, - void *v9 = 0, void *v10 = 0, void *v11 = 0, void *v12 = 0, - void *v13 = 0, void *v14 = 0, void *v15 = 0, void *v16 = 0); + void *v1 = 0, void *v2 = 0, void *v3 = 0, void *v4 = 0, + void *v5 = 0, void *v6 = 0, void *v7 = 0, void *v8 = 0, + void *v9 = 0, void *v10 = 0, void *v11 = 0, void *v12 = 0, + void *v13 = 0, void *v14 = 0, void *v15 = 0, void *v16 = 0); void addValue(std::string sectionName, std::string valueName, std::string value); @@ -52,7 +55,7 @@ struct Section { std::vector<std::string> names; - std::vector<std::string> values; + std::vector<std::string> values; }; std::vector<Section> sections;
diff --git a/src/Common/Debug.cpp b/src/Common/Debug.cpp index a122c42..c3a1921 100644 --- a/src/Common/Debug.cpp +++ b/src/Common/Debug.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2011 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Debug.hpp"
diff --git a/src/Common/Debug.hpp b/src/Common/Debug.hpp index 569e9a3..0632743 100644 --- a/src/Common/Debug.hpp +++ b/src/Common/Debug.hpp
@@ -1,46 +1,49 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2012 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef Debug_hpp -#define Debug_hpp - -#ifdef __ANDROID__ -#include "DebugAndroid.hpp" -#else - -#include <assert.h> -#include <stdio.h> - -#undef min -#undef max - -void trace(const char *format, ...); - -#ifndef NDEBUG - #define TRACE(format, ...) trace("[0x%0.8X]%s(" format ")\n", this, __FUNCTION__, ##__VA_ARGS__) -#else - #define TRACE(...) ((void)0) -#endif - -#ifndef NDEBUG - #define UNIMPLEMENTED() {trace("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); ASSERT(false);} -#else - #define UNIMPLEMENTED() ((void)0) -#endif - -#ifndef NDEBUG - #define ASSERT(expression) {if(!(expression)) trace("\t! Assert failed in %s(%d): " #expression "\n", __FUNCTION__, __LINE__); assert(expression);} -#else - #define ASSERT assert -#endif - -#endif // __ANDROID__ -#endif // Debug_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 Debug_hpp +#define Debug_hpp + +#ifdef __ANDROID__ +#include "DebugAndroid.hpp" +#else + +#include <assert.h> +#include <stdio.h> + +#undef min +#undef max + +void trace(const char *format, ...); + +#ifndef NDEBUG + #define TRACE(format, ...) trace("[0x%0.8X]%s(" format ")\n", this, __FUNCTION__, ##__VA_ARGS__) +#else + #define TRACE(...) ((void)0) +#endif + +#ifndef NDEBUG + #define UNIMPLEMENTED() {trace("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); ASSERT(false);} +#else + #define UNIMPLEMENTED() ((void)0) +#endif + +#ifndef NDEBUG + #define ASSERT(expression) {if(!(expression)) trace("\t! Assert failed in %s(%d): " #expression "\n", __FUNCTION__, __LINE__); assert(expression);} +#else + #define ASSERT assert +#endif + +#endif // __ANDROID__ +#endif // Debug_hpp
diff --git a/src/Common/DebugAndroid.cpp b/src/Common/DebugAndroid.cpp index d8b616e..0d37c0f 100644 --- a/src/Common/DebugAndroid.cpp +++ b/src/Common/DebugAndroid.cpp
@@ -7,31 +7,33 @@ void AndroidEnterDebugger() { - ALOGE(__FUNCTION__); + ALOGE(__FUNCTION__); #ifndef NDEBUG - static volatile int * const makefault = nullptr; - char value[PROPERTY_VALUE_MAX]; - property_get("debug.db.uid", value, "-1"); - int debug_uid = atoi(value); - if ((debug_uid >= 0) && (geteuid() < static_cast<uid_t>(debug_uid))) - { - ALOGE("Waiting for debugger: gdbserver :${PORT} --attach %u. Look for thread %u", getpid(), gettid()); - volatile int waiting = 1; - while (waiting) { - sleep(1); - } - } else { - ALOGE("No debugger"); - } + static volatile int * const makefault = nullptr; + char value[PROPERTY_VALUE_MAX]; + property_get("debug.db.uid", value, "-1"); + int debug_uid = atoi(value); + if((debug_uid >= 0) && (geteuid() < static_cast<uid_t>(debug_uid))) + { + ALOGE("Waiting for debugger: gdbserver :${PORT} --attach %u. Look for thread %u", getpid(), gettid()); + volatile int waiting = 1; + while (waiting) { + sleep(1); + } + } + else + { + ALOGE("No debugger"); + } #endif } void trace(const char *format, ...) { #ifndef NDEBUG - va_list vararg; - va_start(vararg, format); - android_vprintLog(ANDROID_LOG_VERBOSE, NULL, LOG_TAG, format, vararg); - va_end(vararg); + va_list vararg; + va_start(vararg, format); + android_vprintLog(ANDROID_LOG_VERBOSE, NULL, LOG_TAG, format, vararg); + va_end(vararg); #endif }
diff --git a/src/Common/GrallocAndroid.cpp b/src/Common/GrallocAndroid.cpp index f96d62a..ae5fc09 100644 --- a/src/Common/GrallocAndroid.cpp +++ b/src/Common/GrallocAndroid.cpp
@@ -1,22 +1,36 @@ +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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. + #include "GrallocAndroid.hpp" #include <cutils/log.h> GrallocModule *GrallocModule::getInstance() { - static GrallocModule instance; - return &instance; + static GrallocModule instance; + return &instance; } GrallocModule::GrallocModule() { - const hw_module_t *module = nullptr; - hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module); + const hw_module_t *module = nullptr; + hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module); - if(!module) - { - ALOGE("Failed to load standard gralloc"); - } + if(!module) + { + ALOGE("Failed to load standard gralloc"); + } - m_module = reinterpret_cast<const gralloc_module_t*>(module); + m_module = reinterpret_cast<const gralloc_module_t*>(module); }
diff --git a/src/Common/GrallocAndroid.hpp b/src/Common/GrallocAndroid.hpp index 805850d..ffc8fc6 100644 --- a/src/Common/GrallocAndroid.hpp +++ b/src/Common/GrallocAndroid.hpp
@@ -6,20 +6,20 @@ class GrallocModule { public: - static GrallocModule *getInstance(); - int lock(buffer_handle_t handle, int usage, int left, int top, int width, int height, void **vaddr) + static GrallocModule *getInstance(); + int lock(buffer_handle_t handle, int usage, int left, int top, int width, int height, void **vaddr) { - return m_module->lock(m_module, handle, usage, left, top, width, height, vaddr); - } + return m_module->lock(m_module, handle, usage, left, top, width, height, vaddr); + } - int unlock(buffer_handle_t handle) - { - return m_module->unlock(m_module, handle); - } + int unlock(buffer_handle_t handle) + { + return m_module->unlock(m_module, handle); + } private: - GrallocModule(); - const gralloc_module_t *m_module; + GrallocModule(); + const gralloc_module_t *m_module; }; #endif // GRALLOC_ANDROID
diff --git a/src/Common/Half.cpp b/src/Common/Half.cpp index fea54ac..cde8190 100644 --- a/src/Common/Half.cpp +++ b/src/Common/Half.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2011 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Half.hpp" @@ -15,34 +18,34 @@ { half::half(float fp32) { - unsigned int fp32i = *(unsigned int*)&fp32; - unsigned int sign = (fp32i & 0x80000000) >> 16; - unsigned int abs = fp32i & 0x7FFFFFFF; + unsigned int fp32i = *(unsigned int*)&fp32; + unsigned int sign = (fp32i & 0x80000000) >> 16; + unsigned int abs = fp32i & 0x7FFFFFFF; - if(abs > 0x47FFEFFF) // Infinity - { - fp16i = sign | 0x7FFF; - } - else if(abs < 0x38800000) // Denormal - { - unsigned int mantissa = (abs & 0x007FFFFF) | 0x00800000; - int e = 113 - (abs >> 23); + if(abs > 0x47FFEFFF) // Infinity + { + fp16i = sign | 0x7FFF; + } + else if(abs < 0x38800000) // Denormal + { + unsigned int mantissa = (abs & 0x007FFFFF) | 0x00800000; + int e = 113 - (abs >> 23); - if(e < 24) - { - abs = mantissa >> e; - } - else - { - abs = 0; - } + if(e < 24) + { + abs = mantissa >> e; + } + else + { + abs = 0; + } - fp16i = sign | (abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13; - } - else - { - fp16i = sign | (abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13; - } + fp16i = sign | (abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13; + } + else + { + fp16i = sign | (abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13; + } } half::operator float() const @@ -58,7 +61,7 @@ if(m == 0) { fp32i = s << 31; - + return (float&)fp32i; } else @@ -85,7 +88,7 @@ half &half::operator=(half h) { fp16i = h.fp16i; - + return *this; }
diff --git a/src/Common/Half.hpp b/src/Common/Half.hpp index fc412c9..f62ea27 100644 --- a/src/Common/Half.hpp +++ b/src/Common/Half.hpp
@@ -1,32 +1,35 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Half_hpp -#define sw_Half_hpp - -namespace sw -{ - class half - { - public: - explicit half(float f); - - operator float() const; - - half &operator=(half h); - half &operator=(float f); - - private: - unsigned short fp16i; - }; -} - -#endif // sw_Half_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_Half_hpp +#define sw_Half_hpp + +namespace sw +{ + class half + { + public: + explicit half(float f); + + operator float() const; + + half &operator=(half h); + half &operator=(float f); + + private: + unsigned short fp16i; + }; +} + +#endif // sw_Half_hpp
diff --git a/src/Common/Math.cpp b/src/Common/Math.cpp index e8ae3d2..fcf7eca 100644 --- a/src/Common/Math.cpp +++ b/src/Common/Math.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2012 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Math.hpp"
diff --git a/src/Common/Math.hpp b/src/Common/Math.hpp index 9e51850..0b4abe6 100644 --- a/src/Common/Math.hpp +++ b/src/Common/Math.hpp
@@ -1,477 +1,480 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2012 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Math_hpp -#define sw_Math_hpp - -#include "Types.hpp" - -#include <cmath> -#if defined(_MSC_VER) - #include <intrin.h> -#endif - -namespace sw -{ - using std::abs; - - #undef min - #undef max - - template<class T> - inline T max(T a, T b) - { - return a > b ? a : b; - } - - template<class T> - inline T min(T a, T b) - { - return a < b ? a : b; - } - - template<class T> - inline T max(T a, T b, T c) - { - return max(max(a, b), c); - } - - template<class T> - inline T min(T a, T b, T c) - { - return min(min(a, b), c); - } - - template<class T> - inline T max(T a, T b, T c, T d) - { - return max(max(a, b), max(c, d)); - } - - template<class T> - inline T min(T a, T b, T c, T d) - { - return min(min(a, b), min(c, d)); - } - - template<class T> - inline void swap(T &a, T &b) - { - T t = a; - a = b; - b = t; - } - - inline int iround(float x) - { - return (int)floor(x + 0.5f); - // return _mm_cvtss_si32(_mm_load_ss(&x)); // FIXME: Demands SSE support - } - - inline int ifloor(float x) - { - return (int)floor(x); - } - - inline int ceilFix4(int x) - { - return (x + 0xF) & 0xFFFFFFF0; - } - - inline int ceilInt4(int x) - { - return (x + 0xF) >> 4; - } - - #define BITS(x) ( \ - !!((x) & 0x80000000) + \ - !!((x) & 0xC0000000) + \ - !!((x) & 0xE0000000) + \ - !!((x) & 0xF0000000) + \ - !!((x) & 0xF8000000) + \ - !!((x) & 0xFC000000) + \ - !!((x) & 0xFE000000) + \ - !!((x) & 0xFF000000) + \ - !!((x) & 0xFF800000) + \ - !!((x) & 0xFFC00000) + \ - !!((x) & 0xFFE00000) + \ - !!((x) & 0xFFF00000) + \ - !!((x) & 0xFFF80000) + \ - !!((x) & 0xFFFC0000) + \ - !!((x) & 0xFFFE0000) + \ - !!((x) & 0xFFFF0000) + \ - !!((x) & 0xFFFF8000) + \ - !!((x) & 0xFFFFC000) + \ - !!((x) & 0xFFFFE000) + \ - !!((x) & 0xFFFFF000) + \ - !!((x) & 0xFFFFF800) + \ - !!((x) & 0xFFFFFC00) + \ - !!((x) & 0xFFFFFE00) + \ - !!((x) & 0xFFFFFF00) + \ - !!((x) & 0xFFFFFF80) + \ - !!((x) & 0xFFFFFFC0) + \ - !!((x) & 0xFFFFFFE0) + \ - !!((x) & 0xFFFFFFF0) + \ - !!((x) & 0xFFFFFFF8) + \ - !!((x) & 0xFFFFFFFC) + \ - !!((x) & 0xFFFFFFFE) + \ - !!((x) & 0xFFFFFFFF)) - - #define MAX(x, y) ((x) > (y) ? (x) : (y)) - #define MIN(x, y) ((x) < (y) ? (x) : (y)) - - inline float exp2(float x) - { - return exp2f(x); - } - - inline int exp2(int x) - { - return 1 << x; - } - - inline unsigned long log2(int x) - { - #if defined(_MSC_VER) - unsigned long y; - _BitScanReverse(&y, x); - return y; - #else - return 31 - __builtin_clz(x); - #endif - } - - inline int ilog2(float x) - { - unsigned int y = *(unsigned int*)&x; - - return ((y & 0x7F800000) >> 23) - 127; - } - - inline float log2(float x) - { - return logf(x) * 1.44269504f; // 1.0 / log[e](2) - } - - inline bool isPow2(int x) - { - return (x & -x) == x; - } - - template<class T> - inline T clamp(T x, T a, T b) - { - if(x < a) x = a; - if(x > b) x = b; - - return x; - } - - inline float clamp01(float x) - { - return clamp(x, 0.0f, 1.0f); - } - - inline int ceilPow2(int x) - { - int i = 1; - - while(i < x) - { - i <<= 1; - } - - return i; - } - - inline int floorDiv(int a, int b) - { - return a / b + ((a % b) >> 31); - } - - inline int floorMod(int a, int b) - { - int r = a % b; - return r + ((r >> 31) & b); - } - - inline int ceilDiv(int a, int b) - { - return a / b - (-(a % b) >> 31); - } - - inline int ceilMod(int a, int b) - { - int r = a % b; - return r - ((-r >> 31) & b); - } - - template<const int n> - inline unsigned int unorm(float x) - { - static const unsigned int max = 0xFFFFFFFF >> (32 - n); - static const float maxf = static_cast<float>(max); - - if(x >= 1.0f) - { - return max; - } - else if(x <= 0.0f) - { - return 0; - } - else - { - return static_cast<unsigned int>(maxf * x + 0.5f); - } - } - - template<const int n> - inline int snorm(float x) - { - static const unsigned int min = 0x80000000 >> (32 - n); - static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1); - static const float maxf = static_cast<float>(max); - static const unsigned int range = 0xFFFFFFFF >> (32 - n); - - if(x >= 0.0f) - { - if(x >= 1.0f) - { - return max; - } - else - { - return static_cast<int>(maxf * x + 0.5f); - } - } - else - { - if(x <= -1.0f) - { - return min; - } - else - { - return static_cast<int>(maxf * x - 0.5f) & range; - } - } - } - - template<const int n> - inline unsigned int ucast(float x) - { - static const unsigned int max = 0xFFFFFFFF >> (32 - n); - static const float maxf = static_cast<float>(max); - - if(x >= maxf) - { - return max; - } - else if(x <= 0.0f) - { - return 0; - } - else - { - return static_cast<unsigned int>(x + 0.5f); - } - } - - template<const int n> - inline int scast(float x) - { - static const unsigned int min = 0x80000000 >> (32 - n); - static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1); - static const float maxf = static_cast<float>(max); - static const unsigned int range = 0xFFFFFFFF >> (32 - n); - - if(x > 0.0f) - { - if(x >= maxf) - { - return max; - } - else - { - return static_cast<int>(maxf * x + 0.5f); - } - } - else - { - if(x <= -1.0f) - { - return min; - } - else - { - return static_cast<int>(maxf * x - 0.5f) & range; - } - } - } - - inline float sRGBtoLinear(float c) - { - if(c <= 0.04045f) - { - return c * 0.07739938f; // 1.0f / 12.92f; - } - else - { - return powf((c + 0.055f) * 0.9478673f, 2.4f); // 1.0f / 1.055f - } - } - - inline float linearToSRGB(float c) - { - if(c <= 0.0031308f) - { - return c * 12.92f; - } - else - { - return 1.055f * powf(c, 0.4166667f) - 0.055f; // 1.0f / 2.4f - } - } - - unsigned char sRGB8toLinear8(unsigned char value); - - uint64_t FNV_1a(const unsigned char *data, int size); // Fowler-Noll-Vo hash function - - // Round up to the next multiple of alignment - inline unsigned int align(unsigned int value, unsigned int alignment) - { - return ((value + alignment - 1) / alignment) * alignment; - } - - inline int clampToSignedInt(unsigned int x) - { - return static_cast<int>(min(x, 0x7FFFFFFFu)); - } - - class RGB9E5Data - { - unsigned int R : 9; - unsigned int G : 9; - unsigned int B : 9; - unsigned int E : 5; - - public: - void toRGBFloats(float* rgb) const - { - static const float Offset = -24.0f; // Exponent Bias (15) + Number of mantissa bits per component (9) = 24 - - const float factor = powf(2.0f, static_cast<float>(E) + Offset); - rgb[0] = static_cast<float>(R) * factor; - rgb[1] = static_cast<float>(G) * factor; - rgb[2] = static_cast<float>(B) * factor; - } - }; - - class R11G11B10FData - { - unsigned int R : 11; - unsigned int G : 11; - unsigned int B : 10; - - static inline float float11ToFloat32(unsigned short fp11) - { - unsigned short exponent = (fp11 >> 6) & 0x1F; - unsigned short mantissa = fp11 & 0x3F; - - unsigned int output; - if(exponent == 0x1F) - { - // INF or NAN - output = 0x7f800000 | (mantissa << 17); - } - else - { - if(exponent != 0) - { - // normalized - } - else if(mantissa != 0) - { - // The value is denormalized - exponent = 1; - - do - { - exponent--; - mantissa <<= 1; - } while((mantissa & 0x40) == 0); - - mantissa = mantissa & 0x3F; - } - else // The value is zero - { - exponent = static_cast<unsigned short>(-112); - } - - output = ((exponent + 112) << 23) | (mantissa << 17); - } - - return *(float*)(&output); - } - - static inline float float10ToFloat32(unsigned short fp10) - { - unsigned short exponent = (fp10 >> 5) & 0x1F; - unsigned short mantissa = fp10 & 0x1F; - - unsigned int output; - if(exponent == 0x1F) - { - // INF or NAN - output = 0x7f800000 | (mantissa << 17); - } - else - { - if(exponent != 0) - { - // normalized - } - else if(mantissa != 0) - { - // The value is denormalized - exponent = 1; - - do - { - exponent--; - mantissa <<= 1; - } while((mantissa & 0x20) == 0); - - mantissa = mantissa & 0x1F; - } - else // The value is zero - { - exponent = static_cast<unsigned short>(-112); - } - - output = ((exponent + 112) << 23) | (mantissa << 18); - } - - return *(float*)(&output); - } - - public: - void toRGBFloats(float* rgb) const - { - rgb[0] = float11ToFloat32(R); - rgb[1] = float11ToFloat32(G); - rgb[2] = float10ToFloat32(B); - } - }; -} - -#endif // sw_Math_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_Math_hpp +#define sw_Math_hpp + +#include "Types.hpp" + +#include <cmath> +#if defined(_MSC_VER) + #include <intrin.h> +#endif + +namespace sw +{ + using std::abs; + + #undef min + #undef max + + template<class T> + inline T max(T a, T b) + { + return a > b ? a : b; + } + + template<class T> + inline T min(T a, T b) + { + return a < b ? a : b; + } + + template<class T> + inline T max(T a, T b, T c) + { + return max(max(a, b), c); + } + + template<class T> + inline T min(T a, T b, T c) + { + return min(min(a, b), c); + } + + template<class T> + inline T max(T a, T b, T c, T d) + { + return max(max(a, b), max(c, d)); + } + + template<class T> + inline T min(T a, T b, T c, T d) + { + return min(min(a, b), min(c, d)); + } + + template<class T> + inline void swap(T &a, T &b) + { + T t = a; + a = b; + b = t; + } + + inline int iround(float x) + { + return (int)floor(x + 0.5f); + // return _mm_cvtss_si32(_mm_load_ss(&x)); // FIXME: Demands SSE support + } + + inline int ifloor(float x) + { + return (int)floor(x); + } + + inline int ceilFix4(int x) + { + return (x + 0xF) & 0xFFFFFFF0; + } + + inline int ceilInt4(int x) + { + return (x + 0xF) >> 4; + } + + #define BITS(x) ( \ + !!((x) & 0x80000000) + \ + !!((x) & 0xC0000000) + \ + !!((x) & 0xE0000000) + \ + !!((x) & 0xF0000000) + \ + !!((x) & 0xF8000000) + \ + !!((x) & 0xFC000000) + \ + !!((x) & 0xFE000000) + \ + !!((x) & 0xFF000000) + \ + !!((x) & 0xFF800000) + \ + !!((x) & 0xFFC00000) + \ + !!((x) & 0xFFE00000) + \ + !!((x) & 0xFFF00000) + \ + !!((x) & 0xFFF80000) + \ + !!((x) & 0xFFFC0000) + \ + !!((x) & 0xFFFE0000) + \ + !!((x) & 0xFFFF0000) + \ + !!((x) & 0xFFFF8000) + \ + !!((x) & 0xFFFFC000) + \ + !!((x) & 0xFFFFE000) + \ + !!((x) & 0xFFFFF000) + \ + !!((x) & 0xFFFFF800) + \ + !!((x) & 0xFFFFFC00) + \ + !!((x) & 0xFFFFFE00) + \ + !!((x) & 0xFFFFFF00) + \ + !!((x) & 0xFFFFFF80) + \ + !!((x) & 0xFFFFFFC0) + \ + !!((x) & 0xFFFFFFE0) + \ + !!((x) & 0xFFFFFFF0) + \ + !!((x) & 0xFFFFFFF8) + \ + !!((x) & 0xFFFFFFFC) + \ + !!((x) & 0xFFFFFFFE) + \ + !!((x) & 0xFFFFFFFF)) + + #define MAX(x, y) ((x) > (y) ? (x) : (y)) + #define MIN(x, y) ((x) < (y) ? (x) : (y)) + + inline float exp2(float x) + { + return exp2f(x); + } + + inline int exp2(int x) + { + return 1 << x; + } + + inline unsigned long log2(int x) + { + #if defined(_MSC_VER) + unsigned long y; + _BitScanReverse(&y, x); + return y; + #else + return 31 - __builtin_clz(x); + #endif + } + + inline int ilog2(float x) + { + unsigned int y = *(unsigned int*)&x; + + return ((y & 0x7F800000) >> 23) - 127; + } + + inline float log2(float x) + { + return logf(x) * 1.44269504f; // 1.0 / log[e](2) + } + + inline bool isPow2(int x) + { + return (x & -x) == x; + } + + template<class T> + inline T clamp(T x, T a, T b) + { + if(x < a) x = a; + if(x > b) x = b; + + return x; + } + + inline float clamp01(float x) + { + return clamp(x, 0.0f, 1.0f); + } + + inline int ceilPow2(int x) + { + int i = 1; + + while(i < x) + { + i <<= 1; + } + + return i; + } + + inline int floorDiv(int a, int b) + { + return a / b + ((a % b) >> 31); + } + + inline int floorMod(int a, int b) + { + int r = a % b; + return r + ((r >> 31) & b); + } + + inline int ceilDiv(int a, int b) + { + return a / b - (-(a % b) >> 31); + } + + inline int ceilMod(int a, int b) + { + int r = a % b; + return r - ((-r >> 31) & b); + } + + template<const int n> + inline unsigned int unorm(float x) + { + static const unsigned int max = 0xFFFFFFFF >> (32 - n); + static const float maxf = static_cast<float>(max); + + if(x >= 1.0f) + { + return max; + } + else if(x <= 0.0f) + { + return 0; + } + else + { + return static_cast<unsigned int>(maxf * x + 0.5f); + } + } + + template<const int n> + inline int snorm(float x) + { + static const unsigned int min = 0x80000000 >> (32 - n); + static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1); + static const float maxf = static_cast<float>(max); + static const unsigned int range = 0xFFFFFFFF >> (32 - n); + + if(x >= 0.0f) + { + if(x >= 1.0f) + { + return max; + } + else + { + return static_cast<int>(maxf * x + 0.5f); + } + } + else + { + if(x <= -1.0f) + { + return min; + } + else + { + return static_cast<int>(maxf * x - 0.5f) & range; + } + } + } + + template<const int n> + inline unsigned int ucast(float x) + { + static const unsigned int max = 0xFFFFFFFF >> (32 - n); + static const float maxf = static_cast<float>(max); + + if(x >= maxf) + { + return max; + } + else if(x <= 0.0f) + { + return 0; + } + else + { + return static_cast<unsigned int>(x + 0.5f); + } + } + + template<const int n> + inline int scast(float x) + { + static const unsigned int min = 0x80000000 >> (32 - n); + static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1); + static const float maxf = static_cast<float>(max); + static const unsigned int range = 0xFFFFFFFF >> (32 - n); + + if(x > 0.0f) + { + if(x >= maxf) + { + return max; + } + else + { + return static_cast<int>(maxf * x + 0.5f); + } + } + else + { + if(x <= -1.0f) + { + return min; + } + else + { + return static_cast<int>(maxf * x - 0.5f) & range; + } + } + } + + inline float sRGBtoLinear(float c) + { + if(c <= 0.04045f) + { + return c * 0.07739938f; // 1.0f / 12.92f; + } + else + { + return powf((c + 0.055f) * 0.9478673f, 2.4f); // 1.0f / 1.055f + } + } + + inline float linearToSRGB(float c) + { + if(c <= 0.0031308f) + { + return c * 12.92f; + } + else + { + return 1.055f * powf(c, 0.4166667f) - 0.055f; // 1.0f / 2.4f + } + } + + unsigned char sRGB8toLinear8(unsigned char value); + + uint64_t FNV_1a(const unsigned char *data, int size); // Fowler-Noll-Vo hash function + + // Round up to the next multiple of alignment + inline unsigned int align(unsigned int value, unsigned int alignment) + { + return ((value + alignment - 1) / alignment) * alignment; + } + + inline int clampToSignedInt(unsigned int x) + { + return static_cast<int>(min(x, 0x7FFFFFFFu)); + } + + class RGB9E5Data + { + unsigned int R : 9; + unsigned int G : 9; + unsigned int B : 9; + unsigned int E : 5; + + public: + void toRGBFloats(float* rgb) const + { + static const float Offset = -24.0f; // Exponent Bias (15) + Number of mantissa bits per component (9) = 24 + + const float factor = powf(2.0f, static_cast<float>(E) + Offset); + rgb[0] = static_cast<float>(R) * factor; + rgb[1] = static_cast<float>(G) * factor; + rgb[2] = static_cast<float>(B) * factor; + } + }; + + class R11G11B10FData + { + unsigned int R : 11; + unsigned int G : 11; + unsigned int B : 10; + + static inline float float11ToFloat32(unsigned short fp11) + { + unsigned short exponent = (fp11 >> 6) & 0x1F; + unsigned short mantissa = fp11 & 0x3F; + + unsigned int output; + if(exponent == 0x1F) + { + // INF or NAN + output = 0x7f800000 | (mantissa << 17); + } + else + { + if(exponent != 0) + { + // normalized + } + else if(mantissa != 0) + { + // The value is denormalized + exponent = 1; + + do + { + exponent--; + mantissa <<= 1; + } while((mantissa & 0x40) == 0); + + mantissa = mantissa & 0x3F; + } + else // The value is zero + { + exponent = static_cast<unsigned short>(-112); + } + + output = ((exponent + 112) << 23) | (mantissa << 17); + } + + return *(float*)(&output); + } + + static inline float float10ToFloat32(unsigned short fp10) + { + unsigned short exponent = (fp10 >> 5) & 0x1F; + unsigned short mantissa = fp10 & 0x1F; + + unsigned int output; + if(exponent == 0x1F) + { + // INF or NAN + output = 0x7f800000 | (mantissa << 17); + } + else + { + if(exponent != 0) + { + // normalized + } + else if(mantissa != 0) + { + // The value is denormalized + exponent = 1; + + do + { + exponent--; + mantissa <<= 1; + } while((mantissa & 0x20) == 0); + + mantissa = mantissa & 0x1F; + } + else // The value is zero + { + exponent = static_cast<unsigned short>(-112); + } + + output = ((exponent + 112) << 23) | (mantissa << 18); + } + + return *(float*)(&output); + } + + public: + void toRGBFloats(float* rgb) const + { + rgb[0] = float11ToFloat32(R); + rgb[1] = float11ToFloat32(G); + rgb[2] = float10ToFloat32(B); + } + }; +} + +#endif // sw_Math_hpp
diff --git a/src/Common/Memory.cpp b/src/Common/Memory.cpp index 12f21b3..d87575c 100644 --- a/src/Common/Memory.cpp +++ b/src/Common/Memory.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2013 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Memory.hpp"
diff --git a/src/Common/Memory.hpp b/src/Common/Memory.hpp index 36b84e5..3cf4be1 100644 --- a/src/Common/Memory.hpp +++ b/src/Common/Memory.hpp
@@ -1,30 +1,33 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2013 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef Memory_hpp -#define Memory_hpp - -#include <stddef.h> - -namespace sw -{ -size_t memoryPageSize(); - -void *allocate(size_t bytes, size_t alignment = 16); -void *allocateZero(size_t bytes, size_t alignment = 16); -void deallocate(void *memory); - -void *allocateExecutable(size_t bytes); // Allocates memory that can be made executable using markExecutable() -void markExecutable(void *memory, size_t bytes); -void deallocateExecutable(void *memory, size_t bytes); -} - -#endif // Memory_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 Memory_hpp +#define Memory_hpp + +#include <stddef.h> + +namespace sw +{ +size_t memoryPageSize(); + +void *allocate(size_t bytes, size_t alignment = 16); +void *allocateZero(size_t bytes, size_t alignment = 16); +void deallocate(void *memory); + +void *allocateExecutable(size_t bytes); // Allocates memory that can be made executable using markExecutable() +void markExecutable(void *memory, size_t bytes); +void deallocateExecutable(void *memory, size_t bytes); +} + +#endif // Memory_hpp
diff --git a/src/Common/MetaMacro.hpp b/src/Common/MetaMacro.hpp index 1ceb70c..f717d75 100644 --- a/src/Common/MetaMacro.hpp +++ b/src/Common/MetaMacro.hpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2011 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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 sw_MetaMacro_hpp #define sw_MetaMacro_hpp
diff --git a/src/Common/MutexLock.hpp b/src/Common/MutexLock.hpp index 31e5189..16835ed 100644 --- a/src/Common/MutexLock.hpp +++ b/src/Common/MutexLock.hpp
@@ -1,126 +1,129 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_MutexLock_hpp -#define sw_MutexLock_hpp - -#include "Thread.hpp" - -namespace sw -{ - class BackoffLock - { - public: - BackoffLock() - { - mutex = 0; - } - - bool attemptLock() - { - if(!isLocked()) - { - if(atomicExchange(&mutex, 1) == 0) - { - return true; - } - } - - return false; - } - - void lock() - { - int backoff = 1; - - while(!attemptLock()) - { - if(backoff <= 64) - { - for(int i = 0; i < backoff; i++) - { - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - - nop(); - nop(); - nop(); - nop(); - nop(); - } - - backoff *= 2; - } - else - { - Thread::yield(); - - backoff = 1; - } - }; - } - - void unlock() - { - mutex = 0; - } - - bool isLocked() - { - return mutex != 0; - } - - private: - struct - { - // Ensure that the mutex variable is on its own 64-byte cache line to avoid false sharing - // Padding must be public to avoid compiler warnings - volatile int padding1[16]; - volatile int mutex; - volatile int padding2[15]; - }; - }; -} - -#endif // sw_MutexLock_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_MutexLock_hpp +#define sw_MutexLock_hpp + +#include "Thread.hpp" + +namespace sw +{ + class BackoffLock + { + public: + BackoffLock() + { + mutex = 0; + } + + bool attemptLock() + { + if(!isLocked()) + { + if(atomicExchange(&mutex, 1) == 0) + { + return true; + } + } + + return false; + } + + void lock() + { + int backoff = 1; + + while(!attemptLock()) + { + if(backoff <= 64) + { + for(int i = 0; i < backoff; i++) + { + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + + nop(); + nop(); + nop(); + nop(); + nop(); + } + + backoff *= 2; + } + else + { + Thread::yield(); + + backoff = 1; + } + }; + } + + void unlock() + { + mutex = 0; + } + + bool isLocked() + { + return mutex != 0; + } + + private: + struct + { + // Ensure that the mutex variable is on its own 64-byte cache line to avoid false sharing + // Padding must be public to avoid compiler warnings + volatile int padding1[16]; + volatile int mutex; + volatile int padding2[15]; + }; + }; +} + +#endif // sw_MutexLock_hpp
diff --git a/src/Common/Resource.cpp b/src/Common/Resource.cpp index e96d7d0..b016c95 100644 --- a/src/Common/Resource.cpp +++ b/src/Common/Resource.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2012 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Resource.hpp" @@ -28,7 +31,7 @@ Resource::~Resource() { - deallocate(buffer); + deallocate(buffer); } void *Resource::lock(Accessor claimer)
diff --git a/src/Common/Resource.hpp b/src/Common/Resource.hpp index 6a275f1..6d2577e 100644 --- a/src/Common/Resource.hpp +++ b/src/Common/Resource.hpp
@@ -1,57 +1,60 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Resource_hpp -#define sw_Resource_hpp - -#include "MutexLock.hpp" - -namespace sw -{ - enum Accessor - { - PUBLIC, // Application/API access - PRIVATE, // Renderer access, shared by multiple threads if read-only - MANAGED, // Renderer access, shared read/write access if partitioned - DESTRUCT - }; - - class Resource - { - public: - Resource(size_t bytes); - - void destruct(); // Asynchronous destructor - - void *lock(Accessor claimer); - void *lock(Accessor relinquisher, Accessor claimer); - void unlock(); - void unlock(Accessor relinquisher); - - const void *data() const; - const size_t size; - - private: - ~Resource(); // Always call destruct() instead - - BackoffLock criticalSection; - Event unblock; - volatile int blocked; - - volatile Accessor accessor; - volatile int count; - bool orphaned; - - void *buffer; - }; -} - -#endif // sw_Resource_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_Resource_hpp +#define sw_Resource_hpp + +#include "MutexLock.hpp" + +namespace sw +{ + enum Accessor + { + PUBLIC, // Application/API access + PRIVATE, // Renderer access, shared by multiple threads if read-only + MANAGED, // Renderer access, shared read/write access if partitioned + DESTRUCT + }; + + class Resource + { + public: + Resource(size_t bytes); + + void destruct(); // Asynchronous destructor + + void *lock(Accessor claimer); + void *lock(Accessor relinquisher, Accessor claimer); + void unlock(); + void unlock(Accessor relinquisher); + + const void *data() const; + const size_t size; + + private: + ~Resource(); // Always call destruct() instead + + BackoffLock criticalSection; + Event unblock; + volatile int blocked; + + volatile Accessor accessor; + volatile int count; + bool orphaned; + + void *buffer; + }; +} + +#endif // sw_Resource_hpp
diff --git a/src/Common/SharedLibrary.hpp b/src/Common/SharedLibrary.hpp index 1046d64..8d881c1 100644 --- a/src/Common/SharedLibrary.hpp +++ b/src/Common/SharedLibrary.hpp
@@ -1,129 +1,132 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2012 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef SharedLibrary_hpp -#define SharedLibrary_hpp - -#if defined(_WIN32) - #include <Windows.h> -#else - #include <dlfcn.h> -#endif - -void *getLibraryHandle(const char *path); -void *loadLibrary(const char *path); -void freeLibrary(void *library); -void *getProcAddress(void *library, const char *name); - -template<int n> -void *loadLibrary(const char *(&names)[n], const char *mustContainSymbol = nullptr) -{ - for(int i = 0; i < n; i++) - { - void *library = getLibraryHandle(names[i]); - - if(library) - { - if(!mustContainSymbol || getProcAddress(library, mustContainSymbol)) - { - return library; - } - - freeLibrary(library); - } - } - - for(int i = 0; i < n; i++) - { - void *library = loadLibrary(names[i]); - - if(library) - { - if(!mustContainSymbol || getProcAddress(library, mustContainSymbol)) - { - return library; - } - - freeLibrary(library); - } - } - - return 0; -} - -#if defined(_WIN32) - inline void *loadLibrary(const char *path) - { - return (void*)LoadLibrary(path); - } - - inline void *getLibraryHandle(const char *path) - { - HMODULE module = 0; - GetModuleHandleEx(0, path, &module); - return (void*)module; - } - - inline void freeLibrary(void *library) - { - FreeLibrary((HMODULE)library); - } - - inline void *getProcAddress(void *library, const char *name) - { - return (void*)GetProcAddress((HMODULE)library, name); - } -#else - inline void *loadLibrary(const char *path) - { - return dlopen(path, RTLD_LAZY | RTLD_LOCAL); - } - - inline void *getLibraryHandle(const char *path) - { - #ifdef __ANDROID__ - // bionic doesn't support RTLD_NOLOAD before L - return dlopen(path, RTLD_NOW | RTLD_LOCAL); - #else - void *resident = dlopen(path, RTLD_LAZY | RTLD_NOLOAD | RTLD_LOCAL); - - if(resident) - { - return dlopen(path, RTLD_LAZY | RTLD_LOCAL); // Increment reference count - } - - return 0; - #endif - } - - inline void freeLibrary(void *library) - { - if(library) - { - dlclose(library); - } - } - - inline void *getProcAddress(void *library, const char *name) - { - void *symbol = dlsym(library, name); - - if(!symbol) - { - const char *reason = dlerror(); // Silence the error - (void)reason; - } - - return symbol; - } -#endif - -#endif // SharedLibrary_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 SharedLibrary_hpp +#define SharedLibrary_hpp + +#if defined(_WIN32) + #include <Windows.h> +#else + #include <dlfcn.h> +#endif + +void *getLibraryHandle(const char *path); +void *loadLibrary(const char *path); +void freeLibrary(void *library); +void *getProcAddress(void *library, const char *name); + +template<int n> +void *loadLibrary(const char *(&names)[n], const char *mustContainSymbol = nullptr) +{ + for(int i = 0; i < n; i++) + { + void *library = getLibraryHandle(names[i]); + + if(library) + { + if(!mustContainSymbol || getProcAddress(library, mustContainSymbol)) + { + return library; + } + + freeLibrary(library); + } + } + + for(int i = 0; i < n; i++) + { + void *library = loadLibrary(names[i]); + + if(library) + { + if(!mustContainSymbol || getProcAddress(library, mustContainSymbol)) + { + return library; + } + + freeLibrary(library); + } + } + + return 0; +} + +#if defined(_WIN32) + inline void *loadLibrary(const char *path) + { + return (void*)LoadLibrary(path); + } + + inline void *getLibraryHandle(const char *path) + { + HMODULE module = 0; + GetModuleHandleEx(0, path, &module); + return (void*)module; + } + + inline void freeLibrary(void *library) + { + FreeLibrary((HMODULE)library); + } + + inline void *getProcAddress(void *library, const char *name) + { + return (void*)GetProcAddress((HMODULE)library, name); + } +#else + inline void *loadLibrary(const char *path) + { + return dlopen(path, RTLD_LAZY | RTLD_LOCAL); + } + + inline void *getLibraryHandle(const char *path) + { + #ifdef __ANDROID__ + // bionic doesn't support RTLD_NOLOAD before L + return dlopen(path, RTLD_NOW | RTLD_LOCAL); + #else + void *resident = dlopen(path, RTLD_LAZY | RTLD_NOLOAD | RTLD_LOCAL); + + if(resident) + { + return dlopen(path, RTLD_LAZY | RTLD_LOCAL); // Increment reference count + } + + return 0; + #endif + } + + inline void freeLibrary(void *library) + { + if(library) + { + dlclose(library); + } + } + + inline void *getProcAddress(void *library, const char *name) + { + void *symbol = dlsym(library, name); + + if(!symbol) + { + const char *reason = dlerror(); // Silence the error + (void)reason; + } + + return symbol; + } +#endif + +#endif // SharedLibrary_hpp
diff --git a/src/Common/Socket.cpp b/src/Common/Socket.cpp index a0ac3f4..a19f574 100644 --- a/src/Common/Socket.cpp +++ b/src/Common/Socket.cpp
@@ -1,106 +1,109 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2012 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#include "Socket.hpp" - -#if defined(_WIN32) - #include <ws2tcpip.h> -#else - #include <unistd.h> - #include <netdb.h> - #include <netinet/in.h> -#endif - -namespace sw -{ - Socket::Socket(SOCKET socket) : socket(socket) - { - } - - Socket::Socket(const char *address, const char *port) - { - #if defined(_WIN32) - socket = INVALID_SOCKET; - #else - socket = -1; - #endif - - addrinfo hints = {}; - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - hints.ai_flags = AI_PASSIVE; - - addrinfo *info = 0; - getaddrinfo(address, port, &hints, &info); - - if(info) - { - socket = ::socket(info->ai_family, info->ai_socktype, info->ai_protocol); - bind(socket, info->ai_addr, (int)info->ai_addrlen); - } - } - - Socket::~Socket() - { - #if defined(_WIN32) - closesocket(socket); - #else - close(socket); - #endif - } - - void Socket::listen(int backlog) - { - ::listen(socket, backlog); - } - - bool Socket::select(int us) - { - fd_set sockets; - FD_ZERO(&sockets); - FD_SET(socket, &sockets); - - timeval timeout = {us / 1000000, us % 1000000}; - - return ::select(FD_SETSIZE, &sockets, 0, 0, &timeout) >= 1; - } - - Socket *Socket::accept() - { - return new Socket(::accept(socket, 0, 0)); - } - - int Socket::receive(char *buffer, int length) - { - return recv(socket, buffer, length, 0); - } - - void Socket::send(const char *buffer, int length) - { - ::send(socket, buffer, length, 0); - } - - void Socket::startup() - { - #if defined(_WIN32) - WSADATA winsockData; - WSAStartup(MAKEWORD(2, 2), &winsockData); - #endif - } - - void Socket::cleanup() - { - #if defined(_WIN32) - WSACleanup(); - #endif - } -} +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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. + +#include "Socket.hpp" + +#if defined(_WIN32) + #include <ws2tcpip.h> +#else + #include <unistd.h> + #include <netdb.h> + #include <netinet/in.h> +#endif + +namespace sw +{ + Socket::Socket(SOCKET socket) : socket(socket) + { + } + + Socket::Socket(const char *address, const char *port) + { + #if defined(_WIN32) + socket = INVALID_SOCKET; + #else + socket = -1; + #endif + + addrinfo hints = {}; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; + + addrinfo *info = 0; + getaddrinfo(address, port, &hints, &info); + + if(info) + { + socket = ::socket(info->ai_family, info->ai_socktype, info->ai_protocol); + bind(socket, info->ai_addr, (int)info->ai_addrlen); + } + } + + Socket::~Socket() + { + #if defined(_WIN32) + closesocket(socket); + #else + close(socket); + #endif + } + + void Socket::listen(int backlog) + { + ::listen(socket, backlog); + } + + bool Socket::select(int us) + { + fd_set sockets; + FD_ZERO(&sockets); + FD_SET(socket, &sockets); + + timeval timeout = {us / 1000000, us % 1000000}; + + return ::select(FD_SETSIZE, &sockets, 0, 0, &timeout) >= 1; + } + + Socket *Socket::accept() + { + return new Socket(::accept(socket, 0, 0)); + } + + int Socket::receive(char *buffer, int length) + { + return recv(socket, buffer, length, 0); + } + + void Socket::send(const char *buffer, int length) + { + ::send(socket, buffer, length, 0); + } + + void Socket::startup() + { + #if defined(_WIN32) + WSADATA winsockData; + WSAStartup(MAKEWORD(2, 2), &winsockData); + #endif + } + + void Socket::cleanup() + { + #if defined(_WIN32) + WSACleanup(); + #endif + } +}
diff --git a/src/Common/Socket.hpp b/src/Common/Socket.hpp index b712cd3..b6b9abd 100644 --- a/src/Common/Socket.hpp +++ b/src/Common/Socket.hpp
@@ -1,46 +1,49 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2012 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Socket_hpp -#define sw_Socket_hpp - -#if defined(_WIN32) - #include <winsock2.h> -#else - #include <sys/socket.h> - typedef int SOCKET; -#endif - -namespace sw -{ - class Socket - { - public: - Socket(SOCKET socket); - Socket(const char *address, const char *port); - ~Socket(); - - void listen(int backlog = 1); - bool select(int us); - Socket *accept(); - - int receive(char *buffer, int length); - void send(const char *buffer, int length); - - static void startup(); - static void cleanup(); - - private: - SOCKET socket; - }; -} - -#endif // sw_Socket_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_Socket_hpp +#define sw_Socket_hpp + +#if defined(_WIN32) + #include <winsock2.h> +#else + #include <sys/socket.h> + typedef int SOCKET; +#endif + +namespace sw +{ + class Socket + { + public: + Socket(SOCKET socket); + Socket(const char *address, const char *port); + ~Socket(); + + void listen(int backlog = 1); + bool select(int us); + Socket *accept(); + + int receive(char *buffer, int length); + void send(const char *buffer, int length); + + static void startup(); + static void cleanup(); + + private: + SOCKET socket; + }; +} + +#endif // sw_Socket_hpp
diff --git a/src/Common/Thread.cpp b/src/Common/Thread.cpp index 9db3b48..9a7b342 100644 --- a/src/Common/Thread.cpp +++ b/src/Common/Thread.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2012 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Thread.hpp"
diff --git a/src/Common/Thread.hpp b/src/Common/Thread.hpp index d57dd41..deb8b29 100644 --- a/src/Common/Thread.hpp +++ b/src/Common/Thread.hpp
@@ -1,250 +1,253 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2012 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Thread_hpp -#define sw_Thread_hpp - -#if defined(_WIN32) - #ifndef WIN32_LEAN_AND_MEAN - #define WIN32_LEAN_AND_MEAN - #endif - #include <windows.h> - #include <intrin.h> -#else - #include <pthread.h> - #include <sched.h> - #include <unistd.h> - #define TLS_OUT_OF_INDEXES (~0) -#endif - -namespace sw -{ - class Event; - - class Thread - { - public: - Thread(void (*threadFunction)(void *parameters), void *parameters); - - ~Thread(); - - void join(); - - static void yield(); - static void sleep(int milliseconds); - - #if defined(_WIN32) - typedef DWORD LocalStorageKey; - #else - typedef pthread_key_t LocalStorageKey; - #endif - - static LocalStorageKey allocateLocalStorageKey(); - static void freeLocalStorageKey(LocalStorageKey key); - static void setLocalStorage(LocalStorageKey key, void *value); - static void *getLocalStorage(LocalStorageKey key); - - private: - struct Entry - { - void (*const threadFunction)(void *parameters); - void *threadParameters; - Event *init; - }; - - #if defined(_WIN32) - static unsigned long __stdcall startFunction(void *parameters); - HANDLE handle; - #else - static void *startFunction(void *parameters); - pthread_t handle; - #endif - }; - - class Event - { - friend class Thread; - - public: - Event(); - - ~Event(); - - void signal(); - void wait(); - - private: - #if defined(_WIN32) - HANDLE handle; - #else - pthread_cond_t handle; - pthread_mutex_t mutex; - volatile bool signaled; - #endif - }; - - #if PERF_PROFILE - int64_t atomicExchange(int64_t volatile *target, int64_t value); - #endif - - int atomicExchange(int volatile *target, int value); - int atomicIncrement(int volatile *value); - int atomicDecrement(int volatile *value); - int atomicAdd(int volatile *target, int value); - void nop(); -} - -namespace sw -{ - inline void Thread::yield() - { - #if defined(_WIN32) - Sleep(0); - #elif defined(__APPLE__) - pthread_yield_np(); - #else - sched_yield(); - #endif - } - - inline void Thread::sleep(int milliseconds) - { - #if defined(_WIN32) - Sleep(milliseconds); - #else - usleep(1000 * milliseconds); - #endif - } - - inline Thread::LocalStorageKey Thread::allocateLocalStorageKey() - { - #if defined(_WIN32) - return TlsAlloc(); - #else - LocalStorageKey key; - pthread_key_create(&key, 0); - return key; - #endif - } - - inline void Thread::freeLocalStorageKey(LocalStorageKey key) - { - #if defined(_WIN32) - TlsFree(key); - #else - pthread_key_delete(key); - #endif - } - - inline void Thread::setLocalStorage(LocalStorageKey key, void *value) - { - #if defined(_WIN32) - TlsSetValue(key, value); - #else - pthread_setspecific(key, value); - #endif - } - - inline void *Thread::getLocalStorage(LocalStorageKey key) - { - #if defined(_WIN32) - return TlsGetValue(key); - #else - return pthread_getspecific(key); - #endif - } - - inline void Event::signal() - { - #if defined(_WIN32) - SetEvent(handle); - #else - pthread_mutex_lock(&mutex); - signaled = true; - pthread_cond_signal(&handle); - pthread_mutex_unlock(&mutex); - #endif - } - - inline void Event::wait() - { - #if defined(_WIN32) - WaitForSingleObject(handle, INFINITE); - #else - pthread_mutex_lock(&mutex); - while(!signaled) pthread_cond_wait(&handle, &mutex); - signaled = false; - pthread_mutex_unlock(&mutex); - #endif - } - - #if PERF_PROFILE - inline int64_t atomicExchange(volatile int64_t *target, int64_t value) - { - #if defined(_WIN32) - return InterlockedExchange64(target, value); - #else - int ret; - __asm__ __volatile__("lock; xchg8 %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" ); - return ret; - #endif - } - #endif - - inline int atomicExchange(volatile int *target, int value) - { - #if defined(_WIN32) - return InterlockedExchange((volatile long*)target, (long)value); - #else - int ret; - __asm__ __volatile__("lock; xchgl %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" ); - return ret; - #endif - } - - inline int atomicIncrement(volatile int *value) - { - #if defined(_WIN32) - return InterlockedIncrement((volatile long*)value); - #else - return __sync_add_and_fetch(value, 1); - #endif - } - - inline int atomicDecrement(volatile int *value) - { - #if defined(_WIN32) - return InterlockedDecrement((volatile long*)value); - #else - return __sync_sub_and_fetch(value, 1); - #endif - } - - inline int atomicAdd(volatile int* target, int value) - { - #if defined(_MSC_VER) - return InterlockedExchangeAdd((volatile long*)target, value) + value; - #else - return __sync_add_and_fetch(target, value); - #endif - } - - inline void nop() - { - #if defined(_WIN32) - __nop(); - #else - __asm__ __volatile__ ("nop"); - #endif - } -} - -#endif // sw_Thread_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_Thread_hpp +#define sw_Thread_hpp + +#if defined(_WIN32) + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include <windows.h> + #include <intrin.h> +#else + #include <pthread.h> + #include <sched.h> + #include <unistd.h> + #define TLS_OUT_OF_INDEXES (~0) +#endif + +namespace sw +{ + class Event; + + class Thread + { + public: + Thread(void (*threadFunction)(void *parameters), void *parameters); + + ~Thread(); + + void join(); + + static void yield(); + static void sleep(int milliseconds); + + #if defined(_WIN32) + typedef DWORD LocalStorageKey; + #else + typedef pthread_key_t LocalStorageKey; + #endif + + static LocalStorageKey allocateLocalStorageKey(); + static void freeLocalStorageKey(LocalStorageKey key); + static void setLocalStorage(LocalStorageKey key, void *value); + static void *getLocalStorage(LocalStorageKey key); + + private: + struct Entry + { + void (*const threadFunction)(void *parameters); + void *threadParameters; + Event *init; + }; + + #if defined(_WIN32) + static unsigned long __stdcall startFunction(void *parameters); + HANDLE handle; + #else + static void *startFunction(void *parameters); + pthread_t handle; + #endif + }; + + class Event + { + friend class Thread; + + public: + Event(); + + ~Event(); + + void signal(); + void wait(); + + private: + #if defined(_WIN32) + HANDLE handle; + #else + pthread_cond_t handle; + pthread_mutex_t mutex; + volatile bool signaled; + #endif + }; + + #if PERF_PROFILE + int64_t atomicExchange(int64_t volatile *target, int64_t value); + #endif + + int atomicExchange(int volatile *target, int value); + int atomicIncrement(int volatile *value); + int atomicDecrement(int volatile *value); + int atomicAdd(int volatile *target, int value); + void nop(); +} + +namespace sw +{ + inline void Thread::yield() + { + #if defined(_WIN32) + Sleep(0); + #elif defined(__APPLE__) + pthread_yield_np(); + #else + sched_yield(); + #endif + } + + inline void Thread::sleep(int milliseconds) + { + #if defined(_WIN32) + Sleep(milliseconds); + #else + usleep(1000 * milliseconds); + #endif + } + + inline Thread::LocalStorageKey Thread::allocateLocalStorageKey() + { + #if defined(_WIN32) + return TlsAlloc(); + #else + LocalStorageKey key; + pthread_key_create(&key, 0); + return key; + #endif + } + + inline void Thread::freeLocalStorageKey(LocalStorageKey key) + { + #if defined(_WIN32) + TlsFree(key); + #else + pthread_key_delete(key); + #endif + } + + inline void Thread::setLocalStorage(LocalStorageKey key, void *value) + { + #if defined(_WIN32) + TlsSetValue(key, value); + #else + pthread_setspecific(key, value); + #endif + } + + inline void *Thread::getLocalStorage(LocalStorageKey key) + { + #if defined(_WIN32) + return TlsGetValue(key); + #else + return pthread_getspecific(key); + #endif + } + + inline void Event::signal() + { + #if defined(_WIN32) + SetEvent(handle); + #else + pthread_mutex_lock(&mutex); + signaled = true; + pthread_cond_signal(&handle); + pthread_mutex_unlock(&mutex); + #endif + } + + inline void Event::wait() + { + #if defined(_WIN32) + WaitForSingleObject(handle, INFINITE); + #else + pthread_mutex_lock(&mutex); + while(!signaled) pthread_cond_wait(&handle, &mutex); + signaled = false; + pthread_mutex_unlock(&mutex); + #endif + } + + #if PERF_PROFILE + inline int64_t atomicExchange(volatile int64_t *target, int64_t value) + { + #if defined(_WIN32) + return InterlockedExchange64(target, value); + #else + int ret; + __asm__ __volatile__("lock; xchg8 %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" ); + return ret; + #endif + } + #endif + + inline int atomicExchange(volatile int *target, int value) + { + #if defined(_WIN32) + return InterlockedExchange((volatile long*)target, (long)value); + #else + int ret; + __asm__ __volatile__("lock; xchgl %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" ); + return ret; + #endif + } + + inline int atomicIncrement(volatile int *value) + { + #if defined(_WIN32) + return InterlockedIncrement((volatile long*)value); + #else + return __sync_add_and_fetch(value, 1); + #endif + } + + inline int atomicDecrement(volatile int *value) + { + #if defined(_WIN32) + return InterlockedDecrement((volatile long*)value); + #else + return __sync_sub_and_fetch(value, 1); + #endif + } + + inline int atomicAdd(volatile int* target, int value) + { + #if defined(_MSC_VER) + return InterlockedExchangeAdd((volatile long*)target, value) + value; + #else + return __sync_add_and_fetch(target, value); + #endif + } + + inline void nop() + { + #if defined(_WIN32) + __nop(); + #else + __asm__ __volatile__ ("nop"); + #endif + } +} + +#endif // sw_Thread_hpp
diff --git a/src/Common/Timer.cpp b/src/Common/Timer.cpp index b2bbd1b..a147c8b 100644 --- a/src/Common/Timer.cpp +++ b/src/Common/Timer.cpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2012 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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. #include "Timer.hpp"
diff --git a/src/Common/Timer.hpp b/src/Common/Timer.hpp index 0b8b6c4..977c877 100644 --- a/src/Common/Timer.hpp +++ b/src/Common/Timer.hpp
@@ -1,34 +1,37 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Timer_hpp -#define sw_Timer_hpp - -#include "Types.hpp" - -namespace sw -{ - class Timer - { - public: - Timer(); - - ~Timer(); - - static double seconds(); - static int64_t ticks(); - - static int64_t counter(); - static int64_t frequency(); - }; -} - -#endif // sw_Timer_hpp +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. +// +// 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 sw_Timer_hpp +#define sw_Timer_hpp + +#include "Types.hpp" + +namespace sw +{ + class Timer + { + public: + Timer(); + + ~Timer(); + + static double seconds(); + static int64_t ticks(); + + static int64_t counter(); + static int64_t frequency(); + }; +} + +#endif // sw_Timer_hpp
diff --git a/src/Common/Types.hpp b/src/Common/Types.hpp index 1337f4d..5675ccb 100644 --- a/src/Common/Types.hpp +++ b/src/Common/Types.hpp
@@ -1,13 +1,16 @@ -// SwiftShader Software Renderer +// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // -// Copyright(c) 2005-2012 TransGaming Inc. +// 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 // -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. +// 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 sw_Types_hpp #define sw_Types_hpp @@ -123,7 +126,7 @@ return v; } - + inline float4 replicate(float f) { float4 v;