diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2018-09-27 19:54:10 +0100 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2018-09-27 19:54:10 +0100 |
commit | a84ee929a5221aec07bcc93815ca6c57bb8ab6bb (patch) | |
tree | ecf9694b9e772161b67c8b0935362b0e05cc7c7d /indra/newview/llfeaturemanager.cpp | |
parent | 4d4255c27b45ed5e32fe7c4870e2ce3ed10cb140 (diff) | |
parent | 58aef8beaf79dc83546a7b080014ca5030733ac8 (diff) |
merge
Diffstat (limited to 'indra/newview/llfeaturemanager.cpp')
-rw-r--r-- | indra/newview/llfeaturemanager.cpp | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 487496df9a..8d07035b97 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -377,6 +377,43 @@ bool LLFeatureManager::parseFeatureTable(std::string filename) F32 gpu_benchmark(); +#if LL_WINDOWS + +static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific + +U32 exception_benchmark_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop) +{ + if (code == STATUS_MSC_EXCEPTION) + { + // C++ exception, go on + return EXCEPTION_CONTINUE_SEARCH; + } + else + { + // handle it + return EXCEPTION_EXECUTE_HANDLER; + } +} + +F32 logExceptionBenchmark() +{ + // Todo: make a wrapper/class for SEH exceptions + F32 gbps = -1; + __try + { + gbps = gpu_benchmark(); + } + __except (exception_benchmark_filter(GetExceptionCode(), GetExceptionInformation())) + { + // convert to C++ styled exception + char integer_string[32]; + sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode()); + throw std::exception(integer_string); + } + return gbps; +} +#endif + bool LLFeatureManager::loadGPUClass() { if (!gSavedSettings.getBOOL("SkipBenchmark")) @@ -385,7 +422,11 @@ bool LLFeatureManager::loadGPUClass() F32 gbps; try { +#if LL_WINDOWS + gbps = logExceptionBenchmark(); +#else gbps = gpu_benchmark(); +#endif } catch (const std::exception& e) { @@ -400,11 +441,11 @@ bool LLFeatureManager::loadGPUClass() LL_WARNS("RenderInit") << "Unable to get an accurate benchmark; defaulting to class 3" << LL_ENDL; mGPUClass = GPU_CLASS_3; #else - if (gGLManager.mGLVersion < 2.f) + if (gGLManager.mGLVersion <= 2.f) { mGPUClass = GPU_CLASS_0; } - else if (gGLManager.mGLVersion < 3.f) + else if (gGLManager.mGLVersion <= 3.f) { mGPUClass = GPU_CLASS_1; } @@ -420,6 +461,11 @@ bool LLFeatureManager::loadGPUClass() { mGPUClass = GPU_CLASS_4; } + if (gGLManager.mIsIntel && mGPUClass > GPU_CLASS_1) + { + // Intels are generally weaker then other GPUs despite having advanced features + mGPUClass = (EGPUClass)(mGPUClass - 1); + } #endif } else if (gGLManager.mGLVersion <= 2.f) |