This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/intern/ghost/intern/GHOST_Context.cpp
Christian Rauch a296b8f694 GPU: replace GLEW with libepoxy
With libepoxy we can choose between EGL and GLX at runtime, as well as
dynamically open EGL and GLX libraries without linking to them.

This will make it possible to build with Wayland, EGL, GLVND support while
still running on systems that only have X11, GLX and libGL. It also paves
the way for headless rendering through EGL.

libepoxy is a new library dependency, and is included in the precompiled
libraries. GLEW is no longer a dependency, and WITH_SYSTEM_GLEW was removed.

Includes contributions by Brecht Van Lommel, Ray Molenkamp, Campbell Barton
and Sergey Sharybin.

Ref T76428

Differential Revision: https://developer.blender.org/D15291
2022-08-15 16:10:29 +02:00

132 lines
3.3 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2013 Blender Foundation. All rights reserved. */
/** \file
* \ingroup GHOST
*
* Definition of GHOST_Context class.
*/
#include "GHOST_Context.h"
#ifdef _WIN32
# include <epoxy/wgl.h>
# include <tchar.h>
#
# ifndef ERROR_PROFILE_DOES_NOT_MATCH_DEVICE
# define ERROR_PROFILE_DOES_NOT_MATCH_DEVICE 0x7E7
# endif
#endif
#include <cstdio>
#include <cstring>
#ifdef _WIN32
bool win32_silent_chk(bool result)
{
if (!result) {
SetLastError(NO_ERROR);
}
return result;
}
bool win32_chk(bool result, const char *file, int line, const char *text)
{
if (!result) {
LPTSTR formattedMsg = nullptr;
DWORD error = GetLastError();
const char *msg;
DWORD count = 0;
/* Some drivers returns a HRESULT instead of a standard error message.
* i.e: 0xC0072095 instead of 0x2095 for ERROR_INVALID_VERSION_ARB
* So strip down the error to the valid error code range. */
switch (error & 0x0000FFFF) {
case ERROR_INVALID_VERSION_ARB:
msg =
"The specified OpenGL version and feature set are either invalid or not supported.\n";
break;
case ERROR_INVALID_PROFILE_ARB:
msg =
"The specified OpenGL profile and feature set are either invalid or not supported.\n";
break;
case ERROR_INVALID_PIXEL_TYPE_ARB:
msg = "The specified pixel type is invalid.\n";
break;
case ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB:
msg =
("The device contexts specified are not compatible. "
"This can occur if the device contexts are managed by "
"different drivers or possibly on different graphics adapters.\n");
break;
# ifdef WITH_GLEW_ES
case ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV:
msg = "The device context(s) and rendering context have non-matching affinity masks.\n";
break;
case ERROR_MISSING_AFFINITY_MASK_NV:
msg = "The rendering context does not have an affinity mask set.\n";
break;
# endif
case ERROR_PROFILE_DOES_NOT_MATCH_DEVICE:
msg =
("The specified profile is intended for a device of a "
"different type than the specified device.\n");
break;
default: {
count = FormatMessage((FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS),
nullptr,
error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)(&formattedMsg),
0,
nullptr);
msg = count > 0 ? formattedMsg : "<no system message>\n";
break;
}
}
# ifndef NDEBUG
_ftprintf(stderr,
"%s(%d):[%s] -> Win32 Error# (%lu): %s",
file,
line,
text,
(unsigned long)error,
msg);
# else
_ftprintf(stderr, "Win32 Error# (%lu): %s", (unsigned long)error, msg);
# endif
SetLastError(NO_ERROR);
if (count != 0) {
LocalFree(formattedMsg);
}
}
return result;
}
#endif // _WIN32
void GHOST_Context::initClearGL()
{
glClearColor(0.294, 0.294, 0.294, 0.000);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.000, 0.000, 0.000, 0.000);
}