Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-09-07 16:39:47 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-09-07 20:37:04 +0300
commit360489c75167d47653bc34ad9ba9a65076bf384c (patch)
treef4d28e3add0893ae47146314d893e925dc30120e /source/blender/gpu/intern/gpu_platform.cc
parent9cac181fbead28c0bf963bf2b9f82fddf3c2b7df (diff)
GPUPlatform: GL backend isolation
Part of the vulkan implementation T68990. Pretty straight forward. Just move the GL code inside the GLBackend and make the GPUPlatformGlobal a class object.
Diffstat (limited to 'source/blender/gpu/intern/gpu_platform.cc')
-rw-r--r--source/blender/gpu/intern/gpu_platform.cc217
1 files changed, 51 insertions, 166 deletions
diff --git a/source/blender/gpu/intern/gpu_platform.cc b/source/blender/gpu/intern/gpu_platform.cc
index 5cabde61bc3..e4db8c93f1d 100644
--- a/source/blender/gpu/intern/gpu_platform.cc
+++ b/source/blender/gpu/intern/gpu_platform.cc
@@ -23,75 +23,31 @@
* Wrap OpenGL features such as textures, shaders and GLSL
* with checks for drivers and GPU support.
*/
-#include "GPU_platform.h"
-#include "GPU_glew.h"
-#include "gpu_private.h"
-#include <string.h>
+#include "MEM_guardedalloc.h"
#include "BLI_dynstr.h"
#include "BLI_string.h"
-#include "MEM_guardedalloc.h"
+#include "GPU_platform.h"
-static struct GPUPlatformGlobal {
- bool initialized;
- eGPUDeviceType device;
- eGPUOSType os;
- eGPUDriverType driver;
- eGPUSupportLevel support_level;
- char *support_key;
- char *gpu_name;
-} GPG = {false};
-
-/* Remove this? */
-#if 0
-typedef struct GPUPlatformSupportTest {
- eGPUSupportLevel support_level;
- eGPUDeviceType device;
- eGPUOSType os;
- eGPUDriverType driver;
- const char *vendor;
- const char *renderer;
- const char *version;
-} GPUPlatformSupportTest;
-#endif
+#include "gpu_platform_private.hh"
-eGPUSupportLevel GPU_platform_support_level(void)
-{
- return GPG.support_level;
-}
+/* -------------------------------------------------------------------- */
+/** \name GPUPlatformGlobal
+ * \{ */
-const char *GPU_platform_support_level_key(void)
-{
- return GPG.support_key;
-}
+namespace blender::gpu {
-const char *GPU_platform_gpu_name(void)
-{
- return GPG.gpu_name;
-}
+GPUPlatformGlobal GPG;
-/* GPU Types */
-bool GPU_type_matches(eGPUDeviceType device, eGPUOSType os, eGPUDriverType driver)
-{
- return (GPG.device & device) && (GPG.os & os) && (GPG.driver & driver);
-}
-
-static char *gpu_platform_create_key(eGPUSupportLevel support_level,
- const char *vendor,
- const char *renderer,
- const char *version)
+void GPUPlatformGlobal::create_key(eGPUSupportLevel support_level,
+ const char *vendor,
+ const char *renderer,
+ const char *version)
{
DynStr *ds = BLI_dynstr_new();
- BLI_dynstr_append(ds, "{");
- BLI_dynstr_append(ds, vendor);
- BLI_dynstr_append(ds, "/");
- BLI_dynstr_append(ds, renderer);
- BLI_dynstr_append(ds, "/");
- BLI_dynstr_append(ds, version);
- BLI_dynstr_append(ds, "}");
- BLI_dynstr_append(ds, "=");
+ BLI_dynstr_appendf(ds, "{%s/%s/%s}=", vendor, renderer, version);
if (support_level == GPU_SUPPORT_LEVEL_SUPPORTED) {
BLI_dynstr_append(ds, "SUPPORTED");
}
@@ -102,132 +58,61 @@ static char *gpu_platform_create_key(eGPUSupportLevel support_level,
BLI_dynstr_append(ds, "UNSUPPORTED");
}
- char *support_key = BLI_dynstr_get_cstring(ds);
+ support_key = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
BLI_str_replace_char(support_key, '\n', ' ');
BLI_str_replace_char(support_key, '\r', ' ');
- return support_key;
}
-static char *gpu_platform_create_gpu_name(const char *vendor,
- const char *renderer,
- const char *version)
+void GPUPlatformGlobal::create_gpu_name(const char *vendor,
+ const char *renderer,
+ const char *version)
{
DynStr *ds = BLI_dynstr_new();
- BLI_dynstr_append(ds, vendor);
- BLI_dynstr_append(ds, " ");
- BLI_dynstr_append(ds, renderer);
- BLI_dynstr_append(ds, " ");
- BLI_dynstr_append(ds, version);
+ BLI_dynstr_appendf(ds, "%s %s %s", vendor, renderer, version);
- char *gpu_name = BLI_dynstr_get_cstring(ds);
+ gpu_name = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
BLI_str_replace_char(gpu_name, '\n', ' ');
BLI_str_replace_char(gpu_name, '\r', ' ');
- return gpu_name;
}
-void gpu_platform_init(void)
+void GPUPlatformGlobal::clear(void)
{
- if (GPG.initialized) {
- return;
- }
+ MEM_SAFE_FREE(GPG.support_key);
+ MEM_SAFE_FREE(GPG.gpu_name);
+ initialized = false;
+}
-#ifdef _WIN32
- GPG.os = GPU_OS_WIN;
-#elif defined(__APPLE__)
- GPG.os = GPU_OS_MAC;
-#else
- GPG.os = GPU_OS_UNIX;
-#endif
-
- const char *vendor = (const char *)glGetString(GL_VENDOR);
- const char *renderer = (const char *)glGetString(GL_RENDERER);
- const char *version = (const char *)glGetString(GL_VERSION);
-
- if (strstr(vendor, "ATI") || strstr(vendor, "AMD")) {
- GPG.device = GPU_DEVICE_ATI;
- GPG.driver = GPU_DRIVER_OFFICIAL;
- }
- else if (strstr(vendor, "NVIDIA")) {
- GPG.device = GPU_DEVICE_NVIDIA;
- GPG.driver = GPU_DRIVER_OFFICIAL;
- }
- else if (strstr(vendor, "Intel") ||
- /* src/mesa/drivers/dri/intel/intel_context.c */
- strstr(renderer, "Mesa DRI Intel") || strstr(renderer, "Mesa DRI Mobile Intel")) {
- GPG.device = GPU_DEVICE_INTEL;
- GPG.driver = GPU_DRIVER_OFFICIAL;
-
- if (strstr(renderer, "UHD Graphics") ||
- /* Not UHD but affected by the same bugs. */
- strstr(renderer, "HD Graphics 530") || strstr(renderer, "Kaby Lake GT2") ||
- strstr(renderer, "Whiskey Lake")) {
- GPG.device |= GPU_DEVICE_INTEL_UHD;
- }
- }
- else if ((strstr(renderer, "Mesa DRI R")) ||
- (strstr(renderer, "Radeon") && strstr(vendor, "X.Org")) ||
- (strstr(renderer, "AMD") && strstr(vendor, "X.Org")) ||
- (strstr(renderer, "Gallium ") && strstr(renderer, " on ATI ")) ||
- (strstr(renderer, "Gallium ") && strstr(renderer, " on AMD "))) {
- GPG.device = GPU_DEVICE_ATI;
- GPG.driver = GPU_DRIVER_OPENSOURCE;
- }
- else if (strstr(renderer, "Nouveau") || strstr(vendor, "nouveau")) {
- GPG.device = GPU_DEVICE_NVIDIA;
- GPG.driver = GPU_DRIVER_OPENSOURCE;
- }
- else if (strstr(vendor, "Mesa")) {
- GPG.device = GPU_DEVICE_SOFTWARE;
- GPG.driver = GPU_DRIVER_SOFTWARE;
- }
- else if (strstr(vendor, "Microsoft")) {
- GPG.device = GPU_DEVICE_SOFTWARE;
- GPG.driver = GPU_DRIVER_SOFTWARE;
- }
- else if (strstr(renderer, "Apple Software Renderer")) {
- GPG.device = GPU_DEVICE_SOFTWARE;
- GPG.driver = GPU_DRIVER_SOFTWARE;
- }
- else if (strstr(renderer, "llvmpipe") || strstr(renderer, "softpipe")) {
- GPG.device = GPU_DEVICE_SOFTWARE;
- GPG.driver = GPU_DRIVER_SOFTWARE;
- }
- else {
- printf("Warning: Could not find a matching GPU name. Things may not behave as expected.\n");
- printf("Detected OpenGL configuration:\n");
- printf("Vendor: %s\n", vendor);
- printf("Renderer: %s\n", renderer);
- GPG.device = GPU_DEVICE_ANY;
- GPG.driver = GPU_DRIVER_ANY;
- }
+} // namespace blender::gpu
- /* Detect support level */
- if (!GLEW_VERSION_3_3) {
- GPG.support_level = GPU_SUPPORT_LEVEL_UNSUPPORTED;
- }
- else {
- if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_WIN, GPU_DRIVER_ANY)) {
- /* Old Intel drivers with known bugs that cause material properties to crash.
- * Version Build 10.18.14.5067 is the latest available and appears to be working
- * ok with our workarounds, so excluded from this list. */
- if (strstr(version, "Build 7.14") || strstr(version, "Build 7.15") ||
- strstr(version, "Build 8.15") || strstr(version, "Build 9.17") ||
- strstr(version, "Build 9.18") || strstr(version, "Build 10.18.10.3") ||
- strstr(version, "Build 10.18.10.4") || strstr(version, "Build 10.18.10.5") ||
- strstr(version, "Build 10.18.14.4")) {
- GPG.support_level = GPU_SUPPORT_LEVEL_LIMITED;
- }
- }
- }
- GPG.support_key = gpu_platform_create_key(GPG.support_level, vendor, renderer, version);
- GPG.gpu_name = gpu_platform_create_gpu_name(vendor, renderer, version);
- GPG.initialized = true;
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name C-API
+ * \{ */
+
+using namespace blender::gpu;
+
+eGPUSupportLevel GPU_platform_support_level(void)
+{
+ return GPG.support_level;
}
-void gpu_platform_exit(void)
+const char *GPU_platform_support_level_key(void)
{
- MEM_SAFE_FREE(GPG.support_key);
- MEM_SAFE_FREE(GPG.gpu_name);
+ return GPG.support_key;
+}
+
+const char *GPU_platform_gpu_name(void)
+{
+ return GPG.gpu_name;
}
+
+/* GPU Types */
+bool GPU_type_matches(eGPUDeviceType device, eGPUOSType os, eGPUDriverType driver)
+{
+ return (GPG.device & device) && (GPG.os & os) && (GPG.driver & driver);
+}
+
+/** \} */ \ No newline at end of file