From 360489c75167d47653bc34ad9ba9a65076bf384c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 7 Sep 2020 15:39:47 +0200 Subject: 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. --- source/blender/gpu/intern/gpu_platform.cc | 217 +++++++----------------------- 1 file changed, 51 insertions(+), 166 deletions(-) (limited to 'source/blender/gpu/intern/gpu_platform.cc') 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 +#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 -- cgit v1.2.3