[Bf-blender-cvs] [360489c7516] master: GPUPlatform: GL backend isolation
Clément Foucault
noreply at git.blender.org
Mon Sep 7 19:37:30 CEST 2020
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. @@
More information about the Bf-blender-cvs
mailing list