Commit: 360489c75167d47653bc34ad9ba9a65076bf384c Author: Clément Foucault Date: Mon Sep 7 15:39:47 2020 +0200 Branches: master https://developer.blender.org/rB360489c75167d47653bc34ad9ba9a65076bf384c
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. =================================================================== M source/blender/gpu/CMakeLists.txt M source/blender/gpu/intern/gpu_init_exit.c M source/blender/gpu/intern/gpu_platform.cc A source/blender/gpu/intern/gpu_platform_private.hh M source/blender/gpu/intern/gpu_private.h A source/blender/gpu/opengl/gl_backend.cc M source/blender/gpu/opengl/gl_backend.hh =================================================================== diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 5cce4f84aea..47ce113230b 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -87,6 +87,7 @@ set(SRC intern/gpu_vertex_format.cc intern/gpu_viewport.c + opengl/gl_backend.cc opengl/gl_batch.cc opengl/gl_context.cc opengl/gl_drawlist.cc @@ -143,6 +144,7 @@ set(SRC intern/gpu_matrix_private.h intern/gpu_node_graph.h intern/gpu_private.h + intern/gpu_platform_private.hh intern/gpu_select_private.h intern/gpu_shader_private.hh intern/gpu_shader_interface.hh diff --git a/source/blender/gpu/intern/gpu_init_exit.c b/source/blender/gpu/intern/gpu_init_exit.c index 4cb43db9bce..f265d841922 100644 --- a/source/blender/gpu/intern/gpu_init_exit.c +++ b/source/blender/gpu/intern/gpu_init_exit.c @@ -48,7 +48,6 @@ void GPU_init(void) } initialized = true; - gpu_platform_init(); gpu_extensions_init(); /* must come first */ gpu_codegen_init(); @@ -81,7 +80,6 @@ void GPU_exit(void) gpu_codegen_exit(); gpu_extensions_exit(); - gpu_platform_exit(); /* must come last */ initialized = false; } 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 diff --git a/source/blender/gpu/intern/gpu_private.h b/source/blender/gpu/intern/gpu_platform_private.hh similarity index 52% copy from source/blender/gpu/intern/gpu_private.h copy to source/blender/gpu/intern/gpu_platform_private.hh index 505ac3b0278..e882672fdda 100644 --- a/source/blender/gpu/intern/gpu_private.h +++ b/source/blender/gpu/intern/gpu_platform_private.hh @@ -12,6 +12,9 @@ * You should have received a copy of the GNU General Public License * along wit @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs