-
Notifications
You must be signed in to change notification settings - Fork 212
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Linux Support #1
base: master
Are you sure you want to change the base?
Conversation
Without this configuration my system defaults to OpenGL 3.0.
Confirming that these changes providing linux support worked on my arch linux system. Very helpful. |
@DaveAxiom thank you for your contribution! I'll check it out and merge it in once I'm happy. What Linux distro did you use? |
I use a Ubuntu variant distribution. Ubuntu is a Debian based system which many popular distributions are also based on. The directions for installing required libraries is on the Hazel Project Linux PR branch. https://github.com/LovelySanta/Hazel/tree/linux-support-v2#32-linux |
@@ -29,7 +29,7 @@ namespace GLCore { | |||
EventCategoryMouseButton = BIT(4) | |||
}; | |||
|
|||
#define EVENT_CLASS_TYPE(type) static EventType GetStaticType() { return EventType::##type; }\ | |||
#define EVENT_CLASS_TYPE(type) static EventType GetStaticType() { return EventType::type; }\ | |||
virtual EventType GetEventType() const override { return GetStaticType(); }\ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe that Yan is using the token-pasting operator (##) to concat EventType:: with whatever is the name pasted as type argument, so I wouldn't remove the operator here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ##
operator is proprietary to Microsoft's compiler!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey, I am not so sure about it tho as I have used it with gcc and clang professionally under various architecture implementations of the compiler standard. Here's an example code that makes use of the ##
operator compiled using gcc-7
: https://godbolt.org/z/TEGszs
Also, the cppreference preprocessor docs don't seem to say anything about compiler specifics: https://en.cppreference.com/w/cpp/preprocessor/replace
And I have personally compiled the code under clang and gcc on both Linux (gcc and clang) and MacOS (clang) as is.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tested this operator on Godbolt during the summer and found that ##
works on the most recent few major versions of GCC. The above is ::##
which is different.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah sweet, well not cool but ... 😆 I am wondering what could've made this compile fine for me, as far as I remember tho.
I guess there's nothing more that can be done for the above compiler feature support war. I've been misled :(
Added glfwWindowHint() lines to window creation.
@@ -46,6 +46,10 @@ namespace GLCore { | |||
s_GLFWInitialized = true; | |||
} | |||
|
|||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | |||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | |||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggested addition of:
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
before the OpenGL profile hint line, because we're using 3.3 which for some OS (macOS) may require core context compatibility-mode enabled. This is due to Apple's move on starting to deprecate a bunch of APIs - OpenGL, OpenCL, etc. in favor of Metal.
I am aware that this MR is solely about Linux support, but just wanted to mention a point of consideration about GL context support:
macOS: The OS only supports forward-compatible core profile contexts for OpenGL versions 3.2 and later. Before creating an OpenGL context of version 3.2 or later you must set the GLFW_OPENGL_FORWARD_COMPAT and GLFW_OPENGL_PROFILE hints accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.
More on this in the glfw official docs: https://www.glfw.org/docs/3.3/window_guide.html#GLFW_OPENGL_FORWARD_COMPAT_hint
I am only suggesting this because I've done some of the work on my Mac at some point and had to adjust a couple of things.
It is up to you and maybe @TheCherno if he'd like to have a look, but you can use some PLATFORM macro at config time and add this for macOS only, or not do anything but keep in mind for future reference.
Also, from the message of the commit adding the above hints:
Added glfwWindowHint() lines to window creation.
Without this configuration my system defaults to OpenGL 3.0.
wrt macOS but also on API support general:
On macOS you might consider throwing an error message or something or just assert the version for the time being as creating an OpenGL core context below 3.1 is not supported at all. So maybe either disallow < 3.3 if we're not gonna consider API compatibility for these versions or wrap it around a PLATFORM macro too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not well versed on the specifics of OpenGL. I know that there are different OpenGL profiles but I don't know about the specifics of each. I held off on accepting the Hints PR into this branch until now since I rationalized that it is a minimum that can be just a starting point. Cherno plans to make videos on Apple support.
My philosophy behind Linux support is to increase the portability of this project. Apple support is good but the actions of that company are intended to close their platform in order to add proprietary value to their Intellectual Properties. Therefore anyone that buys an Apple shouldn't expect compatibility and I'm not going to dive in further to engineer around Apple. If this PR is accepted, a future PR could be submitted to modify the new base project.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see, I guess I just threw this out here for informative reasons. What you're saying makes sense. :)
Running the OpenGL-Example one failed to load returning this error
Os: Linux Ubuntu 20.4 LTS |
@AliAlboainin96 This branch is modified minimally to make it easy to merge. Change into the cd OpenGL-Examples
../bin/Debug-linux-x86_64/OpenGL-Examples/OpenGL-Examples |
@DaveAxiom For some reason deleting the repo and recloning it worked ! |
This seg faulted on example for me and I sort of assumed it might be a conflict with installed glfw. As a learning exercise I decided to follow the commits on this to a clean branch and make my own Linux build more to my taste. I didn't really keep easy merging in mind, renaming and moving subprojects (and updating to latest original sources) but I'm pretty happy with the result, especially as it doesn't segfault anymore. I diverged a fair bit but it might be worth a quick look at mine for things like the system glfw support and copying of shaders. It's my first time using premake so feel free to point out if I've done anything dumb too, I can't test Windows so it's entirely possible I broke it :) |
|
The minimum version of OpenGL needed is 3.3 which is what you have. You do have an old video card. I can give you tips on how to get this project setup in CodeBlocks for you to step through and debug. This is my output for this program:
|
I use Eclipse not CodeBlocks normally. In this case I use the CLI, with
, note the
So the Nvidia driver can run OpenGL 4.6.0. |
Shouldn't this conversation be held at https://github.com/DaveAxiom/OpenGL?
It looks like the call to |
If I change lines 49 in
to
I get a black window, which I think is the correct behaviour. |
Proper Linux support for project OpenGL! This contribution is intended to be inline with Cherno's programming intent and style.
Premake creates multiple Makefiles as
.make
files. Each project Makefile needs to be specified for compilation. To compile OpenGL-Examples, run from the command prompt:make -f OpenGL-Examples.make